/// <summary>
		/// Gets the max columns count.
		/// </summary>
		/// <returns>The max columns count.</returns>
		/// <param name="uiElements">User interface elements.</param>
		/// <param name="baseLength">Base length.</param>
		/// <param name="layout">Layout.</param>
		/// <param name="maxColumns">Max columns.</param>
		public static int GetMaxColumnsCount(List<RectTransform> uiElements, float baseLength, EasyLayout layout, int maxColumns)
		{
			var length = baseLength;
			var spacing = (layout.Stacking==Stackings.Horizontal) ? layout.Spacing.x : layout.Spacing.y;
			
			bool min_columns_setted = false;
			int min_columns = maxColumns;
			int current_columns = 0;
			
			foreach (var ui_element in uiElements)
			{
				var ui_length = layout.GetLength(ui_element);
				
				if (current_columns==maxColumns)
				{
					min_columns_setted = true;
					min_columns = Mathf.Min(min_columns, current_columns);
					
					current_columns = 1;
					length = baseLength - ui_length;
					continue;
				}
				if (current_columns == 0)
				{
					current_columns = 1;
					length = baseLength - ui_length;
					continue;
				}
				
				if (length >= (ui_length + spacing))
				{
					length -= ui_length + spacing;
					current_columns++;
				}
				else
				{
					min_columns_setted = true;
					min_columns = Mathf.Min(min_columns, current_columns);
					
					current_columns = 1;
					length = baseLength - ui_length;
				}
			}
			if (!min_columns_setted)
			{
				min_columns = current_columns;
			}
			
			return min_columns;
		}
		/// <summary>
		/// Group the specified uiElements.
		/// </summary>
		/// <param name="uiElements">User interface elements.</param>
		/// <param name="baseLength">Base length (width or height).</param>
		/// <param name="layout">Layout.</param>
		public static List<List<RectTransform>> Group(List<RectTransform> uiElements, float baseLength, EasyLayout layout)
		{
			var length = baseLength;
			
			var spacing = (layout.Stacking==Stackings.Horizontal) ? layout.Spacing.x : layout.Spacing.y;
			
			var group = new List<List<RectTransform>>();
			
			var row = new List<RectTransform>();
			
			foreach (var ui_element in uiElements)
			{
				var ui_length = layout.GetLength(ui_element);
				
				if (row.Count == 0)
				{
					length -= ui_length;
					row.Add(ui_element);
					continue;
				}
				
				if (length >= (ui_length + spacing))
				{
					length -= ui_length + spacing;
					row.Add(ui_element);
				}
				else
				{
					group.Add(row);
					length = baseLength;
					length -= ui_length;
					row = new List<RectTransform>();
					row.Add(ui_element);
				}
			}
			if (row.Count > 0)
			{
				group.Add(row);
			}
			
			return group;
		}
		/// <summary>
		/// Group the specified uiElements.
		/// </summary>
		/// <param name="uiElements">User interface elements.</param>
		/// <param name="baseLength">Base length (width or size).</param>
		/// <param name="layout">Layout.</param>
		/// <param name="maxColumns">Max columns.</param>
		public static List<List<RectTransform>> Group(List<RectTransform> uiElements, float baseLength, EasyLayout layout, int maxColumns=0)
		{
			int max_columns = 999999;
			while (true)
			{
				var new_max_columns = GetMaxColumnsCount(uiElements, baseLength, layout, max_columns);
				
				if ((max_columns==new_max_columns) || (new_max_columns==1))
				{
					max_columns = new_max_columns;
					break;
				}
				max_columns = new_max_columns;
			}
			
			var group = new List<List<RectTransform>>();
			var row = new List<RectTransform>();
			
			int i = 0;
			foreach (var ui_element in uiElements)
			{
				if ((i > 0) && ((i % max_columns)==0))
				{
					group.Add(row);
					row = new List<RectTransform>();
				}
				row.Add(ui_element);
				
				i++;
			}
			if (row.Count > 0)
			{
				group.Add(row);
			}
			
			return group;
		}