Subversion Repository Public Repository

Nextrek

Diff Revisions 1084 vs 1086 for /s2s/data/8DBB050CK548EA49A5S800AE8C9C8A84C8B9.json

Diff revisions: vs.
  @@ -6,10 +6,10 @@
6 6 "name": "ObjectManager",
7 7 "type": "game_script",
8 8 "order": 0,
9 - "content": "# ===================================================================\n#\n# Script: ObjectManager\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass ObjectManager\n ###*\n * Stores the current default ObjectManager.\n * @property current\n * @type gs.ObjectManager\n * @static\n ### \n @current: null\n \n ###*\n * Manages game objects by updating if necessary and offering\n * methods to add or remove game objects. All game objects are sorted by\n * the order-property to give control over the update-order.\n *\n * A game object can registered under a unique ID and then easily accessed using\n * that ID. If an object gets registered, a global variable $<ID> is created\n * as well. However, that global variable is only for the use in property-bindings\n * used for In-Game UI. See ui.Component_BindingHandler.\n *\n * In addition, a game object can be assigned to a group like for example\n * a set of UI toggle-buttons can be assigned to the same group and then\n * easily accessed later using gs.ObjectManager.objectsByGroup method.\n *\n * @module gs\n * @class ObjectManager\n * @memberof gs\n * @constructor\n * @see ui.Component_BindingHandler\n ###\n constructor: ->\n ###*\n * All game objects to manage.\n * @property objects\n * @type gs.Object_Base[]\n ### \n @objects = []\n \n ###*\n * All game objects by ID.\n * @property objectsById\n * @type Object\n ### \n @objectsById = {}\n \n ###*\n * All game objects by group.\n * @property objectsByGroup_\n * @type Object\n ### \n @objectsByGroup_ = {}\n \n ###*\n * Indicates if the ObjectManager is active. If <b>false</b> the game objects are not updated.\n * @property active\n * @type boolean\n ### \n @active = yes\n \n ###*\n * Indicates if the ObjectManager needs to sort the game objects.\n * @property active\n * @type boolean\n ### \n @needsSort = yes\n \n ###*\n * Disposes the manager and all assigned game objects.\n *\n * @method dispose\n ###\n dispose: ->\n for object in @objects\n if not object.disposed\n object.dispose()\n \n ###*\n * Disposes all assigned game objects.\n *\n * @method disposeObjects\n ### \n disposeObjects: ->\n keys = Object.keys(@objectsById)\n for k in keys\n object = @objectsById[k]\n if object and not object.disposed\n object.dispose()\n \n ###*\n * Registers an object.\n *\n * @method registerObject\n ###\n registerObject: (object) ->\n if object.id?\n if !@objectsById[object.id]\n @objectsById[object.id] = []\n @objectsById[object.id].push(object)\n # FIXME: Should be handled by UiManager since it is UI specific.\n window[\"$\"+object.id] = object\n \n ###*\n * Unregisters an object.\n *\n * @method unregisterObject\n ### \n unregisterObject: (object) ->\n if object?.id?\n objects = @objectsById[object.id]\n if objects\n objects.remove(object)\n if objects.length > 0\n window[\"$\"+object.id] = objects.last()\n else\n delete window[\"$\"+object.id]\n return null\n \n ###*\n * Adds a game object to the manager. The game object is then automatically updated by the manager.\n *\n * @method addObject\n * @param {gs.Object_Base} object - The game object to add.\n ### \n addObject: (object) -> @add(object)\n \n ###*\n * Removes a game object to the manager. The game object is then no longer automatically updated or disposed by the manager.\n *\n * @method removeObject\n * @param {gs.Object_Base} object - The game object to remove.\n ### \n removeObject: (object) -> @remove(object)\n \n ###*\n * Adds a game object to the manager. The game object is then automatically updated by the manager.\n *\n * @method add\n * @param {gs.Object_Base} object - The game object to add.\n ### \n add: (object) -> \n #@objects.splice(0, 0, object)\n @objects.push(object)\n @needsSort = yes\n @registerObject(object)\n @addToGroup(object, object.group)\n \n ###*\n * Removes a game object to the manager. The game object is then no longer automatically updated or disposed by the manager.\n *\n * @method remove\n * @param {gs.Object_Base} object - The game object to remove.\n ### \n remove: (object) -> \n if object\n @objects.remove(object)\n @unregisterObject(object)\n if object.group?\n @objectsByGroup[object.group]?.remove(object)\n \n ###*\n * Gets an object by ID.\n *\n * @method objectById\n * @param {String} id - The ID of the game object to get. \n * @return {gs.Object_Base} The game object or <b>null</b> if no game object is registered for the specified ID.\n ### \n objectById: (id) -> @objectsById[id]?.last()\n \n ###*\n * Gets an object by ID.\n *\n * @method byId\n * @param {String} id - The ID of the game object to get. \n * @return {gs.Object_Base} The game object or <b>null</b> if no game object is registered for the specified ID.\n ### \n byId: (id) -> @objectsById[id]?.last()\n \n ###*\n * Sets the object for an ID.\n *\n * @method setObjectById\n * @param {gs.Object_Base} object - The game object to set.\n * @param {String} id - The ID for the game object. \n ### \n setObjectById: (object, id) -> \n object.id = id\n if !@objectsById[id]\n @objectsById[id] = [object]\n else\n @objectsById[id].push(object)\n \n window[\"$\"+id] = object\n \n ###*\n * Adds an object to a specified object-group.\n *\n * @method addToGroup\n * @param {gs.Object_Base} object - The game object to add.\n * @param {String} group - The group to assign game object to. \n ### \n addToGroup: (object, group) ->\n if group?\n @objectsByGroup_[object.group]?.remove(object)\n if !@objectsByGroup_[group]\n @objectsByGroup_[group] = []\n @objectsByGroup_[group].push(object)\n \n ###*\n * Gets all object of a specified object-group.\n *\n * @method objectsByGroup\n * @param {String} group - The object-group.\n * @return {gs.Object_Base[]} The game objects belonging to the specified group.\n ### \n objectsByGroup: (group) -> @objectsByGroup_[group] || []\n \n \n ###*\n * Updates the manager and all assigned game objects in the right order.\n *\n * @method update\n ### \n update: -> \n i = 0\n \n if @needsSort\n @objects.sort (a, b) ->\n if a.order < b.order\n return 1\n else if a.order > b.order\n return -1\n else\n return 0\n @needsSort = no\n \n while i < @objects.length\n object = @objects[i]\n if object.disposed\n @removeObject(object)\n else \n object.update() if object.active\n i++\n \n return null\n \ngs.ObjectManager = ObjectManager #new ObjectManager()",
9 + "content": "# ===================================================================\n#\n# Script: ObjectManager\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass ObjectManager\n ###*\n * Stores the current default ObjectManager.\n * @property current\n * @type gs.ObjectManager\n * @static\n ### \n @current: null\n \n ###*\n * Manages game objects by updating if necessary and offering\n * methods to add or remove game objects. All game objects are sorted by\n * the order-property to give control over the update-order.\n *\n * A game object can registered under a unique ID and then easily accessed using\n * that ID. If an object gets registered, a global variable $<ID> is created\n * as well. However, that global variable is only for the use in property-bindings\n * used for In-Game UI. See ui.Component_BindingHandler.\n *\n * In addition, a game object can be assigned to a group like for example\n * a set of UI toggle-buttons can be assigned to the same group and then\n * easily accessed later using gs.ObjectManager.objectsByGroup method.\n *\n * @module gs\n * @class ObjectManager\n * @memberof gs\n * @constructor\n * @see ui.Component_BindingHandler\n ###\n constructor: ->\n ###*\n * All game objects to manage.\n * @property objects\n * @type gs.Object_Base[]\n ### \n @objects = []\n \n ###*\n * All game objects by ID.\n * @property objectsById\n * @type Object\n ### \n @objectsById = {}\n \n ###*\n * All game objects by group.\n * @property objectsByGroup_\n * @type Object\n ### \n @objectsByGroup_ = {}\n \n ###*\n * Indicates if the ObjectManager is active. If <b>false</b> the game objects are not updated.\n * @property active\n * @type boolean\n ### \n @active = yes\n \n ###*\n * Indicates if the ObjectManager needs to sort the game objects.\n * @property active\n * @type boolean\n ### \n @needsSort = yes\n \n ###*\n * Disposes the manager and all assigned game objects.\n *\n * @method dispose\n ###\n dispose: ->\n for object in @objects\n if not object.disposed\n object.dispose()\n \n ###*\n * Disposes all assigned game objects.\n *\n * @method disposeObjects\n ### \n disposeObjects: ->\n keys = Object.keys(@objectsById)\n for k in keys\n object = @objectsById[k]\n if object and not object.disposed\n object.dispose()\n \n ###*\n * Registers an object.\n *\n * @method registerObject\n ###\n registerObject: (object) ->\n if object.id?\n if !@objectsById[object.id]\n @objectsById[object.id] = []\n @objectsById[object.id].push(object)\n # FIXME: Should be handled by UiManager since it is UI specific.\n window[\"$\"+object.id] = object\n \n ###*\n * Unregisters an object.\n *\n * @method unregisterObject\n ### \n unregisterObject: (object) ->\n if object?.id?\n objects = @objectsById[object.id]\n if objects\n objects.remove(object)\n if objects.length > 0\n window[\"$\"+object.id] = objects.last()\n else\n delete window[\"$\"+object.id]\n return null\n \n ###*\n * Adds a game object to the manager. The game object is then automatically updated by the manager.\n *\n * @method addObject\n * @param {gs.Object_Base} object - The game object to add.\n ### \n addObject: (object) -> @add(object)\n \n ###*\n * Removes a game object to the manager. The game object is then no longer automatically updated or disposed by the manager.\n *\n * @method removeObject\n * @param {gs.Object_Base} object - The game object to remove.\n ### \n removeObject: (object) -> @remove(object)\n \n ###*\n * Adds a game object to the manager. The game object is then automatically updated by the manager.\n *\n * @method add\n * @param {gs.Object_Base} object - The game object to add.\n ### \n add: (object) -> \n #@objects.splice(0, 0, object)\n @objects.push(object)\n @needsSort = yes\n @registerObject(object)\n @addToGroup(object, object.group)\n \n ###*\n * Removes a game object to the manager. The game object is then no longer automatically updated or disposed by the manager.\n *\n * @method remove\n * @param {gs.Object_Base} object - The game object to remove.\n ### \n remove: (object) -> \n if object\n @objects.remove(object)\n @unregisterObject(object)\n if object.group?\n @objectsByGroup[object.group]?.remove(object)\n \n ###*\n * Gets an object by ID.\n *\n * @method objectById\n * @param {String} id - The ID of the game object to get. \n * @return {gs.Object_Base} The game object or <b>null</b> if no game object is registered for the specified ID.\n ### \n objectById: (id) -> @objectsById[id]?.last()\n \n ###*\n * Gets an object by ID.\n *\n * @method byId\n * @param {String} id - The ID of the game object to get. \n * @return {gs.Object_Base} The game object or <b>null</b> if no game object is registered for the specified ID.\n ### \n byId: (id) -> @objectsById[id]?.last()\n \n ###*\n * Sets the object for an ID.\n *\n * @method setObjectById\n * @param {gs.Object_Base} object - The game object to set.\n * @param {String} id - The ID for the game object. \n ### \n setObjectById: (object, id) -> \n if !id then return\n \n object.id = id\n if !@objectsById[id]\n @objectsById[id] = [object]\n else\n @objectsById[id].push(object)\n \n window[\"$\"+id] = object\n \n ###*\n * Adds an object to a specified object-group.\n *\n * @method addToGroup\n * @param {gs.Object_Base} object - The game object to add.\n * @param {String} group - The group to assign game object to. \n ### \n addToGroup: (object, group) ->\n if group?\n @objectsByGroup_[object.group]?.remove(object)\n if !@objectsByGroup_[group]\n @objectsByGroup_[group] = []\n @objectsByGroup_[group].push(object)\n \n ###*\n * Gets all object of a specified object-group.\n *\n * @method objectsByGroup\n * @param {String} group - The object-group.\n * @return {gs.Object_Base[]} The game objects belonging to the specified group.\n ### \n objectsByGroup: (group) -> @objectsByGroup_[group] || []\n \n \n ###*\n * Updates the manager and all assigned game objects in the right order.\n *\n * @method update\n ### \n update: -> \n i = 0\n \n if @needsSort\n @objects.sort (a, b) ->\n if a.order < b.order\n return 1\n else if a.order > b.order\n return -1\n else\n return 0\n @needsSort = no\n \n while i < @objects.length\n object = @objects[i]\n if object.disposed\n @removeObject(object)\n else \n object.update() if object.active\n i++\n \n return null\n \ngs.ObjectManager = ObjectManager #new ObjectManager()",
10 10 "parentId": "C0268943K60B3A42B7SA6F1EDDCF2F642FD7",
11 11 "folder": false,
12 - "compiledContent": "var ObjectManager;\n\nObjectManager = (function() {\n\n /**\n * Stores the current default ObjectManager.\n * @property current\n * @type gs.ObjectManager\n * @static\n */\n ObjectManager.current = null;\n\n\n /**\n * Manages game objects by updating if necessary and offering\n * methods to add or remove game objects. All game objects are sorted by\n * the order-property to give control over the update-order.\n *\n * A game object can registered under a unique ID and then easily accessed using\n * that ID. If an object gets registered, a global variable $<ID> is created\n * as well. However, that global variable is only for the use in property-bindings\n * used for In-Game UI. See ui.Component_BindingHandler.\n *\n * In addition, a game object can be assigned to a group like for example\n * a set of UI toggle-buttons can be assigned to the same group and then\n * easily accessed later using gs.ObjectManager.objectsByGroup method.\n *\n * @module gs\n * @class ObjectManager\n * @memberof gs\n * @constructor\n * @see ui.Component_BindingHandler\n */\n\n function ObjectManager() {\n\n /**\n * All game objects to manage.\n * @property objects\n * @type gs.Object_Base[]\n */\n this.objects = [];\n\n /**\n * All game objects by ID.\n * @property objectsById\n * @type Object\n */\n this.objectsById = {};\n\n /**\n * All game objects by group.\n * @property objectsByGroup_\n * @type Object\n */\n this.objectsByGroup_ = {};\n\n /**\n * Indicates if the ObjectManager is active. If <b>false</b> the game objects are not updated.\n * @property active\n * @type boolean\n */\n this.active = true;\n\n /**\n * Indicates if the ObjectManager needs to sort the game objects.\n * @property active\n * @type boolean\n */\n this.needsSort = true;\n }\n\n\n /**\n * Disposes the manager and all assigned game objects.\n *\n * @method dispose\n */\n\n ObjectManager.prototype.dispose = function() {\n var j, len, object, ref, results;\n ref = this.objects;\n results = [];\n for (j = 0, len = ref.length; j < len; j++) {\n object = ref[j];\n if (!object.disposed) {\n results.push(object.dispose());\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n\n /**\n * Disposes all assigned game objects.\n *\n * @method disposeObjects\n */\n\n ObjectManager.prototype.disposeObjects = function() {\n var j, k, keys, len, object, results;\n keys = Object.keys(this.objectsById);\n results = [];\n for (j = 0, len = keys.length; j < len; j++) {\n k = keys[j];\n object = this.objectsById[k];\n if (object && !object.disposed) {\n results.push(object.dispose());\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n\n /**\n * Registers an object.\n *\n * @method registerObject\n */\n\n ObjectManager.prototype.registerObject = function(object) {\n if (object.id != null) {\n if (!this.objectsById[object.id]) {\n this.objectsById[object.id] = [];\n }\n this.objectsById[object.id].push(object);\n return window[\"$\" + object.id] = object;\n }\n };\n\n\n /**\n * Unregisters an object.\n *\n * @method unregisterObject\n */\n\n ObjectManager.prototype.unregisterObject = function(object) {\n var objects;\n if ((object != null ? object.id : void 0) != null) {\n objects = this.objectsById[object.id];\n if (objects) {\n objects.remove(object);\n if (objects.length > 0) {\n window[\"$\" + object.id] = objects.last();\n } else {\n delete window[\"$\" + object.id];\n }\n }\n }\n return null;\n };\n\n\n /**\n * Adds a game object to the manager. The game object is then automatically updated by the manager.\n *\n * @method addObject\n * @param {gs.Object_Base} object - The game object to add.\n */\n\n ObjectManager.prototype.addObject = function(object) {\n return this.add(object);\n };\n\n\n /**\n * Removes a game object to the manager. The game object is then no longer automatically updated or disposed by the manager.\n *\n * @method removeObject\n * @param {gs.Object_Base} object - The game object to remove.\n */\n\n ObjectManager.prototype.removeObject = function(object) {\n return this.remove(object);\n };\n\n\n /**\n * Adds a game object to the manager. The game object is then automatically updated by the manager.\n *\n * @method add\n * @param {gs.Object_Base} object - The game object to add.\n */\n\n ObjectManager.prototype.add = function(object) {\n this.objects.push(object);\n this.needsSort = true;\n this.registerObject(object);\n return this.addToGroup(object, object.group);\n };\n\n\n /**\n * Removes a game object to the manager. The game object is then no longer automatically updated or disposed by the manager.\n *\n * @method remove\n * @param {gs.Object_Base} object - The game object to remove.\n */\n\n ObjectManager.prototype.remove = function(object) {\n var ref;\n if (object) {\n this.objects.remove(object);\n this.unregisterObject(object);\n if (object.group != null) {\n return (ref = this.objectsByGroup[object.group]) != null ? ref.remove(object) : void 0;\n }\n }\n };\n\n\n /**\n * Gets an object by ID.\n *\n * @method objectById\n * @param {String} id - The ID of the game object to get. \n * @return {gs.Object_Base} The game object or <b>null</b> if no game object is registered for the specified ID.\n */\n\n ObjectManager.prototype.objectById = function(id) {\n var ref;\n return (ref = this.objectsById[id]) != null ? ref.last() : void 0;\n };\n\n\n /**\n * Gets an object by ID.\n *\n * @method byId\n * @param {String} id - The ID of the game object to get. \n * @return {gs.Object_Base} The game object or <b>null</b> if no game object is registered for the specified ID.\n */\n\n ObjectManager.prototype.byId = function(id) {\n var ref;\n return (ref = this.objectsById[id]) != null ? ref.last() : void 0;\n };\n\n\n /**\n * Sets the object for an ID.\n *\n * @method setObjectById\n * @param {gs.Object_Base} object - The game object to set.\n * @param {String} id - The ID for the game object.\n */\n\n ObjectManager.prototype.setObjectById = function(object, id) {\n object.id = id;\n if (!this.objectsById[id]) {\n this.objectsById[id] = [object];\n } else {\n this.objectsById[id].push(object);\n }\n return window[\"$\" + id] = object;\n };\n\n\n /**\n * Adds an object to a specified object-group.\n *\n * @method addToGroup\n * @param {gs.Object_Base} object - The game object to add.\n * @param {String} group - The group to assign game object to.\n */\n\n ObjectManager.prototype.addToGroup = function(object, group) {\n var ref;\n if (group != null) {\n if ((ref = this.objectsByGroup_[object.group]) != null) {\n ref.remove(object);\n }\n if (!this.objectsByGroup_[group]) {\n this.objectsByGroup_[group] = [];\n }\n return this.objectsByGroup_[group].push(object);\n }\n };\n\n\n /**\n * Gets all object of a specified object-group.\n *\n * @method objectsByGroup\n * @param {String} group - The object-group.\n * @return {gs.Object_Base[]} The game objects belonging to the specified group.\n */\n\n ObjectManager.prototype.objectsByGroup = function(group) {\n return this.objectsByGroup_[group] || [];\n };\n\n\n /**\n * Updates the manager and all assigned game objects in the right order.\n *\n * @method update\n */\n\n ObjectManager.prototype.update = function() {\n var i, object;\n i = 0;\n if (this.needsSort) {\n this.objects.sort(function(a, b) {\n if (a.order < b.order) {\n return 1;\n } else if (a.order > b.order) {\n return -1;\n } else {\n return 0;\n }\n });\n this.needsSort = false;\n }\n while (i < this.objects.length) {\n object = this.objects[i];\n if (object.disposed) {\n this.removeObject(object);\n } else {\n if (object.active) {\n object.update();\n }\n i++;\n }\n }\n return null;\n };\n\n return ObjectManager;\n\n})();\n\ngs.ObjectManager = ObjectManager;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUE7O0FBQU07O0FBQ0Y7Ozs7OztFQU1BLGFBQUMsQ0FBQSxPQUFELEdBQVU7OztBQUVWOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvQmEsdUJBQUE7O0FBQ1Q7Ozs7O0lBS0EsSUFBQyxDQUFBLE9BQUQsR0FBVzs7QUFFWDs7Ozs7SUFLQSxJQUFDLENBQUEsV0FBRCxHQUFlOztBQUVmOzs7OztJQUtBLElBQUMsQ0FBQSxlQUFELEdBQW1COztBQUVuQjs7Ozs7SUFLQSxJQUFDLENBQUEsTUFBRCxHQUFVOztBQUVWOzs7OztJQUtBLElBQUMsQ0FBQSxTQUFELEdBQWE7RUFsQ0o7OztBQW9DYjs7Ozs7OzBCQUtBLE9BQUEsR0FBUyxTQUFBO0FBQ0wsUUFBQTtBQUFBO0FBQUE7U0FBQSxxQ0FBQTs7TUFDSSxJQUFHLENBQUksTUFBTSxDQUFDLFFBQWQ7cUJBQ0ksTUFBTSxDQUFDLE9BQVAsQ0FBQSxHQURKO09BQUEsTUFBQTs2QkFBQTs7QUFESjs7RUFESzs7O0FBS1Q7Ozs7OzswQkFLQSxjQUFBLEdBQWdCLFNBQUE7QUFDWixRQUFBO0lBQUEsSUFBQSxHQUFPLE1BQU0sQ0FBQyxJQUFQLENBQVksSUFBQyxDQUFBLFdBQWI7QUFDUDtTQUFBLHNDQUFBOztNQUNJLE1BQUEsR0FBUyxJQUFDLENBQUEsV0FBWSxDQUFBLENBQUE7TUFDdEIsSUFBRyxNQUFBLElBQVcsQ0FBSSxNQUFNLENBQUMsUUFBekI7cUJBQ0ksTUFBTSxDQUFDLE9BQVAsQ0FBQSxHQURKO09BQUEsTUFBQTs2QkFBQTs7QUFGSjs7RUFGWTs7O0FBT2hCOzs7Ozs7MEJBS0EsY0FBQSxHQUFnQixTQUFDLE1BQUQ7SUFDWixJQUFHLGlCQUFIO01BQ0ksSUFBRyxDQUFDLElBQUMsQ0FBQSxXQUFZLENBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBakI7UUFDSSxJQUFDLENBQUEsV0FBWSxDQUFBLE1BQU0s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Ozs7Ozs7OzBCQU9BLGNBQUEsR0FBZ0IsU0FBQyxLQUFEO1dBQVcsSUFBQyxDQUFBLGVBQWdCLENBQUEsS0FBQSxDQUFqQixJQUEyQjtFQUF0Qzs7O0FBR2hCOzs7Ozs7MEJBS0EsTUFBQSxHQUFRLFNBQUE7QUFDSixRQUFBO0lBQUEsQ0FBQSxHQUFJO0lBRUosSUFBRyxJQUFDLENBQUEsU0FBSjtNQUNJLElBQUMsQ0FBQSxPQUFPLENBQUMsSUFBVCxDQUFjLFNBQUMsQ0FBRCxFQUFJLENBQUo7UUFDVixJQUFHLENBQUMsQ0FBQyxLQUFGLEdBQVUsQ0FBQyxDQUFDLEtBQWY7QUFDSSxpQkFBTyxFQURYO1NBQUEsTUFFSyxJQUFHLENBQUMsQ0FBQyxLQUFGLEdBQVUsQ0FBQyxDQUFDLEtBQWY7QUFDRCxpQkFBTyxDQUFDLEVBRFA7U0FBQSxNQUFBO0FBR0QsaUJBQU8sRUFITjs7TUFISyxDQUFkO01BT0EsSUFBQyxDQUFBLFNBQUQsR0FBYSxNQVJqQjs7QUFVQSxXQUFNLENBQUEsR0FBSSxJQUFDLENBQUEsT0FBTyxDQUFDLE1BQW5CO01BQ0ksTUFBQSxHQUFTLElBQUMsQ0FBQSxPQUFRLENBQUEsQ0FBQTtNQUNsQixJQUFHLE1BQU0sQ0FBQyxRQUFWO1FBQ0ksSUFBQyxDQUFBLFlBQUQsQ0FBYyxNQUFkLEVBREo7T0FBQSxNQUFBO1FBR0ksSUFBbUIsTUFBTSxDQUFDLE1BQTFCO1VBQUEsTUFBTSxDQUFDLE1BQVAsQ0FBQSxFQUFBOztRQUNBLENBQUEsR0FKSjs7SUFGSjtBQVFBLFdBQU87RUFyQkg7Ozs7OztBQXVCWixFQUFFLENBQUMsYUFBSCxHQUFtQiIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogT2JqZWN0TWFuYWdlclxuI1xuIyAgICQkQ09QWVJJR0hUJCRcbiNcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY2xhc3MgT2JqZWN0TWFuYWdlclxuICAgICMjIypcbiAgICAqIFN0b3JlcyB0aGUgY3VycmVudCBkZWZhdWx0IE9iamVjdE1hbmFnZXIuXG4gICAgKiBAcHJvcGVydHkgY3VycmVudFxuICAgICogQHR5cGUgZ3MuT2JqZWN0TWFuYWdlclxuICAgICogQHN0YXRpY1xuICAgICMjIyBcbiAgICBAY3VycmVudDogbnVsbFxuICAgIFxuICAgICMjIypcbiAgICAqIE1hbmFnZXMgZ2FtZSBvYmplY3RzIGJ5IHVwZGF0aW5nIGlmIG5lY2Vzc2FyeSBhbmQgb2ZmZXJpbmdcbiAgICAqIG1ldGhvZHMgdG8gYWRkIG9yIHJlbW92ZSBnYW1lIG9iamVjdHMuIEFsbCBnYW1lIG9iamVjdHMgYXJlIHNvcnRlZCBieVxuICAgICogdGhlIG9yZGVyLXByb3BlcnR5IHRvIGdpdmUgY29udHJvbCBvdmVyIHRoZSB1cGRhdGUtb3JkZXIuXG4gICAgKlxuICAgICogQSBnYW1lIG9iamVjdCBjYW4gcmVnaXN0ZXJlZCB1bmRlciBhIHVuaXF1ZSBJRCBhbmQgdGhlbiBlYXNpbHkgYWNjZXNzZWQgdXNpbmdcbiAgICAqIHRoYXQgSUQuIElmIGFuIG9iamVjdCBnZXRzIHJlZ2lzdGVyZWQsIGEgZ2xvYmFsIHZhcmlhYmxlICQ8SUQ+IGlzIGNyZWF0ZWRcbiAgICAqIGFzIHdlbGwuIEhvd2V2ZXIsIHRoYXQgZ2xvYmFsIHZhcmlhYmxlIGlzIG9ubHkgZm9yIHRoZSB1c2UgaW4gcHJvcGVydHktYmluZGluZ3NcbiAgICAqIHVzZWQgZm9yIEluLUdhbWUgVUkuIFNlZSB1aS5Db21wb25lbnRfQmluZGluZ0hhbmRsZXIuXG4gICAgKlxuICAgICogSW4gYWRkaXRpb24sIGEgZ2FtZSBvYmplY3QgY2FuIGJlIGFzc2lnbmVkIHRvIGEgZ3JvdXAgbGlrZSBmb3IgZXhhbXBsZVxuICAgICogYSBzZXQgb2YgVUkgdG9nZ2xlLWJ1dHRvbnMgY2FuIGJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIGdyb3VwIGFuZCB0aGVuXG4gICAgKiBlYXNpbHkgYWNjZXNzZWQgbGF0ZXIgdXNpbmcgZ3MuT2JqZWN0TWFuYWdlci5vYmplY3RzQnlHcm91cCBtZXRob2QuXG4gICAgKlxuICAgICogQG1vZHVsZSBnc1xuICAgICogQGNsYXNzIE9iamVjdE1hbmFnZXJcbiAgICAqIEBtZW1iZXJvZiBnc1xuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKiBAc2VlIHVpLkNvbXBvbmVudF9CaW5kaW5nSGFuZGxlclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAtPlxuICAgICAgICAjIyMqXG4gICAgICAgICogQWxsIGdhbWUgb2JqZWN0cyB0byBtYW5hZ2UuXG4gICAgICAgICogQHByb3BlcnR5IG9iamVjdHNcbiAgICAgICAgKiBAdHlwZSBncy5PYmplY3RfQmFzZVtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQG9iamVjdHMgPSBbXVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEFsbCBnYW1lIG9iamVjdHMgYnkgSUQuXG4gICAgICAgICogQHByb3BlcnR5IG9iamVjdHNCeUlkXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjIyBcbiAgICAgICAgQG9iamVjdHNCeUlkID0ge31cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBBbGwgZ2FtZSBvYmplY3RzIGJ5IGdyb3VwLlxuICAgICAgICAqIEBwcm9wZXJ0eSBvYmplY3RzQnlHcm91cF9cbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjIFxuICAgICAgICBAb2JqZWN0c0J5R3JvdXBfID0ge31cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIE9iamVjdE1hbmFnZXIgaXMgYWN0aXZlLiBJZiA8Yj5mYWxzZTwvYj4gdGhlIGdhbWUgb2JqZWN0cyBhcmUgbm90IHVwZGF0ZWQuXG4gICAgICAgICogQHByb3BlcnR5IGFjdGl2ZVxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgIyMjIFxuICAgICAgICBAYWN0aXZlID0geWVzXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBPYmplY3RNYW5hZ2VyIG5lZWRzIHRvIHNvcnQgdGhlIGdhbWUgb2JqZWN0cy5cbiAgICAgICAgKiBAcHJvcGVydHkgYWN0aXZlXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAjIyMgXG4gICAgICAgIEBuZWVkc1NvcnQgPSB5ZXNcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogRGlzcG9zZXMgdGhlIG1hbmFnZXIgYW5kIGFsbCBhc3NpZ25lZCBnYW1lIG9iamVjdHMuXG4gICAgKlxuICAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAgIyMjXG4gICAgZGlzcG9zZTogLT5cbiAgICAgICAgZm9yIG9iamVjdCBpbiBAb2JqZWN0c1xuICAgICAgICAgICAgaWYgbm90IG9iamVjdC5kaXNwb3NlZFxuICAgICAgICAgICAgICAgIG9iamVjdC5kaXNwb3NlKClcbiAgICAgXG4gICAgIyMjKlxuICAgICogRGlzcG9zZXMgYWxsIGFzc2lnbmVkIGdhbWUgb2JqZWN0cy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGRpc3Bvc2VPYmplY3RzXG4gICAgIyMjICAgICAgICAgICBcbiAgICBkaXNwb3NlT2JqZWN0czogLT5cbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKEBvYmplY3RzQnlJZClcbiAgICAgICAgZm9yIGsgaW4ga2V5c1xuICAgICAgICAgICAgb2JqZWN0ID0gQG9iamVjdHNCeUlkW2tdXG4gICAgICAgICAgICBpZiBvYmplY3QgYW5kIG5vdCBvYmplY3QuZGlzcG9zZWRcbiAgICAgICAgICAgICAgICBvYmplY3QuZGlzcG9zZSgpXG4gICAgXG4gICAgIyMjKlxuICAgICogUmVnaXN0ZXJzIGFuIG9iamVjdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHJlZ2lzdGVyT2JqZWN0XG4gICAgIyMjXG4gICAgcmVnaXN0ZXJPYmplY3Q6IChvYmplY3QpIC0+XG4gICAgICAgIGlmIG9iamVjdC5pZD9cbiAgICAgICAgICAgIGlmICFAb2JqZWN0c0J5SWRbb2JqZWN0LmlkXVxuICAgICAgICAgICAgICAgIEBvYmplY3RzQnlJZFtvYmplY3QuaWRdID0gW11cbiAgICAgICAgICAgIEBvYmplY3RzQnlJZFtvYmplY3QuaWRdLnB1c2gob2JqZWN0KVxuICAgICAgICAgICAgIyBGSVhNRTogU2hvdWxkIGJlIGhhbmRsZWQgYnkgVWlNYW5hZ2VyIHNpbmNlIGl0IGlzIFVJIHNwZWNpZmljLlxuICAgICAgICAgICAgd2luZG93W1wiJFwiK29iamVjdC5pZF0gPSBvYmplY3RcbiAgICBcbiAgICAjIyMqXG4gICAgKiBVbnJlZ2lzdGVycyBhbiBvYmplY3QuXG4gICAgKlxuICAgICogQG1ldGhvZCB1bnJlZ2lzdGVyT2JqZWN0XG4gICAgIyMjICAgICAgICBcbiAgICB1bnJlZ2lzdGVyT2JqZWN0OiAob2JqZWN0KSAtPlxuICAgICAgICBpZiBvYmplY3Q/LmlkP1xuICAgICAgICAgICAgb2JqZWN0cyA9IEBvYmplY3RzQnlJZFtvYmplY3QuaWRdXG4gICAgICAgICAgICBpZiBvYmplY3RzXG4gICAgICAgICAgICAgICAgb2JqZWN0cy5yZW1vdmUob2JqZWN0KVxuICAgICAgICAgICAgICAgIGlmIG9iamVjdHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dbXCIkXCIrb2JqZWN0LmlkXSA9IG9iamVjdHMubGFzdCgpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93W1wiJFwiK29iamVjdC5pZF1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBZGRzIGEgZ2FtZSBvYmplY3QgdG8gdGhlIG1hbmFnZXIuIFRoZSBnYW1lIG9iamVjdCBpcyB0aGVuIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgbWFuYWdlci5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGFkZE9iamVjdFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gb2JqZWN0IC0gVGhlIGdhbWUgb2JqZWN0IHRvIGFkZC5cbiAgICAjIyMgICAgICAgIFxuICAgIGFkZE9iamVjdDogKG9iamVjdCkgLT4gQGFkZChvYmplY3QpXG4gICAgXG4gICAgIyMjKlxuICAgICogUmVtb3ZlcyBhIGdhbWUgb2JqZWN0IHRvIHRoZSBtYW5hZ2VyLiBUaGUgZ2FtZSBvYmplY3QgaXMgdGhlbiBubyBsb25nZXIgYXV0b21hdGljYWxseSB1cGRhdGVkIG9yIGRpc3Bvc2VkIGJ5IHRoZSBtYW5hZ2VyLlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVtb3ZlT2JqZWN0XG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBvYmplY3QgLSBUaGUgZ2FtZSBvYmplY3QgdG8gcmVtb3ZlLlxuICAgICMjIyAgICAgICAgXG4gICAgcmVtb3ZlT2JqZWN0OiAob2JqZWN0KSAtPiBAcmVtb3ZlKG9iamVjdClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBZGRzIGEgZ2FtZSBvYmplY3QgdG8gdGhlIG1hbmFnZXIuIFRoZSBnYW1lIG9iamVjdCBpcyB0aGVuIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgbWFuYWdlci5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGFkZFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gb2JqZWN0IC0gVGhlIGdhbWUgb2JqZWN0IHRvIGFkZC5cbiAgICAjIyMgXG4gICAgYWRkOiAob2JqZWN0KSAtPiBcbiAgICAgICAgI0BvYmplY3RzLnNwbGljZSgwLCAwLCBvYmplY3QpXG4gICAgICAgIEBvYmplY3RzLnB1c2gob2JqZWN0KVxuICAgICAgICBAbmVlZHNTb3J0ID0geWVzXG4gICAgICAgIEByZWdpc3Rlck9iamVjdChvYmplY3QpXG4gICAgICAgIEBhZGRUb0dyb3VwKG9iamVjdCwgb2JqZWN0Lmdyb3VwKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBSZW1vdmVzIGEgZ2FtZSBvYmplY3QgdG8gdGhlIG1hbmFnZXIuIFRoZSBnYW1lIG9iamVjdCBpcyB0aGVuIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgb3IgZGlzcG9zZWQgYnkgdGhlIG1hbmFnZXIuXG4gICAgKlxuICAgICogQG1ldGhvZCByZW1vdmVcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IG9iamVjdCAtIFRoZSBnYW1lIG9iamVjdCB0byByZW1vdmUuXG4gICAgIyMjIFxuICAgIHJlbW92ZTogKG9iamVjdCkgLT4gXG4gICAgICAgIGlmIG9iamVjdFxuICAgICAgICAgICAgQG9iamVjdHMucmVtb3ZlKG9iamVjdClcbiAgICAgICAgICAgIEB1bnJlZ2lzdGVyT2JqZWN0KG9iamVjdClcbiAgICAgICAgICAgIGlmIG9iamVjdC5ncm91cD9cbiAgICAgICAgICAgICAgICBAb2JqZWN0c0J5R3JvdXBbb2JqZWN0Lmdyb3VwXT8ucmVtb3ZlKG9iamVjdClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIGFuIG9iamVjdCBieSBJRC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG9iamVjdEJ5SWRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZ2FtZSBvYmplY3QgdG8gZ2V0LiBcbiAgICAqIEByZXR1cm4ge2dzLk9iamVjdF9CYXNlfSBUaGUgZ2FtZSBvYmplY3Qgb3IgPGI+bnVsbDwvYj4gaWYgbm8gZ2FtZSBvYmplY3QgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwZWNpZmllZCBJRC5cbiAgICAjIyMgICAgICAgICBcbiAgICBvYmplY3RCeUlkOiAoaWQpIC0+IEBvYmplY3RzQnlJZFtpZF0/Lmxhc3QoKVxuICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgYW4gb2JqZWN0IGJ5IElELlxuICAgICpcbiAgICAqIEBtZXRob2QgYnlJZFxuICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIElEIG9mIHRoZSBnYW1lIG9iamVjdCB0byBnZXQuIFxuICAgICogQHJldHVybiB7Z3MuT2JqZWN0X0Jhc2V9IFRoZSBnYW1lIG9iamVjdCBvciA8Yj5udWxsPC9iPiBpZiBubyBnYW1lIG9iamVjdCBpcyByZWdpc3RlcmVkIGZvciB0aGUgc3BlY2lmaWVkIElELlxuICAgICMjIyBcbiAgICBieUlkOiAoaWQpIC0+IEBvYmplY3RzQnlJZFtpZF0/Lmxhc3QoKVxuICAgIFxuICAgICMjIypcbiAgICAqIFNldHMgdGhlIG9iamVjdCBmb3IgYW4gSUQuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXRPYmplY3RCeUlkXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBvYmplY3QgLSBUaGUgZ2FtZSBvYmplY3QgdG8gc2V0LlxuICAgICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gVGhlIElEIGZvciB0aGUgZ2FtZSBvYmplY3QuIFxuICAgICMjIyBcbiAgICBzZXRPYmplY3RCeUlkOiAob2JqZWN0LCBpZCkgLT4gXG4gICAgICAgIG9iamVjdC5pZCA9IGlkXG4gICAgICAgIGlmICFAb2JqZWN0c0J5SWRbaWRdXG4gICAgICAgICAgICBAb2JqZWN0c0J5SWRbaWRdID0gW29iamVjdF1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQG9iamVjdHNCeUlkW2lkXS5wdXNoKG9iamVjdClcbiAgICAgICAgICAgIFxuICAgICAgICB3aW5kb3dbXCIkXCIraWRdID0gb2JqZWN0XG4gICAgXG4gICAgIyMjKlxuICAgICogQWRkcyBhbiBvYmplY3QgdG8gYSBzcGVjaWZpZWQgb2JqZWN0LWdyb3VwLlxuICAgICpcbiAgICAqIEBtZXRob2QgYWRkVG9Hcm91cFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gb2JqZWN0IC0gVGhlIGdhbWUgb2JqZWN0IHRvIGFkZC5cbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cCAtIFRoZSBncm91cCB0byBhc3NpZ24gZ2FtZSBvYmplY3QgdG8uIFxuICAgICMjIyBcbiAgICBhZGRUb0dyb3VwOiAob2JqZWN0LCBncm91cCkgLT5cbiAgICAgICAgaWYgZ3JvdXA/XG4gICAgICAgICAgICBAb2JqZWN0c0J5R3JvdXBfW29iamVjdC5ncm91cF0/LnJlbW92ZShvYmplY3QpXG4gICAgICAgICAgICBpZiAhQG9iamVjdHNCeUdyb3VwX1tncm91cF1cbiAgICAgICAgICAgICAgICBAb2JqZWN0c0J5R3JvdXBfW2dyb3VwXSA9IFtdXG4gICAgICAgICAgICBAb2JqZWN0c0J5R3JvdXBfW2dyb3VwXS5wdXNoKG9iamVjdClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIGFsbCBvYmplY3Qgb2YgYSBzcGVjaWZpZWQgb2JqZWN0LWdyb3VwLlxuICAgICpcbiAgICAqIEBtZXRob2Qgb2JqZWN0c0J5R3JvdXBcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cCAtIFRoZSBvYmplY3QtZ3JvdXAuXG4gICAgKiBAcmV0dXJuIHtncy5PYmplY3RfQmFzZVtdfSBUaGUgZ2FtZSBvYmplY3RzIGJlbG9uZ2luZyB0byB0aGUgc3BlY2lmaWVkIGdyb3VwLlxuICAgICMjIyAgICAgICAgIFxuICAgIG9iamVjdHNCeUdyb3VwOiAoZ3JvdXApIC0+IEBvYmplY3RzQnlHcm91cF9bZ3JvdXBdIHx8IFtdXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgbWFuYWdlciBhbmQgYWxsIGFzc2lnbmVkIGdhbWUgb2JqZWN0cyBpbiB0aGUgcmlnaHQgb3JkZXIuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyMgIFxuICAgIHVwZGF0ZTogLT4gXG4gICAgICAgIGkgPSAwXG4gICAgICAgIFxuICAgICAgICBpZiBAbmVlZHNTb3J0XG4gICAgICAgICAgICBAb2JqZWN0cy5zb3J0IChhLCBiKSAtPlxuICAgICAgICAgICAgICAgIGlmIGEub3JkZXIgPCBiLm9yZGVyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxXG4gICAgICAgICAgICAgICAgZWxzZSBpZiBhLm9yZGVyID4gYi5vcmRlclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICBAbmVlZHNTb3J0ID0gbm9cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgd2hpbGUgaSA8IEBvYmplY3RzLmxlbmd0aFxuICAgICAgICAgICAgb2JqZWN0ID0gQG9iamVjdHNbaV1cbiAgICAgICAgICAgIGlmIG9iamVjdC5kaXNwb3NlZFxuICAgICAgICAgICAgICAgIEByZW1vdmVPYmplY3Qob2JqZWN0KVxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICBvYmplY3QudXBkYXRlKCkgaWYgb2JqZWN0LmFjdGl2ZVxuICAgICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIFxuZ3MuT2JqZWN0TWFuYWdlciA9IE9iamVjdE1hbmFnZXIgI25ldyBPYmplY3RNYW5hZ2VyKCkiXX0=\n//# sourceURL=ObjectManager_6.js"
12 + "compiledContent": "var ObjectManager;\n\nObjectManager = (function() {\n\n /**\n * Stores the current default ObjectManager.\n * @property current\n * @type gs.ObjectManager\n * @static\n */\n ObjectManager.current = null;\n\n\n /**\n * Manages game objects by updating if necessary and offering\n * methods to add or remove game objects. All game objects are sorted by\n * the order-property to give control over the update-order.\n *\n * A game object can registered under a unique ID and then easily accessed using\n * that ID. If an object gets registered, a global variable $<ID> is created\n * as well. However, that global variable is only for the use in property-bindings\n * used for In-Game UI. See ui.Component_BindingHandler.\n *\n * In addition, a game object can be assigned to a group like for example\n * a set of UI toggle-buttons can be assigned to the same group and then\n * easily accessed later using gs.ObjectManager.objectsByGroup method.\n *\n * @module gs\n * @class ObjectManager\n * @memberof gs\n * @constructor\n * @see ui.Component_BindingHandler\n */\n\n function ObjectManager() {\n\n /**\n * All game objects to manage.\n * @property objects\n * @type gs.Object_Base[]\n */\n this.objects = [];\n\n /**\n * All game objects by ID.\n * @property objectsById\n * @type Object\n */\n this.objectsById = {};\n\n /**\n * All game objects by group.\n * @property objectsByGroup_\n * @type Object\n */\n this.objectsByGroup_ = {};\n\n /**\n * Indicates if the ObjectManager is active. If <b>false</b> the game objects are not updated.\n * @property active\n * @type boolean\n */\n this.active = true;\n\n /**\n * Indicates if the ObjectManager needs to sort the game objects.\n * @property active\n * @type boolean\n */\n this.needsSort = true;\n }\n\n\n /**\n * Disposes the manager and all assigned game objects.\n *\n * @method dispose\n */\n\n ObjectManager.prototype.dispose = function() {\n var j, len, object, ref, results;\n ref = this.objects;\n results = [];\n for (j = 0, len = ref.length; j < len; j++) {\n object = ref[j];\n if (!object.disposed) {\n results.push(object.dispose());\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n\n /**\n * Disposes all assigned game objects.\n *\n * @method disposeObjects\n */\n\n ObjectManager.prototype.disposeObjects = function() {\n var j, k, keys, len, object, results;\n keys = Object.keys(this.objectsById);\n results = [];\n for (j = 0, len = keys.length; j < len; j++) {\n k = keys[j];\n object = this.objectsById[k];\n if (object && !object.disposed) {\n results.push(object.dispose());\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n\n /**\n * Registers an object.\n *\n * @method registerObject\n */\n\n ObjectManager.prototype.registerObject = function(object) {\n if (object.id != null) {\n if (!this.objectsById[object.id]) {\n this.objectsById[object.id] = [];\n }\n this.objectsById[object.id].push(object);\n return window[\"$\" + object.id] = object;\n }\n };\n\n\n /**\n * Unregisters an object.\n *\n * @method unregisterObject\n */\n\n ObjectManager.prototype.unregisterObject = function(object) {\n var objects;\n if ((object != null ? object.id : void 0) != null) {\n objects = this.objectsById[object.id];\n if (objects) {\n objects.remove(object);\n if (objects.length > 0) {\n window[\"$\" + object.id] = objects.last();\n } else {\n delete window[\"$\" + object.id];\n }\n }\n }\n return null;\n };\n\n\n /**\n * Adds a game object to the manager. The game object is then automatically updated by the manager.\n *\n * @method addObject\n * @param {gs.Object_Base} object - The game object to add.\n */\n\n ObjectManager.prototype.addObject = function(object) {\n return this.add(object);\n };\n\n\n /**\n * Removes a game object to the manager. The game object is then no longer automatically updated or disposed by the manager.\n *\n * @method removeObject\n * @param {gs.Object_Base} object - The game object to remove.\n */\n\n ObjectManager.prototype.removeObject = function(object) {\n return this.remove(object);\n };\n\n\n /**\n * Adds a game object to the manager. The game object is then automatically updated by the manager.\n *\n * @method add\n * @param {gs.Object_Base} object - The game object to add.\n */\n\n ObjectManager.prototype.add = function(object) {\n this.objects.push(object);\n this.needsSort = true;\n this.registerObject(object);\n return this.addToGroup(object, object.group);\n };\n\n\n /**\n * Removes a game object to the manager. The game object is then no longer automatically updated or disposed by the manager.\n *\n * @method remove\n * @param {gs.Object_Base} object - The game object to remove.\n */\n\n ObjectManager.prototype.remove = function(object) {\n var ref;\n if (object) {\n this.objects.remove(object);\n this.unregisterObject(object);\n if (object.group != null) {\n return (ref = this.objectsByGroup[object.group]) != null ? ref.remove(object) : void 0;\n }\n }\n };\n\n\n /**\n * Gets an object by ID.\n *\n * @method objectById\n * @param {String} id - The ID of the game object to get. \n * @return {gs.Object_Base} The game object or <b>null</b> if no game object is registered for the specified ID.\n */\n\n ObjectManager.prototype.objectById = function(id) {\n var ref;\n return (ref = this.objectsById[id]) != null ? ref.last() : void 0;\n };\n\n\n /**\n * Gets an object by ID.\n *\n * @method byId\n * @param {String} id - The ID of the game object to get. \n * @return {gs.Object_Base} The game object or <b>null</b> if no game object is registered for the specified ID.\n */\n\n ObjectManager.prototype.byId = function(id) {\n var ref;\n return (ref = this.objectsById[id]) != null ? ref.last() : void 0;\n };\n\n\n /**\n * Sets the object for an ID.\n *\n * @method setObjectById\n * @param {gs.Object_Base} object - The game object to set.\n * @param {String} id - The ID for the game object.\n */\n\n ObjectManager.prototype.setObjectById = function(object, id) {\n if (!id) {\n return;\n }\n object.id = id;\n if (!this.objectsById[id]) {\n this.objectsById[id] = [object];\n } else {\n this.objectsById[id].push(object);\n }\n return window[\"$\" + id] = object;\n };\n\n\n /**\n * Adds an object to a specified object-group.\n *\n * @method addToGroup\n * @param {gs.Object_Base} object - The game object to add.\n * @param {String} group - The group to assign game object to.\n */\n\n ObjectManager.prototype.addToGroup = function(object, group) {\n var ref;\n if (group != null) {\n if ((ref = this.objectsByGroup_[object.group]) != null) {\n ref.remove(object);\n }\n if (!this.objectsByGroup_[group]) {\n this.objectsByGroup_[group] = [];\n }\n return this.objectsByGroup_[group].push(object);\n }\n };\n\n\n /**\n * Gets all object of a specified object-group.\n *\n * @method objectsByGroup\n * @param {String} group - The object-group.\n * @return {gs.Object_Base[]} The game objects belonging to the specified group.\n */\n\n ObjectManager.prototype.objectsByGroup = function(group) {\n return this.objectsByGroup_[group] || [];\n };\n\n\n /**\n * Updates the manager and all assigned game objects in the right order.\n *\n * @method update\n */\n\n ObjectManager.prototype.update = function() {\n var i, object;\n i = 0;\n if (this.needsSort) {\n this.objects.sort(function(a, b) {\n if (a.order < b.order) {\n return 1;\n } else if (a.order > b.order) {\n return -1;\n } else {\n return 0;\n }\n });\n this.needsSort = false;\n }\n while (i < this.objects.length) {\n object = this.objects[i];\n if (object.disposed) {\n this.removeObject(object);\n } else {\n if (object.active) {\n object.update();\n }\n i++;\n }\n }\n return null;\n };\n\n return ObjectManager;\n\n})();\n\ngs.ObjectManager = ObjectManager;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUE7O0FBQU07O0FBQ0Y7Ozs7OztFQU1BLGFBQUMsQ0FBQSxPQUFELEdBQVU7OztBQUVWOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvQmEsdUJBQUE7O0FBQ1Q7Ozs7O0lBS0EsSUFBQyxDQUFBLE9BQUQsR0FBVzs7QUFFWDs7Ozs7SUFLQSxJQUFDLENBQUEsV0FBRCxHQUFlOztBQUVmOzs7OztJQUtBLElBQUMsQ0FBQSxlQUFELEdBQW1COztBQUVuQjs7Ozs7SUFLQSxJQUFDLENBQUEsTUFBRCxHQUFVOztBQUVWOzs7OztJQUtBLElBQUMsQ0FBQSxTQUFELEdBQWE7RUFsQ0o7OztBQW9DYjs7Ozs7OzBCQUtBLE9BQUEsR0FBUyxTQUFBO0FBQ0wsUUFBQTtBQUFBO0FBQUE7U0FBQSxxQ0FBQTs7TUFDSSxJQUFHLENBQUksTUFBTSxDQUFDLFFBQWQ7cUJBQ0ksTUFBTSxDQUFDLE9BQVAsQ0FBQSxHQURKO09BQUEsTUFBQTs2QkFBQTs7QUFESjs7RUFESzs7O0FBS1Q7Ozs7OzswQkFLQSxjQUFBLEdBQWdCLFNBQUE7QUFDWixRQUFBO0lBQUEsSUFBQSxHQUFPLE1BQU0sQ0FBQyxJQUFQLENBQVksSUFBQyxDQUFBLFdBQWI7QUFDUDtTQUFBLHNDQUFBOztNQUNJLE1BQUEsR0FBUyxJQUFDLENBQUEsV0FBWSxDQUFBLENBQUE7TUFDdEIsSUFBRyxNQUFBLElBQVcsQ0FBSSxNQUFNLENBQUMsUUFBekI7cUJBQ0ksTUFBTSxDQUFDLE9BQVAsQ0FBQSxHQURKO09BQUEsTUFBQTs2QkFBQTs7QUFGSjs7RUFGWTs7O0FBT2hCOzs7Ozs7MEJBS0EsY0FBQSxHQUFnQixTQUFDLE1BQUQ7SUFDWixJQUFHLGlCQUFIO01BQ0ksSUFBRyxDQUFDLElBQUMsQ0FBQSxXQUFZLENBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBakI7UUFDSSxJQUFDLENBQUEsV0FBWSxDQUFBLE1BQU0s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LENBQTZCLE1BQTdCLEVBSko7O0VBRFE7OztBQU9aOzs7Ozs7OzswQkFPQSxjQUFBLEdBQWdCLFNBQUMsS0FBRDtXQUFXLElBQUMsQ0FBQSxlQUFnQixDQUFBLEtBQUEsQ0FBakIsSUFBMkI7RUFBdEM7OztBQUdoQjs7Ozs7OzBCQUtBLE1BQUEsR0FBUSxTQUFBO0FBQ0osUUFBQTtJQUFBLENBQUEsR0FBSTtJQUVKLElBQUcsSUFBQyxDQUFBLFNBQUo7TUFDSSxJQUFDLENBQUEsT0FBTyxDQUFDLElBQVQsQ0FBYyxTQUFDLENBQUQsRUFBSSxDQUFKO1FBQ1YsSUFBRyxDQUFDLENBQUMsS0FBRixHQUFVLENBQUMsQ0FBQyxLQUFmO0FBQ0ksaUJBQU8sRUFEWDtTQUFBLE1BRUssSUFBRyxDQUFDLENBQUMsS0FBRixHQUFVLENBQUMsQ0FBQyxLQUFmO0FBQ0QsaUJBQU8sQ0FBQyxFQURQO1NBQUEsTUFBQTtBQUdELGlCQUFPLEVBSE47O01BSEssQ0FBZDtNQU9BLElBQUMsQ0FBQSxTQUFELEdBQWEsTUFSakI7O0FBVUEsV0FBTSxDQUFBLEdBQUksSUFBQyxDQUFBLE9BQU8sQ0FBQyxNQUFuQjtNQUNJLE1BQUEsR0FBUyxJQUFDLENBQUEsT0FBUSxDQUFBLENBQUE7TUFDbEIsSUFBRyxNQUFNLENBQUMsUUFBVjtRQUNJLElBQUMsQ0FBQSxZQUFELENBQWMsTUFBZCxFQURKO09BQUEsTUFBQTtRQUdJLElBQW1CLE1BQU0sQ0FBQyxNQUExQjtVQUFBLE1BQU0sQ0FBQyxNQUFQLENBQUEsRUFBQTs7UUFDQSxDQUFBLEdBSko7O0lBRko7QUFRQSxXQUFPO0VBckJIOzs7Ozs7QUF1QlosRUFBRSxDQUFDLGFBQUgsR0FBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiNcbiMgICBTY3JpcHQ6IE9iamVjdE1hbmFnZXJcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIE9iamVjdE1hbmFnZXJcbiAgICAjIyMqXG4gICAgKiBTdG9yZXMgdGhlIGN1cnJlbnQgZGVmYXVsdCBPYmplY3RNYW5hZ2VyLlxuICAgICogQHByb3BlcnR5IGN1cnJlbnRcbiAgICAqIEB0eXBlIGdzLk9iamVjdE1hbmFnZXJcbiAgICAqIEBzdGF0aWNcbiAgICAjIyMgXG4gICAgQGN1cnJlbnQ6IG51bGxcbiAgICBcbiAgICAjIyMqXG4gICAgKiBNYW5hZ2VzIGdhbWUgb2JqZWN0cyBieSB1cGRhdGluZyBpZiBuZWNlc3NhcnkgYW5kIG9mZmVyaW5nXG4gICAgKiBtZXRob2RzIHRvIGFkZCBvciByZW1vdmUgZ2FtZSBvYmplY3RzLiBBbGwgZ2FtZSBvYmplY3RzIGFyZSBzb3J0ZWQgYnlcbiAgICAqIHRoZSBvcmRlci1wcm9wZXJ0eSB0byBnaXZlIGNvbnRyb2wgb3ZlciB0aGUgdXBkYXRlLW9yZGVyLlxuICAgICpcbiAgICAqIEEgZ2FtZSBvYmplY3QgY2FuIHJlZ2lzdGVyZWQgdW5kZXIgYSB1bmlxdWUgSUQgYW5kIHRoZW4gZWFzaWx5IGFjY2Vzc2VkIHVzaW5nXG4gICAgKiB0aGF0IElELiBJZiBhbiBvYmplY3QgZ2V0cyByZWdpc3RlcmVkLCBhIGdsb2JhbCB2YXJpYWJsZSAkPElEPiBpcyBjcmVhdGVkXG4gICAgKiBhcyB3ZWxsLiBIb3dldmVyLCB0aGF0IGdsb2JhbCB2YXJpYWJsZSBpcyBvbmx5IGZvciB0aGUgdXNlIGluIHByb3BlcnR5LWJpbmRpbmdzXG4gICAgKiB1c2VkIGZvciBJbi1HYW1lIFVJLiBTZWUgdWkuQ29tcG9uZW50X0JpbmRpbmdIYW5kbGVyLlxuICAgICpcbiAgICAqIEluIGFkZGl0aW9uLCBhIGdhbWUgb2JqZWN0IGNhbiBiZSBhc3NpZ25lZCB0byBhIGdyb3VwIGxpa2UgZm9yIGV4YW1wbGVcbiAgICAqIGEgc2V0IG9mIFVJIHRvZ2dsZS1idXR0b25zIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgc2FtZSBncm91cCBhbmQgdGhlblxuICAgICogZWFzaWx5IGFjY2Vzc2VkIGxhdGVyIHVzaW5nIGdzLk9iamVjdE1hbmFnZXIub2JqZWN0c0J5R3JvdXAgbWV0aG9kLlxuICAgICpcbiAgICAqIEBtb2R1bGUgZ3NcbiAgICAqIEBjbGFzcyBPYmplY3RNYW5hZ2VyXG4gICAgKiBAbWVtYmVyb2YgZ3NcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICogQHNlZSB1aS5Db21wb25lbnRfQmluZGluZ0hhbmRsZXJcbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogLT5cbiAgICAgICAgIyMjKlxuICAgICAgICAqIEFsbCBnYW1lIG9iamVjdHMgdG8gbWFuYWdlLlxuICAgICAgICAqIEBwcm9wZXJ0eSBvYmplY3RzXG4gICAgICAgICogQHR5cGUgZ3MuT2JqZWN0X0Jhc2VbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBvYmplY3RzID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBBbGwgZ2FtZSBvYmplY3RzIGJ5IElELlxuICAgICAgICAqIEBwcm9wZXJ0eSBvYmplY3RzQnlJZFxuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyMgXG4gICAgICAgIEBvYmplY3RzQnlJZCA9IHt9XG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQWxsIGdhbWUgb2JqZWN0cyBieSBncm91cC5cbiAgICAgICAgKiBAcHJvcGVydHkgb2JqZWN0c0J5R3JvdXBfXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjIyBcbiAgICAgICAgQG9iamVjdHNCeUdyb3VwXyA9IHt9XG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBPYmplY3RNYW5hZ2VyIGlzIGFjdGl2ZS4gSWYgPGI+ZmFsc2U8L2I+IHRoZSBnYW1lIG9iamVjdHMgYXJlIG5vdCB1cGRhdGVkLlxuICAgICAgICAqIEBwcm9wZXJ0eSBhY3RpdmVcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICMjIyBcbiAgICAgICAgQGFjdGl2ZSA9IHllc1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgT2JqZWN0TWFuYWdlciBuZWVkcyB0byBzb3J0IHRoZSBnYW1lIG9iamVjdHMuXG4gICAgICAgICogQHByb3BlcnR5IGFjdGl2ZVxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgIyMjIFxuICAgICAgICBAbmVlZHNTb3J0ID0geWVzXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIERpc3Bvc2VzIHRoZSBtYW5hZ2VyIGFuZCBhbGwgYXNzaWduZWQgZ2FtZSBvYmplY3RzLlxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZVxuICAgICMjI1xuICAgIGRpc3Bvc2U6IC0+XG4gICAgICAgIGZvciBvYmplY3QgaW4gQG9iamVjdHNcbiAgICAgICAgICAgIGlmIG5vdCBvYmplY3QuZGlzcG9zZWRcbiAgICAgICAgICAgICAgICBvYmplY3QuZGlzcG9zZSgpXG4gICAgIFxuICAgICMjIypcbiAgICAqIERpc3Bvc2VzIGFsbCBhc3NpZ25lZCBnYW1lIG9iamVjdHMuXG4gICAgKlxuICAgICogQG1ldGhvZCBkaXNwb3NlT2JqZWN0c1xuICAgICMjIyAgICAgICAgICAgXG4gICAgZGlzcG9zZU9iamVjdHM6IC0+XG4gICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhAb2JqZWN0c0J5SWQpXG4gICAgICAgIGZvciBrIGluIGtleXNcbiAgICAgICAgICAgIG9iamVjdCA9IEBvYmplY3RzQnlJZFtrXVxuICAgICAgICAgICAgaWYgb2JqZWN0IGFuZCBub3Qgb2JqZWN0LmRpc3Bvc2VkXG4gICAgICAgICAgICAgICAgb2JqZWN0LmRpc3Bvc2UoKVxuICAgIFxuICAgICMjIypcbiAgICAqIFJlZ2lzdGVycyBhbiBvYmplY3QuXG4gICAgKlxuICAgICogQG1ldGhvZCByZWdpc3Rlck9iamVjdFxuICAgICMjI1xuICAgIHJlZ2lzdGVyT2JqZWN0OiAob2JqZWN0KSAtPlxuICAgICAgICBpZiBvYmplY3QuaWQ/XG4gICAgICAgICAgICBpZiAhQG9iamVjdHNCeUlkW29iamVjdC5pZF1cbiAgICAgICAgICAgICAgICBAb2JqZWN0c0J5SWRbb2JqZWN0LmlkXSA9IFtdXG4gICAgICAgICAgICBAb2JqZWN0c0J5SWRbb2JqZWN0LmlkXS5wdXNoKG9iamVjdClcbiAgICAgICAgICAgICMgRklYTUU6IFNob3VsZCBiZSBoYW5kbGVkIGJ5IFVpTWFuYWdlciBzaW5jZSBpdCBpcyBVSSBzcGVjaWZpYy5cbiAgICAgICAgICAgIHdpbmRvd1tcIiRcIitvYmplY3QuaWRdID0gb2JqZWN0XG4gICAgXG4gICAgIyMjKlxuICAgICogVW5yZWdpc3RlcnMgYW4gb2JqZWN0LlxuICAgICpcbiAgICAqIEBtZXRob2QgdW5yZWdpc3Rlck9iamVjdFxuICAgICMjIyAgICAgICAgXG4gICAgdW5yZWdpc3Rlck9iamVjdDogKG9iamVjdCkgLT5cbiAgICAgICAgaWYgb2JqZWN0Py5pZD9cbiAgICAgICAgICAgIG9iamVjdHMgPSBAb2JqZWN0c0J5SWRbb2JqZWN0LmlkXVxuICAgICAgICAgICAgaWYgb2JqZWN0c1xuICAgICAgICAgICAgICAgIG9iamVjdHMucmVtb3ZlKG9iamVjdClcbiAgICAgICAgICAgICAgICBpZiBvYmplY3RzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgd2luZG93W1wiJFwiK29iamVjdC5pZF0gPSBvYmplY3RzLmxhc3QoKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvd1tcIiRcIitvYmplY3QuaWRdXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgXG4gICAgIyMjKlxuICAgICogQWRkcyBhIGdhbWUgb2JqZWN0IHRvIHRoZSBtYW5hZ2VyLiBUaGUgZ2FtZSBvYmplY3QgaXMgdGhlbiBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIG1hbmFnZXIuXG4gICAgKlxuICAgICogQG1ldGhvZCBhZGRPYmplY3RcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IG9iamVjdCAtIFRoZSBnYW1lIG9iamVjdCB0byBhZGQuXG4gICAgIyMjICAgICAgICBcbiAgICBhZGRPYmplY3Q6IChvYmplY3QpIC0+IEBhZGQob2JqZWN0KVxuICAgIFxuICAgICMjIypcbiAgICAqIFJlbW92ZXMgYSBnYW1lIG9iamVjdCB0byB0aGUgbWFuYWdlci4gVGhlIGdhbWUgb2JqZWN0IGlzIHRoZW4gbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBvciBkaXNwb3NlZCBieSB0aGUgbWFuYWdlci5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHJlbW92ZU9iamVjdFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gb2JqZWN0IC0gVGhlIGdhbWUgb2JqZWN0IHRvIHJlbW92ZS5cbiAgICAjIyMgICAgICAgIFxuICAgIHJlbW92ZU9iamVjdDogKG9iamVjdCkgLT4gQHJlbW92ZShvYmplY3QpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWRkcyBhIGdhbWUgb2JqZWN0IHRvIHRoZSBtYW5hZ2VyLiBUaGUgZ2FtZSBvYmplY3QgaXMgdGhlbiBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIG1hbmFnZXIuXG4gICAgKlxuICAgICogQG1ldGhvZCBhZGRcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IG9iamVjdCAtIFRoZSBnYW1lIG9iamVjdCB0byBhZGQuXG4gICAgIyMjIFxuICAgIGFkZDogKG9iamVjdCkgLT4gXG4gICAgICAgICNAb2JqZWN0cy5zcGxpY2UoMCwgMCwgb2JqZWN0KVxuICAgICAgICBAb2JqZWN0cy5wdXNoKG9iamVjdClcbiAgICAgICAgQG5lZWRzU29ydCA9IHllc1xuICAgICAgICBAcmVnaXN0ZXJPYmplY3Qob2JqZWN0KVxuICAgICAgICBAYWRkVG9Hcm91cChvYmplY3QsIG9iamVjdC5ncm91cClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogUmVtb3ZlcyBhIGdhbWUgb2JqZWN0IHRvIHRoZSBtYW5hZ2VyLiBUaGUgZ2FtZSBvYmplY3QgaXMgdGhlbiBubyBsb25nZXIgYXV0b21hdGljYWxseSB1cGRhdGVkIG9yIGRpc3Bvc2VkIGJ5IHRoZSBtYW5hZ2VyLlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVtb3ZlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBvYmplY3QgLSBUaGUgZ2FtZSBvYmplY3QgdG8gcmVtb3ZlLlxuICAgICMjIyBcbiAgICByZW1vdmU6IChvYmplY3QpIC0+IFxuICAgICAgICBpZiBvYmplY3RcbiAgICAgICAgICAgIEBvYmplY3RzLnJlbW92ZShvYmplY3QpXG4gICAgICAgICAgICBAdW5yZWdpc3Rlck9iamVjdChvYmplY3QpXG4gICAgICAgICAgICBpZiBvYmplY3QuZ3JvdXA/XG4gICAgICAgICAgICAgICAgQG9iamVjdHNCeUdyb3VwW29iamVjdC5ncm91cF0/LnJlbW92ZShvYmplY3QpXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyBhbiBvYmplY3QgYnkgSUQuXG4gICAgKlxuICAgICogQG1ldGhvZCBvYmplY3RCeUlkXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBUaGUgSUQgb2YgdGhlIGdhbWUgb2JqZWN0IHRvIGdldC4gXG4gICAgKiBAcmV0dXJuIHtncy5PYmplY3RfQmFzZX0gVGhlIGdhbWUgb2JqZWN0IG9yIDxiPm51bGw8L2I+IGlmIG5vIGdhbWUgb2JqZWN0IGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGVjaWZpZWQgSUQuXG4gICAgIyMjICAgICAgICAgXG4gICAgb2JqZWN0QnlJZDogKGlkKSAtPiBAb2JqZWN0c0J5SWRbaWRdPy5sYXN0KClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIGFuIG9iamVjdCBieSBJRC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGJ5SWRcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBJRCBvZiB0aGUgZ2FtZSBvYmplY3QgdG8gZ2V0LiBcbiAgICAqIEByZXR1cm4ge2dzLk9iamVjdF9CYXNlfSBUaGUgZ2FtZSBvYmplY3Qgb3IgPGI+bnVsbDwvYj4gaWYgbm8gZ2FtZSBvYmplY3QgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHNwZWNpZmllZCBJRC5cbiAgICAjIyMgXG4gICAgYnlJZDogKGlkKSAtPiBAb2JqZWN0c0J5SWRbaWRdPy5sYXN0KClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBTZXRzIHRoZSBvYmplY3QgZm9yIGFuIElELlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0T2JqZWN0QnlJZFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gb2JqZWN0IC0gVGhlIGdhbWUgb2JqZWN0IHRvIHNldC5cbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCAtIFRoZSBJRCBmb3IgdGhlIGdhbWUgb2JqZWN0LiBcbiAgICAjIyMgXG4gICAgc2V0T2JqZWN0QnlJZDogKG9iamVjdCwgaWQpIC0+IFxuICAgICAgICBpZiAhaWQgdGhlbiByZXR1cm5cbiAgICAgICAgXG4gICAgICAgIG9iamVjdC5pZCA9IGlkXG4gICAgICAgIGlmICFAb2JqZWN0c0J5SWRbaWRdXG4gICAgICAgICAgICBAb2JqZWN0c0J5SWRbaWRdID0gW29iamVjdF1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQG9iamVjdHNCeUlkW2lkXS5wdXNoKG9iamVjdClcbiAgICAgICAgICAgIFxuICAgICAgICB3aW5kb3dbXCIkXCIraWRdID0gb2JqZWN0XG4gICAgXG4gICAgIyMjKlxuICAgICogQWRkcyBhbiBvYmplY3QgdG8gYSBzcGVjaWZpZWQgb2JqZWN0LWdyb3VwLlxuICAgICpcbiAgICAqIEBtZXRob2QgYWRkVG9Hcm91cFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gb2JqZWN0IC0gVGhlIGdhbWUgb2JqZWN0IHRvIGFkZC5cbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cCAtIFRoZSBncm91cCB0byBhc3NpZ24gZ2FtZSBvYmplY3QgdG8uIFxuICAgICMjIyBcbiAgICBhZGRUb0dyb3VwOiAob2JqZWN0LCBncm91cCkgLT5cbiAgICAgICAgaWYgZ3JvdXA/XG4gICAgICAgICAgICBAb2JqZWN0c0J5R3JvdXBfW29iamVjdC5ncm91cF0/LnJlbW92ZShvYmplY3QpXG4gICAgICAgICAgICBpZiAhQG9iamVjdHNCeUdyb3VwX1tncm91cF1cbiAgICAgICAgICAgICAgICBAb2JqZWN0c0J5R3JvdXBfW2dyb3VwXSA9IFtdXG4gICAgICAgICAgICBAb2JqZWN0c0J5R3JvdXBfW2dyb3VwXS5wdXNoKG9iamVjdClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIGFsbCBvYmplY3Qgb2YgYSBzcGVjaWZpZWQgb2JqZWN0LWdyb3VwLlxuICAgICpcbiAgICAqIEBtZXRob2Qgb2JqZWN0c0J5R3JvdXBcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSBncm91cCAtIFRoZSBvYmplY3QtZ3JvdXAuXG4gICAgKiBAcmV0dXJuIHtncy5PYmplY3RfQmFzZVtdfSBUaGUgZ2FtZSBvYmplY3RzIGJlbG9uZ2luZyB0byB0aGUgc3BlY2lmaWVkIGdyb3VwLlxuICAgICMjIyAgICAgICAgIFxuICAgIG9iamVjdHNCeUdyb3VwOiAoZ3JvdXApIC0+IEBvYmplY3RzQnlHcm91cF9bZ3JvdXBdIHx8IFtdXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgbWFuYWdlciBhbmQgYWxsIGFzc2lnbmVkIGdhbWUgb2JqZWN0cyBpbiB0aGUgcmlnaHQgb3JkZXIuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyMgIFxuICAgIHVwZGF0ZTogLT4gXG4gICAgICAgIGkgPSAwXG4gICAgICAgIFxuICAgICAgICBpZiBAbmVlZHNTb3J0XG4gICAgICAgICAgICBAb2JqZWN0cy5zb3J0IChhLCBiKSAtPlxuICAgICAgICAgICAgICAgIGlmIGEub3JkZXIgPCBiLm9yZGVyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxXG4gICAgICAgICAgICAgICAgZWxzZSBpZiBhLm9yZGVyID4gYi5vcmRlclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgICBAbmVlZHNTb3J0ID0gbm9cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgd2hpbGUgaSA8IEBvYmplY3RzLmxlbmd0aFxuICAgICAgICAgICAgb2JqZWN0ID0gQG9iamVjdHNbaV1cbiAgICAgICAgICAgIGlmIG9iamVjdC5kaXNwb3NlZFxuICAgICAgICAgICAgICAgIEByZW1vdmVPYmplY3Qob2JqZWN0KVxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICBvYmplY3QudXBkYXRlKCkgaWYgb2JqZWN0LmFjdGl2ZVxuICAgICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIFxuZ3MuT2JqZWN0TWFuYWdlciA9IE9iamVjdE1hbmFnZXIgI25ldyBPYmplY3RNYW5hZ2VyKCkiXX0=\n//# sourceURL=ObjectManager_2.js"
13 13 },
14 14 "summary": [
15 15 "name",