Subversion Repository Public Repository

Nextrek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
    "uid": "8DBB050CK548EA49A5S800AE8C9C8A84C8B9",
    "isLoaded": true,
    "lastModificationTime": 0,
    "items": {
        "name": "ObjectManager",
        "type": "game_script",
        "order": 0,
        "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()",
        "parentId": "C0268943K60B3A42B7SA6F1EDDCF2F642FD7",
        "folder": false,
        "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"
    },
    "summary": [
        "name",
        "type",
        "order"
    ]
}

Commits for Nextrek/s2s/data/8DBB050CK548EA49A5S800AE8C9C8A84C8B9.json

Diff revisions: vs.
Revision Author Commited Message
1084 MOliva picture MOliva Fri 11 May, 2018 12:41:55 +0000