Subversion Repository Public Repository

Nextrek

1
{"uid":"E442F997KC428A496DSA01EE8D171F72BDCA","isLoaded":true,"lastModificationTime":0,"items":{"name":"Component_StackLayoutBehavior","type":"game_script","order":6,"content":"# ===================================================================\n#\n#   Script: Component_StackLayoutBehavior\n#\n#   $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_StackLayoutBehavior extends gs.Component_LayoutBehavior\n    ###*\n    * Turns a game object into a stack-layout and layouts all sub-objects\n    * like stack vertically or horizontally. The game object needs a \n    * container-component.\n    * <br>\n    * The sub-objects in a stack-layout can be configured as resizable or\n    * non-resizable(fixed-size). For example:<br>\n    * <br>\n    * Lets say we have a layout-size of 500px in width with three controls.<br>\n    * <br>\n    * | 80px | dynamic | 80px | <br>\n    * <br>\n    * Two controls have a fixed size of 80px and the middle-control has a\n    * dynamic-size because it is configured to be resizable. In that case, \n    * the size of the resizable control would be 340px because that is the\n    * free space left after subtracting the size(160px) of the fixed-size controls.<br>\n    * <br>\n    * In addition, each sub-object can have different alignment options.\n    *\n    * @module gs\n    * @class Component_StackLayoutBehavior\n    * @extends gs.Component_LayoutBehavior\n    * @memberof gs\n    * @constructor\n    ###\n    constructor: (orientation) ->\n        super\n        \n        ###*\n        * The orientation of the stack-layout. Can be vertical or horizontal.\n        * @property orientation\n        * @type gs.Orientation\n        ###\n        @orientation = orientation || 0\n        \n        ###*\n        * @property scrollOffsetX\n        * @type number\n        * @protected\n        ###\n        @scrollOffsetX = 0\n        \n        ###*\n        * @property scrollOffsetY\n        * @type number\n        * @protected\n        ###\n        @scrollOffsetY = 0\n        \n        ###*\n        * @property contentHeight\n        * @type number\n        * @protected\n        ###\n        @contentHeight = 0\n        \n        ###*\n        * Control list-offset.\n        * @property offset\n        * @type number\n        * @protected\n        ###\n        @offset = 0\n        \n        ###*\n        * Count of controls to process.\n        * @property contentHeight\n        * @type number\n        * @protected\n        ###\n        @count = 0\n        \n        ###*\n        * Current x-coordinate. \n        * @property cx\n        * @type number\n        * @protected\n        ###\n        @cx = 0\n        \n        ###*\n        * Current y-coordinate. \n        * @property cy\n        * @type number\n        * @protected\n        ###\n        @cy = 0\n        \n        ###*\n        * Total size of all centered controls. \n        * @property centerSize\n        * @type number\n        * @protected\n        ###\n        @centerSize = 0\n        \n        ###*\n        * Current x/y-coordinate for a centered control.\n        * @property center\n        * @type number\n        * @protected\n        ###\n        @center = 0\n        \n        ###*\n        * Current x/y-coordinate for a bottom/right aligned control.\n        * @property bottom\n        * @type number\n        * @protected\n        ###\n        @bottom = 0\n        \n        @managementMode = 0\n        \n    ###*\n    * Initializes the layout.\n    *\n    * @method setup\n    ### \n    setup: ->\n        @update()\n                \n        if @object.scrollable\n            gs.GlobalEventManager.on \"mouseWheel\", =>\n                r = @object.dstRect\n                \n                if Rect.contains(r.x, r.y, r.width, r.height, Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y)\n                    @object.update()\n\n    ###*\n    * Updates the layout depending on its orientation.\n    *\n    * @method update\n    ### \n    update: ->\n        super\n        \n        if @orientation == 0\n            @layoutHorizontal()\n        else\n            @layoutVertical()\n    \n    ###*\n    * Sizes the layout to fit its content\n    *\n    * @method sizeToFit\n    * @return number The content size.\n    ###\n    sizeToFit: ->\n        if @orientation == 0\n            return @sizeToFitHorizontal()\n        else\n            return @sizeToFitVertical()\n            \n    ###*\n    * Sizes the horizontal-layout to fit its content\n    *\n    * @method sizeToFitHorizontal\n    ###\n    sizeToFitHorizontal: ->\n        x = 0\n        y = 0\n        rect = @object.dstRect\n        \n        if @object.sizeToFit\n            for i in [@offset...@count]\n                control = @object.subObjects[i]\n\n                if !control.alignment\n                    rect.width = Math.max(x + control.margin.left + control.dstRect.width + control.margin.right, rect.width || 0)\n                    x += control.margin.left + control.dstRect.width + control.margin.right\n                if !control.alignmentY\n                    rect.height = Math.max(y + control.margin.top + control.dstRect.height + control.margin.bottom, rect.height || 0)\n    \n    ###*\n    * Sizes the vertical-layout to fit its content\n    *\n    * @method sizeToFitVertical\n    ###    \n    sizeToFitVertical: ->\n        rect = @object.dstRect\n        if @object.sizeToFit\n            for control in @object.subObjects\n                rect.width = Math.max(control.dstRect.x + control.dstRect.width + control.margin.right, rect.width || 1)\n                rect.height = Math.max(control.dstRect.y + control.dstRect.height + control.margin.bottom, rect.height || 1)\n            \n    ###*\n    * Calculates the dynamic-size of a horizontal stack-layout. That size is used for\n    * resizable-controls to let them fill all free space. It is calculated in the\n    * following way:<br>\n    * <br>\n    * dynamic-size = sum-of-all-fixed-control-sizes / count-of-resizable-controls\n    * <br>\n    *\n    * @method calculateDynamicSizeHorizontal\n    * @return {number} The dynamic size.\n    * @protected\n    ### \n    calculateDynamicSizeHorizontal: ->\n        fixedSize = 0\n        dynamicCount = 0\n        rect = @object.dstRect\n        for control, i in @object.subObjects\n            if control.resizable and !control.sizeToFit\n                dynamicCount++\n            else\n                fixedSize += control.margin.left + control.dstRect.width + control.margin.right\n                if control.alignmentX == 1\n                    @centerSize += control.dstRect.width + control.margin.right\n                \n        return Math.round((rect.width - fixedSize) / dynamicCount) \n     \n    ###*\n    * Calculates the dynamic-size of a vertical stack-layout. That size is used for\n    * resizable-controls to let them fill all free space. It is calculated in the\n    * following way:<br>\n    * <br>\n    * dynamic-size = sum-of-all-fixed-control-sizes / count-of-resizable-controls\n    * <br>\n    *\n    * @method calculateDynamicSizeVertical\n    * @return {number} The dynamic size.\n    * @protected\n    ### \n    calculateDynamicSizeVertical: ->\n        fixedSize = 0\n        dynamicCount = 0\n        \n        for control in @object.subObjects\n            if control.resizable and !control.sizeToFit\n                dynamicCount++\n            else\n                fixedSize += control.dstRect.height\n                if control.alignmentY == 1\n                    @centerSize += control.dstRect.height + control.margin.bottom\n                \n        return Math.round((@object.dstRect.height - fixedSize) / dynamicCount)\n        \n    ###*\n    * Layouts the specified control as fixed-size control for a horizontal stack-layout. \n    *\n    * @method updateControlRectFixedH\n    * @param {gs.Object_Base} control The control to update.\n    * @protected\n    ###\n    updateControlRectFixedH: (control) ->\n        rect = @object.dstRect\n        if control.alignmentX == 0\n            @cx += control.margin.left\n            control.dstRect.x = @cx\n            @cx += control.dstRect.width + control.margin.right\n        else if control.alignmentX == 2\n            @bottom += control.margin.right\n            control.dstRect.x = (rect.x+rect.width) - control.dstRect.width - @bottom\n            @bottom += control.dstRect.width + control.margin.left\n        else if control.alignmentX == 1\n            control.dstRect.x = @center + (rect.width - @centerSize) / 2\n            @center += control.dstRect.width + control.margin.right\n            \n        if control.alignmentY == 1\n            control.dstRect.y = @cy + Math.round((rect.height-(control.dstRect.height+control.margin.top+control.margin.bottom)) / 2)\n        else\n            control.dstRect.y = @cy + control.margin.top\n     \n    ###*\n    * Layouts the specified control as fixed-size control for a vertical stack-layout. \n    *\n    * @method updateControlRectFixedV\n    * @param {gs.Object_Base} control The control to update.\n    * @protected\n    ###        \n    updateControlRectFixedV: (control) ->\n        rect = @object.dstRect\n        if control.alignmentY == 0\n            @cy += control.margin.top\n            control.dstRect.y = @cy\n            @cy += control.dstRect.height + control.margin.bottom\n            control.dstRect.x = @cx + control.margin.left\n        else if control.alignmentY == 2\n            @bottom += control.margin.bottom\n            control.dstRect.y = (rect.height) - control.dstRect.height - @bottom\n            @bottom += control.dstRect.height + control.margin.top\n            control.dstRect.x = @cx + control.margin.left\n        else if control.alignmentY == 1\n            control.dstRect.y = @center + (rect.height - @centerSize) / 2\n            control.dstRect.x = @cx + control.margin.left\n            @center += control.dstRect.height + control.margin.bottom\n        if control.alignmentX == 1\n            control.dstRect.x = @cx + Math.round((rect.width-control.dstRect.width) / 2)\n     \n    ###*\n    * Layouts the specified control as resizable-control for a horizontal stack-layout. \n    * That means the control will take up all free space after subtracting all \n    * fixed-size controls.\n    *\n    * @method updateControlRectResizableH\n    * @param {gs.Object_Base} control The control to update.\n    * @protected\n    ###        \n    updateControlRectResizableH: (control) ->\n        dynamicSize = @calculateDynamicSizeHorizontal() \n        control.dstRect.y = control.margin.top\n        control.dstRect.height = @object.dstRect.height - control.margin.bottom - control.margin.top\n        control.dstRect.x = @cx + control.margin.left\n        control.dstRect.width = dynamicSize - control.margin.right - control.margin.left\n        @cx += dynamicSize\n    \n    ###*\n    * Layouts the specified control as resizable-control for a vertical stack-layout. \n    * That means the control will take up all free space after subtracting all \n    * fixed-size controls.\n    *\n    * @method updateControlRectResizableV\n    * @param {gs.Object_Base} control The control to update.\n    * @protected\n    ### \n    updateControlRectResizableV: (control) ->\n        dynamicSize = @calculateDynamicSizeVertical()\n        control.dstRect.x = control.margin.left\n        control.dstRect.width = @object.dstRect.width - control.margin.right - control.margin.left\n        control.dstRect.y = @cy + control.margin.top\n        control.dstRect.height = dynamicSize - control.margin.bottom - control.margin.top\n        @cy += dynamicSize\n    \n    \n    ###*\n    * Updates a control.\n    *\n    * @method updateControl\n    * @param {gs.Object_Base} control The control to update.\n    * @protected\n    ### \n    updateControl: (control) ->\n        if @orientation == 1\n            if not control.clipRect? then control.clipRect = @object.clipRect\n            if yes #!control.updated or (Rect.intersect(control.dstRect.x+@object.dstRect.x, control.dstRect.y+ @object.dstRect.y, control.dstRect.width, control.dstRect.height, @object.dstRect.x, @object.dstRect.y, @object.dstRect.width, @object.dstRect.height))\n                if control.needsUpdate\n                    control.needsUpdate = no\n                    control.update()\n                    \n                control.updated = yes\n                control.visible = yes\n            else\n                if control.visible\n                    control.visible = no\n                    control.update()\n        else\n            super(control)\n                    \n    ###*\n    * Layouts the sub-objects horizontally.\n    *\n    * @method layoutHorizontal\n    ### \n    layoutHorizontal: ->\n        @bottom = 0\n        @center = 0\n        @centerSize = 0\n        @offset = (@object.listOffset||0)\n        @count = @object.subObjects.length\n        @cx = 0\n        @cy = 0\n        \n        \n        @sizeToFitHorizontal()\n        \n        i = @offset\n        while i < @object.subObjects.length\n            control = @object.subObjects[i]\n            \n            @updateControl(control)\n\n            if control.disposed\n                @object.removeObject(control)\n                i--\n            else\n                if control.resizable and !control.sizeToFit\n                    @updateControlRectResizableH(control)\n                else\n                    @updateControlRectFixedH(control)\n            i++    \n        @object.clipRect?.set(@object.dstRect.x + @object.origin.x, @object.dstRect.y + @object.origin.y, @object.dstRect.width, @object.dstRect.height)  \n            \n        \n        \n        return null \n        \n    ###*\n    * Layouts the sub-objects vertically.\n    *\n    * @method layoutVertical\n    ###           \n    layoutVertical: ->\n        @bottom = 0\n        @center = 0\n        @centerSize = 0\n        @offset = (@object.listOffset||0)\n        @count = @object.subObjects.length\n        @cx = 0\n        @cy = 0\n        \n        @cy -= @object.scrollOffsetY\n        i = @offset\n        currentY = 0\n        \n        while i < @object.subObjects.length\n            control = @object.subObjects[i]\n            i++\n            continue unless control\n            \n            @updateControl(control)\n \n            if control.disposed\n                @object.removeObject(control)\n                i--\n            else\n                if control.resizable and !control.sizeToFit\n                    @updateControlRectResizableV(control)\n                else\n                    @updateControlRectFixedV(control)\n            \n        @sizeToFitVertical()  \n        \n        \n        @object.clipRect?.set(@object.dstRect.x + @object.origin.x, @object.dstRect.y + @object.origin.y, @object.dstRect.width, @object.dstRect.height)  \n            \n        return null    \ngs.Component_StackLayoutBehavior = Component_StackLayoutBehavior","parentId":"01A95DA3K01E8A4CB4SBE17E790BCE1FC035","folder":false,"compiledContent":"var Component_StackLayoutBehavior,\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\nComponent_StackLayoutBehavior = (function(superClass) {\n  extend(Component_StackLayoutBehavior, superClass);\n\n\n  /**\n  * Turns a game object into a stack-layout and layouts all sub-objects\n  * like stack vertically or horizontally. The game object needs a \n  * container-component.\n  * <br>\n  * The sub-objects in a stack-layout can be configured as resizable or\n  * non-resizable(fixed-size). For example:<br>\n  * <br>\n  * Lets say we have a layout-size of 500px in width with three controls.<br>\n  * <br>\n  * | 80px | dynamic | 80px | <br>\n  * <br>\n  * Two controls have a fixed size of 80px and the middle-control has a\n  * dynamic-size because it is configured to be resizable. In that case, \n  * the size of the resizable control would be 340px because that is the\n  * free space left after subtracting the size(160px) of the fixed-size controls.<br>\n  * <br>\n  * In addition, each sub-object can have different alignment options.\n  *\n  * @module gs\n  * @class Component_StackLayoutBehavior\n  * @extends gs.Component_LayoutBehavior\n  * @memberof gs\n  * @constructor\n   */\n\n  function Component_StackLayoutBehavior(orientation) {\n    Component_StackLayoutBehavior.__super__.constructor.apply(this, arguments);\n\n    /**\n    * The orientation of the stack-layout. Can be vertical or horizontal.\n    * @property orientation\n    * @type gs.Orientation\n     */\n    this.orientation = orientation || 0;\n\n    /**\n    * @property scrollOffsetX\n    * @type number\n    * @protected\n     */\n    this.scrollOffsetX = 0;\n\n    /**\n    * @property scrollOffsetY\n    * @type number\n    * @protected\n     */\n    this.scrollOffsetY = 0;\n\n    /**\n    * @property contentHeight\n    * @type number\n    * @protected\n     */\n    this.contentHeight = 0;\n\n    /**\n    * Control list-offset.\n    * @property offset\n    * @type number\n    * @protected\n     */\n    this.offset = 0;\n\n    /**\n    * Count of controls to process.\n    * @property contentHeight\n    * @type number\n    * @protected\n     */\n    this.count = 0;\n\n    /**\n    * Current x-coordinate. \n    * @property cx\n    * @type number\n    * @protected\n     */\n    this.cx = 0;\n\n    /**\n    * Current y-coordinate. \n    * @property cy\n    * @type number\n    * @protected\n     */\n    this.cy = 0;\n\n    /**\n    * Total size of all centered controls. \n    * @property centerSize\n    * @type number\n    * @protected\n     */\n    this.centerSize = 0;\n\n    /**\n    * Current x/y-coordinate for a centered control.\n    * @property center\n    * @type number\n    * @protected\n     */\n    this.center = 0;\n\n    /**\n    * Current x/y-coordinate for a bottom/right aligned control.\n    * @property bottom\n    * @type number\n    * @protected\n     */\n    this.bottom = 0;\n    this.managementMode = 0;\n  }\n\n\n  /**\n  * Initializes the layout.\n  *\n  * @method setup\n   */\n\n  Component_StackLayoutBehavior.prototype.setup = function() {\n    this.update();\n    if (this.object.scrollable) {\n      return gs.GlobalEventManager.on(\"mouseWheel\", (function(_this) {\n        return function() {\n          var r;\n          r = _this.object.dstRect;\n          if (Rect.contains(r.x, r.y, r.width, r.height, Input.Mouse.x - _this.object.origin.x, Input.Mouse.y - _this.object.origin.y)) {\n            return _this.object.update();\n          }\n        };\n      })(this));\n    }\n  };\n\n\n  /**\n  * Updates the layout depending on its orientation.\n  *\n  * @method update\n   */\n\n  Component_StackLayoutBehavior.prototype.update = function() {\n    Component_StackLayoutBehavior.__super__.update.apply(this, arguments);\n    if (this.orientation === 0) {\n      return this.layoutHorizontal();\n    } else {\n      return this.layoutVertical();\n    }\n  };\n\n\n  /**\n  * Sizes the layout to fit its content\n  *\n  * @method sizeToFit\n  * @return number The content size.\n   */\n\n  Component_StackLayoutBehavior.prototype.sizeToFit = function() {\n    if (this.orientation === 0) {\n      return this.sizeToFitHorizontal();\n    } else {\n      return this.sizeToFitVertical();\n    }\n  };\n\n\n  /**\n  * Sizes the horizontal-layout to fit its content\n  *\n  * @method sizeToFitHorizontal\n   */\n\n  Component_StackLayoutBehavior.prototype.sizeToFitHorizontal = function() {\n    var control, i, j, rect, ref, ref1, results, x, y;\n    x = 0;\n    y = 0;\n    rect = this.object.dstRect;\n    if (this.object.sizeToFit) {\n      results = [];\n      for (i = j = ref = this.offset, ref1 = this.count; ref <= ref1 ? j < ref1 : j > ref1; i = ref <= ref1 ? ++j : --j) {\n        control = this.object.subObjects[i];\n        if (!control.alignment) {\n          rect.width = Math.max(x + control.margin.left + control.dstRect.width + control.margin.right, rect.width || 0);\n          x += control.margin.left + control.dstRect.width + control.margin.right;\n        }\n        if (!control.alignmentY) {\n          results.push(rect.height = Math.max(y + control.margin.top + control.dstRect.height + control.margin.bottom, rect.height || 0));\n        } else {\n          results.push(void 0);\n        }\n      }\n      return results;\n    }\n  };\n\n\n  /**\n  * Sizes the vertical-layout to fit its content\n  *\n  * @method sizeToFitVertical\n   */\n\n  Component_StackLayoutBehavior.prototype.sizeToFitVertical = function() {\n    var control, j, len, rect, ref, results;\n    rect = this.object.dstRect;\n    if (this.object.sizeToFit) {\n      ref = this.object.subObjects;\n      results = [];\n      for (j = 0, len = ref.length; j < len; j++) {\n        control = ref[j];\n        rect.width = Math.max(control.dstRect.x + control.dstRect.width + control.margin.right, rect.width || 1);\n        results.push(rect.height = Math.max(control.dstRect.y + control.dstRect.height + control.margin.bottom, rect.height || 1));\n      }\n      return results;\n    }\n  };\n\n\n  /**\n  * Calculates the dynamic-size of a horizontal stack-layout. That size is used for\n  * resizable-controls to let them fill all free space. It is calculated in the\n  * following way:<br>\n  * <br>\n  * dynamic-size = sum-of-all-fixed-control-sizes / count-of-resizable-controls\n  * <br>\n  *\n  * @method calculateDynamicSizeHorizontal\n  * @return {number} The dynamic size.\n  * @protected\n   */\n\n  Component_StackLayoutBehavior.prototype.calculateDynamicSizeHorizontal = function() {\n    var control, dynamicCount, fixedSize, i, j, len, rect, ref;\n    fixedSize = 0;\n    dynamicCount = 0;\n    rect = this.object.dstRect;\n    ref = this.object.subObjects;\n    for (i = j = 0, len = ref.length; j < len; i = ++j) {\n      control = ref[i];\n      if (control.resizable && !control.sizeToFit) {\n        dynamicCount++;\n      } else {\n        fixedSize += control.margin.left + control.dstRect.width + control.margin.right;\n        if (control.alignmentX === 1) {\n          this.centerSize += control.dstRect.width + control.margin.right;\n        }\n      }\n    }\n    return Math.round((rect.width - fixedSize) / dynamicCount);\n  };\n\n\n  /**\n  * Calculates the dynamic-size of a vertical stack-layout. That size is used for\n  * resizable-controls to let them fill all free space. It is calculated in the\n  * following way:<br>\n  * <br>\n  * dynamic-size = sum-of-all-fixed-control-sizes / count-of-resizable-controls\n  * <br>\n  *\n  * @method calculateDynamicSizeVertical\n  * @return {number} The dynamic size.\n  * @protected\n   */\n\n  Component_StackLayoutBehavior.prototype.calculateDynamicSizeVertical = function() {\n    var control, dynamicCount, fixedSize, j, len, ref;\n    fixedSize = 0;\n    dynamicCount = 0;\n    ref = this.object.subObjects;\n    for (j = 0, len = ref.length; j < len; j++) {\n      control = ref[j];\n      if (control.resizable && !control.sizeToFit) {\n        dynamicCount++;\n      } else {\n        fixedSize += control.dstRect.height;\n        if (control.alignmentY === 1) {\n          this.centerSize += control.dstRect.height + control.margin.bottom;\n        }\n      }\n    }\n    return Math.round((this.object.dstRect.height - fixedSize) / dynamicCount);\n  };\n\n\n  /**\n  * Layouts the specified control as fixed-size control for a horizontal stack-layout. \n  *\n  * @method updateControlRectFixedH\n  * @param {gs.Object_Base} control The control to update.\n  * @protected\n   */\n\n  Component_StackLayoutBehavior.prototype.updateControlRectFixedH = function(control) {\n    var rect;\n    rect = this.object.dstRect;\n    if (control.alignmentX === 0) {\n      this.cx += control.margin.left;\n      control.dstRect.x = this.cx;\n      this.cx += control.dstRect.width + control.margin.right;\n    } else if (control.alignmentX === 2) {\n      this.bottom += control.margin.right;\n      control.dstRect.x = (rect.x + rect.width) - control.dstRect.width - this.bottom;\n      this.bottom += control.dstRect.width + control.margin.left;\n    } else if (control.alignmentX === 1) {\n      control.dstRect.x = this.center + (rect.width - this.centerSize) / 2;\n      this.center += control.dstRect.width + control.margin.right;\n    }\n    if (control.alignmentY === 1) {\n      return control.dstRect.y = this.cy + Math.round((rect.height - (control.dstRect.height + control.margin.top + control.margin.bottom)) / 2);\n    } else {\n      return control.dstRect.y = this.cy + control.margin.top;\n    }\n  };\n\n\n  /**\n  * Layouts the specified control as fixed-size control for a vertical stack-layout. \n  *\n  * @method updateControlRectFixedV\n  * @param {gs.Object_Base} control The control to update.\n  * @protected\n   */\n\n  Component_StackLayoutBehavior.prototype.updateControlRectFixedV = function(control) {\n    var rect;\n    rect = this.object.dstRect;\n    if (control.alignmentY === 0) {\n      this.cy += control.margin.top;\n      control.dstRect.y = this.cy;\n      this.cy += control.dstRect.height + control.margin.bottom;\n      control.dstRect.x = this.cx + control.margin.left;\n    } else if (control.alignmentY === 2) {\n      this.bottom += control.margin.bottom;\n      control.dstRect.y = rect.height - control.dstRect.height - this.bottom;\n      this.bottom += control.dstRect.height + control.margin.top;\n      control.dstRect.x = this.cx + control.margin.left;\n    } else if (control.alignmentY === 1) {\n      control.dstRect.y = this.center + (rect.height - this.centerSize) / 2;\n      control.dstRect.x = this.cx + control.margin.left;\n      this.center += control.dstRect.height + control.margin.bottom;\n    }\n    if (control.alignmentX === 1) {\n      return control.dstRect.x = this.cx + Math.round((rect.width - control.dstRect.width) / 2);\n    }\n  };\n\n\n  /**\n  * Layouts the specified control as resizable-control for a horizontal stack-layout. \n  * That means the control will take up all free space after subtracting all \n  * fixed-size controls.\n  *\n  * @method updateControlRectResizableH\n  * @param {gs.Object_Base} control The control to update.\n  * @protected\n   */\n\n  Component_StackLayoutBehavior.prototype.updateControlRectResizableH = function(control) {\n    var dynamicSize;\n    dynamicSize = this.calculateDynamicSizeHorizontal();\n    control.dstRect.y = control.margin.top;\n    control.dstRect.height = this.object.dstRect.height - control.margin.bottom - control.margin.top;\n    control.dstRect.x = this.cx + control.margin.left;\n    control.dstRect.width = dynamicSize - control.margin.right - control.margin.left;\n    return this.cx += dynamicSize;\n  };\n\n\n  /**\n  * Layouts the specified control as resizable-control for a vertical stack-layout. \n  * That means the control will take up all free space after subtracting all \n  * fixed-size controls.\n  *\n  * @method updateControlRectResizableV\n  * @param {gs.Object_Base} control The control to update.\n  * @protected\n   */\n\n  Component_StackLayoutBehavior.prototype.updateControlRectResizableV = function(control) {\n    var dynamicSize;\n    dynamicSize = this.calculateDynamicSizeVertical();\n    control.dstRect.x = control.margin.left;\n    control.dstRect.width = this.object.dstRect.width - control.margin.right - control.margin.left;\n    control.dstRect.y = this.cy + control.margin.top;\n    control.dstRect.height = dynamicSize - control.margin.bottom - control.margin.top;\n    return this.cy += dynamicSize;\n  };\n\n\n  /**\n  * Updates a control.\n  *\n  * @method updateControl\n  * @param {gs.Object_Base} control The control to update.\n  * @protected\n   */\n\n  Component_StackLayoutBehavior.prototype.updateControl = function(control) {\n    if (this.orientation === 1) {\n      if (control.clipRect == null) {\n        control.clipRect = this.object.clipRect;\n      }\n      if (true) {\n        if (control.needsUpdate) {\n          control.needsUpdate = false;\n          control.update();\n        }\n        control.updated = true;\n        return control.visible = true;\n      } else {\n        if (control.visible) {\n          control.visible = false;\n          return control.update();\n        }\n      }\n    } else {\n      return Component_StackLayoutBehavior.__super__.updateControl.call(this, control);\n    }\n  };\n\n\n  /**\n  * Layouts the sub-objects horizontally.\n  *\n  * @method layoutHorizontal\n   */\n\n  Component_StackLayoutBehavior.prototype.layoutHorizontal = function() {\n    var control, i, ref;\n    this.bottom = 0;\n    this.center = 0;\n    this.centerSize = 0;\n    this.offset = this.object.listOffset || 0;\n    this.count = this.object.subObjects.length;\n    this.cx = 0;\n    this.cy = 0;\n    this.sizeToFitHorizontal();\n    i = this.offset;\n    while (i < this.object.subObjects.length) {\n      control = this.object.subObjects[i];\n      this.updateControl(control);\n      if (control.disposed) {\n        this.object.removeObject(control);\n        i--;\n      } else {\n        if (control.resizable && !control.sizeToFit) {\n          this.updateControlRectResizableH(control);\n        } else {\n          this.updateControlRectFixedH(control);\n        }\n      }\n      i++;\n    }\n    if ((ref = this.object.clipRect) != null) {\n      ref.set(this.object.dstRect.x + this.object.origin.x, this.object.dstRect.y + this.object.origin.y, this.object.dstRect.width, this.object.dstRect.height);\n    }\n    return null;\n  };\n\n\n  /**\n  * Layouts the sub-objects vertically.\n  *\n  * @method layoutVertical\n   */\n\n  Component_StackLayoutBehavior.prototype.layoutVertical = function() {\n    var control, currentY, i, ref;\n    this.bottom = 0;\n    this.center = 0;\n    this.centerSize = 0;\n    this.offset = this.object.listOffset || 0;\n    this.count = this.object.subObjects.length;\n    this.cx = 0;\n    this.cy = 0;\n    this.cy -= this.object.scrollOffsetY;\n    i = this.offset;\n    currentY = 0;\n    while (i < this.object.subObjects.length) {\n      control = this.object.subObjects[i];\n      i++;\n      if (!control) {\n        continue;\n      }\n      this.updateControl(control);\n      if (control.disposed) {\n        this.object.removeObject(control);\n        i--;\n      } else {\n        if (control.resizable && !control.sizeToFit) {\n          this.updateControlRectResizableV(control);\n        } else {\n          this.updateControlRectFixedV(control);\n        }\n      }\n    }\n    this.sizeToFitVertical();\n    if ((ref = this.object.clipRect) != null) {\n      ref.set(this.object.dstRect.x + this.object.origin.x, this.object.dstRect.y + this.object.origin.y, this.object.dstRect.width, this.object.dstRect.height);\n    }\n    return null;\n  };\n\n  return Component_StackLayoutBehavior;\n\n})(gs.Component_LayoutBehavior);\n\ngs.Component_StackLayoutBehavior = Component_StackLayoutBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsNkJBQUE7RUFBQTs7O0FBQU07Ozs7QUFDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF5QmEsdUNBQUMsV0FBRDtJQUNULGdFQUFBLFNBQUE7O0FBRUE7Ozs7O0lBS0EsSUFBQyxDQUFBLFdBQUQsR0FBZSxXQUFBLElBQWU7O0FBRTlCOzs7OztJQUtBLElBQUMsQ0FBQSxhQUFELEdBQWlCOztBQUVqQjs7Ozs7SUFLQSxJQUFDLENBQUEsYUFBRCxHQUFpQjs7QUFFakI7Ozs7O0lBS0EsSUFBQyxDQUFBLGFBQUQsR0FBaUI7O0FBRWpCOzs7Ozs7SUFNQSxJQUFDLENBQUEsTUFBRCxHQUFVOztBQUVWOzs7Ozs7SUFNQSxJQUFDLENBQUEsS0FBRCxHQUFTOztBQUVUOzs7Ozs7SUFNQSxJQUFDLENBQUEsRUFBRCxHQUFNOztBQUVOOzs7Ozs7SUFNQSxJQUFDLENBQUEsRUFBRCxHQUFNOztBQUVOOzs7Ozs7SUFNQSxJQUFDLENBQUEsVUFBRCxHQUFjOztBQUVkOzs7Ozs7SUFNQSxJQUFDLENBQUEsTUFBRCxHQUFVOztBQUVWOzs7Ozs7SUFNQSxJQUFDLENBQUEsTUFBRCxHQUFVO0lBRVYsSUFBQyxDQUFBLGNBQUQsR0FBa0I7RUF2RlQ7OztBQXlGYjs7Ozs7OzBDQUtBLEtBQUEsR0FBTyxTQUFBO0lBQ0gsSUFBQyxDQUFBLE1BQUQsQ0FBQTtJQUVBLElBQUcsSUFBQyxDQUFBLE1BQU0sQ0FBQyxVQUFYO2FBQ0ksRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQXRCLENBQXlCLFlBQXpCLEVBQXVDLENBQUEsU0FBQSxLQUFBO2VBQUEsU0FBQTtBQUNuQyxjQUFBO1VBQUEsQ0FBQSxHQUFJLEtBQUMsQ0FBQSxNQUFNLENBQUM7VUFFWixJQUFHLElBQUksQ0FBQyxRQUFMLENBQWMsQ0FBQyxDQUFDLENBQWhCLEVBQW1CLENBQUMsQ0FBQyxDQUFyQixFQUF3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LEdBQVc7QUFFWCxXQUFNLENBQUEsR0FBSSxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUE3QjtNQUNJLE9BQUEsR0FBVSxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVcsQ0FBQSxDQUFBO01BQzdCLENBQUE7TUFDQSxJQUFBLENBQWdCLE9BQWhCO0FBQUEsaUJBQUE7O01BRUEsSUFBQyxDQUFBLGFBQUQsQ0FBZSxPQUFmO01BRUEsSUFBRyxPQUFPLENBQUMsUUFBWDtRQUNJLElBQUMsQ0FBQSxNQUFNLENBQUMsWUFBUixDQUFxQixPQUFyQjtRQUNBLENBQUEsR0FGSjtPQUFBLE1BQUE7UUFJSSxJQUFHLE9BQU8sQ0FBQyxTQUFSLElBQXNCLENBQUMsT0FBTyxDQUFDLFNBQWxDO1VBQ0ksSUFBQyxDQUFBLDJCQUFELENBQTZCLE9BQTdCLEVBREo7U0FBQSxNQUFBO1VBR0ksSUFBQyxDQUFBLHVCQUFELENBQXlCLE9BQXpCLEVBSEo7U0FKSjs7SUFQSjtJQWdCQSxJQUFDLENBQUEsaUJBQUQsQ0FBQTs7U0FHZ0IsQ0FBRSxHQUFsQixDQUFzQixJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFoQixHQUFvQixJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUF6RCxFQUE0RCxJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFoQixHQUFvQixJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUEvRixFQUFrRyxJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFsSCxFQUF5SCxJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUF6STs7QUFFQSxXQUFPO0VBbENLOzs7O0dBell3QixFQUFFLENBQUM7O0FBNGEvQyxFQUFFLENBQUMsNkJBQUgsR0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyIjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiNcbiMgICBTY3JpcHQ6IENvbXBvbmVudF9TdGFja0xheW91dEJlaGF2aW9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5jbGFzcyBDb21wb25lbnRfU3RhY2tMYXlvdXRCZWhhdmlvciBleHRlbmRzIGdzLkNvbXBvbmVudF9MYXlvdXRCZWhhdmlvclxuICAgICMjIypcbiAgICAqIFR1cm5zIGEgZ2FtZSBvYmplY3QgaW50byBhIHN0YWNrLWxheW91dCBhbmQgbGF5b3V0cyBhbGwgc3ViLW9iamVjdHNcbiAgICAqIGxpa2Ugc3RhY2sgdmVydGljYWxseSBvciBob3Jpem9udGFsbHkuIFRoZSBnYW1lIG9iamVjdCBuZWVkcyBhIFxuICAgICogY29udGFpbmVyLWNvbXBvbmVudC5cbiAgICAqIDxicj5cbiAgICAqIFRoZSBzdWItb2JqZWN0cyBpbiBhIHN0YWNrLWxheW91dCBjYW4gYmUgY29uZmlndXJlZCBhcyByZXNpemFibGUgb3JcbiAgICAqIG5vbi1yZXNpemFibGUoZml4ZWQtc2l6ZSkuIEZvciBleGFtcGxlOjxicj5cbiAgICAqIDxicj5cbiAgICAqIExldHMgc2F5IHdlIGhhdmUgYSBsYXlvdXQtc2l6ZSBvZiA1MDBweCBpbiB3aWR0aCB3aXRoIHRocmVlIGNvbnRyb2xzLjxicj5cbiAgICAqIDxicj5cbiAgICAqIHwgODBweCB8IGR5bmFtaWMgfCA4MHB4IHwgPGJyPlxuICAgICogPGJyPlxuICAgICogVHdvIGNvbnRyb2xzIGhhdmUgYSBmaXhlZCBzaXplIG9mIDgwcHggYW5kIHRoZSBtaWRkbGUtY29udHJvbCBoYXMgYVxuICAgICogZHluYW1pYy1zaXplIGJlY2F1c2UgaXQgaXMgY29uZmlndXJlZCB0byBiZSByZXNpemFibGUuIEluIHRoYXQgY2FzZSwgXG4gICAgKiB0aGUgc2l6ZSBvZiB0aGUgcmVzaXphYmxlIGNvbnRyb2wgd291bGQgYmUgMzQwcHggYmVjYXVzZSB0aGF0IGlzIHRoZVxuICAgICogZnJlZSBzcGFjZSBsZWZ0IGFmdGVyIHN1YnRyYWN0aW5nIHRoZSBzaXplKDE2MHB4KSBvZiB0aGUgZml4ZWQtc2l6ZSBjb250cm9scy48YnI+XG4gICAgKiA8YnI+XG4gICAgKiBJbiBhZGRpdGlvbiwgZWFjaCBzdWItb2JqZWN0IGNhbiBoYXZlIGRpZmZlcmVudCBhbGlnbm1lbnQgb3B0aW9ucy5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X1N0YWNrTGF5b3V0QmVoYXZpb3JcbiAgICAqIEBleHRlbmRzIGdzLkNvbXBvbmVudF9MYXlvdXRCZWhhdmlvclxuICAgICogQG1lbWJlcm9mIGdzXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogKG9yaWVudGF0aW9uKSAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgc3RhY2stbGF5b3V0LiBDYW4gYmUgdmVydGljYWwgb3IgaG9yaXpvbnRhbC5cbiAgICAgICAgKiBAcHJvcGVydHkgb3JpZW50YXRpb25cbiAgICAgICAgKiBAdHlwZSBncy5PcmllbnRhdGlvblxuICAgICAgICAjIyNcbiAgICAgICAgQG9yaWVudGF0aW9uID0gb3JpZW50YXRpb24gfHwgMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEBwcm9wZXJ0eSBzY3JvbGxPZmZzZXRYXG4gICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAjIyNcbiAgICAgICAgQHNjcm9sbE9mZnNldFggPSAwXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQHByb3BlcnR5IHNjcm9sbE9mZnNldFlcbiAgICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAc2Nyb2xsT2Zmc2V0WSA9IDBcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBAcHJvcGVydHkgY29udGVudEhlaWdodFxuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBjb250ZW50SGVpZ2h0ID0gMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIENvbnRyb2wgbGlzdC1vZmZzZXQuXG4gICAgICAgICogQHByb3BlcnR5IG9mZnNldFxuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBvZmZzZXQgPSAwXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQ291bnQgb2YgY29udHJvbHMgdG8gcHJvY2Vzcy5cbiAgICAgICAgKiBAcHJvcGVydHkgY29udGVudEhlaWdodFxuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBjb3VudCA9IDBcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBDdXJyZW50IHgtY29vcmRpbmF0ZS4gXG4gICAgICAgICogQHByb3BlcnR5IGN4XG4gICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAjIyNcbiAgICAgICAgQGN4ID0gMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEN1cnJlbnQgeS1jb29yZGluYXRlLiBcbiAgICAgICAgKiBAcHJvcGVydHkgY3lcbiAgICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAY3kgPSAwXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVG90YWwgc2l6ZSBvZiBhbGwgY2VudGVyZWQgY29udHJvbHMuIFxuICAgICAgICAqIEBwcm9wZXJ0eSBjZW50ZXJTaXplXG4gICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAjIyNcbiAgICAgICAgQGNlbnRlclNpemUgPSAwXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQ3VycmVudCB4L3ktY29vcmRpbmF0ZSBmb3IgYSBjZW50ZXJlZCBjb250cm9sLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjZW50ZXJcbiAgICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAY2VudGVyID0gMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEN1cnJlbnQgeC95LWNvb3JkaW5hdGUgZm9yIGEgYm90dG9tL3JpZ2h0IGFsaWduZWQgY29udHJvbC5cbiAgICAgICAgKiBAcHJvcGVydHkgYm90dG9tXG4gICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgICogQHByb3RlY3RlZFxuICAgICAgICAjIyNcbiAgICAgICAgQGJvdHRvbSA9IDBcbiAgICAgICAgXG4gICAgICAgIEBtYW5hZ2VtZW50TW9kZSA9IDBcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogSW5pdGlhbGl6ZXMgdGhlIGxheW91dC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwXG4gICAgIyMjIFxuICAgIHNldHVwOiAtPlxuICAgICAgICBAdXBkYXRlKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgQG9iamVjdC5zY3JvbGxhYmxlXG4gICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub24gXCJtb3VzZVdoZWVsXCIsID0+XG4gICAgICAgICAgICAgICAgciA9IEBvYmplY3QuZHN0UmVjdFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIFJlY3QuY29udGFpbnMoci54LCByLnksIHIud2lkdGgsIHIuaGVpZ2h0LCBJbnB1dC5Nb3VzZS54IC0gQG9iamVjdC5vcmlnaW4ueCwgSW5wdXQuTW91c2UueSAtIEBvYmplY3Qub3JpZ2luLnkpXG4gICAgICAgICAgICAgICAgICAgIEBvYmplY3QudXBkYXRlKClcblxuICAgICMjIypcbiAgICAqIFVwZGF0ZXMgdGhlIGxheW91dCBkZXBlbmRpbmcgb24gaXRzIG9yaWVudGF0aW9uLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgIyMjIFxuICAgIHVwZGF0ZTogLT5cbiAgICAgICAgc3VwZXJcbiAgICAgICAgXG4gICAgICAgIGlmIEBvcmllbnRhdGlvbiA9PSAwXG4gICAgICAgICAgICBAbGF5b3V0SG9yaXpvbnRhbCgpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBsYXlvdXRWZXJ0aWNhbCgpXG4gICAgXG4gICAgIyMjKlxuICAgICogU2l6ZXMgdGhlIGxheW91dCB0byBmaXQgaXRzIGNvbnRlbnRcbiAgICAqXG4gICAgKiBAbWV0aG9kIHNpemVUb0ZpdFxuICAgICogQHJldHVybiBudW1iZXIgVGhlIGNvbnRlbnQgc2l6ZS5cbiAgICAjIyNcbiAgICBzaXplVG9GaXQ6IC0+XG4gICAgICAgIGlmIEBvcmllbnRhdGlvbiA9PSAwXG4gICAgICAgICAgICByZXR1cm4gQHNpemVUb0ZpdEhvcml6b250YWwoKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gQHNpemVUb0ZpdFZlcnRpY2FsKClcbiAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIFNpemVzIHRoZSBob3Jpem9udGFsLWxheW91dCB0byBmaXQgaXRzIGNvbnRlbnRcbiAgICAqXG4gICAgKiBAbWV0aG9kIHNpemVUb0ZpdEhvcml6b250YWxcbiAgICAjIyNcbiAgICBzaXplVG9GaXRIb3Jpem9udGFsOiAtPlxuICAgICAgICB4ID0gMFxuICAgICAgICB5ID0gMFxuICAgICAgICByZWN0ID0gQG9iamVjdC5kc3RSZWN0XG4gICAgICAgIFxuICAgICAgICBpZiBAb2JqZWN0LnNpemVUb0ZpdFxuICAgICAgICAgICAgZm9yIGkgaW4gW0BvZmZzZXQuLi5AY291bnRdXG4gICAgICAgICAgICAgICAgY29udHJvbCA9IEBvYmplY3Quc3ViT2JqZWN0c1tpXVxuXG4gICAgICAgICAgICAgICAgaWYgIWNvbnRyb2wuYWxpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgIHJlY3Qud2lkdGggPSBNYXRoLm1heCh4ICsgY29udHJvbC5tYXJnaW4ubGVmdCArIGNvbnRyb2wuZHN0UmVjdC53aWR0aCArIGNvbnRyb2wubWFyZ2luLnJpZ2h0LCByZWN0LndpZHRoIHx8IDApXG4gICAgICAgICAgICAgICAgICAgIHggKz0gY29udHJvbC5tYXJnaW4ubGVmdCArIGNvbnRyb2wuZHN0UmVjdC53aWR0aCArIGNvbnRyb2wubWFyZ2luLnJpZ2h0XG4gICAgICAgICAgICAgICAgaWYgIWNvbnRyb2wuYWxpZ25tZW50WVxuICAgICAgICAgICAgICAgICAgICByZWN0LmhlaWdodCA9IE1hdGgubWF4KHkgKyBjb250cm9sLm1hcmdpbi50b3AgKyBjb250cm9sLmRzdFJlY3QuaGVpZ2h0ICsgY29udHJvbC5tYXJnaW4uYm90dG9tLCByZWN0LmhlaWdodCB8fCAwKVxuICAgIFxuICAgICMjIypcbiAgICAqIFNpemVzIHRoZSB2ZXJ0aWNhbC1sYXlvdXQgdG8gZml0IGl0cyBjb250ZW50XG4gICAgKlxuICAgICogQG1ldGhvZCBzaXplVG9GaXRWZXJ0aWNhbFxuICAgICMjIyAgICBcbiAgICBzaXplVG9GaXRWZXJ0aWNhbDogLT5cbiAgICAgICAgcmVjdCA9IEBvYmplY3QuZHN0UmVjdFxuICAgICAgICBpZiBAb2JqZWN0LnNpemVUb0ZpdFxuICAgICAgICAgICAgZm9yIGNvbnRyb2wgaW4gQG9iamVjdC5zdWJPYmplY3RzXG4gICAgICAgICAgICAgICAgcmVjdC53aWR0aCA9IE1hdGgubWF4KGNvbnRyb2wuZHN0UmVjdC54ICsgY29udHJvbC5kc3RSZWN0LndpZHRoICsgY29udHJvbC5tYXJnaW4ucmlnaHQsIHJlY3Qud2lkdGggfHwgMSlcbiAgICAgICAgICAgICAgICByZWN0LmhlaWdodCA9IE1hdGgubWF4KGNvbnRyb2wuZHN0UmVjdC55ICsgY29udHJvbC5kc3RSZWN0LmhlaWdodCArIGNvbnRyb2wubWFyZ2luLmJvdHRvbSwgcmVjdC5oZWlnaHQgfHwgMSlcbiAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIENhbGN1bGF0ZXMgdGhlIGR5bmFtaWMtc2l6ZSBvZiBhIGhvcml6b250YWwgc3RhY2stbGF5b3V0LiBUaGF0IHNpemUgaXMgdXNlZCBmb3JcbiAgICAqIHJlc2l6YWJsZS1jb250cm9scyB0byBsZXQgdGhlbSBmaWxsIGFsbCBmcmVlIHNwYWNlLiBJdCBpcyBjYWxjdWxhdGVkIGluIHRoZVxuICAgICogZm9sbG93aW5nIHdheTo8YnI+XG4gICAgKiA8YnI+XG4gICAgKiBkeW5hbWljLXNpemUgPSBzdW0tb2YtYWxsLWZpeGVkLWNvbnRyb2wtc2l6ZXMgLyBjb3VudC1vZi1yZXNpemFibGUtY29udHJvbHNcbiAgICAqIDxicj5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNhbGN1bGF0ZUR5bmFtaWNTaXplSG9yaXpvbnRhbFxuICAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgZHluYW1pYyBzaXplLlxuICAgICogQHByb3RlY3RlZFxuICAgICMjIyBcbiAgICBjYWxjdWxhdGVEeW5hbWljU2l6ZUhvcml6b250YWw6IC0+XG4gICAgICAgIGZpeGVkU2l6ZSA9IDBcbiAgICAgICAgZHluYW1pY0NvdW50ID0gMFxuICAgICAgICByZWN0ID0gQG9iamVjdC5kc3RSZWN0XG4gICAgICAgIGZvciBjb250cm9sLCBpIGluIEBvYmplY3Quc3ViT2JqZWN0c1xuICAgICAgICAgICAgaWYgY29udHJvbC5yZXNpemFibGUgYW5kICFjb250cm9sLnNpemVUb0ZpdFxuICAgICAgICAgICAgICAgIGR5bmFtaWNDb3VudCsrXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZml4ZWRTaXplICs9IGNvbnRyb2wubWFyZ2luLmxlZnQgKyBjb250cm9sLmRzdFJlY3Qud2lkdGggKyBjb250cm9sLm1hcmdpbi5yaWdodFxuICAgICAgICAgICAgICAgIGlmIGNvbnRyb2wuYWxpZ25tZW50WCA9PSAxXG4gICAgICAgICAgICAgICAgICAgIEBjZW50ZXJTaXplICs9IGNvbnRyb2wuZHN0UmVjdC53aWR0aCArIGNvbnRyb2wubWFyZ2luLnJpZ2h0XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKChyZWN0LndpZHRoIC0gZml4ZWRTaXplKSAvIGR5bmFtaWNDb3VudCkgXG4gICAgIFxuICAgICMjIypcbiAgICAqIENhbGN1bGF0ZXMgdGhlIGR5bmFtaWMtc2l6ZSBvZiBhIHZlcnRpY2FsIHN0YWNrLWxheW91dC4gVGhhdCBzaXplIGlzIHVzZWQgZm9yXG4gICAgKiByZXNpemFibGUtY29udHJvbHMgdG8gbGV0IHRoZW0gZmlsbCBhbGwgZnJlZSBzcGFjZS4gSXQgaXMgY2FsY3VsYXRlZCBpbiB0aGVcbiAgICAqIGZvbGxvd2luZyB3YXk6PGJyPlxuICAgICogPGJyPlxuICAgICogZHluYW1pYy1zaXplID0gc3VtLW9mLWFsbC1maXhlZC1jb250cm9sLXNpemVzIC8gY291bnQtb2YtcmVzaXphYmxlLWNvbnRyb2xzXG4gICAgKiA8YnI+XG4gICAgKlxuICAgICogQG1ldGhvZCBjYWxjdWxhdGVEeW5hbWljU2l6ZVZlcnRpY2FsXG4gICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBkeW5hbWljIHNpemUuXG4gICAgKiBAcHJvdGVjdGVkXG4gICAgIyMjIFxuICAgIGNhbGN1bGF0ZUR5bmFtaWNTaXplVmVydGljYWw6IC0+XG4gICAgICAgIGZpeGVkU2l6ZSA9IDBcbiAgICAgICAgZHluYW1pY0NvdW50ID0gMFxuICAgICAgICBcbiAgICAgICAgZm9yIGNvbnRyb2wgaW4gQG9iamVjdC5zdWJPYmplY3RzXG4gICAgICAgICAgICBpZiBjb250cm9sLnJlc2l6YWJsZSBhbmQgIWNvbnRyb2wuc2l6ZVRvRml0XG4gICAgICAgICAgICAgICAgZHluYW1pY0NvdW50KytcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBmaXhlZFNpemUgKz0gY29udHJvbC5kc3RSZWN0LmhlaWdodFxuICAgICAgICAgICAgICAgIGlmIGNvbnRyb2wuYWxpZ25tZW50WSA9PSAxXG4gICAgICAgICAgICAgICAgICAgIEBjZW50ZXJTaXplICs9IGNvbnRyb2wuZHN0UmVjdC5oZWlnaHQgKyBjb250cm9sLm1hcmdpbi5ib3R0b21cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKEBvYmplY3QuZHN0UmVjdC5oZWlnaHQgLSBmaXhlZFNpemUpIC8gZHluYW1pY0NvdW50KVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBMYXlvdXRzIHRoZSBzcGVjaWZpZWQgY29udHJvbCBhcyBmaXhlZC1zaXplIGNvbnRyb2wgZm9yIGEgaG9yaXpvbnRhbCBzdGFjay1sYXlvdXQuIFxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQ29udHJvbFJlY3RGaXhlZEhcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gdXBkYXRlLlxuICAgICogQHByb3RlY3RlZFxuICAgICMjI1xuICAgIHVwZGF0ZUNvbnRyb2xSZWN0Rml4ZWRIOiAoY29udHJvbCkgLT5cbiAgICAgICAgcmVjdCA9IEBvYmplY3QuZHN0UmVjdFxuICAgICAgICBpZiBjb250cm9sLmFsaWdubWVudFggPT0gMFxuICAgICAgICAgICAgQGN4ICs9IGNvbnRyb2wubWFyZ2luLmxlZnRcbiAgICAgICAgICAgIGNvbnRyb2wuZHN0UmVjdC54ID0gQGN4XG4gICAgICAgICAgICBAY3ggKz0gY29udHJvbC5kc3RSZWN0LndpZHRoICsgY29udHJvbC5tYXJnaW4ucmlnaHRcbiAgICAgICAgZWxzZSBpZiBjb250cm9sLmFsaWdubWVudFggPT0gMlxuICAgICAgICAgICAgQGJvdHRvbSArPSBjb250cm9sLm1hcmdpbi5yaWdodFxuICAgICAgICAgICAgY29udHJvbC5kc3RSZWN0LnggPSAocmVjdC54K3JlY3Qud2lkdGgpIC0gY29udHJvbC5kc3RSZWN0LndpZHRoIC0gQGJvdHRvbVxuICAgICAgICAgICAgQGJvdHRvbSArPSBjb250cm9sLmRzdFJlY3Qud2lkdGggKyBjb250cm9sLm1hcmdpbi5sZWZ0XG4gICAgICAgIGVsc2UgaWYgY29udHJvbC5hbGlnbm1lbnRYID09IDFcbiAgICAgICAgICAgIGNvbnRyb2wuZHN0UmVjdC54ID0gQGNlbnRlciArIChyZWN0LndpZHRoIC0gQGNlbnRlclNpemUpIC8gMlxuICAgICAgICAgICAgQGNlbnRlciArPSBjb250cm9sLmRzdFJlY3Qud2lkdGggKyBjb250cm9sLm1hcmdpbi5yaWdodFxuICAgICAgICAgICAgXG4gICAgICAgIGlmIGNvbnRyb2wuYWxpZ25tZW50WSA9PSAxXG4gICAgICAgICAgICBjb250cm9sLmRzdFJlY3QueSA9IEBjeSArIE1hdGgucm91bmQoKHJlY3QuaGVpZ2h0LShjb250cm9sLmRzdFJlY3QuaGVpZ2h0K2NvbnRyb2wubWFyZ2luLnRvcCtjb250cm9sLm1hcmdpbi5ib3R0b20pKSAvIDIpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRyb2wuZHN0UmVjdC55ID0gQGN5ICsgY29udHJvbC5tYXJnaW4udG9wXG4gICAgIFxuICAgICMjIypcbiAgICAqIExheW91dHMgdGhlIHNwZWNpZmllZCBjb250cm9sIGFzIGZpeGVkLXNpemUgY29udHJvbCBmb3IgYSB2ZXJ0aWNhbCBzdGFjay1sYXlvdXQuIFxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQ29udHJvbFJlY3RGaXhlZFZcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gdXBkYXRlLlxuICAgICogQHByb3RlY3RlZFxuICAgICMjIyAgICAgICAgXG4gICAgdXBkYXRlQ29udHJvbFJlY3RGaXhlZFY6IChjb250cm9sKSAtPlxuICAgICAgICByZWN0ID0gQG9iamVjdC5kc3RSZWN0XG4gICAgICAgIGlmIGNvbnRyb2wuYWxpZ25tZW50WSA9PSAwXG4gICAgICAgICAgICBAY3kgKz0gY29udHJvbC5tYXJnaW4udG9wXG4gICAgICAgICAgICBjb250cm9sLmRzdFJlY3QueSA9IEBjeVxuICAgICAgICAgICAgQGN5ICs9IGNvbnRyb2wuZHN0UmVjdC5oZWlnaHQgKyBjb250cm9sLm1hcmdpbi5ib3R0b21cbiAgICAgICAgICAgIGNvbnRyb2wuZHN0UmVjdC54ID0gQGN4ICsgY29udHJvbC5tYXJnaW4ubGVmdFxuICAgICAgICBlbHNlIGlmIGNvbnRyb2wuYWxpZ25tZW50WSA9PSAyXG4gICAgICAgICAgICBAYm90dG9tICs9IGNvbnRyb2wubWFyZ2luLmJvdHRvbVxuICAgICAgICAgICAgY29udHJvbC5kc3RSZWN0LnkgPSAocmVjdC5oZWlnaHQpIC0gY29udHJvbC5kc3RSZWN0LmhlaWdodCAtIEBib3R0b21cbiAgICAgICAgICAgIEBib3R0b20gKz0gY29udHJvbC5kc3RSZWN0LmhlaWdodCArIGNvbnRyb2wubWFyZ2luLnRvcFxuICAgICAgICAgICAgY29udHJvbC5kc3RSZWN0LnggPSBAY3ggKyBjb250cm9sLm1hcmdpbi5sZWZ0XG4gICAgICAgIGVsc2UgaWYgY29udHJvbC5hbGlnbm1lbnRZID09IDFcbiAgICAgICAgICAgIGNvbnRyb2wuZHN0UmVjdC55ID0gQGNlbnRlciArIChyZWN0LmhlaWdodCAtIEBjZW50ZXJTaXplKSAvIDJcbiAgICAgICAgICAgIGNvbnRyb2wuZHN0UmVjdC54ID0gQGN4ICsgY29udHJvbC5tYXJnaW4ubGVmdFxuICAgICAgICAgICAgQGNlbnRlciArPSBjb250cm9sLmRzdFJlY3QuaGVpZ2h0ICsgY29udHJvbC5tYXJnaW4uYm90dG9tXG4gICAgICAgIGlmIGNvbnRyb2wuYWxpZ25tZW50WCA9PSAxXG4gICAgICAgICAgICBjb250cm9sLmRzdFJlY3QueCA9IEBjeCArIE1hdGgucm91bmQoKHJlY3Qud2lkdGgtY29udHJvbC5kc3RSZWN0LndpZHRoKSAvIDIpXG4gICAgIFxuICAgICMjIypcbiAgICAqIExheW91dHMgdGhlIHNwZWNpZmllZCBjb250cm9sIGFzIHJlc2l6YWJsZS1jb250cm9sIGZvciBhIGhvcml6b250YWwgc3RhY2stbGF5b3V0LiBcbiAgICAqIFRoYXQgbWVhbnMgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwIGFsbCBmcmVlIHNwYWNlIGFmdGVyIHN1YnRyYWN0aW5nIGFsbCBcbiAgICAqIGZpeGVkLXNpemUgY29udHJvbHMuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVDb250cm9sUmVjdFJlc2l6YWJsZUhcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gdXBkYXRlLlxuICAgICogQHByb3RlY3RlZFxuICAgICMjIyAgICAgICAgXG4gICAgdXBkYXRlQ29udHJvbFJlY3RSZXNpemFibGVIOiAoY29udHJvbCkgLT5cbiAgICAgICAgZHluYW1pY1NpemUgPSBAY2FsY3VsYXRlRHluYW1pY1NpemVIb3Jpem9udGFsKCkgXG4gICAgICAgIGNvbnRyb2wuZHN0UmVjdC55ID0gY29udHJvbC5tYXJnaW4udG9wXG4gICAgICAgIGNvbnRyb2wuZHN0UmVjdC5oZWlnaHQgPSBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0IC0gY29udHJvbC5tYXJnaW4uYm90dG9tIC0gY29udHJvbC5tYXJnaW4udG9wXG4gICAgICAgIGNvbnRyb2wuZHN0UmVjdC54ID0gQGN4ICsgY29udHJvbC5tYXJnaW4ubGVmdFxuICAgICAgICBjb250cm9sLmRzdFJlY3Qud2lkdGggPSBkeW5hbWljU2l6ZSAtIGNvbnRyb2wubWFyZ2luLnJpZ2h0IC0gY29udHJvbC5tYXJnaW4ubGVmdFxuICAgICAgICBAY3ggKz0gZHluYW1pY1NpemVcbiAgICBcbiAgICAjIyMqXG4gICAgKiBMYXlvdXRzIHRoZSBzcGVjaWZpZWQgY29udHJvbCBhcyByZXNpemFibGUtY29udHJvbCBmb3IgYSB2ZXJ0aWNhbCBzdGFjay1sYXlvdXQuIFxuICAgICogVGhhdCBtZWFucyB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAgYWxsIGZyZWUgc3BhY2UgYWZ0ZXIgc3VidHJhY3RpbmcgYWxsIFxuICAgICogZml4ZWQtc2l6ZSBjb250cm9scy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZUNvbnRyb2xSZWN0UmVzaXphYmxlVlxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gY29udHJvbCBUaGUgY29udHJvbCB0byB1cGRhdGUuXG4gICAgKiBAcHJvdGVjdGVkXG4gICAgIyMjIFxuICAgIHVwZGF0ZUNvbnRyb2xSZWN0UmVzaXphYmxlVjogKGNvbnRyb2wpIC0+XG4gICAgICAgIGR5bmFtaWNTaXplID0gQGNhbGN1bGF0ZUR5bmFtaWNTaXplVmVydGljYWwoKVxuICAgICAgICBjb250cm9sLmRzdFJlY3QueCA9IGNvbnRyb2wubWFyZ2luLmxlZnRcbiAgICAgICAgY29udHJvbC5kc3RSZWN0LndpZHRoID0gQG9iamVjdC5kc3RSZWN0LndpZHRoIC0gY29udHJvbC5tYXJnaW4ucmlnaHQgLSBjb250cm9sLm1hcmdpbi5sZWZ0XG4gICAgICAgIGNvbnRyb2wuZHN0UmVjdC55ID0gQGN5ICsgY29udHJvbC5tYXJnaW4udG9wXG4gICAgICAgIGNvbnRyb2wuZHN0UmVjdC5oZWlnaHQgPSBkeW5hbWljU2l6ZSAtIGNvbnRyb2wubWFyZ2luLmJvdHRvbSAtIGNvbnRyb2wubWFyZ2luLnRvcFxuICAgICAgICBAY3kgKz0gZHluYW1pY1NpemVcbiAgICBcbiAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIGEgY29udHJvbC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZUNvbnRyb2xcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gdXBkYXRlLlxuICAgICogQHByb3RlY3RlZFxuICAgICMjIyBcbiAgICB1cGRhdGVDb250cm9sOiAoY29udHJvbCkgLT5cbiAgICAgICAgaWYgQG9yaWVudGF0aW9uID09IDFcbiAgICAgICAgICAgIGlmIG5vdCBjb250cm9sLmNsaXBSZWN0PyB0aGVuIGNvbnRyb2wuY2xpcFJlY3QgPSBAb2JqZWN0LmNsaXBSZWN0XG4gICAgICAgICAgICBpZiB5ZXMgIyFjb250cm9sLnVwZGF0ZWQgb3IgKFJlY3QuaW50ZXJzZWN0KGNvbnRyb2wuZHN0UmVjdC54K0BvYmplY3QuZHN0UmVjdC54LCBjb250cm9sLmRzdFJlY3QueSsgQG9iamVjdC5kc3RSZWN0LnksIGNvbnRyb2wuZHN0UmVjdC53aWR0aCwgY29udHJvbC5kc3RSZWN0LmhlaWdodCwgQG9iamVjdC5kc3RSZWN0LngsIEBvYmplY3QuZHN0UmVjdC55LCBAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQpKVxuICAgICAgICAgICAgICAgIGlmIGNvbnRyb2wubmVlZHNVcGRhdGVcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5uZWVkc1VwZGF0ZSA9IG5vXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29udHJvbC51cGRhdGVkID0geWVzXG4gICAgICAgICAgICAgICAgY29udHJvbC52aXNpYmxlID0geWVzXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaWYgY29udHJvbC52aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmlzaWJsZSA9IG5vXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3VwZXIoY29udHJvbClcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgIyMjKlxuICAgICogTGF5b3V0cyB0aGUgc3ViLW9iamVjdHMgaG9yaXpvbnRhbGx5LlxuICAgICpcbiAgICAqIEBtZXRob2QgbGF5b3V0SG9yaXpvbnRhbFxuICAgICMjIyBcbiAgICBsYXlvdXRIb3Jpem9udGFsOiAtPlxuICAgICAgICBAYm90dG9tID0gMFxuICAgICAgICBAY2VudGVyID0gMFxuICAgICAgICBAY2VudGVyU2l6ZSA9IDBcbiAgICAgICAgQG9mZnNldCA9IChAb2JqZWN0Lmxpc3RPZmZzZXR8fDApXG4gICAgICAgIEBjb3VudCA9IEBvYmplY3Quc3ViT2JqZWN0cy5sZW5ndGhcbiAgICAgICAgQGN4ID0gMFxuICAgICAgICBAY3kgPSAwXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgQHNpemVUb0ZpdEhvcml6b250YWwoKVxuICAgICAgICBcbiAgICAgICAgaSA9IEBvZmZzZXRcbiAgICAgICAgd2hpbGUgaSA8IEBvYmplY3Quc3ViT2JqZWN0cy5sZW5ndGhcbiAgICAgICAgICAgIGNvbnRyb2wgPSBAb2JqZWN0LnN1Yk9iamVjdHNbaV1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQHVwZGF0ZUNvbnRyb2woY29udHJvbClcblxuICAgICAgICAgICAgaWYgY29udHJvbC5kaXNwb3NlZFxuICAgICAgICAgICAgICAgIEBvYmplY3QucmVtb3ZlT2JqZWN0KGNvbnRyb2wpXG4gICAgICAgICAgICAgICAgaS0tXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaWYgY29udHJvbC5yZXNpemFibGUgYW5kICFjb250cm9sLnNpemVUb0ZpdFxuICAgICAgICAgICAgICAgICAgICBAdXBkYXRlQ29udHJvbFJlY3RSZXNpemFibGVIKGNvbnRyb2wpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBAdXBkYXRlQ29udHJvbFJlY3RGaXhlZEgoY29udHJvbClcbiAgICAgICAgICAgIGkrKyAgICBcbiAgICAgICAgQG9iamVjdC5jbGlwUmVjdD8uc2V0KEBvYmplY3QuZHN0UmVjdC54ICsgQG9iamVjdC5vcmlnaW4ueCwgQG9iamVjdC5kc3RSZWN0LnkgKyBAb2JqZWN0Lm9yaWdpbi55LCBAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQpICBcbiAgICAgICAgICAgIFxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBudWxsIFxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBMYXlvdXRzIHRoZSBzdWItb2JqZWN0cyB2ZXJ0aWNhbGx5LlxuICAgICpcbiAgICAqIEBtZXRob2QgbGF5b3V0VmVydGljYWxcbiAgICAjIyMgICAgICAgICAgIFxuICAgIGxheW91dFZlcnRpY2FsOiAtPlxuICAgICAgICBAYm90dG9tID0gMFxuICAgICAgICBAY2VudGVyID0gMFxuICAgICAgICBAY2VudGVyU2l6ZSA9IDBcbiAgICAgICAgQG9mZnNldCA9IChAb2JqZWN0Lmxpc3RPZmZzZXR8fDApXG4gICAgICAgIEBjb3VudCA9IEBvYmplY3Quc3ViT2JqZWN0cy5sZW5ndGhcbiAgICAgICAgQGN4ID0gMFxuICAgICAgICBAY3kgPSAwXG4gICAgICAgIFxuICAgICAgICBAY3kgLT0gQG9iamVjdC5zY3JvbGxPZmZzZXRZXG4gICAgICAgIGkgPSBAb2Zmc2V0XG4gICAgICAgIGN1cnJlbnRZID0gMFxuICAgICAgICBcbiAgICAgICAgd2hpbGUgaSA8IEBvYmplY3Quc3ViT2JqZWN0cy5sZW5ndGhcbiAgICAgICAgICAgIGNvbnRyb2wgPSBAb2JqZWN0LnN1Yk9iamVjdHNbaV1cbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgY29udGludWUgdW5sZXNzIGNvbnRyb2xcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQHVwZGF0ZUNvbnRyb2woY29udHJvbClcbiBcbiAgICAgICAgICAgIGlmIGNvbnRyb2wuZGlzcG9zZWRcbiAgICAgICAgICAgICAgICBAb2JqZWN0LnJlbW92ZU9iamVjdChjb250cm9sKVxuICAgICAgICAgICAgICAgIGktLVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGlmIGNvbnRyb2wucmVzaXphYmxlIGFuZCAhY29udHJvbC5zaXplVG9GaXRcbiAgICAgICAgICAgICAgICAgICAgQHVwZGF0ZUNvbnRyb2xSZWN0UmVzaXphYmxlVihjb250cm9sKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgQHVwZGF0ZUNvbnRyb2xSZWN0Rml4ZWRWKGNvbnRyb2wpXG4gICAgICAgICAgICBcbiAgICAgICAgQHNpemVUb0ZpdFZlcnRpY2FsKCkgIFxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIEBvYmplY3QuY2xpcFJlY3Q/LnNldChAb2JqZWN0LmRzdFJlY3QueCArIEBvYmplY3Qub3JpZ2luLngsIEBvYmplY3QuZHN0UmVjdC55ICsgQG9iamVjdC5vcmlnaW4ueSwgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0KSAgXG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIG51bGwgICAgXG5ncy5Db21wb25lbnRfU3RhY2tMYXlvdXRCZWhhdmlvciA9IENvbXBvbmVudF9TdGFja0xheW91dEJlaGF2aW9yIl19\n//# sourceURL=Component_StackLayoutBehavior_85.js"},"summary":["name","type","order"]}

Commits for Nextrek/s2s/data/E442F997KC428A496DSA01EE8D171F72BDCA.json

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