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": "310BAD46K234CA48DBSABF0EE1601511F062",
    "isLoaded": true,
    "lastModificationTime": 0,
    "items": {
        "name": "Component_MessageBehavior",
        "type": "game_script",
        "order": 12,
        "content": "# ===================================================================\n#\n#   Script: Component_MessageBehavior\n#\n#   $$COPYRIGHT$$\n#\n# ===================================================================\n###*\n* An enumeration of game message modes.\n*\n* ADV - Adventure Mode\n* NVL - Novel Mode\n*\n* @typedef MessageMode\n* @memberof vn\n###\nclass MessageMode\n    @ADV = 0\n    @NVL = 1\n    \nvn.MessageMode = MessageMode\n\n\nclass Component_MessageBehavior extends gs.Component\n    @objectCodecBlackList = [\"onMessageWaiting\", \"onMessageFinish\"]\n    \n    ###*\n    * Called if this object instance is restored from a data-bundle. It can be used\n    * re-assign event-handler, anonymous functions, etc.\n    * \n    * @method onDataBundleRestore.\n    * @param Object data - The data-bundle\n    * @param gs.ObjectCodecContext context - The codec-context.\n    ###\n    onDataBundleRestore: (data, context) ->\n        @tempSettings = GameManager.tempSettings\n        @setupEventHandlers()\n        \n    ###*\n    * A behavior-component to define the behavior of a game-message.\n    *\n    * @module vn\n    * @class Component_MessageBehavior\n    * @extends gs.Component\n    * @memberof vn\n    * @constructor\n    ###\n    constructor: ->\n        ###*\n        * Reference to game settings.\n        * @property settings\n        * @type Object\n        * @protected\n        ###\n        @settings = GameManager.settings\n        ###*\n        * Reference to temporary game settings.\n        * @property settings\n        * @type Object\n        * @protected\n        ###\n        @tempSettings = GameManager.tempSettings\n        \n        ###*\n        * Indicates if the message is currently waiting.\n        * @property isWaiting\n        * @type boolean\n        * @readOnly\n        ###\n        @isWaiting = no\n        \n        ###*\n        * Indicates if the message is currently running.\n        * @property isRunning\n        * @type boolean\n        * @readOnly\n        ###\n        @isRunning = no\n        \n        ###*\n        * Indicates if a voice is currently playing together with the message.\n        * @property isVoicePlaying\n        * @type boolean\n        * @readOnly\n        ###\n        @isVoicePlaying = no\n        \n        ###*\n        * Current message caret/cursor position.\n        * @property caretPosition\n        * @type gs.Point\n        * @readOnly\n        ###\n        @caretPosition = new gs.Point(0, 0)\n        \n        ###*\n        * Current raw message text.\n        * @property message\n        * @type string\n        * @readOnly\n        ###\n        @message = \"\"\n        \n        ###*\n        * All currently displayed raw messages.\n        * @property messages\n        * @type string[]\n        * @readOnly\n        ###\n        @messages = []\n        \n        ###*\n        * Voice associated with the current message.\n        * @property voice\n        * @type gs.AudioBufferReference\n        ###\n        @voice = null\n        \n        ###*\n        * Indicates if current message is partial. DEPRECATED. Please do not use.\n        * @property partial\n        * @deprecated\n        * @type boolean\n        * @readOnly\n        ###\n        @partial = no\n        \n        ###*\n        * Indicates if the message is currently waiting in live-preview.\n        * @property waitingPreview\n        * @type boolean\n        * @readOnly\n        ###\n        @waitingPreview = no\n        \n        ###*\n        * Indicates if the auto-message is enabled.\n        * @property autoMessageEnabled\n        * @type boolean\n        * @readOnly\n        ###\n        @autoMessageEnabled = no\n      \n        @onMessageFinish = (sender) =>\n            @object.events.emit \"finish\", this\n            \n            if @object.settings.autoErase or @object.settings.paragraphSpacing > 0\n                @message = \"\"\n            \n        @onMessageWaiting = (sender) =>\n            if !@object.textRenderer.isBatched() or !@object.textRenderer.isBatchInProgress()\n                @object.textRenderer.waitAtEnd = !@partial\n                @object.events.emit \"waiting\", this\n    ###*\n    * Adds event-handlers\n    *\n    * @method setupEventHandlers\n    ### \n    setupEventHandlers: ->\n        @object.events.offByOwner(\"messageFinish\", this)\n        @object.events.offByOwner(\"messageWaiting\", this)\n        \n        @object.events.on \"messageFinish\", gs.CallBack(\"onMessageFinish\", this), null, this\n        @object.events.on \"messageWaiting\", gs.CallBack(\"onMessageWaiting\", this), null, this\n            \n        gs.GlobalEventManager.offByOwner(\"previewWaiting\", this)\n        gs.GlobalEventManager.offByOwner(\"previewRestart\", this)\n                \n        gs.GlobalEventManager.on \"previewWaiting\", ((sender) =>\n            @waitingPreview = yes\n        ), null, this\n        \n        gs.GlobalEventManager.on \"previewRestart\", ((sender) =>\n            @waitingPreview = no\n        ), null, this\n        \n    ###*\n    * Setup the component. Adds event handlers.\n    *\n    * @method setup\n    ###\n    setup: ->\n        @setupEventHandlers()\n     \n    ###*\n    * Disposes the component.\n    *\n    * @method toDataBundle\n    ###   \n    dispose: ->\n        super\n        \n        gs.GlobalEventManager.offByOwner(\"previewWaiting\", this)\n        gs.GlobalEventManager.offByOwner(\"previewRestart\", this)\n                \n    ###*\n    * Not implemented yet.\n    *\n    * @method toDataBundle\n    ###\n    toDataBundle: ->\n    ###*\n    * Not implemented yet.\n    *\n    * @method restore\n    * @param {Object} bundle - A data bundle.\n    ###    \n    restore: (bundle) ->\n        \n    ###*\n    * Action to show a game message.\n    *\n    * @method showMessage\n    * @param {Object} sender - The sender of this action.\n    * @param {Object} params - An object containing the necessary parameters.\n    ###\n    showMessage: (sender, params) ->\n        gs.GameNotifier.postContextChange(lcsm(params.message))\n        \n        @partial = params.partial\n        @message += lcsm(params.message)\n        @addMessage(params.message, RecordManager.characters[params.characterId], @object.messages.length > 0 and @object.settings.paragraphSpacing > 0, !@partial)\n        \n        if @object.textRenderer.isBatched()\n            @object.textRenderer.waitAtEnd = yes\n        else\n            @object.textRenderer.waitAtEnd = !@partial\n            \n        \n    ###*\n    * Deprecated. Not longer used.\n    *\n    * @method updateBitmap\n    ###\n    updateBitmap: ->\n        if !@object.bitmap or @object.bitmap.width != @object.dstRect.width or @object.bitmap.height != @object.dstRect.height\n            @object.bitmap?.dispose()\n            @object.bitmap = new Bitmap(@object.dstRect.width, @object.dstRect.height)\n            @object.bitmap.font = @object.font\n          \n    ###*\n    * Restores a NVL game message of an array of message-objects. That is\n    * necessary to restore a NVL game message from a save-game.\n    *\n    * @method restoreMessages\n    * @param {Array} messages - An array of messages to restore.\n    ###\n    restoreMessages: (messages) ->\n        @updateBitmap()\n        @clear()\n        \n        @object.opacity = 255\n        @object.srcRect = new Rect(0, 0, @object.dstRect.width, @object.dstRect.height)\n        \n        for message in messages\n            @object.font.color = new Color(message.character?.textColor || Color.WHITE)\n            @object.textRenderer.drawFormattedTextImmediately(0, 0, @object.dstRect.width, @object.dstRect.height, lcsm(message.text ? message), yes)\n\n        return null\n        \n    ###*\n    * Adds a new message.\n    * \n    * @method addMessage\n    * @param {string} message - The message.\n    * @param {Object} character - Database-Record of a character.\n    * @param {boolean} newLine - Indicates if the message should make a line break.\n    ###\n    addMessage: (message, character, newLine, waitAtEnd) ->\n        @object.textRenderer.partialMessage = null\n        @object.offset = x: 0, y: 0\n        @object.visible = yes\n        \n        @object.messages.push({ text: message, character: character})\n        \n        @object.textRenderer.waitAtEnd = waitAtEnd\n        if not @object.settings.autoErase\n            @object.textRenderer.currentY += @object.settings.paragraphSpacing\n        if newLine\n            @object.textRenderer.newLine()\n        @updateBitmap()\n            \n        if character? and @object.settings.useCharacterColor\n            @object.font.color = new Color(character?.textColor || Color.WHITE)\n            \n        @object.opacity = 255\n        @object.srcRect = new Rect(0, 0, @object.dstRect.width, @object.dstRect.height)\n     \n        @update()\n        @object.textRenderer.drawFormattedText(0, 0, @object.dstRect.width, @object.dstRect.height, message, yes)\n\n    ###*\n    * Clears the game message by deleting/clearing all messages.\n    *\n    * @method clear\n    ###\n    clear: -> \n        @object.textRenderer.clear()\n        @object.messages = []\n        @message = \"\"\n        \n    ###*\n    * Closes the game message by making it invisible.\n    *\n    * @method close\n    ###\n    close: -> \n        @object.visible = no\n    \n    ###*\n    * Gets the duration of an associated voice or 0 if no voice is associated.\n    *\n    * @method voiceDuration\n    * @return {number} The duration in frames.\n    ###\n    voiceDuration: ->\n        duration = 0\n        if @voice? and (@settings.autoMessage.waitForVoice or @settings.timeMessageToVoice)\n            duration = Math.round((@voice.source.buffer.duration * (1.0 / @voice.source.playbackRate.value)) * 1000 / 16.6)\n        else\n            duration = 0\n            \n        return if @tempSettings.skip then 1 else duration\n        \n    ###*\n    * Gets the duration of rendering the game-message.\n    *\n    * @method messageDuration\n    * @return {number} The duration in frames.\n    ###\n    messageDuration: -> \n        duration = @object.textRenderer.calculateDuration()\n        \n        return if @tempSettings.skip then 1 else duration\n        \n    ###*\n    * Gets the time between two messages in auto-read mode.\n    *\n    * @method autoMessageTime\n    * @return {number} The time in frames.\n    ###\n    autoMessageTime: -> \n        if @tempSettings.skip\n            return 1\n        else\n            return Math.max(Math.round(@settings.autoMessage.time * Graphics.frameRate), @voiceDuration() - @messageDuration())\n    \n    ###*\n    * Gets the current message speed.\n    *\n    * @method messageSpeed\n    * @return {number} The message speed.\n    ###\n    messageSpeed: -> Math.max(11 - Math.round(GameManager.settings.messageSpeed * 2.5), 0)\n    \n    ###*\n    * Checks if a mouse-button or key was pressed to continue with the message-rendering.\n    *\n    * @method actionTrigger\n    * @return {boolean} If true, the an action-button or action-key is pressed.\n    ###\n    actionTrigger: -> (gs.ObjectManager.current.input and @object.visible and @object.dstRect.contains(Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y) and Input.Mouse.buttons[Input.Mouse.LEFT] == 2) or Input.trigger(Input.C)\n    \n    finish: ->\n        #@object.character = null\n        \n        if @object.voice? and GameManager.settings.skipVoiceOnAction\n            AudioManager.stopSound(@object.voice.name)\n    \n    erase: ->\n        fading = GameManager.tempSettings.messageFading\n        duration = if GameManager.tempSettings.skip then 0 else fading.duration\n        \n        @object.animator.disappear(fading.animation, fading.easing, duration, =>\n            SceneManager.scene.currentCharacter = { name: \"\" }\n            @clear()\n            @object.visible = no\n        )\n        \n    ###*\n    * FIXME: Deprecated? It is also a re-definition of gs.Component_Visual.updateOrigin.\n    *\n    * @method updateOrigin\n    ###\n    updateOrigin: ->\n        ox = 0\n        oy = 0\n        if @object.parent? and @object.parent.dstRect?\n            p = @object.parent\n            while p? and p.dstRect?\n                ox += p.dstRect.x\n                oy += p.dstRect.y\n                p = p.parent\n                    \n        @object.origin.x = ox\n        @object.origin.y = oy\n        \n    ###*\n    * Updates the object. \n    *\n    * @method updateObject\n    * @private\n    ###\n    updateObject: ->\n        @updateOrigin()\n        \n        if @tempSettings.skip and not @waitingPreview\n            @object.textRenderer.isWaiting = no\n    \n    ###*\n    * Updates the message.\n    *\n    * @method updateMessage\n    * @private\n    ###\n    updateMessage: ->\n        @caretPosition = @object.textRenderer.caretPosition\n        \n        if @tempSettings.skip and (@settings.allowSkipUnreadMessages or GameManager.globalData.messages[@message]?.read)\n            @object.textRenderer.drawImmediately = yes\n            @object.textRenderer.waitAtEnd = @waitingPreview\n            @object.textRenderer.waitAtEndTime = 0\n        else\n            #@object.textRenderer.drawImmediately = no\n            @updateSpeed()\n            @updateAutoMessage()\n            \n    ###*\n    * Updates the speed of the message. That depends on game-settings if a message\n    * is timed to its voice or not.\n    *\n    * @method updateSpeed\n    * @private\n    ###\n    updateSpeed: ->\n        voiceDuration = @voiceDuration()\n        if voiceDuration > 0 and @settings.timeMessageToVoice\n            @object.textRenderer.speed = voiceDuration / @message.length\n        else\n            @object.textRenderer.speed = @messageSpeed()\n            \n    ###*\n    * Update auto-read mode.\n    *\n    * @method updateAutoMessage\n    * @private\n    ###\n    updateAutoMessage: ->\n        if @settings.autoMessage.stopOnAction and @actionTrigger()\n            @settings.autoMessage.enabled = no\n            \n        if @settings.autoMessage.enabled and not @partial\n            if @object.textRenderer.waitAtEnd\n                @object.textRenderer.isWaiting = no\n            @object.textRenderer.waitAtEndTime = @autoMessageTime()\n            @object.textRenderer.waitAtEnd = no\n        else if @autoMessageEnabled != @settings.autoMessage.enabled\n            @object.textRenderer.waitAtEnd = yes\n            @object.textRenderer.waitAtEndTime = 0\n            \n        @autoMessageEnabled = @settings.autoMessage.enabled\n            \n    ###\n    * Updates the game message behavior\n    *\n    * @method update\n    ###\n    update: ->\n        @object.needsUpdate = yes\n        @updateObject()\n        @updateMessage()\n        \n        if @character != @object.character   \n            gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @character)\n            @character = @object.character\n            \n        if @object.textRenderer.isWaiting != @isWaiting or @object.textRenderer.isRunning != @isRunning or (@voice?.playing && (!@object.character?.timeTalkingToVoiceVolume or @voice.averageVolume > @object.character.talkingVolume)) != @isVoicePlaying\n            @isWaiting = @object.textRenderer.isWaiting\n            @isRunning = @object.textRenderer.isRunning\n            @isVoicePlaying = (@voice?.playing && (!@object.character?.timeTalkingToVoiceVolume or @voice.averageVolume > @object.character.talkingVolume))\n            \n            if not @tempSettings.skip\n                if @voice?.playing\n                    if not @isVoicePlaying\n                        gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @object.character)\n                    else\n                        gs.GlobalEventManager.emit(\"talkingStarted\", this, character: @object.character)\n                else\n                    if @isWaiting\n                        gs.GlobalEventManager.emit(\"talkingEnded\", this, character: @object.character)\n                    else if @isRunning\n                        gs.GlobalEventManager.emit(\"talkingStarted\", this, character: @object.character)\n        \n        if @object.layoutRect? and @object.parent?.dstRect?\n            if @object.layoutRect.x then @object.dstRect.x = @object.layoutRect.x(@object.parent.dstRect.width)\n            if @object.layoutRect.y then @object.dstRect.y = @object.layoutRect.y(@object.parent.dstRect.height)\n            if @object.layoutRect.width then @object.dstRect.width = @object.layoutRect.width(@object.parent.dstRect.width)\n            if @object.layoutRect.height then @object.dstRect.height = @object.layoutRect.height(@object.parent.dstRect.height)\nvn.Component_MessageBehavior = Component_MessageBehavior",
        "parentId": "D3325122KACDEA4515SB731E37A42B9D779F",
        "folder": false,
        "compiledContent": "\n/**\n* An enumeration of game message modes.\n*\n* ADV - Adventure Mode\n* NVL - Novel Mode\n*\n* @typedef MessageMode\n* @memberof vn\n */\nvar Component_MessageBehavior, MessageMode,\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\nMessageMode = (function() {\n  function MessageMode() {}\n\n  MessageMode.ADV = 0;\n\n  MessageMode.NVL = 1;\n\n  return MessageMode;\n\n})();\n\nvn.MessageMode = MessageMode;\n\nComponent_MessageBehavior = (function(superClass) {\n  extend(Component_MessageBehavior, superClass);\n\n  Component_MessageBehavior.objectCodecBlackList = [\"onMessageWaiting\", \"onMessageFinish\"];\n\n\n  /**\n  * Called if this object instance is restored from a data-bundle. It can be used\n  * re-assign event-handler, anonymous functions, etc.\n  * \n  * @method onDataBundleRestore.\n  * @param Object data - The data-bundle\n  * @param gs.ObjectCodecContext context - The codec-context.\n   */\n\n  Component_MessageBehavior.prototype.onDataBundleRestore = function(data, context) {\n    this.tempSettings = GameManager.tempSettings;\n    return this.setupEventHandlers();\n  };\n\n\n  /**\n  * A behavior-component to define the behavior of a game-message.\n  *\n  * @module vn\n  * @class Component_MessageBehavior\n  * @extends gs.Component\n  * @memberof vn\n  * @constructor\n   */\n\n  function Component_MessageBehavior() {\n\n    /**\n    * Reference to game settings.\n    * @property settings\n    * @type Object\n    * @protected\n     */\n    this.settings = GameManager.settings;\n\n    /**\n    * Reference to temporary game settings.\n    * @property settings\n    * @type Object\n    * @protected\n     */\n    this.tempSettings = GameManager.tempSettings;\n\n    /**\n    * Indicates if the message is currently waiting.\n    * @property isWaiting\n    * @type boolean\n    * @readOnly\n     */\n    this.isWaiting = false;\n\n    /**\n    * Indicates if the message is currently running.\n    * @property isRunning\n    * @type boolean\n    * @readOnly\n     */\n    this.isRunning = false;\n\n    /**\n    * Indicates if a voice is currently playing together with the message.\n    * @property isVoicePlaying\n    * @type boolean\n    * @readOnly\n     */\n    this.isVoicePlaying = false;\n\n    /**\n    * Current message caret/cursor position.\n    * @property caretPosition\n    * @type gs.Point\n    * @readOnly\n     */\n    this.caretPosition = new gs.Point(0, 0);\n\n    /**\n    * Current raw message text.\n    * @property message\n    * @type string\n    * @readOnly\n     */\n    this.message = \"\";\n\n    /**\n    * All currently displayed raw messages.\n    * @property messages\n    * @type string[]\n    * @readOnly\n     */\n    this.messages = [];\n\n    /**\n    * Voice associated with the current message.\n    * @property voice\n    * @type gs.AudioBufferReference\n     */\n    this.voice = null;\n\n    /**\n    * Indicates if current message is partial. DEPRECATED. Please do not use.\n    * @property partial\n    * @deprecated\n    * @type boolean\n    * @readOnly\n     */\n    this.partial = false;\n\n    /**\n    * Indicates if the message is currently waiting in live-preview.\n    * @property waitingPreview\n    * @type boolean\n    * @readOnly\n     */\n    this.waitingPreview = false;\n\n    /**\n    * Indicates if the auto-message is enabled.\n    * @property autoMessageEnabled\n    * @type boolean\n    * @readOnly\n     */\n    this.autoMessageEnabled = false;\n    this.onMessageFinish = (function(_this) {\n      return function(sender) {\n        _this.object.events.emit(\"finish\", _this);\n        if (_this.object.settings.autoErase || _this.object.settings.paragraphSpacing > 0) {\n          return _this.message = \"\";\n        }\n      };\n    })(this);\n    this.onMessageWaiting = (function(_this) {\n      return function(sender) {\n        if (!_this.object.textRenderer.isBatched() || !_this.object.textRenderer.isBatchInProgress()) {\n          _this.object.textRenderer.waitAtEnd = !_this.partial;\n          return _this.object.events.emit(\"waiting\", _this);\n        }\n      };\n    })(this);\n  }\n\n\n  /**\n  * Adds event-handlers\n  *\n  * @method setupEventHandlers\n   */\n\n  Component_MessageBehavior.prototype.setupEventHandlers = function() {\n    this.object.events.offByOwner(\"messageFinish\", this);\n    this.object.events.offByOwner(\"messageWaiting\", this);\n    this.object.events.on(\"messageFinish\", gs.CallBack(\"onMessageFinish\", this), null, this);\n    this.object.events.on(\"messageWaiting\", gs.CallBack(\"onMessageWaiting\", this), null, this);\n    gs.GlobalEventManager.offByOwner(\"previewWaiting\", this);\n    gs.GlobalEventManager.offByOwner(\"previewRestart\", this);\n    gs.GlobalEventManager.on(\"previewWaiting\", ((function(_this) {\n      return function(sender) {\n        return _this.waitingPreview = true;\n      };\n    })(this)), null, this);\n    return gs.GlobalEventManager.on(\"previewRestart\", ((function(_this) {\n      return function(sender) {\n        return _this.waitingPreview = false;\n      };\n    })(this)), null, this);\n  };\n\n\n  /**\n  * Setup the component. Adds event handlers.\n  *\n  * @method setup\n   */\n\n  Component_MessageBehavior.prototype.setup = function() {\n    return this.setupEventHandlers();\n  };\n\n\n  /**\n  * Disposes the component.\n  *\n  * @method toDataBundle\n   */\n\n  Component_MessageBehavior.prototype.dispose = function() {\n    Component_MessageBehavior.__super__.dispose.apply(this, arguments);\n    gs.GlobalEventManager.offByOwner(\"previewWaiting\", this);\n    return gs.GlobalEventManager.offByOwner(\"previewRestart\", this);\n  };\n\n\n  /**\n  * Not implemented yet.\n  *\n  * @method toDataBundle\n   */\n\n  Component_MessageBehavior.prototype.toDataBundle = function() {};\n\n\n  /**\n  * Not implemented yet.\n  *\n  * @method restore\n  * @param {Object} bundle - A data bundle.\n   */\n\n  Component_MessageBehavior.prototype.restore = function(bundle) {};\n\n\n  /**\n  * Action to show a game message.\n  *\n  * @method showMessage\n  * @param {Object} sender - The sender of this action.\n  * @param {Object} params - An object containing the necessary parameters.\n   */\n\n  Component_MessageBehavior.prototype.showMessage = function(sender, params) {\n    gs.GameNotifier.postContextChange(lcsm(params.message));\n    this.partial = params.partial;\n    this.message += lcsm(params.message);\n    this.addMessage(params.message, RecordManager.characters[params.characterId], this.object.messages.length > 0 && this.object.settings.paragraphSpacing > 0, !this.partial);\n    if (this.object.textRenderer.isBatched()) {\n      return this.object.textRenderer.waitAtEnd = true;\n    } else {\n      return this.object.textRenderer.waitAtEnd = !this.partial;\n    }\n  };\n\n\n  /**\n  * Deprecated. Not longer used.\n  *\n  * @method updateBitmap\n   */\n\n  Component_MessageBehavior.prototype.updateBitmap = function() {\n    var ref;\n    if (!this.object.bitmap || this.object.bitmap.width !== this.object.dstRect.width || this.object.bitmap.height !== this.object.dstRect.height) {\n      if ((ref = this.object.bitmap) != null) {\n        ref.dispose();\n      }\n      this.object.bitmap = new Bitmap(this.object.dstRect.width, this.object.dstRect.height);\n      return this.object.bitmap.font = this.object.font;\n    }\n  };\n\n\n  /**\n  * Restores a NVL game message of an array of message-objects. That is\n  * necessary to restore a NVL game message from a save-game.\n  *\n  * @method restoreMessages\n  * @param {Array} messages - An array of messages to restore.\n   */\n\n  Component_MessageBehavior.prototype.restoreMessages = function(messages) {\n    var i, len, message, ref, ref1;\n    this.updateBitmap();\n    this.clear();\n    this.object.opacity = 255;\n    this.object.srcRect = new Rect(0, 0, this.object.dstRect.width, this.object.dstRect.height);\n    for (i = 0, len = messages.length; i < len; i++) {\n      message = messages[i];\n      this.object.font.color = new Color(((ref = message.character) != null ? ref.textColor : void 0) || Color.WHITE);\n      this.object.textRenderer.drawFormattedTextImmediately(0, 0, this.object.dstRect.width, this.object.dstRect.height, lcsm((ref1 = message.text) != null ? ref1 : message), true);\n    }\n    return null;\n  };\n\n\n  /**\n  * Adds a new message.\n  * \n  * @method addMessage\n  * @param {string} message - The message.\n  * @param {Object} character - Database-Record of a character.\n  * @param {boolean} newLine - Indicates if the message should make a line break.\n   */\n\n  Component_MessageBehavior.prototype.addMessage = function(message, character, newLine, waitAtEnd) {\n    this.object.textRenderer.partialMessage = null;\n    this.object.offset = {\n      x: 0,\n      y: 0\n    };\n    this.object.visible = true;\n    this.object.messages.push({\n      text: message,\n      character: character\n    });\n    this.object.textRenderer.waitAtEnd = waitAtEnd;\n    if (!this.object.settings.autoErase) {\n      this.object.textRenderer.currentY += this.object.settings.paragraphSpacing;\n    }\n    if (newLine) {\n      this.object.textRenderer.newLine();\n    }\n    this.updateBitmap();\n    if ((character != null) && this.object.settings.useCharacterColor) {\n      this.object.font.color = new Color((character != null ? character.textColor : void 0) || Color.WHITE);\n    }\n    this.object.opacity = 255;\n    this.object.srcRect = new Rect(0, 0, this.object.dstRect.width, this.object.dstRect.height);\n    this.update();\n    return this.object.textRenderer.drawFormattedText(0, 0, this.object.dstRect.width, this.object.dstRect.height, message, true);\n  };\n\n\n  /**\n  * Clears the game message by deleting/clearing all messages.\n  *\n  * @method clear\n   */\n\n  Component_MessageBehavior.prototype.clear = function() {\n    this.object.textRenderer.clear();\n    this.object.messages = [];\n    return this.message = \"\";\n  };\n\n\n  /**\n  * Closes the game message by making it invisible.\n  *\n  * @method close\n   */\n\n  Component_MessageBehavior.prototype.close = function() {\n    return this.object.visible = false;\n  };\n\n\n  /**\n  * Gets the duration of an associated voice or 0 if no voice is associated.\n  *\n  * @method voiceDuration\n  * @return {number} The duration in frames.\n   */\n\n  Component_MessageBehavior.prototype.voiceDuration = function() {\n    var duration;\n    duration = 0;\n    if ((this.voice != null) && (this.settings.autoMessage.waitForVoice || this.settings.timeMessageToVoice)) {\n      duration = Math.round((this.voice.source.buffer.duration * (1.0 / this.voice.source.playbackRate.value)) * 1000 / 16.6);\n    } else {\n      duration = 0;\n    }\n    if (this.tempSettings.skip) {\n      return 1;\n    } else {\n      return duration;\n    }\n  };\n\n\n  /**\n  * Gets the duration of rendering the game-message.\n  *\n  * @method messageDuration\n  * @return {number} The duration in frames.\n   */\n\n  Component_MessageBehavior.prototype.messageDuration = function() {\n    var duration;\n    duration = this.object.textRenderer.calculateDuration();\n    if (this.tempSettings.skip) {\n      return 1;\n    } else {\n      return duration;\n    }\n  };\n\n\n  /**\n  * Gets the time between two messages in auto-read mode.\n  *\n  * @method autoMessageTime\n  * @return {number} The time in frames.\n   */\n\n  Component_MessageBehavior.prototype.autoMessageTime = function() {\n    if (this.tempSettings.skip) {\n      return 1;\n    } else {\n      return Math.max(Math.round(this.settings.autoMessage.time * Graphics.frameRate), this.voiceDuration() - this.messageDuration());\n    }\n  };\n\n\n  /**\n  * Gets the current message speed.\n  *\n  * @method messageSpeed\n  * @return {number} The message speed.\n   */\n\n  Component_MessageBehavior.prototype.messageSpeed = function() {\n    return Math.max(11 - Math.round(GameManager.settings.messageSpeed * 2.5), 0);\n  };\n\n\n  /**\n  * Checks if a mouse-button or key was pressed to continue with the message-rendering.\n  *\n  * @method actionTrigger\n  * @return {boolean} If true, the an action-button or action-key is pressed.\n   */\n\n  Component_MessageBehavior.prototype.actionTrigger = function() {\n    return (gs.ObjectManager.current.input && this.object.visible && this.object.dstRect.contains(Input.Mouse.x - this.object.origin.x, Input.Mouse.y - this.object.origin.y) && Input.Mouse.buttons[Input.Mouse.LEFT] === 2) || Input.trigger(Input.C);\n  };\n\n  Component_MessageBehavior.prototype.finish = function() {\n    if ((this.object.voice != null) && GameManager.settings.skipVoiceOnAction) {\n      return AudioManager.stopSound(this.object.voice.name);\n    }\n  };\n\n  Component_MessageBehavior.prototype.erase = function() {\n    var duration, fading;\n    fading = GameManager.tempSettings.messageFading;\n    duration = GameManager.tempSettings.skip ? 0 : fading.duration;\n    return this.object.animator.disappear(fading.animation, fading.easing, duration, (function(_this) {\n      return function() {\n        SceneManager.scene.currentCharacter = {\n          name: \"\"\n        };\n        _this.clear();\n        return _this.object.visible = false;\n      };\n    })(this));\n  };\n\n\n  /**\n  * FIXME: Deprecated? It is also a re-definition of gs.Component_Visual.updateOrigin.\n  *\n  * @method updateOrigin\n   */\n\n  Component_MessageBehavior.prototype.updateOrigin = function() {\n    var ox, oy, p;\n    ox = 0;\n    oy = 0;\n    if ((this.object.parent != null) && (this.object.parent.dstRect != null)) {\n      p = this.object.parent;\n      while ((p != null) && (p.dstRect != null)) {\n        ox += p.dstRect.x;\n        oy += p.dstRect.y;\n        p = p.parent;\n      }\n    }\n    this.object.origin.x = ox;\n    return this.object.origin.y = oy;\n  };\n\n\n  /**\n  * Updates the object. \n  *\n  * @method updateObject\n  * @private\n   */\n\n  Component_MessageBehavior.prototype.updateObject = function() {\n    this.updateOrigin();\n    if (this.tempSettings.skip && !this.waitingPreview) {\n      return this.object.textRenderer.isWaiting = false;\n    }\n  };\n\n\n  /**\n  * Updates the message.\n  *\n  * @method updateMessage\n  * @private\n   */\n\n  Component_MessageBehavior.prototype.updateMessage = function() {\n    var ref;\n    this.caretPosition = this.object.textRenderer.caretPosition;\n    if (this.tempSettings.skip && (this.settings.allowSkipUnreadMessages || ((ref = GameManager.globalData.messages[this.message]) != null ? ref.read : void 0))) {\n      this.object.textRenderer.drawImmediately = true;\n      this.object.textRenderer.waitAtEnd = this.waitingPreview;\n      return this.object.textRenderer.waitAtEndTime = 0;\n    } else {\n      this.updateSpeed();\n      return this.updateAutoMessage();\n    }\n  };\n\n\n  /**\n  * Updates the speed of the message. That depends on game-settings if a message\n  * is timed to its voice or not.\n  *\n  * @method updateSpeed\n  * @private\n   */\n\n  Component_MessageBehavior.prototype.updateSpeed = function() {\n    var voiceDuration;\n    voiceDuration = this.voiceDuration();\n    if (voiceDuration > 0 && this.settings.timeMessageToVoice) {\n      return this.object.textRenderer.speed = voiceDuration / this.message.length;\n    } else {\n      return this.object.textRenderer.speed = this.messageSpeed();\n    }\n  };\n\n\n  /**\n  * Update auto-read mode.\n  *\n  * @method updateAutoMessage\n  * @private\n   */\n\n  Component_MessageBehavior.prototype.updateAutoMessage = function() {\n    if (this.settings.autoMessage.stopOnAction && this.actionTrigger()) {\n      this.settings.autoMessage.enabled = false;\n    }\n    if (this.settings.autoMessage.enabled && !this.partial) {\n      if (this.object.textRenderer.waitAtEnd) {\n        this.object.textRenderer.isWaiting = false;\n      }\n      this.object.textRenderer.waitAtEndTime = this.autoMessageTime();\n      this.object.textRenderer.waitAtEnd = false;\n    } else if (this.autoMessageEnabled !== this.settings.autoMessage.enabled) {\n      this.object.textRenderer.waitAtEnd = true;\n      this.object.textRenderer.waitAtEndTime = 0;\n    }\n    return this.autoMessageEnabled = this.settings.autoMessage.enabled;\n  };\n\n\n  /*\n  * Updates the game message behavior\n  *\n  * @method update\n   */\n\n  Component_MessageBehavior.prototype.update = function() {\n    var ref, ref1, ref2, ref3, ref4, ref5;\n    this.object.needsUpdate = true;\n    this.updateObject();\n    this.updateMessage();\n    if (this.character !== this.object.character) {\n      gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n        character: this.character\n      });\n      this.character = this.object.character;\n    }\n    if (this.object.textRenderer.isWaiting !== this.isWaiting || this.object.textRenderer.isRunning !== this.isRunning || (((ref = this.voice) != null ? ref.playing : void 0) && (!((ref1 = this.object.character) != null ? ref1.timeTalkingToVoiceVolume : void 0) || this.voice.averageVolume > this.object.character.talkingVolume)) !== this.isVoicePlaying) {\n      this.isWaiting = this.object.textRenderer.isWaiting;\n      this.isRunning = this.object.textRenderer.isRunning;\n      this.isVoicePlaying = ((ref2 = this.voice) != null ? ref2.playing : void 0) && (!((ref3 = this.object.character) != null ? ref3.timeTalkingToVoiceVolume : void 0) || this.voice.averageVolume > this.object.character.talkingVolume);\n      if (!this.tempSettings.skip) {\n        if ((ref4 = this.voice) != null ? ref4.playing : void 0) {\n          if (!this.isVoicePlaying) {\n            gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n              character: this.object.character\n            });\n          } else {\n            gs.GlobalEventManager.emit(\"talkingStarted\", this, {\n              character: this.object.character\n            });\n          }\n        } else {\n          if (this.isWaiting) {\n            gs.GlobalEventManager.emit(\"talkingEnded\", this, {\n              character: this.object.character\n            });\n          } else if (this.isRunning) {\n            gs.GlobalEventManager.emit(\"talkingStarted\", this, {\n              character: this.object.character\n            });\n          }\n        }\n      }\n    }\n    if ((this.object.layoutRect != null) && (((ref5 = this.object.parent) != null ? ref5.dstRect : void 0) != null)) {\n      if (this.object.layoutRect.x) {\n        this.object.dstRect.x = this.object.layoutRect.x(this.object.parent.dstRect.width);\n      }\n      if (this.object.layoutRect.y) {\n        this.object.dstRect.y = this.object.layoutRect.y(this.object.parent.dstRect.height);\n      }\n      if (this.object.layoutRect.width) {\n        this.object.dstRect.width = this.object.layoutRect.width(this.object.parent.dstRect.width);\n      }\n      if (this.object.layoutRect.height) {\n        return this.object.dstRect.height = this.object.layoutRect.height(this.object.parent.dstRect.height);\n      }\n    }\n  };\n\n  return Component_MessageBehavior;\n\n})(gs.Component);\n\nvn.Component_MessageBehavior = Component_MessageBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFPQTs7Ozs7Ozs7O0FBQUEsSUFBQSxzQ0FBQTtFQUFBOzs7QUFTTTs7O0VBQ0YsV0FBQyxDQUFBLEdBQUQsR0FBTzs7RUFDUCxXQUFDLENBQUEsR0FBRCxHQUFPOzs7Ozs7QUFFWCxFQUFFLENBQUMsV0FBSCxHQUFpQjs7QUFHWDs7O0VBQ0YseUJBQUMsQ0FBQSxvQkFBRCxHQUF3QixDQUFDLGtCQUFELEVBQXFCLGlCQUFyQjs7O0FBRXhCOzs7Ozs7Ozs7c0NBUUEsbUJBQUEsR0FBcUIsU0FBQyxJQUFELEVBQU8sT0FBUDtJQUNqQixJQUFDLENBQUEsWUFBRCxHQUFnQixXQUFXLENBQUM7V0FDNUIsSUFBQyxDQUFBLGtCQUFELENBQUE7RUFGaUI7OztBQUlyQjs7Ozs7Ozs7OztFQVNhLG1DQUFBOztBQUNUOzs7Ozs7SUFNQSxJQUFDLENBQUEsUUFBRCxHQUFZLFdBQVcsQ0FBQzs7QUFDeEI7Ozs7OztJQU1BLElBQUMsQ0FBQSxZQUFELEdBQWdCLFdBQVcsQ0FBQzs7QUFFNUI7Ozs7OztJQU1BLElBQUMsQ0FBQSxTQUFELEdBQWE7O0FBRWI7Ozs7OztJQU1BLElBQUMsQ0FBQSxTQUFELEdBQWE7O0FBRWI7Ozs7OztJQU1BLElBQUMsQ0FBQSxjQUFELEdBQWtCOztBQUVsQjs7Ozs7O0lBTUEsSUFBQyxDQUFBLGFBQUQsR0FBcUIsSUFBQSxFQUFFLENBQUMsS0FBSCxDQUFTLENBQVQsRUFBWSxDQUFaOztBQUVyQjs7Ozs7O0lBTUEsSUFBQyxDQUFBLE9BQUQsR0FBVzs7QUFFWDs7Ozs7O0lBTUEsSUFBQyxDQUFBLFFBQUQsR0FBWTs7QUFFWjs7Ozs7SUFLQSxJQUFDLENBQUEsS0FBRCxHQUFTOztBQUVUOzs7Ozs7O0lBT0EsSUFBQyxDQUFBLE9BQUQsR0FBVzs7QUFFWDs7Ozs7O0lBTUEsSUFBQyxDQUFBLGNBQUQsR0FBa0I7O0FBRWxCOzs7Ozs7SUFNQSxJQUFD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QSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQXRCO1FBQTZCLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQWhCLEdBQW9CLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQW5CLENBQXFCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUE1QyxFQUFqRDs7TUFDQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQXRCO1FBQWlDLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWhCLEdBQXdCLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQW5CLENBQXlCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFoRCxFQUF6RDs7TUFDQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQXRCO2VBQWtDLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWhCLEdBQXlCLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQW5CLENBQTBCLElBQUMsQ0FBQSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFqRCxFQUEzRDtPQUpKOztFQTFCSTs7OztHQTViNEIsRUFBRSxDQUFDOztBQTJkM0MsRUFBRSxDQUFDLHlCQUFILEdBQStCIiwic291cmNlc0NvbnRlbnQiOlsiIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jXG4jICAgU2NyaXB0OiBDb21wb25lbnRfTWVzc2FnZUJlaGF2aW9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jIyMqXG4qIEFuIGVudW1lcmF0aW9uIG9mIGdhbWUgbWVzc2FnZSBtb2Rlcy5cbipcbiogQURWIC0gQWR2ZW50dXJlIE1vZGVcbiogTlZMIC0gTm92ZWwgTW9kZVxuKlxuKiBAdHlwZWRlZiBNZXNzYWdlTW9kZVxuKiBAbWVtYmVyb2Ygdm5cbiMjI1xuY2xhc3MgTWVzc2FnZU1vZGVcbiAgICBAQURWID0gMFxuICAgIEBOVkwgPSAxXG4gICAgXG52bi5NZXNzYWdlTW9kZSA9IE1lc3NhZ2VNb2RlXG5cblxuY2xhc3MgQ29tcG9uZW50X01lc3NhZ2VCZWhhdmlvciBleHRlbmRzIGdzLkNvbXBvbmVudFxuICAgIEBvYmplY3RDb2RlY0JsYWNrTGlzdCA9IFtcIm9uTWVzc2FnZVdhaXRpbmdcIiwgXCJvbk1lc3NhZ2VGaW5pc2hcIl1cbiAgICBcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgQHRlbXBTZXR0aW5ncyA9IEdhbWVNYW5hZ2VyLnRlbXBTZXR0aW5nc1xuICAgICAgICBAc2V0dXBFdmVudEhhbmRsZXJzKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQSBiZWhhdmlvci1jb21wb25lbnQgdG8gZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBhIGdhbWUtbWVzc2FnZS5cbiAgICAqXG4gICAgKiBAbW9kdWxlIHZuXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X01lc3NhZ2VCZWhhdmlvclxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgKiBAbWVtYmVyb2Ygdm5cbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAtPlxuICAgICAgICAjIyMqXG4gICAgICAgICogUmVmZXJlbmNlIHRvIGdhbWUgc2V0dGluZ3MuXG4gICAgICAgICogQHByb3BlcnR5IHNldHRpbmdzXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAjIyNcbiAgICAgICAgQHNldHRpbmdzID0gR2FtZU1hbmFnZXIuc2V0dGluZ3NcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFJlZmVyZW5jZSB0byB0ZW1wb3JhcnkgZ2FtZSBzZXR0aW5ncy5cbiAgICAgICAgKiBAcHJvcGVydHkgc2V0dGluZ3NcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAdGVtcFNldHRpbmdzID0gR2FtZU1hbmFnZXIudGVtcFNldHRpbmdzXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSB3YWl0aW5nLlxuICAgICAgICAqIEBwcm9wZXJ0eSBpc1dhaXRpbmdcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAaXNXYWl0aW5nID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2UgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAgICAgICogQHByb3BlcnR5IGlzUnVubmluZ1xuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBpc1J1bm5pbmcgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiBhIHZvaWNlIGlzIGN1cnJlbnRseSBwbGF5aW5nIHRvZ2V0aGVyIHdpdGggdGhlIG1lc3NhZ2UuXG4gICAgICAgICogQHByb3BlcnR5IGlzVm9pY2VQbGF5aW5nXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAqIEByZWFkT25seVxuICAgICAgICAjIyNcbiAgICAgICAgQGlzVm9pY2VQbGF5aW5nID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBDdXJyZW50IG1lc3NhZ2UgY2FyZXQvY3Vyc29yIHBvc2l0aW9uLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjYXJldFBvc2l0aW9uXG4gICAgICAgICogQHR5cGUgZ3MuUG9pbnRcbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBjYXJldFBvc2l0aW9uID0gbmV3IGdzLlBvaW50KDAsIDApXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQ3VycmVudCByYXcgbWVzc2FnZSB0ZXh0LlxuICAgICAgICAqIEBwcm9wZXJ0eSBtZXNzYWdlXG4gICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAbWVzc2FnZSA9IFwiXCJcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBBbGwgY3VycmVudGx5IGRpc3BsYXllZCByYXcgbWVzc2FnZXMuXG4gICAgICAgICogQHByb3BlcnR5IG1lc3NhZ2VzXG4gICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBtZXNzYWdlcyA9IFtdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVm9pY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG1lc3NhZ2UuXG4gICAgICAgICogQHByb3BlcnR5IHZvaWNlXG4gICAgICAgICogQHR5cGUgZ3MuQXVkaW9CdWZmZXJSZWZlcmVuY2VcbiAgICAgICAgIyMjXG4gICAgICAgIEB2b2ljZSA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgY3VycmVudCBtZXNzYWdlIGlzIHBhcnRpYWwuIERFUFJFQ0FURUQuIFBsZWFzZSBkbyBub3QgdXNlLlxuICAgICAgICAqIEBwcm9wZXJ0eSBwYXJ0aWFsXG4gICAgICAgICogQGRlcHJlY2F0ZWRcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAcGFydGlhbCA9IG5vXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogSW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSB3YWl0aW5nIGluIGxpdmUtcHJldmlldy5cbiAgICAgICAgKiBAcHJvcGVydHkgd2FpdGluZ1ByZXZpZXdcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICogQHJlYWRPbmx5XG4gICAgICAgICMjI1xuICAgICAgICBAd2FpdGluZ1ByZXZpZXcgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgYXV0by1tZXNzYWdlIGlzIGVuYWJsZWQuXG4gICAgICAgICogQHByb3BlcnR5IGF1dG9NZXNzYWdlRW5hYmxlZFxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcmVhZE9ubHlcbiAgICAgICAgIyMjXG4gICAgICAgIEBhdXRvTWVzc2FnZUVuYWJsZWQgPSBub1xuICAgICAgXG4gICAgICAgIEBvbk1lc3NhZ2VGaW5pc2ggPSAoc2VuZGVyKSA9PlxuICAgICAgICAgICAgQG9iamVjdC5ldmVudHMuZW1pdCBcImZpbmlzaFwiLCB0aGlzXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIEBvYmplY3Quc2V0dGluZ3MuYXV0b0VyYXNlIG9yIEBvYmplY3Quc2V0dGluZ3MucGFyYWdyYXBoU3BhY2luZyA+IDBcbiAgICAgICAgICAgICAgICBAbWVzc2FnZSA9IFwiXCJcbiAgICAgICAgICAgIFxuICAgICAgICBAb25NZXNzYWdlV2FpdGluZyA9IChzZW5kZXIpID0+XG4gICAgICAgICAgICBpZiAhQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNCYXRjaGVkKCkgb3IgIUBvYmplY3QudGV4dFJlbmRlcmVyLmlzQmF0Y2hJblByb2dyZXNzKClcbiAgICAgICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSAhQHBhcnRpYWxcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0IFwid2FpdGluZ1wiLCB0aGlzXG4gICAgIyMjKlxuICAgICogQWRkcyBldmVudC1oYW5kbGVyc1xuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0dXBFdmVudEhhbmRsZXJzXG4gICAgIyMjIFxuICAgIHNldHVwRXZlbnRIYW5kbGVyczogLT5cbiAgICAgICAgQG9iamVjdC5ldmVudHMub2ZmQnlPd25lcihcIm1lc3NhZ2VGaW5pc2hcIiwgdGhpcylcbiAgICAgICAgQG9iamVjdC5ldmVudHMub2ZmQnlPd25lcihcIm1lc3NhZ2VXYWl0aW5nXCIsIHRoaXMpXG4gICAgICAgIFxuICAgICAgICBAb2JqZWN0LmV2ZW50cy5vbiBcIm1lc3NhZ2VGaW5pc2hcIiwgZ3MuQ2FsbEJhY2soXCJvbk1lc3NhZ2VGaW5pc2hcIiwgdGhpcyksIG51bGwsIHRoaXNcbiAgICAgICAgQG9iamVjdC5ldmVudHMub24gXCJtZXNzYWdlV2FpdGluZ1wiLCBncy5DYWxsQmFjayhcIm9uTWVzc2FnZVdhaXRpbmdcIiwgdGhpcyksIG51bGwsIHRoaXNcbiAgICAgICAgICAgIFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcInByZXZpZXdXYWl0aW5nXCIsIHRoaXMpXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwicHJldmlld1Jlc3RhcnRcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwicHJldmlld1dhaXRpbmdcIiwgKChzZW5kZXIpID0+XG4gICAgICAgICAgICBAd2FpdGluZ1ByZXZpZXcgPSB5ZXNcbiAgICAgICAgKSwgbnVsbCwgdGhpc1xuICAgICAgICBcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwicHJldmlld1Jlc3RhcnRcIiwgKChzZW5kZXIpID0+XG4gICAgICAgICAgICBAd2FpdGluZ1ByZXZpZXcgPSBub1xuICAgICAgICApLCBudWxsLCB0aGlzXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNldHVwIHRoZSBjb21wb25lbnQuIEFkZHMgZXZlbnQgaGFuZGxlcnMuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cFxuICAgICMjI1xuICAgIHNldHVwOiAtPlxuICAgICAgICBAc2V0dXBFdmVudEhhbmRsZXJzKClcbiAgICAgXG4gICAgIyMjKlxuICAgICogRGlzcG9zZXMgdGhlIGNvbXBvbmVudC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHRvRGF0YUJ1bmRsZVxuICAgICMjIyAgIFxuICAgIGRpc3Bvc2U6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcInByZXZpZXdXYWl0aW5nXCIsIHRoaXMpXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwicHJldmlld1Jlc3RhcnRcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBOb3QgaW1wbGVtZW50ZWQgeWV0LlxuICAgICpcbiAgICAqIEBtZXRob2QgdG9EYXRhQnVuZGxlXG4gICAgIyMjXG4gICAgdG9EYXRhQnVuZGxlOiAtPlxuICAgICMjIypcbiAgICAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4gICAgKlxuICAgICogQG1ldGhvZCByZXN0b3JlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gYnVuZGxlIC0gQSBkYXRhIGJ1bmRsZS5cbiAgICAjIyMgICAgXG4gICAgcmVzdG9yZTogKGJ1bmRsZSkgLT5cbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIHRvIHNob3cgYSBnYW1lIG1lc3NhZ2UuXG4gICAgKlxuICAgICogQG1ldGhvZCBzaG93TWVzc2FnZVxuICAgICogQHBhcmFtIHtPYmplY3R9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2YgdGhpcyBhY3Rpb24uXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzLlxuICAgICMjI1xuICAgIHNob3dNZXNzYWdlOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIGdzLkdhbWVOb3RpZmllci5wb3N0Q29udGV4dENoYW5nZShsY3NtKHBhcmFtcy5tZXNzYWdlKSlcbiAgICAgICAgXG4gICAgICAgIEBwYXJ0aWFsID0gcGFyYW1zLnBhcnRpYWxcbiAgICAgICAgQG1lc3NhZ2UgKz0gbGNzbShwYXJhbXMubWVzc2FnZSlcbiAgICAgICAgQGFkZE1lc3NhZ2UocGFyYW1zLm1lc3NhZ2UsIFJlY29yZE1hbmFnZXIuY2hhcmFjdGVyc1twYXJhbXMuY2hhcmFjdGVySWRdLCBAb2JqZWN0Lm1lc3NhZ2VzLmxlbmd0aCA+IDAgYW5kIEBvYmplY3Quc2V0dGluZ3MucGFyYWdyYXBoU3BhY2luZyA+IDAsICFAcGFydGlhbClcbiAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3QudGV4dFJlbmRlcmVyLmlzQmF0Y2hlZCgpXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSB5ZXNcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIud2FpdEF0RW5kID0gIUBwYXJ0aWFsXG4gICAgICAgICAgICBcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogRGVwcmVjYXRlZC4gTm90IGxvbmdlciB1c2VkLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQml0bWFwXG4gICAgIyMjXG4gICAgdXBkYXRlQml0bWFwOiAtPlxuICAgICAgICBpZiAhQG9iamVjdC5iaXRtYXAgb3IgQG9iamVjdC5iaXRtYXAud2lkdGggIT0gQG9iamVjdC5kc3RSZWN0LndpZHRoIG9yIEBvYmplY3QuYml0bWFwLmhlaWdodCAhPSBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0XG4gICAgICAgICAgICBAb2JqZWN0LmJpdG1hcD8uZGlzcG9zZSgpXG4gICAgICAgICAgICBAb2JqZWN0LmJpdG1hcCA9IG5ldyBCaXRtYXAoQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0KVxuICAgICAgICAgICAgQG9iamVjdC5iaXRtYXAuZm9udCA9IEBvYmplY3QuZm9udFxuICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIFJlc3RvcmVzIGEgTlZMIGdhbWUgbWVzc2FnZSBvZiBhbiBhcnJheSBvZiBtZXNzYWdlLW9iamVjdHMuIFRoYXQgaXNcbiAgICAqIG5lY2Vzc2FyeSB0byByZXN0b3JlIGEgTlZMIGdhbWUgbWVzc2FnZSBmcm9tIGEgc2F2ZS1nYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVzdG9yZU1lc3NhZ2VzXG4gICAgKiBAcGFyYW0ge0FycmF5fSBtZXNzYWdlcyAtIEFuIGFycmF5IG9mIG1lc3NhZ2VzIHRvIHJlc3RvcmUuXG4gICAgIyMjXG4gICAgcmVzdG9yZU1lc3NhZ2VzOiAobWVzc2FnZXMpIC0+XG4gICAgICAgIEB1cGRhdGVCaXRtYXAoKVxuICAgICAgICBAY2xlYXIoKVxuICAgICAgICBcbiAgICAgICAgQG9iamVjdC5vcGFjaXR5ID0gMjU1XG4gICAgICAgIEBvYmplY3Quc3JjUmVjdCA9IG5ldyBSZWN0KDAsIDAsIEBvYmplY3QuZHN0UmVjdC53aWR0aCwgQG9iamVjdC5kc3RSZWN0LmhlaWdodClcbiAgICAgICAgXG4gICAgICAgIGZvciBtZXNzYWdlIGluIG1lc3NhZ2VzXG4gICAgICAgICAgICBAb2JqZWN0LmZvbnQuY29sb3IgPSBuZXcgQ29sb3IobWVzc2FnZS5jaGFyYWN0ZXI/LnRleHRDb2xvciB8fCBDb2xvci5XSElURSlcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmRyYXdGb3JtYXR0ZWRUZXh0SW1tZWRpYXRlbHkoMCwgMCwgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0LCBsY3NtKG1lc3NhZ2UudGV4dCA/IG1lc3NhZ2UpLCB5ZXMpXG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWRkcyBhIG5ldyBtZXNzYWdlLlxuICAgICogXG4gICAgKiBAbWV0aG9kIGFkZE1lc3NhZ2VcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gY2hhcmFjdGVyIC0gRGF0YWJhc2UtUmVjb3JkIG9mIGEgY2hhcmFjdGVyLlxuICAgICogQHBhcmFtIHtib29sZWFufSBuZXdMaW5lIC0gSW5kaWNhdGVzIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBtYWtlIGEgbGluZSBicmVhay5cbiAgICAjIyNcbiAgICBhZGRNZXNzYWdlOiAobWVzc2FnZSwgY2hhcmFjdGVyLCBuZXdMaW5lLCB3YWl0QXRFbmQpIC0+XG4gICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLnBhcnRpYWxNZXNzYWdlID0gbnVsbFxuICAgICAgICBAb2JqZWN0Lm9mZnNldCA9IHg6IDAsIHk6IDBcbiAgICAgICAgQG9iamVjdC52aXNpYmxlID0geWVzXG4gICAgICAgIFxuICAgICAgICBAb2JqZWN0Lm1lc3NhZ2VzLnB1c2goeyB0ZXh0OiBtZXNzYWdlLCBjaGFyYWN0ZXI6IGNoYXJhY3Rlcn0pXG4gICAgICAgIFxuICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSB3YWl0QXRFbmRcbiAgICAgICAgaWYgbm90IEBvYmplY3Quc2V0dGluZ3MuYXV0b0VyYXNlXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci5jdXJyZW50WSArPSBAb2JqZWN0LnNldHRpbmdzLnBhcmFncmFwaFNwYWNpbmdcbiAgICAgICAgaWYgbmV3TGluZVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIubmV3TGluZSgpXG4gICAgICAgIEB1cGRhdGVCaXRtYXAoKVxuICAgICAgICAgICAgXG4gICAgICAgIGlmIGNoYXJhY3Rlcj8gYW5kIEBvYmplY3Quc2V0dGluZ3MudXNlQ2hhcmFjdGVyQ29sb3JcbiAgICAgICAgICAgIEBvYmplY3QuZm9udC5jb2xvciA9IG5ldyBDb2xvcihjaGFyYWN0ZXI/LnRleHRDb2xvciB8fCBDb2xvci5XSElURSlcbiAgICAgICAgICAgIFxuICAgICAgICBAb2JqZWN0Lm9wYWNpdHkgPSAyNTVcbiAgICAgICAgQG9iamVjdC5zcmNSZWN0ID0gbmV3IFJlY3QoMCwgMCwgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0KVxuICAgICBcbiAgICAgICAgQHVwZGF0ZSgpXG4gICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmRyYXdGb3JtYXR0ZWRUZXh0KDAsIDAsIEBvYmplY3QuZHN0UmVjdC53aWR0aCwgQG9iamVjdC5kc3RSZWN0LmhlaWdodCwgbWVzc2FnZSwgeWVzKVxuXG4gICAgIyMjKlxuICAgICogQ2xlYXJzIHRoZSBnYW1lIG1lc3NhZ2UgYnkgZGVsZXRpbmcvY2xlYXJpbmcgYWxsIG1lc3NhZ2VzLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2xlYXJcbiAgICAjIyNcbiAgICBjbGVhcjogLT4gXG4gICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmNsZWFyKClcbiAgICAgICAgQG9iamVjdC5tZXNzYWdlcyA9IFtdXG4gICAgICAgIEBtZXNzYWdlID0gXCJcIlxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBDbG9zZXMgdGhlIGdhbWUgbWVzc2FnZSBieSBtYWtpbmcgaXQgaW52aXNpYmxlLlxuICAgICpcbiAgICAqIEBtZXRob2QgY2xvc2VcbiAgICAjIyNcbiAgICBjbG9zZTogLT4gXG4gICAgICAgIEBvYmplY3QudmlzaWJsZSA9IG5vXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgZHVyYXRpb24gb2YgYW4gYXNzb2NpYXRlZCB2b2ljZSBvciAwIGlmIG5vIHZvaWNlIGlzIGFzc29jaWF0ZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCB2b2ljZUR1cmF0aW9uXG4gICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgIyMjXG4gICAgdm9pY2VEdXJhdGlvbjogLT5cbiAgICAgICAgZHVyYXRpb24gPSAwXG4gICAgICAgIGlmIEB2b2ljZT8gYW5kIChAc2V0dGluZ3MuYXV0b01lc3NhZ2Uud2FpdEZvclZvaWNlIG9yIEBzZXR0aW5ncy50aW1lTWVzc2FnZVRvVm9pY2UpXG4gICAgICAgICAgICBkdXJhdGlvbiA9IE1hdGgucm91bmQoKEB2b2ljZS5zb3VyY2UuYnVmZmVyLmR1cmF0aW9uICogKDEuMCAvIEB2b2ljZS5zb3VyY2UucGxheWJhY2tSYXRlLnZhbHVlKSkgKiAxMDAwIC8gMTYuNilcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZHVyYXRpb24gPSAwXG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcCB0aGVuIDEgZWxzZSBkdXJhdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSBkdXJhdGlvbiBvZiByZW5kZXJpbmcgdGhlIGdhbWUtbWVzc2FnZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIG1lc3NhZ2VEdXJhdGlvblxuICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICMjI1xuICAgIG1lc3NhZ2VEdXJhdGlvbjogLT4gXG4gICAgICAgIGR1cmF0aW9uID0gQG9iamVjdC50ZXh0UmVuZGVyZXIuY2FsY3VsYXRlRHVyYXRpb24oKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcCB0aGVuIDEgZWxzZSBkdXJhdGlvblxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSB0aW1lIGJldHdlZW4gdHdvIG1lc3NhZ2VzIGluIGF1dG8tcmVhZCBtb2RlLlxuICAgICpcbiAgICAqIEBtZXRob2QgYXV0b01lc3NhZ2VUaW1lXG4gICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0aW1lIGluIGZyYW1lcy5cbiAgICAjIyNcbiAgICBhdXRvTWVzc2FnZVRpbWU6IC0+IFxuICAgICAgICBpZiBAdGVtcFNldHRpbmdzLnNraXBcbiAgICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLnJvdW5kKEBzZXR0aW5ncy5hdXRvTWVzc2FnZS50aW1lICogR3JhcGhpY3MuZnJhbWVSYXRlKSwgQHZvaWNlRHVyYXRpb24oKSAtIEBtZXNzYWdlRHVyYXRpb24oKSlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBHZXRzIHRoZSBjdXJyZW50IG1lc3NhZ2Ugc3BlZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCBtZXNzYWdlU3BlZWRcbiAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIG1lc3NhZ2Ugc3BlZWQuXG4gICAgIyMjXG4gICAgbWVzc2FnZVNwZWVkOiAtPiBNYXRoLm1heCgxMSAtIE1hdGgucm91bmQoR2FtZU1hbmFnZXIuc2V0dGluZ3MubWVzc2FnZVNwZWVkICogMi41KSwgMClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBDaGVja3MgaWYgYSBtb3VzZS1idXR0b24gb3Iga2V5IHdhcyBwcmVzc2VkIHRvIGNvbnRpbnVlIHdpdGggdGhlIG1lc3NhZ2UtcmVuZGVyaW5nLlxuICAgICpcbiAgICAqIEBtZXRob2QgYWN0aW9uVHJpZ2dlclxuICAgICogQHJldHVybiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIGFuIGFjdGlvbi1idXR0b24gb3IgYWN0aW9uLWtleSBpcyBwcmVzc2VkLlxuICAgICMjI1xuICAgIGFjdGlvblRyaWdnZXI6IC0+IChncy5PYmplY3RNYW5hZ2VyLmN1cnJlbnQuaW5wdXQgYW5kIEBvYmplY3QudmlzaWJsZSBhbmQgQG9iamVjdC5kc3RSZWN0LmNvbnRhaW5zKElucHV0Lk1vdXNlLnggLSBAb2JqZWN0Lm9yaWdpbi54LCBJbnB1dC5Nb3VzZS55IC0gQG9iamVjdC5vcmlnaW4ueSkgYW5kIElucHV0Lk1vdXNlLmJ1dHRvbnNbSW5wdXQuTW91c2UuTEVGVF0gPT0gMikgb3IgSW5wdXQudHJpZ2dlcihJbnB1dC5DKVxuICAgIFxuICAgIGZpbmlzaDogLT5cbiAgICAgICAgI0BvYmplY3QuY2hhcmFjdGVyID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgaWYgQG9iamVjdC52b2ljZT8gYW5kIEdhbWVNYW5hZ2VyLnNldHRpbmdzLnNraXBWb2ljZU9uQWN0aW9uXG4gICAgICAgICAgICBBdWRpb01hbmFnZXIuc3RvcFNvdW5kKEBvYmplY3Qudm9pY2UubmFtZSlcbiAgICBcbiAgICBlcmFzZTogLT5cbiAgICAgICAgZmFkaW5nID0gR2FtZU1hbmFnZXIudGVtcFNldHRpbmdzLm1lc3NhZ2VGYWRpbmdcbiAgICAgICAgZHVyYXRpb24gPSBpZiBHYW1lTWFuYWdlci50ZW1wU2V0dGluZ3Muc2tpcCB0aGVuIDAgZWxzZSBmYWRpbmcuZHVyYXRpb25cbiAgICAgICAgXG4gICAgICAgIEBvYmplY3QuYW5pbWF0b3IuZGlzYXBwZWFyKGZhZGluZy5hbmltYXRpb24sIGZhZGluZy5lYXNpbmcsIGR1cmF0aW9uLCA9PlxuICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLnNjZW5lLmN1cnJlbnRDaGFyYWN0ZXIgPSB7IG5hbWU6IFwiXCIgfVxuICAgICAgICAgICAgQGNsZWFyKClcbiAgICAgICAgICAgIEBvYmplY3QudmlzaWJsZSA9IG5vXG4gICAgICAgIClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogRklYTUU6IERlcHJlY2F0ZWQ/IEl0IGlzIGFsc28gYSByZS1kZWZpbml0aW9uIG9mIGdzLkNvbXBvbmVudF9WaXN1YWwudXBkYXRlT3JpZ2luLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlT3JpZ2luXG4gICAgIyMjXG4gICAgdXBkYXRlT3JpZ2luOiAtPlxuICAgICAgICBveCA9IDBcbiAgICAgICAgb3kgPSAwXG4gICAgICAgIGlmIEBvYmplY3QucGFyZW50PyBhbmQgQG9iamVjdC5wYXJlbnQuZHN0UmVjdD9cbiAgICAgICAgICAgIHAgPSBAb2JqZWN0LnBhcmVudFxuICAgICAgICAgICAgd2hpbGUgcD8gYW5kIHAuZHN0UmVjdD9cbiAgICAgICAgICAgICAgICBveCArPSBwLmRzdFJlY3QueFxuICAgICAgICAgICAgICAgIG95ICs9IHAuZHN0UmVjdC55XG4gICAgICAgICAgICAgICAgcCA9IHAucGFyZW50XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICBAb2JqZWN0Lm9yaWdpbi54ID0gb3hcbiAgICAgICAgQG9iamVjdC5vcmlnaW4ueSA9IG95XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFVwZGF0ZXMgdGhlIG9iamVjdC4gXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVPYmplY3RcbiAgICAqIEBwcml2YXRlXG4gICAgIyMjXG4gICAgdXBkYXRlT2JqZWN0OiAtPlxuICAgICAgICBAdXBkYXRlT3JpZ2luKClcbiAgICAgICAgXG4gICAgICAgIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcCBhbmQgbm90IEB3YWl0aW5nUHJldmlld1xuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuaXNXYWl0aW5nID0gbm9cbiAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBtZXNzYWdlLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlTWVzc2FnZVxuICAgICogQHByaXZhdGVcbiAgICAjIyNcbiAgICB1cGRhdGVNZXNzYWdlOiAtPlxuICAgICAgICBAY2FyZXRQb3NpdGlvbiA9IEBvYmplY3QudGV4dFJlbmRlcmVyLmNhcmV0UG9zaXRpb25cbiAgICAgICAgXG4gICAgICAgIGlmIEB0ZW1wU2V0dGluZ3Muc2tpcCBhbmQgKEBzZXR0aW5ncy5hbGxvd1NraXBVbnJlYWRNZXNzYWdlcyBvciBHYW1lTWFuYWdlci5nbG9iYWxEYXRhLm1lc3NhZ2VzW0BtZXNzYWdlXT8ucmVhZClcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmRyYXdJbW1lZGlhdGVseSA9IHllc1xuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIud2FpdEF0RW5kID0gQHdhaXRpbmdQcmV2aWV3XG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmRUaW1lID0gMFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICAjQG9iamVjdC50ZXh0UmVuZGVyZXIuZHJhd0ltbWVkaWF0ZWx5ID0gbm9cbiAgICAgICAgICAgIEB1cGRhdGVTcGVlZCgpXG4gICAgICAgICAgICBAdXBkYXRlQXV0b01lc3NhZ2UoKVxuICAgICAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgc3BlZWQgb2YgdGhlIG1lc3NhZ2UuIFRoYXQgZGVwZW5kcyBvbiBnYW1lLXNldHRpbmdzIGlmIGEgbWVzc2FnZVxuICAgICogaXMgdGltZWQgdG8gaXRzIHZvaWNlIG9yIG5vdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZVNwZWVkXG4gICAgKiBAcHJpdmF0ZVxuICAgICMjI1xuICAgIHVwZGF0ZVNwZWVkOiAtPlxuICAgICAgICB2b2ljZUR1cmF0aW9uID0gQHZvaWNlRHVyYXRpb24oKVxuICAgICAgICBpZiB2b2ljZUR1cmF0aW9uID4gMCBhbmQgQHNldHRpbmdzLnRpbWVNZXNzYWdlVG9Wb2ljZVxuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIuc3BlZWQgPSB2b2ljZUR1cmF0aW9uIC8gQG1lc3NhZ2UubGVuZ3RoXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLnNwZWVkID0gQG1lc3NhZ2VTcGVlZCgpXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGUgYXV0by1yZWFkIG1vZGUuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVBdXRvTWVzc2FnZVxuICAgICogQHByaXZhdGVcbiAgICAjIyNcbiAgICB1cGRhdGVBdXRvTWVzc2FnZTogLT5cbiAgICAgICAgaWYgQHNldHRpbmdzLmF1dG9NZXNzYWdlLnN0b3BPbkFjdGlvbiBhbmQgQGFjdGlvblRyaWdnZXIoKVxuICAgICAgICAgICAgQHNldHRpbmdzLmF1dG9NZXNzYWdlLmVuYWJsZWQgPSBub1xuICAgICAgICAgICAgXG4gICAgICAgIGlmIEBzZXR0aW5ncy5hdXRvTWVzc2FnZS5lbmFibGVkIGFuZCBub3QgQHBhcnRpYWxcbiAgICAgICAgICAgIGlmIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZFxuICAgICAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLmlzV2FpdGluZyA9IG5vXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmRUaW1lID0gQGF1dG9NZXNzYWdlVGltZSgpXG4gICAgICAgICAgICBAb2JqZWN0LnRleHRSZW5kZXJlci53YWl0QXRFbmQgPSBub1xuICAgICAgICBlbHNlIGlmIEBhdXRvTWVzc2FnZUVuYWJsZWQgIT0gQHNldHRpbmdzLmF1dG9NZXNzYWdlLmVuYWJsZWRcbiAgICAgICAgICAgIEBvYmplY3QudGV4dFJlbmRlcmVyLndhaXRBdEVuZCA9IHllc1xuICAgICAgICAgICAgQG9iamVjdC50ZXh0UmVuZGVyZXIud2FpdEF0RW5kVGltZSA9IDBcbiAgICAgICAgICAgIFxuICAgICAgICBAYXV0b01lc3NhZ2VFbmFibGVkID0gQHNldHRpbmdzLmF1dG9NZXNzYWdlLmVuYWJsZWRcbiAgICAgICAgICAgIFxuICAgICMjI1xuICAgICogVXBkYXRlcyB0aGUgZ2FtZSBtZXNzYWdlIGJlaGF2aW9yXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyNcbiAgICB1cGRhdGU6IC0+XG4gICAgICAgIEBvYmplY3QubmVlZHNVcGRhdGUgPSB5ZXNcbiAgICAgICAgQHVwZGF0ZU9iamVjdCgpXG4gICAgICAgIEB1cGRhdGVNZXNzYWdlKClcbiAgICAgICAgXG4gICAgICAgIGlmIEBjaGFyYWN0ZXIgIT0gQG9iamVjdC5jaGFyYWN0ZXIgICBcbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidGFsa2luZ0VuZGVkXCIsIHRoaXMsIGNoYXJhY3RlcjogQGNoYXJhY3RlcilcbiAgICAgICAgICAgIEBjaGFyYWN0ZXIgPSBAb2JqZWN0LmNoYXJhY3RlclxuICAgICAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3QudGV4dFJlbmRlcmVyLmlzV2FpdGluZyAhPSBAaXNXYWl0aW5nIG9yIEBvYmplY3QudGV4dFJlbmRlcmVyLmlzUnVubmluZyAhPSBAaXNSdW5uaW5nIG9yIChAdm9pY2U/LnBsYXlpbmcgJiYgKCFAb2JqZWN0LmNoYXJhY3Rlcj8udGltZVRhbGtpbmdUb1ZvaWNlVm9sdW1lIG9yIEB2b2ljZS5hdmVyYWdlVm9sdW1lID4gQG9iamVjdC5jaGFyYWN0ZXIudGFsa2luZ1ZvbHVtZSkpICE9IEBpc1ZvaWNlUGxheWluZ1xuICAgICAgICAgICAgQGlzV2FpdGluZyA9IEBvYmplY3QudGV4dFJlbmRlcmVyLmlzV2FpdGluZ1xuICAgICAgICAgICAgQGlzUnVubmluZyA9IEBvYmplY3QudGV4dFJlbmRlcmVyLmlzUnVubmluZ1xuICAgICAgICAgICAgQGlzVm9pY2VQbGF5aW5nID0gKEB2b2ljZT8ucGxheWluZyAmJiAoIUBvYmplY3QuY2hhcmFjdGVyPy50aW1lVGFsa2luZ1RvVm9pY2VWb2x1bWUgb3IgQHZvaWNlLmF2ZXJhZ2VWb2x1bWUgPiBAb2JqZWN0LmNoYXJhY3Rlci50YWxraW5nVm9sdW1lKSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgbm90IEB0ZW1wU2V0dGluZ3Muc2tpcFxuICAgICAgICAgICAgICAgIGlmIEB2b2ljZT8ucGxheWluZ1xuICAgICAgICAgICAgICAgICAgICBpZiBub3QgQGlzVm9pY2VQbGF5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInRhbGtpbmdFbmRlZFwiLCB0aGlzLCBjaGFyYWN0ZXI6IEBvYmplY3QuY2hhcmFjdGVyKVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInRhbGtpbmdTdGFydGVkXCIsIHRoaXMsIGNoYXJhY3RlcjogQG9iamVjdC5jaGFyYWN0ZXIpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpZiBAaXNXYWl0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInRhbGtpbmdFbmRlZFwiLCB0aGlzLCBjaGFyYWN0ZXI6IEBvYmplY3QuY2hhcmFjdGVyKVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIEBpc1J1bm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidGFsa2luZ1N0YXJ0ZWRcIiwgdGhpcywgY2hhcmFjdGVyOiBAb2JqZWN0LmNoYXJhY3RlcilcbiAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3QubGF5b3V0UmVjdD8gYW5kIEBvYmplY3QucGFyZW50Py5kc3RSZWN0P1xuICAgICAgICAgICAgaWYgQG9iamVjdC5sYXlvdXRSZWN0LnggdGhlbiBAb2JqZWN0LmRzdFJlY3QueCA9IEBvYmplY3QubGF5b3V0UmVjdC54KEBvYmplY3QucGFyZW50LmRzdFJlY3Qud2lkdGgpXG4gICAgICAgICAgICBpZiBAb2JqZWN0LmxheW91dFJlY3QueSB0aGVuIEBvYmplY3QuZHN0UmVjdC55ID0gQG9iamVjdC5sYXlvdXRSZWN0LnkoQG9iamVjdC5wYXJlbnQuZHN0UmVjdC5oZWlnaHQpXG4gICAgICAgICAgICBpZiBAb2JqZWN0LmxheW91dFJlY3Qud2lkdGggdGhlbiBAb2JqZWN0LmRzdFJlY3Qud2lkdGggPSBAb2JqZWN0LmxheW91dFJlY3Qud2lkdGgoQG9iamVjdC5wYXJlbnQuZHN0UmVjdC53aWR0aClcbiAgICAgICAgICAgIGlmIEBvYmplY3QubGF5b3V0UmVjdC5oZWlnaHQgdGhlbiBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0ID0gQG9iamVjdC5sYXlvdXRSZWN0LmhlaWdodChAb2JqZWN0LnBhcmVudC5kc3RSZWN0LmhlaWdodClcbnZuLkNvbXBvbmVudF9NZXNzYWdlQmVoYXZpb3IgPSBDb21wb25lbnRfTWVzc2FnZUJlaGF2aW9yIl19\n//# sourceURL=Component_MessageBehavior_131.js"
    },
    "summary": [
        "name",
        "type",
        "order"
    ]
}

Commits for Nextrek/s2s/data/310BAD46K234CA48DBSABF0EE1601511F062.json

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