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"]}
|