Decompiled source of Mods Communicator Menu v0.0.1

OutwardModsCommunicatorMenu.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using OutwardModsCommunicator.EventBus;
using OutwardModsCommunicator.Managers;
using OutwardModsCommunicatorMenu.Events.Publishers;
using OutwardModsCommunicatorMenu.Managers;
using OutwardModsCommunicatorMenu.Patches;
using OutwardModsCommunicatorMenu.UI;
using OutwardModsCommunicatorMenu.UI.Builders;
using OutwardModsCommunicatorMenu.UI.Components;
using OutwardModsCommunicatorMenu.Utility;
using OutwardModsCommunicatorMenu.Utility.Enums;
using OutwardModsCommunicatorMenu.Utility.Helpers;
using SideLoader;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;
using UniverseLib;
using UniverseLib.Config;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.Utility;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("OutwardModsCommunicatorMenu")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OutwardModsCommunicatorMenu")]
[assembly: AssemblyCopyright("Copyright © 2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("c5450fe0-edcf-483f-b9ea-4b1ef9d36da7")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace OutwardModsCommunicatorMenu
{
	[BepInPlugin("gymmed.mods_communicator_menu", "Mods Communicator Menu", "0.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class OMCM : BaseUnityPlugin
	{
		public const string GUID = "gymmed.mods_communicator_menu";

		public const string NAME = "Mods Communicator Menu";

		public const string VERSION = "0.0.1";

		public static string prefix = "[Mods-Communicator-Menu]";

		public const string EVENTS_LISTENER_GUID = "gymmed.mods_communicator_menu_*";

		internal static ManualLogSource Log;

		internal void Awake()
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Log = ((BaseUnityPlugin)this).Logger;
				LogMessage("Hello world from Mods Communicator Menu 0.0.1!");
				Universe.Init(1f, (Action)delegate
				{
					LogMessage("UniverseLib initialized");
				}, (Action<string, LogType>)delegate(string msg, LogType type)
				{
					LogMessage("[UniverseLib] " + msg);
				}, new UniverseLibConfig
				{
					Force_Unlock_Mouse = true
				});
				new Harmony("gymmed.mods_communicator_menu").PatchAll();
				UIManager.Instance.Initialize(Log);
				LogMessage("Awake completed successfully");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("[OMCM] Error in Awake: " + ex.GetType().Name + ": " + ex.Message + "\n" + ex.StackTrace));
			}
		}

		internal void Update()
		{
			UIManager.Instance.OnUpdate();
		}

		public static void LogMessage(string message)
		{
			Log.LogMessage((object)(prefix + " " + message));
		}

		public static void LogStatusMessage(string message, ChatLogStatus status = ChatLogStatus.Info)
		{
			LogMessage($"[{status}] {message}");
		}

		public static void LogSL(string message)
		{
			SL.Log(prefix + " " + message);
		}

		public static string GetProjectLocation()
		{
			return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
		}
	}
}
namespace OutwardModsCommunicatorMenu.Utility
{
	public static class CollectionValueParser
	{
		public static (object result, string error) TryParse(Type collectionType, string valueString)
		{
			if (collectionType == null || string.IsNullOrWhiteSpace(valueString))
			{
				return (null, "Type or value is null/empty");
			}
			if (!IsCollectionType(collectionType))
			{
				return (null, "Type '" + collectionType.Name + "' is not a collection type");
			}
			Type elementType = GetElementType(collectionType);
			if (elementType == null)
			{
				return (null, "Cannot determine element type for '" + collectionType.Name + "'");
			}
			string[] array = valueString.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
			if (array.Length == 0)
			{
				return (null, "No values provided");
			}
			if (collectionType.IsArray)
			{
				return TryParseArray(elementType, array);
			}
			return TryParseCollection(collectionType, elementType, array);
		}

		private static (object result, string error) TryParseArray(Type elementType, string[] values)
		{
			List<object> list = new List<object>();
			for (int i = 0; i < values.Length; i++)
			{
				var (item, text) = ParseValue(elementType, values[i]);
				if (text != null)
				{
					return (null, $"Invalid value at position {i + 1}: {text}");
				}
				list.Add(item);
			}
			try
			{
				Array array = Array.CreateInstance(elementType, list.Count);
				for (int j = 0; j < list.Count; j++)
				{
					array.SetValue(list[j], j);
				}
				return (array, null);
			}
			catch (Exception ex)
			{
				return (null, "Failed to create array: " + ex.Message);
			}
		}

		private static (object result, string error) TryParseCollection(Type collectionType, Type elementType, string[] values)
		{
			List<object> list = new List<object>();
			for (int i = 0; i < values.Length; i++)
			{
				var (item, text) = ParseValue(elementType, values[i]);
				if (text != null)
				{
					return (null, $"Invalid value at position {i + 1}: {text}");
				}
				list.Add(item);
			}
			try
			{
				bool num = IsSetType(collectionType);
				bool flag = IsListType(collectionType);
				bool flag2 = typeof(ICollection).IsAssignableFrom(collectionType);
				bool flag3 = typeof(IEnumerable).IsAssignableFrom(collectionType);
				object obj;
				if (num || (flag3 && !flag && collectionType.GetConstructor(Type.EmptyTypes) != null))
				{
					Type type = typeof(HashSet<>).MakeGenericType(elementType);
					obj = Activator.CreateInstance(type);
					MethodInfo method = type.GetMethod("Add");
					foreach (object item2 in list)
					{
						method.Invoke(obj, new object[1] { item2 });
					}
				}
				else if (flag || (flag2 && collectionType.GetConstructor(Type.EmptyTypes) != null))
				{
					Type type2 = typeof(List<>).MakeGenericType(elementType);
					obj = Activator.CreateInstance(type2);
					MethodInfo method2 = type2.GetMethod("Add");
					foreach (object item3 in list)
					{
						method2.Invoke(obj, new object[1] { item3 });
					}
				}
				else
				{
					if (!collectionType.IsAssignableFrom(typeof(List<>).MakeGenericType(elementType)))
					{
						return (null, "Cannot instantiate collection type '" + collectionType.Name + "'");
					}
					Type type3 = typeof(List<>).MakeGenericType(elementType);
					obj = Activator.CreateInstance(type3);
					MethodInfo method3 = type3.GetMethod("Add");
					foreach (object item4 in list)
					{
						method3.Invoke(obj, new object[1] { item4 });
					}
				}
				return (obj, null);
			}
			catch (Exception ex)
			{
				return (null, "Failed to create collection: " + ex.Message);
			}
		}

		private static (object result, string error) ParseValue(Type targetType, string valueString)
		{
			if (string.IsNullOrWhiteSpace(valueString))
			{
				return (null, "Empty value");
			}
			valueString = valueString.Trim();
			if (targetType.IsEnum)
			{
				try
				{
					return (Enum.Parse(targetType, valueString, ignoreCase: true), null);
				}
				catch
				{
					string text = string.Join(", ", Enum.GetNames(targetType));
					return (null, "Invalid enum value. Expected one of: " + text);
				}
			}
			object item = default(object);
			Exception ex = default(Exception);
			if (ParseUtility.TryParse(valueString, targetType, ref item, ref ex))
			{
				return (item, null);
			}
			return (null, "Cannot convert '" + valueString + "' to " + targetType.Name);
		}

		public static bool IsCollectionType(Type type)
		{
			if (type == null)
			{
				return false;
			}
			if (type.IsArray)
			{
				return true;
			}
			if (typeof(IEnumerable).IsAssignableFrom(type))
			{
				if (type.IsGenericType)
				{
					Type genericTypeDefinition = type.GetGenericTypeDefinition();
					if (genericTypeDefinition == typeof(HashSet<>) || genericTypeDefinition == typeof(List<>) || genericTypeDefinition == typeof(IList<>) || genericTypeDefinition == typeof(ICollection<>) || genericTypeDefinition == typeof(IEnumerable<>))
					{
						return true;
					}
				}
				if (typeof(ICollection).IsAssignableFrom(type) && type.GetConstructor(Type.EmptyTypes) != null)
				{
					return true;
				}
			}
			return false;
		}

		public static Type GetElementType(Type collectionType)
		{
			if (collectionType == null)
			{
				return null;
			}
			if (collectionType.IsArray)
			{
				return collectionType.GetElementType();
			}
			if (collectionType.IsGenericType)
			{
				Type[] genericArguments = collectionType.GetGenericArguments();
				if (genericArguments.Length != 0)
				{
					return genericArguments[0];
				}
			}
			Type[] interfaces = collectionType.GetInterfaces();
			foreach (Type type in interfaces)
			{
				if (!type.IsGenericType)
				{
					continue;
				}
				Type genericTypeDefinition = type.GetGenericTypeDefinition();
				if (genericTypeDefinition == typeof(IEnumerable<>) || genericTypeDefinition == typeof(ICollection<>) || genericTypeDefinition == typeof(IList<>))
				{
					Type[] genericArguments2 = type.GetGenericArguments();
					if (genericArguments2.Length != 0)
					{
						return genericArguments2[0];
					}
				}
			}
			return null;
		}

		private static bool IsSetType(Type type)
		{
			if (type == null)
			{
				return false;
			}
			if (type.IsGenericType)
			{
				Type genericTypeDefinition = type.GetGenericTypeDefinition();
				if (!(genericTypeDefinition == typeof(HashSet<>)))
				{
					return genericTypeDefinition == typeof(ISet<>);
				}
				return true;
			}
			return false;
		}

		private static bool IsListType(Type type)
		{
			if (type == null)
			{
				return false;
			}
			if (type.IsGenericType)
			{
				Type genericTypeDefinition = type.GetGenericTypeDefinition();
				if (!(genericTypeDefinition == typeof(List<>)) && !(genericTypeDefinition == typeof(IList<>)))
				{
					return genericTypeDefinition == typeof(IList<>);
				}
				return true;
			}
			return typeof(IList).IsAssignableFrom(type);
		}
	}
	public class EventPayloadBuilder
	{
		private readonly struct ParseResult
		{
			public bool Success { get; }

			public object Value { get; }

			public string ErrorMessage { get; }

			private ParseResult(bool success, object value, string errorMessage)
			{
				Success = success;
				Value = value;
				ErrorMessage = errorMessage;
			}

			public static ParseResult CreateSuccess(object value)
			{
				return new ParseResult(success: true, value, null);
			}

			public static ParseResult CreateFailure(string errorMessage)
			{
				return new ParseResult(success: false, null, errorMessage);
			}
		}

		private class PayloadParameter
		{
			public string Name { get; }

			public Type Type { get; }

			public string Value { get; }

			public PayloadParameter(string name, Type type, string value)
			{
				Name = name;
				Type = type;
				Value = value;
			}
		}

		private readonly List<PayloadParameter> _parameters = new List<PayloadParameter>();

		public void AddParameter(string name, Type type, string value)
		{
			_parameters.Add(new PayloadParameter(name, type, value));
		}

		public (EventPayload payload, string errors) Build()
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			EventPayload val = new EventPayload();
			StringBuilder stringBuilder = new StringBuilder();
			foreach (PayloadParameter parameter in _parameters)
			{
				if (!string.IsNullOrEmpty(parameter.Name) && !(parameter.Type == null))
				{
					string text = TypeNameFormatter.Format(parameter.Type);
					ParseResult parseResult = TryParseParameterValue(parameter.Type, parameter.Value);
					if (parseResult.Success)
					{
						((Dictionary<string, object>)(object)val)[parameter.Name] = parseResult.Value;
						continue;
					}
					stringBuilder.AppendLine("Failed to parse '" + parameter.Value + "' as " + text + ": " + parseResult.ErrorMessage);
				}
			}
			return (val, stringBuilder.ToString());
		}

		private static ParseResult TryParseParameterValue(Type type, string value)
		{
			if (string.IsNullOrEmpty(value))
			{
				return ParseResult.CreateFailure("Empty value");
			}
			if (CollectionValueParser.IsCollectionType(type))
			{
				var (value2, text) = CollectionValueParser.TryParse(type, value);
				if (text != null)
				{
					return ParseResult.CreateFailure(text);
				}
				return ParseResult.CreateSuccess(value2);
			}
			Type enumType = GetEnumType(type);
			if (enumType != null)
			{
				if (TryParseEnumValue(enumType, value, out var result))
				{
					return ParseResult.CreateSuccess(result);
				}
				string text2 = string.Join(", ", Enum.GetNames(enumType));
				return ParseResult.CreateFailure("Expected one of: " + text2);
			}
			object value3 = default(object);
			Exception ex = default(Exception);
			if (ParseUtility.TryParse(value, type, ref value3, ref ex))
			{
				return ParseResult.CreateSuccess(value3);
			}
			return ParseResult.CreateFailure("Unable to parse value");
		}

		private static Type GetEnumType(Type type)
		{
			if (type.IsEnum)
			{
				return type;
			}
			Type underlyingType = Nullable.GetUnderlyingType(type);
			if (underlyingType != null && underlyingType.IsEnum)
			{
				return underlyingType;
			}
			return null;
		}

		private static bool TryParseEnumValue(Type enumType, string valueString, out object result)
		{
			result = null;
			if (string.IsNullOrWhiteSpace(valueString) || enumType == null || !enumType.IsEnum)
			{
				return false;
			}
			try
			{
				result = Enum.Parse(enumType, valueString, ignoreCase: true);
				return true;
			}
			catch
			{
				return false;
			}
		}

		public void Clear()
		{
			_parameters.Clear();
		}
	}
	public static class GenericTypeParser
	{
		private static readonly Dictionary<string, Type> SimpleTypeMap = new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase)
		{
			{
				"string",
				typeof(string)
			},
			{
				"int",
				typeof(int)
			},
			{
				"bool",
				typeof(bool)
			},
			{
				"float",
				typeof(float)
			},
			{
				"double",
				typeof(double)
			},
			{
				"decimal",
				typeof(decimal)
			},
			{
				"long",
				typeof(long)
			},
			{
				"short",
				typeof(short)
			},
			{
				"byte",
				typeof(byte)
			},
			{
				"char",
				typeof(char)
			},
			{
				"object",
				typeof(object)
			},
			{
				"void",
				typeof(void)
			},
			{
				"hashset",
				typeof(HashSet<>)
			},
			{
				"list",
				typeof(List<>)
			},
			{
				"dictionary",
				typeof(Dictionary<, >)
			},
			{
				"queue",
				typeof(Queue<>)
			},
			{
				"stack",
				typeof(Stack<>)
			},
			{
				"set",
				typeof(HashSet<>)
			}
		};

		public static Type Parse(string typeString)
		{
			if (string.IsNullOrWhiteSpace(typeString))
			{
				return null;
			}
			typeString = typeString.Trim();
			int num = typeString.IndexOf('[');
			int num2 = typeString.IndexOf('<');
			if (num >= 0 && (num2 < 0 || num < num2))
			{
				return ParseArrayType(typeString);
			}
			if (num2 >= 0)
			{
				return ParseGenericType(typeString);
			}
			return ParseSimpleType(typeString);
		}

		private static Type ParseArrayType(string typeString)
		{
			int num = typeString.IndexOf('[');
			if (num < 0)
			{
				return null;
			}
			string typeString2 = typeString.Substring(0, num);
			string text = typeString.Substring(num);
			Type type = Parse(typeString2);
			if (type == null)
			{
				return null;
			}
			if (text == "[]")
			{
				return type.MakeArrayType();
			}
			int num2 = 1;
			for (int i = 1; i < text.Length; i++)
			{
				if (text[i] == ',')
				{
					num2++;
				}
			}
			return type.MakeArrayType(num2);
		}

		private static Type ParseGenericType(string typeString)
		{
			int num = typeString.IndexOf('<');
			int num2 = typeString.LastIndexOf('>');
			if (num < 0 || num2 < 0 || num2 <= num)
			{
				return null;
			}
			string typeName = typeString.Substring(0, num);
			List<Type> list = ParseGenericArguments(typeString.Substring(num + 1, num2 - num - 1));
			if (list == null || list.Count == 0)
			{
				return null;
			}
			Type type = ParseSimpleType(typeName);
			if (type == null)
			{
				return null;
			}
			try
			{
				return type.MakeGenericType(list.ToArray());
			}
			catch (Exception)
			{
				return null;
			}
		}

		private static List<Type> ParseGenericArguments(string argsString)
		{
			List<Type> list = new List<Type>();
			int num = 0;
			int num2 = 0;
			for (int i = 0; i <= argsString.Length; i++)
			{
				switch ((i < argsString.Length) ? argsString[i] : ',')
				{
				case '<':
				case '[':
					num++;
					break;
				case '>':
				case ']':
					num--;
					break;
				case ',':
				{
					if (num != 0)
					{
						break;
					}
					string text = argsString.Substring(num2, i - num2).Trim();
					if (!string.IsNullOrEmpty(text))
					{
						Type type = Parse(text);
						if (type == null)
						{
							return null;
						}
						list.Add(type);
					}
					num2 = i + 1;
					break;
				}
				}
			}
			if (num2 < argsString.Length)
			{
				string text2 = argsString.Substring(num2).Trim();
				if (!string.IsNullOrEmpty(text2))
				{
					Type type2 = Parse(text2);
					if (type2 == null)
					{
						return null;
					}
					list.Add(type2);
				}
			}
			return list;
		}

		private static Type ParseSimpleType(string typeName)
		{
			if (string.IsNullOrWhiteSpace(typeName))
			{
				return null;
			}
			typeName = typeName.Trim();
			if (SimpleTypeMap.TryGetValue(typeName, out var value))
			{
				return value;
			}
			if (typeName.EndsWith("?"))
			{
				Type type = ParseSimpleType(typeName.Substring(0, typeName.Length - 1));
				if (type != null)
				{
					return typeof(Nullable<>).MakeGenericType(type);
				}
				return null;
			}
			return FindTypeInAssemblies(typeName);
		}

		private static Type FindTypeInAssemblies(string typeName)
		{
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			if (Enumerable.Contains(typeName, '.') || Enumerable.Contains(typeName, '+'))
			{
				Type type = TryResolveNestedClass(typeName);
				if (type != null)
				{
					return type;
				}
			}
			Assembly[] array = assemblies;
			foreach (Assembly assembly in array)
			{
				try
				{
					Type type2 = assembly.GetType(typeName, throwOnError: false, ignoreCase: true);
					if (type2 != null)
					{
						return type2;
					}
				}
				catch (Exception)
				{
				}
			}
			array = assemblies;
			foreach (Assembly assembly2 in array)
			{
				try
				{
					string name = typeName;
					int num = typeName.LastIndexOf('.');
					if (num >= 0)
					{
						name = typeName.Substring(num + 1);
					}
					Type type3 = assembly2.GetType(name, throwOnError: false, ignoreCase: true);
					if (type3 != null)
					{
						return type3;
					}
				}
				catch (Exception)
				{
				}
			}
			array = assemblies;
			foreach (Assembly assembly3 in array)
			{
				try
				{
					Type[] types = assembly3.GetTypes();
					foreach (Type type4 in types)
					{
						if (string.Equals(type4.Name, typeName, StringComparison.OrdinalIgnoreCase) || string.Equals(type4.FullName, typeName, StringComparison.OrdinalIgnoreCase))
						{
							return type4;
						}
					}
				}
				catch (Exception)
				{
				}
			}
			return null;
		}

		private static Type TryResolveNestedClass(string typeName)
		{
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			List<string> list = new List<string>();
			list.Add(typeName);
			if (Enumerable.Contains(typeName, '.'))
			{
				string[] array = typeName.Split(new char[1] { '.' });
				for (int i = 1; i < array.Length; i++)
				{
					string item = string.Join(".", array, 0, array.Length - i) + "+" + string.Join("+", array, array.Length - i, i);
					if (!list.Contains(item))
					{
						list.Add(item);
					}
				}
				list.Add(typeName.Replace(".", "+"));
			}
			if (Enumerable.Contains(typeName, '+'))
			{
				string item2 = typeName.Replace("+", ".");
				if (!list.Contains(item2))
				{
					list.Add(item2);
				}
				string[] array2 = typeName.Split(new char[1] { '+' });
				for (int j = 1; j < array2.Length; j++)
				{
					string item3 = string.Join("+", array2, 0, array2.Length - j) + "." + string.Join(".", array2, array2.Length - j, j);
					if (!list.Contains(item3))
					{
						list.Add(item3);
					}
				}
			}
			Assembly[] array3 = assemblies;
			foreach (Assembly assembly in array3)
			{
				try
				{
					foreach (string item4 in list)
					{
						try
						{
							Type type = assembly.GetType(item4, throwOnError: false, ignoreCase: true);
							if (type != null)
							{
								return type;
							}
						}
						catch (Exception)
						{
						}
					}
				}
				catch (Exception)
				{
				}
			}
			array3 = assemblies;
			foreach (Assembly assembly2 in array3)
			{
				try
				{
					Type[] types = assembly2.GetTypes();
					foreach (Type type2 in types)
					{
						string fullName = type2.FullName;
						if (fullName != null)
						{
							string a = (Enumerable.Contains(fullName, '+') ? fullName.Substring(fullName.LastIndexOf('+') + 1) : (Enumerable.Contains(fullName, '.') ? fullName.Substring(fullName.LastIndexOf('.') + 1) : fullName));
							string b = (Enumerable.Contains(typeName, '+') ? typeName.Substring(typeName.LastIndexOf('+') + 1) : (Enumerable.Contains(typeName, '.') ? typeName.Substring(typeName.LastIndexOf('.') + 1) : typeName));
							if (string.Equals(a, b, StringComparison.OrdinalIgnoreCase))
							{
								return type2;
							}
						}
					}
				}
				catch (Exception)
				{
				}
			}
			return null;
		}

		public static bool IsGenericType(string typeString)
		{
			if (!string.IsNullOrWhiteSpace(typeString) && Enumerable.Contains(typeString, '<'))
			{
				return Enumerable.Contains(typeString, '>');
			}
			return false;
		}

		public static bool IsArrayType(string typeString)
		{
			if (!string.IsNullOrWhiteSpace(typeString) && Enumerable.Contains(typeString, '['))
			{
				return Enumerable.Contains(typeString, ']');
			}
			return false;
		}
	}
	public static class KeybindingHelper
	{
		private const string CATEGORY = "Mods Communicator Menu";

		public static void Register(string actionName, string displayName)
		{
			CustomKeybindings.AddAction(actionName, (KeybindingsCategory)0, (ControlType)2, (InputType)1);
		}

		public static bool IsKeyDown(string actionName)
		{
			return CustomKeybindings.GetKeyDown(actionName);
		}

		public static bool IsKeyHeld(string actionName)
		{
			return CustomKeybindings.GetKey(actionName);
		}
	}
	public static class TypeNameFormatter
	{
		public static string Format(Type type)
		{
			if (type == null)
			{
				return "null";
			}
			if (type.IsArray)
			{
				return Format(type.GetElementType()) + "[]";
			}
			Type underlyingType = Nullable.GetUnderlyingType(type);
			if (underlyingType != null)
			{
				return Format(underlyingType) + "?";
			}
			if (type.IsGenericType)
			{
				Type genericTypeDefinition = type.GetGenericTypeDefinition();
				Type[] genericArguments = type.GetGenericArguments();
				string genericTypeBaseName = GetGenericTypeBaseName(genericTypeDefinition.Name);
				string text = string.Join(", ", genericArguments.Select(Format));
				return genericTypeBaseName + "<" + text + ">";
			}
			if (type == typeof(string))
			{
				return "string";
			}
			if (type == typeof(int))
			{
				return "int";
			}
			if (type == typeof(bool))
			{
				return "bool";
			}
			if (type == typeof(float))
			{
				return "float";
			}
			if (type == typeof(double))
			{
				return "double";
			}
			return GetDisplayName(type);
		}

		private static string GetGenericTypeBaseName(string genericTypeDefinitionName)
		{
			int num = genericTypeDefinitionName.IndexOf('`');
			if (num > 0)
			{
				return genericTypeDefinitionName.Substring(0, num);
			}
			return genericTypeDefinitionName;
		}

		private static string GetDisplayName(Type type)
		{
			List<string> nestedClassPath = GetNestedClassPath(type);
			bool num = HasNameCollision(nestedClassPath);
			string fullQualifiedName = GetFullQualifiedName(type);
			if (num)
			{
				return fullQualifiedName;
			}
			return string.Join(".", nestedClassPath);
		}

		private static List<string> GetNestedClassPath(Type type)
		{
			List<string> list = new List<string>();
			Type type2 = type;
			while (type2 != null)
			{
				string text = type2.Name;
				int num = text.IndexOf('`');
				if (num > 0)
				{
					text = text.Substring(0, num);
				}
				list.Insert(0, text);
				type2 = type2.DeclaringType;
			}
			return list;
		}

		private static string GetFullQualifiedName(Type type)
		{
			string @namespace = type.Namespace;
			List<string> nestedClassPath = GetNestedClassPath(type);
			if (string.IsNullOrEmpty(@namespace))
			{
				return string.Join(".", nestedClassPath);
			}
			return @namespace + "." + string.Join(".", nestedClassPath);
		}

		private static bool HasNameCollision(List<string> nestedPath)
		{
			if (nestedPath.Count == 0)
			{
				return false;
			}
			string.Join(".", nestedPath);
			List<string> list = new List<string>();
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly assembly in assemblies)
			{
				try
				{
					Type[] types = assembly.GetTypes();
					foreach (Type type in types)
					{
						if (type.FullName == null)
						{
							continue;
						}
						List<string> nestedClassPath = GetNestedClassPath(type);
						if (nestedClassPath.Count != nestedPath.Count)
						{
							continue;
						}
						bool flag = true;
						for (int k = 0; k < nestedClassPath.Count; k++)
						{
							if (!string.Equals(nestedClassPath[k], nestedPath[k], StringComparison.OrdinalIgnoreCase))
							{
								flag = false;
								break;
							}
						}
						if (flag)
						{
							list.Add(type.Namespace ?? "");
						}
					}
				}
				catch
				{
				}
			}
			return list.Distinct().ToList().Count > 1;
		}
	}
	public static class TypeResolver
	{
		public static Type Resolve(string typeName)
		{
			if (string.IsNullOrEmpty(typeName))
			{
				return null;
			}
			if (typeName.EndsWith("?"))
			{
				return ResolveNullableType(typeName);
			}
			return ResolveNonNullableType(typeName);
		}

		private static Type ResolveNullableType(string typeName)
		{
			Type type = ResolveNonNullableType(typeName.Substring(0, typeName.Length - 1));
			if (type != null && type.IsValueType && type != typeof(void))
			{
				return typeof(Nullable<>).MakeGenericType(type);
			}
			return type;
		}

		private static Type ResolveNonNullableType(string typeName)
		{
			if (TryGetSimpleType(typeName, out var result))
			{
				return result;
			}
			return GenericTypeParser.Parse(typeName);
		}

		private static bool TryGetSimpleType(string typeName, out Type result)
		{
			result = typeName.ToLower() switch
			{
				"string" => typeof(string), 
				"int" => typeof(int), 
				"bool" => typeof(bool), 
				"float" => typeof(float), 
				"double" => typeof(double), 
				"vector2" => typeof(Vector2), 
				"vector3" => typeof(Vector3), 
				"vector4" => typeof(Vector4), 
				"quaternion" => typeof(Quaternion), 
				"color" => typeof(Color), 
				_ => null, 
			};
			return result != null;
		}

		public static string GetExampleInput(Type type)
		{
			return ParseUtility.GetExampleInput(type);
		}

		public static bool CanParse(Type type)
		{
			return ParseUtility.CanParse(type);
		}
	}
}
namespace OutwardModsCommunicatorMenu.Utility.Helpers
{
	public static class CharacterHelpers
	{
		public static Character TryToFindOtherCharacterInLobby(Character mainCharacter, string otherCharName)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			Character val = null;
			foreach (PlayerSystem item in Global.Lobby.PlayersInLobby)
			{
				val = item.ControlledCharacter;
				if ((Object)(object)val != (Object)null && val.UID != mainCharacter.UID && string.Equals(otherCharName, val.Name))
				{
					return val;
				}
			}
			return null;
		}

		public static Character TryToFindOtherCharacterInLobby(Character mainCharacter)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			Character val = null;
			foreach (PlayerSystem item in Global.Lobby.PlayersInLobby)
			{
				val = item.ControlledCharacter;
				if ((Object)(object)val != (Object)null && val.UID != mainCharacter.UID)
				{
					return val;
				}
			}
			return val;
		}

		public static bool IsCharacterInDistance(Character firstCharacter, Character secondCharacter, float minimumDistance)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)firstCharacter).transform.position - ((Component)secondCharacter).transform.position;
			float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude;
			float num = minimumDistance * minimumDistance;
			if (sqrMagnitude > num)
			{
				return false;
			}
			return true;
		}

		public static bool HasManualMovement(Character character)
		{
			CharacterControl characterControl = character.CharacterControl;
			LocalCharacterControl val = (LocalCharacterControl)(object)((characterControl is LocalCharacterControl) ? characterControl : null);
			if (val == null)
			{
				return false;
			}
			if (((Vector2)(ref ((CharacterControl)val).m_moveInput)).sqrMagnitude > 0.01f)
			{
				return true;
			}
			return false;
		}
	}
	public static class ChatHelpers
	{
		public static void SendChatLog(ChatPanel panel, string message, ChatLogStatus status = ChatLogStatus.Info)
		{
			panel.ChatMessageReceived("System", ChatLogStatusHelper.GetChatLogText(message, status));
		}

		public static void SendChatLog(Character character, string message, ChatLogStatus status = ChatLogStatus.Info)
		{
			CharacterUI characterUI = character.CharacterUI;
			if ((Object)(object)((characterUI != null) ? characterUI.ChatPanel : null) == (Object)null)
			{
				OMCM.LogMessage("ChatHelpers@SendChatLog provided character with missing chatPanel!");
			}
			else
			{
				SendChatLog(character.CharacterUI.ChatPanel, message, status);
			}
		}

		public static void SendChatOrLog(Character character, string message, ChatLogStatus status = ChatLogStatus.Info)
		{
			CharacterUI characterUI = character.CharacterUI;
			if ((Object)(object)((characterUI != null) ? characterUI.ChatPanel : null) == (Object)null)
			{
				OMCM.LogStatusMessage(message, status);
			}
			else
			{
				SendChatLog(character.CharacterUI.ChatPanel, message, status);
			}
		}
	}
}
namespace OutwardModsCommunicatorMenu.Utility.Enums
{
	public enum ChatCommandsManagerParams
	{
		CommandName,
		CommandParameters,
		CommandAction,
		IsCheatCommand,
		CommandDescription,
		CommandRequiresDebugMode
	}
	public static class ChatCommandsManagerParamsHelper
	{
		private static readonly Dictionary<ChatCommandsManagerParams, (string key, Type type)> _registry = new Dictionary<ChatCommandsManagerParams, (string, Type)>
		{
			[ChatCommandsManagerParams.CommandName] = ("command", typeof(string)),
			[ChatCommandsManagerParams.CommandParameters] = ("parameters", typeof(Dictionary<string, (string, string)>)),
			[ChatCommandsManagerParams.CommandAction] = ("function", typeof(Action<Character, Dictionary<string, string>>)),
			[ChatCommandsManagerParams.IsCheatCommand] = ("isCheatCommand", typeof(bool)),
			[ChatCommandsManagerParams.CommandDescription] = ("description", typeof(string)),
			[ChatCommandsManagerParams.CommandRequiresDebugMode] = ("debugMode", typeof(bool))
		};

		public static (string key, Type type) Get(ChatCommandsManagerParams param)
		{
			return _registry[param];
		}
	}
	public enum ChatLogStatus
	{
		Info,
		Success,
		Warning,
		Error
	}
	public static class ChatLogStatusHelper
	{
		public static string GetChatLogText(string message, ChatLogStatus status = ChatLogStatus.Info)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			return status switch
			{
				ChatLogStatus.Success => Global.SetTextColor(message, Global.LIGHT_GREEN), 
				ChatLogStatus.Warning => Global.SetTextColor(message, Global.LIGHT_ORANGE), 
				ChatLogStatus.Error => "<color=#" + UnityEngineExtensions.ToHex(Global.LIGHT_RED) + ">" + message + "</color>", 
				_ => message, 
			};
		}
	}
}
namespace OutwardModsCommunicatorMenu.UI
{
	public static class EventPublishingPanelBuilder
	{
		private static GameObject _contentParent;

		private static TabNavigationBuilder _tabNavigationBuilder;

		private static GameObject _publishViewContainer;

		private static SubscribersViewBuilder _subscribersViewBuilder;

		private static PublishersViewBuilder _publishersViewBuilder;

		private static InputSectionBuilder _inputSectionBuilder;

		private static RegisteredParamsBuilder _registeredParamsBuilder;

		private static DynamicParamsBuilder _dynamicParamsBuilder;

		private static ActionButtonsBuilder _actionButtonsBuilder;

		public static void Build(GameObject content)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			_contentParent = content;
			_tabNavigationBuilder = new TabNavigationBuilder();
			_tabNavigationBuilder.Build(content);
			_tabNavigationBuilder.OnTabChanged += OnTabChanged;
			_publishViewContainer = UIFactory.CreateVerticalGroup(content, "PublishViewContainer", false, false, true, true, 5, new Vector4(5f, 5f, 5f, 5f), default(Color), (TextAnchor?)null);
			GameObject publishViewContainer = _publishViewContainer;
			int? num = 9999;
			int? num2 = 9999;
			int? num3 = 400;
			UIFactory.SetLayoutElement(publishViewContainer, (int?)null, num3, num, num2, (int?)null, (int?)null, (bool?)null);
			BuildPublishView(_publishViewContainer);
			_subscribersViewBuilder = new SubscribersViewBuilder();
			_subscribersViewBuilder.Build(content);
			_publishersViewBuilder = new PublishersViewBuilder();
			_publishersViewBuilder.Build(content);
			ShowTab(EventMenuTab.Publish);
		}

		private static void BuildPublishView(GameObject parent)
		{
			CreateTitleLabel(parent);
			_inputSectionBuilder = new InputSectionBuilder();
			_inputSectionBuilder.Build(parent);
			_inputSectionBuilder.OnEventNameChanged += OnInputChanged;
			_inputSectionBuilder.OnModGuidChanged += OnInputChanged;
			_registeredParamsBuilder = new RegisteredParamsBuilder();
			_registeredParamsBuilder.Build(parent);
			_registeredParamsBuilder.OnRegisteredParamClicked += OnRegisteredParamClicked;
			_actionButtonsBuilder = new ActionButtonsBuilder();
			_actionButtonsBuilder.Build(parent);
			_actionButtonsBuilder.OnPublishClicked += PublishEvent;
			_actionButtonsBuilder.OnClearClicked += ClearAll;
			_dynamicParamsBuilder = new DynamicParamsBuilder();
			_dynamicParamsBuilder.Build(parent);
			CreateInfoLabel(parent);
			RefreshRegisteredParams();
		}

		private static void OnTabChanged(EventMenuTab tab)
		{
			ShowTab(tab);
		}

		private static void ShowTab(EventMenuTab tab)
		{
			bool active = tab == EventMenuTab.Publish;
			bool flag = tab == EventMenuTab.Subscribers;
			bool flag2 = tab == EventMenuTab.Publishers;
			if ((Object)(object)_publishViewContainer != (Object)null)
			{
				_publishViewContainer.SetActive(active);
			}
			if (_subscribersViewBuilder != null)
			{
				_subscribersViewBuilder.SetVisible(flag);
				if (flag)
				{
					_subscribersViewBuilder.Refresh();
				}
			}
			if (_publishersViewBuilder != null)
			{
				_publishersViewBuilder.SetVisible(flag2);
				if (flag2)
				{
					_publishersViewBuilder.Refresh();
				}
			}
			ManualLogSource log = UIManager.Instance.Log;
			if (log != null)
			{
				log.LogMessage((object)$"[EventPublishingPanel] Switched to tab: {tab}");
			}
		}

		private static void OnRegisteredParamClicked(string name, string type)
		{
			_dynamicParamsBuilder.AddDynamicParameter(name, type);
		}

		private static void OnInputChanged()
		{
			_actionButtonsBuilder?.ClearValidationMessage();
			RefreshRegisteredParams();
		}

		private static void RefreshRegisteredParams()
		{
			string modGuid = _inputSectionBuilder?.ModGuidInput?.Text ?? string.Empty;
			string text = _inputSectionBuilder?.EventNameInput?.Text ?? string.Empty;
			_registeredParamsBuilder?.Refresh(modGuid, text, text);
		}

		private static void CreateTitleLabel(GameObject content)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(content, "Title", "Publish Event to Mods", (TextAnchor)3, Color.white, true, 16)).gameObject, (int?)300, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
		}

		private static void CreateInfoLabel(GameObject content)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(content, "InfoLabel", "Type mod GUID and event name. Click registered params to add. Dynamic params: click to edit.", (TextAnchor)3, Color.yellow, true, 14)).gameObject, (int?)420, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
		}

		private static void ClearAll()
		{
			_dynamicParamsBuilder?.Clear();
			_inputSectionBuilder?.ModGuidInput?.Clear();
			_inputSectionBuilder?.EventNameInput?.Clear();
			RefreshRegisteredParams();
			_actionButtonsBuilder?.ClearValidationMessage();
			ManualLogSource log = UIManager.Instance.Log;
			if (log != null)
			{
				log.LogMessage((object)"[EventPublishingPanel] Cleared all");
			}
		}

		private static void PublishEvent()
		{
			string text = _inputSectionBuilder?.ModGuidInput?.Text?.Trim() ?? string.Empty;
			string text2 = _inputSectionBuilder?.EventNameInput?.Text?.Trim() ?? string.Empty;
			if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(text2))
			{
				_actionButtonsBuilder?.SetValidationMessage("Error: Mod GUID and Event Name are required!", isError: true);
				ManualLogSource log = UIManager.Instance.Log;
				if (log != null)
				{
					log.LogMessage((object)"[EventPublishingPanel] Error: Mod GUID and Event Name are required!");
				}
				return;
			}
			EventPayloadBuilder eventPayloadBuilder = new EventPayloadBuilder();
			string text3 = string.Empty;
			IReadOnlyDictionary<string, Dictionary<string, EventDefinition>> registeredEvents = EventBus.GetRegisteredEvents();
			bool flag = false;
			Dictionary<string, EventPayload> value2;
			if (registeredEvents.TryGetValue(text, out var value) && value.ContainsKey(text2))
			{
				flag = true;
			}
			else if (EventBus.GetModPublishedPayloads().TryGetValue(text, out value2) && value2.ContainsKey(text2))
			{
				flag = true;
			}
			if (!flag)
			{
				text3 = text3 + "Warning: Event '" + text2 + "' for mod '" + text + "' is not registered.\n";
			}
			IReadOnlyList<(string, string, string)> readOnlyList = _dynamicParamsBuilder?.DynamicParams;
			if (readOnlyList != null)
			{
				foreach (var (text4, text5, text6) in readOnlyList)
				{
					if (string.IsNullOrEmpty(text4) || string.IsNullOrEmpty(text5))
					{
						continue;
					}
					Type type = TypeResolver.Resolve(text5);
					if (type == null)
					{
						text3 = text3 + "Warning: Unknown type '" + text5 + "' for parameter '" + text4 + "'.\n";
						continue;
					}
					if (CollectionValueParser.IsCollectionType(type) && !string.IsNullOrWhiteSpace(text6))
					{
						string item = CollectionValueParser.TryParse(type, text6).error;
						if (item != null)
						{
							Type elementType = CollectionValueParser.GetElementType(type);
							text3 = ((!(elementType != null) || !elementType.IsEnum) ? (text3 + "Warning: Failed to parse collection '" + text4 + "' (" + text5 + "): " + item + "\n") : (text3 + "Warning: Failed to parse enum collection '" + text4 + "' (" + text5 + "): " + item + ". For enum values, use only member names separated by spaces (e.g., 'Abrassar Enmerkar').\n"));
							continue;
						}
					}
					eventPayloadBuilder.AddParameter(text4, type, text6);
				}
			}
			var (val, text7) = eventPayloadBuilder.Build();
			if (!string.IsNullOrEmpty(text7))
			{
				text3 += text7;
			}
			if (!string.IsNullOrEmpty(text3))
			{
				_actionButtonsBuilder?.SetValidationMessage(text3.TrimEnd(new char[1] { '\n' }), isError: true);
				ManualLogSource log2 = UIManager.Instance.Log;
				if (log2 != null)
				{
					log2.LogMessage((object)("[EventPublishingPanel] Warning publishing event:\n" + text3));
				}
			}
			else
			{
				_actionButtonsBuilder?.SetValidationMessage("Event published successfully!", isError: false);
			}
			EventBus.Publish(text, text2, val);
			ManualLogSource log3 = UIManager.Instance.Log;
			if (log3 != null)
			{
				log3.LogMessage((object)$"[EventPublishingPanel] Published event '{text2}' to mod '{text}' with {readOnlyList?.Count ?? 0} dynamic params");
			}
		}

		public static void Update()
		{
			_inputSectionBuilder?.Update();
			_dynamicParamsBuilder?.Update();
			_subscribersViewBuilder?.Update();
			_publishersViewBuilder?.Update();
		}
	}
	public static class MenuFactory
	{
		public static void CreateEventPublishingPanel(GameObject contentRoot)
		{
			EventPublishingPanelBuilder.Build(contentRoot);
		}
	}
}
namespace OutwardModsCommunicatorMenu.UI.Components
{
	public class AutocompleteInput
	{
		private readonly InputFieldRef _inputField;

		private readonly GameObject _suggestionsScrollView;

		private readonly GameObject _suggestionsContainer;

		private readonly List<ButtonRef> _suggestionButtons = new List<ButtonRef>();

		private readonly List<string> _currentSuggestions = new List<string>();

		private readonly Func<string, List<string>> _getSuggestions;

		private readonly Func<string> _externalFilterProvider;

		private readonly float _width;

		private int _selectedIndex = -1;

		private bool _isInitialized;

		private float _debounceTimer = -1f;

		private string _pendingFilter = string.Empty;

		private const float DEBOUNCE_DELAY = 0.3f;

		public string Text => _inputField.Text;

		public InputFieldRef InputField => _inputField;

		public event Action<string> OnSelect;

		public event Action<string> OnTextChanged;

		public AutocompleteInput(GameObject parent, string name, string placeholder, Vector2 size, Func<string, List<string>> getSuggestions, Func<string> externalFilterProvider = null)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			_getSuggestions = getSuggestions;
			_externalFilterProvider = externalFilterProvider;
			_width = size.x;
			_inputField = UIFactory.CreateInputField(parent, name, placeholder);
			GameObject gameObject = ((Component)_inputField.Component).gameObject;
			int? num = (int)size.x;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(gameObject, num, (int?)(int)size.y, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			(_suggestionsScrollView, _suggestionsContainer) = ScrollViewHelper.CreateScrollView(parent, name + "_Suggestions", new Vector2(size.x, 80f), (Color?)new Color(0.15f, 0.15f, 0.2f, 0.98f));
			_suggestionsScrollView.SetActive(false);
			((UnityEvent<string>)(object)_inputField.Component.onValueChanged).AddListener((UnityAction<string>)OnValueChanged);
			_isInitialized = true;
			UpdateSuggestions(string.Empty);
		}

		public void Update()
		{
			if (_debounceTimer > 0f)
			{
				_debounceTimer -= Time.unscaledDeltaTime;
				if (_debounceTimer <= 0f)
				{
					_debounceTimer = -1f;
					UpdateSuggestions(_pendingFilter);
				}
			}
		}

		private void OnValueChanged(string value)
		{
			_selectedIndex = -1;
			_pendingFilter = value;
			if (string.IsNullOrEmpty(value))
			{
				_debounceTimer = -1f;
				UpdateSuggestions(value);
			}
			else
			{
				_debounceTimer = 0.3f;
			}
			this.OnTextChanged?.Invoke(value);
		}

		private void UpdateSuggestions(string filter)
		{
			if (!_isInitialized)
			{
				return;
			}
			_currentSuggestions.Clear();
			foreach (ButtonRef suggestionButton in _suggestionButtons)
			{
				Object.Destroy((Object)(object)suggestionButton.GameObject);
			}
			_suggestionButtons.Clear();
			_ = filter;
			List<string> list = _getSuggestions?.Invoke(filter) ?? new List<string>();
			if (!string.IsNullOrEmpty(filter))
			{
				list = list.Where((string s) => UnityEngineExtensions.Contains(s, filter, StringComparison.OrdinalIgnoreCase)).ToList();
			}
			_currentSuggestions.AddRange(list);
			if (_currentSuggestions.Count == 0)
			{
				_suggestionsScrollView.SetActive(false);
				return;
			}
			_suggestionsScrollView.SetActive(true);
			for (int i = 0; i < _currentSuggestions.Count; i++)
			{
				string text = _currentSuggestions[i];
				CreateSuggestionButton(text, i);
			}
			UpdateSelectionVisual();
		}

		private void CreateSuggestionButton(string text, int index)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			ButtonRef val = UIFactory.CreateButton(_suggestionsContainer, $"Suggestion_{index}", text, (Color?)new Color(0.2f, 0.2f, 0.2f));
			GameObject gameObject = ((Component)val.Component).gameObject;
			int? num = (int)_width;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(gameObject, num, (int?)25, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			int capturedIndex = index;
			val.OnClick = (Action)Delegate.Combine(val.OnClick, (Action)delegate
			{
				SelectItem(capturedIndex);
			});
			_suggestionButtons.Add(val);
		}

		private void UpdateSelectionVisual()
		{
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < _suggestionButtons.Count; i++)
			{
				ButtonRef val = _suggestionButtons[i];
				ColorBlock colors;
				if (i == _selectedIndex)
				{
					Button component = val.Component;
					colors = default(ColorBlock);
					((ColorBlock)(ref colors)).normalColor = new Color(0.3f, 0.5f, 0.7f, 1f);
					((ColorBlock)(ref colors)).highlightedColor = new Color(0.4f, 0.6f, 0.8f, 1f);
					((ColorBlock)(ref colors)).pressedColor = new Color(0.2f, 0.4f, 0.6f, 1f);
					((ColorBlock)(ref colors)).colorMultiplier = 1f;
					((ColorBlock)(ref colors)).fadeDuration = 0.1f;
					((Selectable)component).colors = colors;
				}
				else
				{
					Button component2 = val.Component;
					colors = default(ColorBlock);
					((ColorBlock)(ref colors)).normalColor = new Color(0.2f, 0.2f, 0.2f, 0.9f);
					((ColorBlock)(ref colors)).highlightedColor = new Color(0.3f, 0.4f, 0.5f, 1f);
					((ColorBlock)(ref colors)).pressedColor = new Color(0.2f, 0.3f, 0.4f, 1f);
					((ColorBlock)(ref colors)).colorMultiplier = 1f;
					((ColorBlock)(ref colors)).fadeDuration = 0.1f;
					((Selectable)component2).colors = colors;
				}
			}
		}

		public void HandleKeyDown(KeyCode key)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Invalid comparison between Unknown and I4
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Invalid comparison between Unknown and I4
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Invalid comparison between Unknown and I4
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Invalid comparison between Unknown and I4
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Invalid comparison between Unknown and I4
			if (!_suggestionsScrollView.activeSelf || _currentSuggestions.Count == 0)
			{
				return;
			}
			if ((int)key == 274)
			{
				_selectedIndex = Mathf.Min(_selectedIndex + 1, _currentSuggestions.Count - 1);
				UpdateSelectionVisual();
			}
			else if ((int)key == 273)
			{
				_selectedIndex = Mathf.Max(_selectedIndex - 1, 0);
				UpdateSelectionVisual();
			}
			else if ((int)key == 13 || (int)key == 271)
			{
				if (_selectedIndex >= 0 && _selectedIndex < _currentSuggestions.Count)
				{
					SelectItem(_selectedIndex);
				}
			}
			else if ((int)key == 27)
			{
				_suggestionsScrollView.SetActive(false);
				_selectedIndex = -1;
			}
		}

		private void SelectItem(int index)
		{
			if (index >= 0 && index < _currentSuggestions.Count)
			{
				string text = _currentSuggestions[index];
				_inputField.Text = text;
				_suggestionsScrollView.SetActive(false);
				_selectedIndex = -1;
				_debounceTimer = -1f;
				this.OnSelect?.Invoke(text);
			}
		}

		public void SetText(string text)
		{
			_inputField.Text = text;
		}

		public void Clear()
		{
			_inputField.Text = string.Empty;
			_suggestionsScrollView.SetActive(false);
			_selectedIndex = -1;
			_debounceTimer = -1f;
		}

		public void HideSuggestions()
		{
			_suggestionsScrollView.SetActive(false);
			_selectedIndex = -1;
		}

		public void RefreshSuggestions()
		{
			_pendingFilter = _inputField.Text;
			_debounceTimer = -1f;
			UpdateSuggestions(_pendingFilter);
		}
	}
	public static class ScrollViewHelper
	{
		public static (GameObject root, GameObject content) CreateScrollView(GameObject parent, string name, Vector2 size, Color? bgColor = null)
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			GameObject item = default(GameObject);
			AutoSliderScrollbar val = default(AutoSliderScrollbar);
			GameObject obj = UIFactory.CreateScrollView(parent, name, ref item, ref val, (Color)(((??)bgColor) ?? new Color(0.2f, 0.2f, 0.25f, 0.95f)));
			int? num = (int)size.x;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(obj, num, (int?)(int)size.y, num2, (int?)9999, (int?)null, (int?)null, (bool?)null);
			return (obj, item);
		}

		public static (GameObject root, GameObject content) CreateScrollView(GameObject parent, string name, int minWidth, int minHeight, Color? bgColor = null)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return CreateScrollView(parent, name, new Vector2((float)minWidth, (float)minHeight), bgColor);
		}
	}
}
namespace OutwardModsCommunicatorMenu.UI.Builders
{
	public class ActionButtonsBuilder
	{
		private Text _validationLabel;

		public event Action OnPublishClicked;

		public event Action OnClearClicked;

		public void Build(GameObject parent)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = UIFactory.CreateHorizontalGroup(parent, "ActionButtonsRow", false, false, true, true, 10, new Vector4(3f, 3f, 3f, 3f), default(Color), (TextAnchor?)null);
			int? num = 35;
			UIFactory.SetLayoutElement(obj, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef obj2 = UIFactory.CreateButton(obj, "PublishBtn", "PUBLISH EVENT", (Color?)new Color(0.2f, 0.3f, 0.2f));
			UIFactory.SetLayoutElement(((Component)obj2.Component).gameObject, (int?)130, (int?)30, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, (Action)delegate
			{
				this.OnPublishClicked?.Invoke();
			});
			ButtonRef obj3 = UIFactory.CreateButton(obj, "ClearBtn", "Clear", (Color?)new Color(0.3f, 0.2f, 0.2f));
			UIFactory.SetLayoutElement(((Component)obj3.Component).gameObject, (int?)100, (int?)30, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			obj3.OnClick = (Action)Delegate.Combine(obj3.OnClick, (Action)delegate
			{
				this.OnClearClicked?.Invoke();
			});
			_validationLabel = UIFactory.CreateLabel(parent, "ValidationLabel", "", (TextAnchor)3, Color.yellow, false, 12);
			GameObject gameObject = ((Component)_validationLabel).gameObject;
			num = 9999;
			int? num2 = 20;
			UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
		}

		public void SetValidationMessage(string message, bool isError)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_validationLabel != (Object)null)
			{
				_validationLabel.text = message;
				((Graphic)_validationLabel).color = (isError ? Color.red : Color.green);
			}
		}

		public void ClearValidationMessage()
		{
			if ((Object)(object)_validationLabel != (Object)null)
			{
				_validationLabel.text = "";
			}
		}
	}
	public class ComplexValueFormatter : IValueFormatter
	{
		public class MemberInfo
		{
			public string Name { get; set; }

			public object Value { get; set; }

			public string MemberType { get; set; }
		}

		private const int MaxDepth = 3;

		public bool CanFormat(object value)
		{
			if (value != null)
			{
				return !IsSimpleType(value);
			}
			return false;
		}

		public void CreateDisplay(GameObject parent, string name, object value, Type displayType)
		{
			string text = "unknown";
			try
			{
				text = ((displayType != null) ? TypeNameFormatter.Format(displayType) : (value?.GetType().Name ?? "null"));
			}
			catch
			{
				text = value?.GetType().Name ?? "null";
			}
			ExpandableValueBuilder.Create(parent, name, text, value, displayType);
		}

		private static bool IsSimpleType(object value)
		{
			if (value != null)
			{
				if (!(value is string))
				{
					if (!(value is bool))
					{
						if (!(value is char))
						{
							if (!(value is int))
							{
								if (!(value is long))
								{
									if (!(value is float))
									{
										if (!(value is double))
										{
											if (!(value is decimal))
											{
												if (!(value is DateTime))
												{
													if (!(value is DateTimeOffset))
													{
														if (!(value is TimeSpan))
														{
															if (value is Guid)
															{
																return true;
															}
															return value?.GetType().IsPrimitive ?? false;
														}
														return true;
													}
													return true;
												}
												return true;
											}
											return true;
										}
										return true;
									}
									return true;
								}
								return true;
							}
							return true;
						}
						return true;
					}
					return true;
				}
				return true;
			}
			return true;
		}

		public static string FormatAsString(object value, int depth)
		{
			if (!(value is Array array))
			{
				if (!(value is IDictionary dict))
				{
					if (!(value is ICollection collection))
					{
						if (value is IEnumerable enumerable)
						{
							return FormatEnumerable(enumerable);
						}
						return null;
					}
					return FormatCollection(collection);
				}
				return FormatDictionary(dict);
			}
			return FormatArray(array);
		}

		private static string FormatCollection(ICollection collection)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append('[');
			int num = 0;
			foreach (object item in collection)
			{
				if (num > 0)
				{
					stringBuilder.Append(", ");
				}
				if (num >= 10)
				{
					stringBuilder.Append("...");
					break;
				}
				stringBuilder.Append(FormatCollectionItem(item));
				num++;
			}
			stringBuilder.Append(']');
			return stringBuilder.ToString();
		}

		private static string FormatArray(Array array)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append('[');
			for (int i = 0; i < array.Length && i < 10; i++)
			{
				if (i > 0)
				{
					stringBuilder.Append(", ");
				}
				stringBuilder.Append(FormatCollectionItem(array.GetValue(i)));
			}
			if (array.Length > 10)
			{
				stringBuilder.Append("...");
			}
			stringBuilder.Append(']');
			return stringBuilder.ToString();
		}

		private static string FormatDictionary(IDictionary dict)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append('{');
			int num = 0;
			foreach (DictionaryEntry item in dict)
			{
				if (num > 0)
				{
					stringBuilder.Append(", ");
				}
				if (num >= 5)
				{
					stringBuilder.Append("...");
					break;
				}
				stringBuilder.Append(FormatCollectionItem(item.Key) + ": " + FormatCollectionItem(item.Value));
				num++;
			}
			stringBuilder.Append('}');
			return stringBuilder.ToString();
		}

		private static string FormatEnumerable(IEnumerable enumerable)
		{
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append('[');
			int num = 0;
			foreach (object item in enumerable)
			{
				if (num > 0)
				{
					stringBuilder.Append(", ");
				}
				if (num >= 10)
				{
					stringBuilder.Append("...");
					break;
				}
				stringBuilder.Append(FormatCollectionItem(item));
				num++;
			}
			stringBuilder.Append(']');
			return stringBuilder.ToString();
		}

		private static string FormatCollectionItem(object item)
		{
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_0274: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_0292: Unknown result type (might be due to invalid IL or missing references)
			if (item != null)
			{
				if (!(item is string text))
				{
					if (!(item is bool))
					{
						if (!(item is int num))
						{
							if (!(item is float num2))
							{
								if (!(item is double num3))
								{
									if (!(item is Vector2 val))
									{
										if (!(item is Vector3 val2))
										{
											if (!(item is Vector4 val3))
											{
												if (!(item is Quaternion val4))
												{
													if (item is Color val5)
													{
														return $"({val5.r:F2},{val5.g:F2},{val5.b:F2},{val5.a:F2})";
													}
													if (item != null && item.GetType().IsPrimitive)
													{
														return item.ToString();
													}
													if (item is ICollection || item is Array || item is IDictionary || item is IEnumerable)
													{
														return "<" + item.GetType().Name + ">";
													}
													return item?.ToString() ?? "null";
												}
												return $"({val4.x:F2},{val4.y:F2},{val4.z:F2},{val4.w:F2})";
											}
											return $"({val3.x:F2},{val3.y:F2},{val3.z:F2},{val3.w:F2})";
										}
										return $"({val2.x:F2},{val2.y:F2},{val2.z:F2})";
									}
									return $"({val.x:F2},{val.y:F2})";
								}
								return num3.ToString("F2");
							}
							return num2.ToString("F2");
						}
						return num.ToString();
					}
					return ((bool)item) ? "true" : "false";
				}
				return "\"" + text + "\"";
			}
			return "null";
		}

		public static string GetValuePreview(object value)
		{
			if (value != null)
			{
				if (!(value is Array array))
				{
					if (!(value is IDictionary dictionary))
					{
						if (!(value is ICollection collection))
						{
							if (value is IEnumerable enumerable)
							{
								return $">= {GetEnumerableCount(enumerable)}";
							}
							return string.Empty;
						}
						return $"Count={collection.Count}";
					}
					return $"Count={dictionary.Count}";
				}
				return $"Length={array.Length}";
			}
			return "(null)";
		}

		private static int GetEnumerableCount(IEnumerable enumerable)
		{
			int num = 0;
			foreach (object item in enumerable)
			{
				_ = item;
				num++;
				if (num > 5)
				{
					break;
				}
			}
			return num;
		}

		public static List<MemberInfo> GetMembers(object value, int depth)
		{
			List<MemberInfo> list = new List<MemberInfo>();
			if (value == null)
			{
				return list;
			}
			Type type = value.GetType();
			try
			{
				PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
				foreach (PropertyInfo propertyInfo in properties)
				{
					if (propertyInfo.GetIndexParameters().Length == 0)
					{
						try
						{
							object value2 = propertyInfo.GetValue(value);
							list.Add(new MemberInfo
							{
								Name = propertyInfo.Name,
								Value = value2,
								MemberType = "Property"
							});
						}
						catch
						{
							list.Add(new MemberInfo
							{
								Name = propertyInfo.Name,
								Value = null,
								MemberType = "Property"
							});
						}
					}
				}
			}
			catch
			{
			}
			try
			{
				FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				foreach (FieldInfo fieldInfo in fields)
				{
					try
					{
						object value3 = fieldInfo.GetValue(value);
						list.Add(new MemberInfo
						{
							Name = fieldInfo.Name,
							Value = value3,
							MemberType = "Field"
						});
					}
					catch
					{
						list.Add(new MemberInfo
						{
							Name = fieldInfo.Name,
							Value = null,
							MemberType = "Field"
						});
					}
				}
			}
			catch
			{
			}
			return list;
		}
	}
	public class DynamicParamsBuilder
	{
		private readonly List<(string name, string type, string value, GameObject button)> _dynamicParams = new List<(string, string, string, GameObject)>();

		private GameObject _dynamicParamsContainer;

		private GameObject _currentRow;

		private GameObject _paramEditorGroup;

		private InputFieldRef _paramNameInput;

		private AutocompleteInput _paramTypeInput;

		private InputFieldRef _paramValueInput;

		private int _editingParamIndex = -1;

		private const int MAX_ROW_WIDTH = 700;

		private const int BUTTON_MIN_WIDTH = 120;

		private const int BUTTON_SPACING = 3;

		private const int ROW_PADDING = 6;

		private int _currentRowWidth;

		public IReadOnlyList<(string name, string type, string value)> DynamicParams => _dynamicParams.ConvertAll(((string name, string type, string value, GameObject button) p) => (p.name, p.type, p.value));

		public event Action OnDynamicParamsChanged;

		public void Update()
		{
			if ((Object)(object)_paramEditorGroup != (Object)null && _paramEditorGroup.activeSelf)
			{
				_paramTypeInput?.Update();
			}
		}

		public void Build(GameObject parent)
		{
			CreateDynamicParamsSection(parent);
			CreateParamEditor(parent);
		}

		private void CreateDynamicParamsSection(GameObject parent)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(parent, "DynamicParamsLabel", "Dynamic Parameters:", (TextAnchor)3, Color.white, true, 14)).gameObject, (int?)200, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			_dynamicParamsContainer = UIFactory.CreateVerticalGroup(parent, "DynamicParamsContainer", false, false, true, true, 3, new Vector4(3f, 3f, 3f, 3f), default(Color), (TextAnchor?)null);
			GameObject dynamicParamsContainer = _dynamicParamsContainer;
			int? num = 9999;
			int? num2 = 30;
			UIFactory.SetLayoutElement(dynamicParamsContainer, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			_currentRow = CreateNewRow();
			ButtonRef obj = UIFactory.CreateButton(parent, "AddParamBtn", "+ Add", (Color?)new Color(0.2f, 0.3f, 0.2f));
			UIFactory.SetLayoutElement(((Component)obj.Component).gameObject, (int?)80, (int?)30, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			obj.OnClick = (Action)Delegate.Combine(obj.OnClick, (Action)delegate
			{
				AddDynamicParameter();
			});
		}

		private GameObject CreateNewRow()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = UIFactory.CreateHorizontalGroup(_dynamicParamsContainer, $"Row_{_dynamicParamsContainer.transform.childCount}", false, false, true, true, 3, new Vector4(6f, 2f, 6f, 2f), default(Color), (TextAnchor?)null);
			int? num = 9999;
			int? num2 = 30;
			UIFactory.SetLayoutElement(obj, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			_currentRowWidth = 12;
			return obj;
		}

		private void CreateParamEditor(GameObject parent)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_024d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0330: Unknown result type (might be due to invalid IL or missing references)
			//IL_0336: Unknown result type (might be due to invalid IL or missing references)
			//IL_033a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0340: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0447: Unknown result type (might be due to invalid IL or missing references)
			//IL_04dc: Unknown result type (might be due to invalid IL or missing references)
			_paramEditorGroup = UIFactory.CreateVerticalGroup(parent, "ParamEditor", false, false, true, true, 3, new Vector4(5f, 5f, 5f, 5f), new Color(0.15f, 0.15f, 0.2f, 0.95f), (TextAnchor?)null);
			UIFactory.SetLayoutElement(_paramEditorGroup, (int?)300, (int?)120, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			_paramEditorGroup.SetActive(false);
			GameObject gameObject = ((Component)UIFactory.CreateLabel(_paramEditorGroup, "EditNameLabel", "Name:", (TextAnchor)3, Color.white, true, 14)).gameObject;
			int? num = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			_paramNameInput = UIFactory.CreateInputField(_paramEditorGroup, "EditNameInput", "");
			GameObject gameObject2 = ((Component)_paramNameInput.Component).gameObject;
			num = 9999;
			int? num2 = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			GameObject gameObject3 = ((Component)UIFactory.CreateLabel(_paramEditorGroup, "EditTypeLabel", "Type:", (TextAnchor)3, Color.white, true, 14)).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject3, (int?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			_paramTypeInput = new AutocompleteInput(_paramEditorGroup, "EditTypeInput", "type", new Vector2(150f, 25f), (string filter) => EventDataManager.Instance.GetSupportedTypes(filter));
			GameObject gameObject4 = ((Component)UIFactory.CreateLabel(_paramEditorGroup, "EditValueLabel", "Value:", (TextAnchor)3, Color.white, true, 14)).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject4, (int?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			_paramValueInput = UIFactory.CreateInputField(_paramEditorGroup, "EditValueInput", "");
			GameObject gameObject5 = ((Component)_paramValueInput.Component).gameObject;
			num2 = 9999;
			num = 25;
			UIFactory.SetLayoutElement(gameObject5, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			GameObject obj = UIFactory.CreateHorizontalGroup(_paramEditorGroup, "ButtonRow", false, false, true, true, 5, default(Vector4), default(Color), (TextAnchor?)null);
			num = 30;
			UIFactory.SetLayoutElement(obj, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef obj2 = UIFactory.CreateButton(obj, "SaveBtn", "Save", (Color?)new Color(0.2f, 0.4f, 0.2f));
			UIFactory.SetLayoutElement(((Component)obj2.Component).gameObject, (int?)60, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, (Action)delegate
			{
				SaveParamEdit();
			});
			ButtonRef obj3 = UIFactory.CreateButton(obj, "DeleteBtn", "Delete", (Color?)new Color(0.4f, 0.2f, 0.2f));
			UIFactory.SetLayoutElement(((Component)obj3.Component).gameObject, (int?)60, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			obj3.OnClick = (Action)Delegate.Combine(obj3.OnClick, (Action)delegate
			{
				DeleteCurrentParam();
			});
			ButtonRef obj4 = UIFactory.CreateButton(obj, "CancelBtn", "Cancel", (Color?)new Color(0.3f, 0.2f, 0.2f));
			UIFactory.SetLayoutElement(((Component)obj4.Component).gameObject, (int?)60, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			obj4.OnClick = (Action)Delegate.Combine(obj4.OnClick, (Action)delegate
			{
				HideParamEditor();
			});
		}

		public void AddDynamicParameter(string name = null, string type = null)
		{
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_dynamicParamsContainer == (Object)null))
			{
				int count = _dynamicParams.Count;
				string text = name ?? $"param{count}";
				string text2 = type ?? "string";
				string item = "";
				int num = Mathf.Max(120, text.Length * 8 + 60);
				if (_currentRowWidth + num > 700 && _dynamicParams.Count > 0)
				{
					_currentRow = CreateNewRow();
				}
				ButtonRef val = UIFactory.CreateButton(_currentRow, $"Param_{count}", $"[{count}] {text}: {text2}", (Color?)new Color(0.2f, 0.25f, 0.3f));
				UIFactory.SetLayoutElement(((Component)val.Component).gameObject, (int?)num, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				_currentRowWidth += num + 3;
				int capturedIndex = count;
				val.OnClick = (Action)Delegate.Combine(val.OnClick, (Action)delegate
				{
					EditDynamicParameter(capturedIndex);
				});
				_dynamicParams.Add((text, text2, item, ((Component)val.Component).gameObject));
				UpdateParamButtonLabels();
				this.OnDynamicParamsChanged?.Invoke();
				ManualLogSource log = UIManager.Instance.Log;
				if (log != null)
				{
					log.LogMessage((object)$"[DynamicParams] Added parameter {count}: {text} ({text2})");
				}
			}
		}

		private void UpdateParamButtonLabels()
		{
			for (int i = 0; i < _dynamicParams.Count; i++)
			{
				(string name, string type, string value, GameObject button) tuple = _dynamicParams[i];
				string item = tuple.name;
				string item2 = tuple.type;
				Text componentInChildren = tuple.button.GetComponentInChildren<Text>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					componentInChildren.text = $"[{i}] {item}: {item2}";
				}
			}
		}

		private void EditDynamicParameter(int index)
		{
			if (index >= 0 && index < _dynamicParams.Count)
			{
				_editingParamIndex = index;
				var (text, text2, text3, _) = _dynamicParams[index];
				_paramNameInput.Text = text;
				_paramTypeInput.SetText(text2);
				_paramValueInput.Text = text3;
				_paramEditorGroup.SetActive(true);
			}
		}

		private void SaveParamEdit()
		{
			if (_editingParamIndex >= 0 && _editingParamIndex < _dynamicParams.Count)
			{
				_dynamicParams[_editingParamIndex] = (_paramNameInput.Text, _paramTypeInput.Text, _paramValueInput.Text, _dynamicParams[_editingParamIndex].button);
				UpdateParamButtonLabels();
				this.OnDynamicParamsChanged?.Invoke();
			}
			HideParamEditor();
		}

		private void DeleteCurrentParam()
		{
			if (_editingParamIndex >= 0 && _editingParamIndex < _dynamicParams.Count)
			{
				GameObject item = _dynamicParams[_editingParamIndex].button;
				if ((Object)(object)item != (Object)null)
				{
					Object.Destroy((Object)(object)item);
				}
				_dynamicParams.RemoveAt(_editingParamIndex);
				RebuildRows();
				this.OnDynamicParamsChanged?.Invoke();
			}
			HideParamEditor();
		}

		private void RebuildRows()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			List<(string, string, string, GameObject)> list = new List<(string, string, string, GameObject)>();
			foreach (Transform item4 in _dynamicParamsContainer.transform)
			{
				Object.Destroy((Object)(object)((Component)item4).gameObject);
			}
			_currentRow = CreateNewRow();
			_currentRowWidth = 12;
			for (int i = 0; i < _dynamicParams.Count; i++)
			{
				(string name, string type, string value, GameObject button) tuple = _dynamicParams[i];
				string item = tuple.name;
				string item2 = tuple.type;
				string item3 = tuple.value;
				int num = Mathf.Max(120, item.Length * 8 + 60);
				if (_currentRowWidth + num > 700 && _dynamicParams.Count > 0)
				{
					_currentRow = CreateNewRow();
				}
				ButtonRef val = UIFactory.CreateButton(_currentRow, $"Param_{i}", $"[{i}] {item}: {item2}", (Color?)new Color(0.2f, 0.25f, 0.3f));
				UIFactory.SetLayoutElement(((Component)val.Component).gameObject, (int?)num, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				int capturedIndex = i;
				val.OnClick = (Action)Delegate.Combine(val.OnClick, (Action)delegate
				{
					EditDynamicParameter(capturedIndex);
				});
				_currentRowWidth += num + 3;
				list.Add((item, item2, item3, ((Component)val.Component).gameObject));
			}
			_dynamicParams.Clear();
			_dynamicParams.AddRange(list);
			UpdateParamButtonLabels();
		}

		private void HideParamEditor()
		{
			_paramEditorGroup.SetActive(false);
			_editingParamIndex = -1;
		}

		public void Clear()
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			foreach (var dynamicParam in _dynamicParams)
			{
				Object.Destroy((Object)(object)dynamicParam.button);
			}
			_dynamicParams.Clear();
			foreach (Transform item in _dynamicParamsContainer.transform)
			{
				Object.Destroy((Object)(object)((Component)item).gameObject);
			}
			_currentRow = CreateNewRow();
			this.OnDynamicParamsChanged?.Invoke();
		}
	}
	public class ExpandableItemBuilder
	{
		private readonly ButtonRef _toggleButton;

		private readonly GameObject _detailContent;

		private bool _isExpanded;

		private string _collapsedText;

		private string _expandedText;

		public bool IsExpanded => _isExpanded;

		public GameObject DetailContent => _detailContent;

		public ExpandableItemBuilder(GameObject parent, string name, string title, Color? buttonColor = null, string collapsedSuffix = " [+]", string expandedSuffix = " [-]")
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			_collapsedText = title + collapsedSuffix;
			_expandedText = title + expandedSuffix;
			_toggleButton = UIFactory.CreateButton(parent, name + "_ToggleBtn", _collapsedText, (Color?)(Color)(((??)buttonColor) ?? new Color(0.2f, 0.25f, 0.3f)));
			GameObject gameObject = ((Component)_toggleButton.Component).gameObject;
			int? num = 9999;
			int? num2 = 28;
			UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			_detailContent = UIFactory.CreateVerticalGroup(parent, name + "_DetailContent", false, false, true, true, 2, new Vector4(8f, 5f, 5f, 5f), new Color(0.08f, 0.1f, 0.12f, 0.95f), (TextAnchor?)null);
			GameObject detailContent = _detailContent;
			num2 = 9999;
			UIFactory.SetLayoutElement(detailContent, (int?)null, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			_detailContent.SetActive(false);
			ButtonRef toggleButton = _toggleButton;
			toggleButton.OnClick = (Action)Delegate.Combine(toggleButton.OnClick, new Action(Toggle));
		}

		private void Toggle()
		{
			SetExpanded(!_isExpanded);
		}

		public void SetExpanded(bool expanded)
		{
			_isExpanded = expanded;
			_detailContent.SetActive(_isExpanded);
			Text componentInChildren = ((Component)_toggleButton.Component).GetComponentInChildren<Text>();
			if ((Object)(object)componentInChildren != (Object)null)
			{
				componentInChildren.text = (_isExpanded ? _expandedText : _collapsedText);
			}
			UpdateButtonColor();
		}

		private void UpdateButtonColor()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			Button component = _toggleButton.Component;
			ColorBlock colors = default(ColorBlock);
			((ColorBlock)(ref colors)).normalColor = (_isExpanded ? new Color(0.25f, 0.35f, 0.45f, 1f) : new Color(0.2f, 0.25f, 0.3f, 0.9f));
			((ColorBlock)(ref colors)).highlightedColor = (_isExpanded ? new Color(0.35f, 0.45f, 0.55f, 1f) : new Color(0.3f, 0.35f, 0.4f, 1f));
			((ColorBlock)(ref colors)).pressedColor = (_isExpanded ? new Color(0.2f, 0.3f, 0.4f, 1f) : new Color(0.2f, 0.25f, 0.3f, 1f));
			((ColorBlock)(ref colors)).colorMultiplier = 1f;
			((ColorBlock)(ref colors)).fadeDuration = 0.1f;
			((Selectable)component).colors = colors;
		}

		public void Collapse()
		{
			SetExpanded(expanded: false);
		}

		public void Expand()
		{
			SetExpanded(expanded: true);
		}

		public void SetTitle(string title, string collapsedSuffix = " [+]", string expandedSuffix = " [-]")
		{
			_collapsedText = title + collapsedSuffix;
			_expandedText = title + expandedSuffix;
			UpdateButtonColor();
		}
	}
	public class ExpandableValueBuilder
	{
		private const int MaxReflectionDepth = 3;

		private const int PageSize = 30;

		private readonly GameObject _rootObject;

		private readonly GameObject _summaryLine;

		private readonly GameObject _detailContent;

		private readonly ButtonRef _toggleButton;

		private readonly bool _isExpanded;

		private readonly string _name;

		private readonly object _storedValue;

		private readonly Type _storedType;

		public GameObject DetailContent => _detailContent;

		private ExpandableValueBuilder(GameObject parent, string name, string typeName, object value, Type displayType, bool isExpanded)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0364: Unknown result type (might be due to invalid IL or missing references)
			//IL_036b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0371: Unknown result type (might be due to invalid IL or missing references)
			//IL_02db: Unknown result type (might be due to invalid IL or missing references)
			_name = name;
			_isExpanded = isExpanded;
			_storedValue = value;
			_storedType = displayType;
			GameObject val = UIFactory.CreateVerticalGroup(parent, name + "_Container", false, false, true, true, 2, new Vector4(2f, 2f, 2f, 2f), default(Color), (TextAnchor?)null);
			int? num = 9999;
			int? num2 = 20;
			UIFactory.SetLayoutElement(val, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			_rootObject = val;
			_summaryLine = UIFactory.CreateHorizontalGroup(val, name + "_Summary", false, false, true, true, 3, default(Vector4), default(Color), (TextAnchor?)null);
			GameObject summaryLine = _summaryLine;
			num2 = 20;
			UIFactory.SetLayoutElement(summaryLine, (int?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			_toggleButton = UIFactory.CreateButton(_summaryLine, name + "_Toggle", isExpanded ? "[-]" : "[+]", (Color?)new Color(0.25f, 0.28f, 0.35f));
			ButtonRef toggleButton = _toggleButton;
			toggleButton.OnClick = (Action)Delegate.Combine(toggleButton.OnClick, new Action(OnToggleClicked));
			UIFactory.SetLayoutElement(((Component)_toggleButton.Component).gameObject, (int?)30, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(_summaryLine, name + "_Type", typeName ?? "", (TextAnchor)3, new Color(0.6f, 0.7f, 0.9f, 1f), false, 11)).gameObject, (int?)80, (int?)18, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			if (value != null)
			{
				string valuePreview = GetValuePreview(value);
				if (!string.IsNullOrEmpty(valuePreview))
				{
					GameObject gameObject = ((Component)UIFactory.CreateLabel(_summaryLine, name + "_Preview", valuePreview, (TextAnchor)3, new Color(0.7f, 0.7f, 0.75f, 1f), false, 10)).gameObject;
					num2 = 9999;
					num = 18;
					UIFactory.SetLayoutElement(gameObject, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
				}
			}
			_detailContent = UIFactory.CreateVerticalGroup(val, name + "_Detail", false, false, true, true, 2, new Vector4(10f, 2f, 2f, 2f), default(Color), (TextAnchor?)null);
			GameObject detailContent = _detailContent;
			num = 9999;
			UIFactory.SetLayoutElement(detailContent, (int?)null, (int?)null, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			_detailContent.SetActive(isExpanded);
			if (isExpanded)
			{
				BuildDetailContent(_detailContent, value, displayType, 0);
			}
		}

		public static ExpandableValueBuilder Create(GameObject parent, string name, string typeName, object value, Type displayType)
		{
			return new ExpandableValueBuilder(parent, name, typeName, value, displayType, isExpanded: false);
		}

		private void OnToggleClicked()
		{
			_detailContent.SetActive(!_detailContent.activeSelf);
			Text componentInChildren = ((Component)_toggleButton.Component).GetComponentInChildren<Text>();
			if ((Object)(object)componentInChildren != (Object)null)
			{
				componentInChildren.text = (_detailContent.activeSelf ? "[-]" : "[+]");
			}
			if (_detailContent.activeSelf && _detailContent.transform.childCount == 0)
			{
				BuildDetailContent(_detailContent, _storedValue, _storedType, 0);
			}
		}

		private void BuildDetailContent(GameObject content, object value, Type displayType, int depth)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			if (value == null)
			{
				GameObject gameObject = ((Component)UIFactory.CreateLabel(content, ((Object)content).name + "_Null", "  (null)", (TextAnchor)3, new Color(0.5f, 0.5f, 0.5f, 1f), false, 10)).gameObject;
				int? num = 16;
				UIFactory.SetLayoutElement(gameObject, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				return;
			}
			if (value is IEnumerable && !(value is string))
			{
				BuildCollectionContent(content, value, displayType, depth);
				return;
			}
			string text = ComplexValueFormatter.FormatAsString(value, depth);
			if (!string.IsNullOrEmpty(text))
			{
				GameObject gameObject2 = ((Component)UIFactory.CreateLabel(content, ((Object)content).name + "_AsString", "  " + text, (TextAnchor)3, new Color(0.6f, 0.85f, 0.6f, 1f), false, 10)).gameObject;
				int? num = 9999;
				int? num2 = 16;
				UIFactory.SetLayoutElement(gameObject2, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
				CreateSeparator(content, ((Object)content).name + "_Sep1");
			}
			BuildReflectionContent(content, value, depth);
		}

		private void BuildCollectionContent(GameObject content, object value, Type displayType, int depth)
		{
			if (!(value is IEnumerable enumerable))
			{
				return;
			}
			List<object> list = new List<object>();
			foreach (object item in enumerable)
			{
				list.Add(item);
			}
			int count = list.Count;
			int startIndex = 0;
			int num = Math.Min(30, count);
			bool num2 = count > 30;
			CreateCollectionItems(content, list, startIndex, num, count, depth, ((Object)content).name + "_page0");
			if (num2)
			{
				CreatePaginationControls(content, list, num, count, depth, ((Object)content).name + "_pagination");
			}
		}

		private void CreateCollectionItems(GameObject parent, List<object> items, int startIndex, int displayCount, int totalCount, int depth, string namePrefix)
		{
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_0317: Unknown result type (might be due to invalid IL or missing references)
			//IL_0475: Unknown result type (might be due to invalid IL or missing references)
			for (int i = startIndex; i < startIndex + displayCount && i < items.Count; i++)
			{
				object item = items[i];
				string text = $"{namePrefix}_{i}";
				_ = item?.GetType().Name;
				string itemPreview = GetItemPreview(item);
				GameObject val = UIFactory.CreateVerticalGroup(parent, text + "_container", false, false, true, true, 2, new Vector4(2f, 2f, 2f, 2f), default(Color), (TextAnchor?)null);
				int? num = 9999;
				int? num2 = 18;
				UIFactory.SetLayoutElement(val, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
				GameObject val2 = UIFactory.CreateHorizontalGroup(val, text + "_header", false, false, true, true, 3, default(Vector4), default(Color), (TextAnchor?)null);
				num2 = 18;
				UIFactory.SetLayoutElement(val2, (int?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(val2, text + "_index", $"#{i}:", (TextAnchor)3, new Color(0.6f, 0.7f, 0.8f, 1f), false, 13)).gameObject, (int?)35, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				string text2 = item?.GetType().Name ?? "null";
				UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(val2, text + "_type", text2, (TextAnchor)3, new Color(0.6f, 0.7f, 0.9f, 1f), false, 13)).gameObject, (int?)80, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				if (!string.IsNullOrEmpty(itemPreview))
				{
					if (IsSimpleType(item))
					{
						CreateLockedInputField(val2, text + "_preview", itemPreview);
					}
					else
					{
						GameObject gameObject = ((Component)UIFactory.CreateLabel(val2, text + "_preview", " = " + itemPreview, (TextAnchor)3, new Color(0.7f, 0.7f, 0.75f, 1f), false, 13)).gameObject;
						num2 = 9999;
						num = 20;
						UIFactory.SetLayoutElement(gameObject, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
					}
				}
				GameObject detailContent = UIFactory.CreateVerticalGroup(val, text + "_detail", false, false, true, true, 2, new Vector4(10f, 2f, 2f, 2f), default(Color), (TextAnchor?)null);
				GameObject obj = detailContent;
				num = 9999;
				UIFactory.SetLayoutElement(obj, (int?)null, (int?)null, num, (int?)null, (int?)null, (int?)null, (bool?)null);
				detailContent.SetActive(false);
				if (item == null || IsSimpleType(item) || depth >= 3)
				{
					continue;
				}
				ButtonRef expandBtn = UIFactory.CreateButton(val2, text + "_expand", "[+]", (Color?)new Color(0.2f, 0.25f, 0.3f));
				ButtonRef obj2 = expandBtn;
				obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, (Action)delegate
				{
					bool flag = !detailContent.activeSelf;
					detailContent.SetActive(flag);
					expandBtn.ButtonText.text = (flag ? "[-]" : "[+]");
					if (flag && detailContent.transform.childCount == 0)
					{
						BuildReflectionContent(detailContent, item, depth + 1);
					}
				});
				UIFactory.SetLayoutElement(((Component)expandBtn.Component).gameObject, (int?)30, (int?)16, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			}
		}

		private void CreatePaginationControls(GameObject parent, List<object> items, int currentEnd, int totalCount, int depth, string namePrefix)
		{
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			ButtonRef loadMoreBtn = UIFactory.CreateButton(parent, namePrefix + "_loadMore", $"Load More ({totalCount - currentEnd} remaining)", (Color?)new Color(0.2f, 0.3f, 0.4f));
			GameObject gameObject = ((Component)loadMoreBtn.Component).gameObject;
			int? num = 9999;
			int? num2 = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			int capturedStart = currentEnd;
			ButtonRef obj = loadMoreBtn;
			obj.OnClick = (Action)Delegate.Combine(obj.OnClick, (Action)delegate
			{
				Object.Destroy((Object)(object)((Component)loadMoreBtn.Component).gameObject);
				int num3 = Math.Min(capturedStart + 30, totalCount);
				CreateCollectionItems(parent, items, capturedStart, num3 - capturedStart, totalCount, depth, $"{namePrefix}_page{capturedStart / 30}");
				if (num3 < totalCount)
				{
					CreatePaginationControls(parent, items, num3, totalCount, depth, $"{namePrefix}_page{num3 / 30}");
				}
			});
		}

		private bool IsSimpleType(object value)
		{
			if (value != null)
			{
				if (!(value is string))
				{
					if (!(value is bool))
					{
						if (!(value is char))
						{
							if (!(value is int))
							{
								if (!(value is long))
								{
									if (!(value is float))
									{
										if (!(value is double))
										{
											if (!(value is decimal))
											{
												if (value is DateTime)
												{
													return true;
												}
												return value?.GetType().IsPrimitive ?? false;
											}
											return true;
										}
										return true;
									}
									return true;
								}
								return true;
							}
							return true;
						}
						return true;
					}
					return true;
				}
				return true;
			}
			return true;
		}

		private string GetItemPreview(object item)
		{
			if (item == null)
			{
				return "null";
			}
			if (item is string text)
			{
				return "\"" + text + "\"";
			}
			if (item is bool)
			{
				if (!(bool)item)
				{
					return "false";
				}
				return "true";
			}
			if (item is int num)
			{
				return num.ToString();
			}
			if (item is float num2)
			{
				return num2.ToString("F2");
			}
			if (item is double num3)
			{
				return num3.ToString("F2");
			}
			return string.Empty;
		}

		private void BuildReflectionContent(GameObject content, object value, int depth)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			int? num;
			if (depth >= 3)
			{
				GameObject gameObject = ((Component)UIFactory.CreateLabel(content, ((Object)content).name + "_MaxDepth", "  (max depth reached)", (TextAnchor)3, new Color(0.5f, 0.5f, 0.5f, 1f), false, 13)).gameObject;
				num = 20;
				UIFactory.SetLayoutElement(gameObject, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
				return;
			}
			List<ComplexValueFormatter.MemberInfo> list = null;
			try
			{
				list = ComplexValueFormatter.GetMembers(value, depth);
			}
			catch (Exception ex)
			{
				OMCM.LogMessage("[ExpandableValueBuilder] GetMembers failed: " + ex.Message);
			}
			if (list == null || list.Count <= 0)
			{
				return;
			}
			GameObject gameObject2 = ((Component)UIFactory.CreateLabel(content, ((Object)content).name + "_ReflectionHeader", $"  --- Members ({list.Count}) ---", (TextAnchor)3, new Color(0.5f, 0.6f, 0.8f, 1f), true, 13)).gameObject;
			num = 9999;
			int? num2 = 20;
			UIFactory.SetLayoutElement(gameObject2, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			foreach (ComplexValueFormatter.MemberInfo item in list)
			{
				try
				{
					CreateMemberLabel(content, item.Name, item.Value, item.MemberType, depth + 1);
				}
				catch (Exception ex2)
				{
					OMCM.LogMessage("[ExpandableValueBuilder] CreateMemberLabel failed for " + item.Name + ": " + ex2.Message);
				}
			}
		}

		private void CreateMemberLabel(GameObject parent, string name, object memberValue, string memberType, int depth)
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			string text = ((memberType == "Property") ? "P:" : "F:");
			GameObject val = UIFactory.CreateHorizontalGroup(parent, "Member_" + name, false, false, true, true, 5, default(Vector4), default(Color), (TextAnchor?)null);
			int? num = 20;
			UIFactory.SetLayoutElement(val, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(val, "MemberName_" + name, "  " + text + " " + name + ":", (TextAnchor)3, new Color(0.6f, 0.7f, 0.85f, 1f), false, 13)).gameObject, (int?)80, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			if (memberValue == null || IsSimpleType(memberValue))
			{
				string text2 = ((memberValue == null) ? "null" : memberValue.ToString());
				if (text2.Length > 60)
				{
					text2 = text2.Substring(0, 60) + "...";
				}
				CreateLockedInputField(val, "MemberValue_" + name, text2);
				return;
			}
			string text3;
			if (memberValue is ICollection collection)
			{
				text3 = $"<{collection.GetType().Name} Count={collection.Count}>";
			}
			else if (memberValue is Array array)
			{
				text3 = $"<{array.GetType().Name} Length={array.Length}>";
			}
			else
			{
				text3 = memberValue.ToString();
				if (text3.Length > 60)
				{
		

UniverseLib.Mono.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using HarmonyLib;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Runtime;
using UniverseLib.Runtime.Mono;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.ObjectPool;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.UI.Widgets.ScrollView;
using UniverseLib.Utility;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("UniverseLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Sinai")]
[assembly: AssemblyProduct("UniverseLib")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: AssemblyFileVersion("1.4.3")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.3.0")]
[module: UnverifiableCode]
public static class MonoExtensions
{
	private static PropertyInfo p_childControlHeight = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlHeight");

	private static PropertyInfo p_childControlWidth = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlWidth");

	public static void AddListener(this UnityEvent _event, Action listener)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		_event.AddListener(new UnityAction(listener.Invoke));
	}

	public static void AddListener<T>(this UnityEvent<T> _event, Action<T> listener)
	{
		_event.AddListener((UnityAction<T>)listener.Invoke);
	}

	public static void RemoveListener(this UnityEvent _event, Action listener)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		_event.RemoveListener(new UnityAction(listener.Invoke));
	}

	public static void RemoveListener<T>(this UnityEvent<T> _event, Action<T> listener)
	{
		_event.RemoveListener((UnityAction<T>)listener.Invoke);
	}

	public static void Clear(this StringBuilder sb)
	{
		sb.Remove(0, sb.Length);
	}

	public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value)
	{
		p_childControlHeight?.SetValue(group, value, null);
	}

	public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value)
	{
		p_childControlWidth?.SetValue(group, value, null);
	}
}
namespace UniverseLib
{
	public static class ReflectionExtensions
	{
		public static Type GetActualType(this object obj)
		{
			return ReflectionUtility.Instance.Internal_GetActualType(obj);
		}

		public static object TryCast(this object obj)
		{
			return ReflectionUtility.Instance.Internal_TryCast(obj, ReflectionUtility.Instance.Internal_GetActualType(obj));
		}

		public static object TryCast(this object obj, Type castTo)
		{
			return ReflectionUtility.Instance.Internal_TryCast(obj, castTo);
		}

		public static T TryCast<T>(this object obj)
		{
			try
			{
				return (T)ReflectionUtility.Instance.Internal_TryCast(obj, typeof(T));
			}
			catch
			{
				return default(T);
			}
		}

		[Obsolete("This method is no longer necessary, just use Assembly.GetTypes().", false)]
		public static IEnumerable<Type> TryGetTypes(this Assembly asm)
		{
			return asm.GetTypes();
		}

		public static bool ReferenceEqual(this object objA, object objB)
		{
			if (objA == objB)
			{
				return true;
			}
			Object val = (Object)((objA is Object) ? objA : null);
			if (val != null)
			{
				Object val2 = (Object)((objB is Object) ? objB : null);
				if (val2 != null && Object.op_Implicit(val) && Object.op_Implicit(val2) && val.m_CachedPtr == val2.m_CachedPtr)
				{
					return true;
				}
			}
			return false;
		}

		public static string ReflectionExToString(this Exception e, bool innerMost = true)
		{
			if (e == null)
			{
				return "The exception was null.";
			}
			if (innerMost)
			{
				e = e.GetInnerMostException();
			}
			return $"{e.GetType()}: {e.Message}";
		}

		public static Exception GetInnerMostException(this Exception e)
		{
			while (e != null && e.InnerException != null)
			{
				e = e.InnerException;
			}
			return e;
		}
	}
	internal static class ReflectionPatches
	{
		internal static void Init()
		{
			Universe.Patch(typeof(Assembly), "GetTypes", (MethodType)0, new Type[0], null, null, AccessTools.Method(typeof(ReflectionPatches), "Finalizer_Assembly_GetTypes", (Type[])null, (Type[])null));
		}

		public static Exception Finalizer_Assembly_GetTypes(Assembly __instance, Exception __exception, ref Type[] __result)
		{
			if (__exception != null)
			{
				if (__exception is ReflectionTypeLoadException e)
				{
					__result = ReflectionUtility.TryExtractTypesFromException(e);
				}
				else
				{
					try
					{
						__result = __instance.GetExportedTypes();
					}
					catch (ReflectionTypeLoadException e2)
					{
						__result = ReflectionUtility.TryExtractTypesFromException(e2);
					}
					catch
					{
						__result = ArgumentUtility.EmptyTypes;
					}
				}
			}
			return null;
		}
	}
	public class ReflectionUtility
	{
		public static bool Initializing;

		public const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;

		public static readonly SortedDictionary<string, Type> AllTypes = new SortedDictionary<string, Type>(StringComparer.OrdinalIgnoreCase);

		public static readonly List<string> AllNamespaces = new List<string>();

		private static readonly HashSet<string> uniqueNamespaces = new HashSet<string>();

		private static string[] allTypeNamesArray;

		private static readonly Dictionary<string, Type> shorthandToType = new Dictionary<string, Type>
		{
			{
				"object",
				typeof(object)
			},
			{
				"string",
				typeof(string)
			},
			{
				"bool",
				typeof(bool)
			},
			{
				"byte",
				typeof(byte)
			},
			{
				"sbyte",
				typeof(sbyte)
			},
			{
				"char",
				typeof(char)
			},
			{
				"decimal",
				typeof(decimal)
			},
			{
				"double",
				typeof(double)
			},
			{
				"float",
				typeof(float)
			},
			{
				"int",
				typeof(int)
			},
			{
				"uint",
				typeof(uint)
			},
			{
				"long",
				typeof(long)
			},
			{
				"ulong",
				typeof(ulong)
			},
			{
				"short",
				typeof(short)
			},
			{
				"ushort",
				typeof(ushort)
			},
			{
				"void",
				typeof(void)
			}
		};

		internal static readonly Dictionary<string, Type[]> baseTypes = new Dictionary<string, Type[]>();

		internal static ReflectionUtility Instance { get; private set; }

		public static event Action<Type> OnTypeLoaded;

		internal static void Init()
		{
			ReflectionPatches.Init();
			Instance = new ReflectionUtility();
			Instance.Initialize();
		}

		protected virtual void Initialize()
		{
			SetupTypeCache();
			Initializing = false;
		}

		public static string[] GetTypeNameArray()
		{
			if (allTypeNamesArray == null || allTypeNamesArray.Length != AllTypes.Count)
			{
				allTypeNamesArray = new string[AllTypes.Count];
				int num = 0;
				foreach (string key in AllTypes.Keys)
				{
					allTypeNamesArray[num] = key;
					num++;
				}
			}
			return allTypeNamesArray;
		}

		private static void SetupTypeCache()
		{
			if (Universe.Context == RuntimeContext.Mono)
			{
				ForceLoadManagedAssemblies();
			}
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly asm in assemblies)
			{
				CacheTypes(asm);
			}
			AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded;
		}

		private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args)
		{
			if ((object)args.LoadedAssembly != null && !(args.LoadedAssembly.GetName().Name == "completions"))
			{
				CacheTypes(args.LoadedAssembly);
			}
		}

		private static void ForceLoadManagedAssemblies()
		{
			string path = Path.Combine(Application.dataPath, "Managed");
			if (!Directory.Exists(path))
			{
				return;
			}
			string[] files = Directory.GetFiles(path, "*.dll");
			foreach (string path2 in files)
			{
				try
				{
					Assembly assembly = Assembly.LoadFile(path2);
					assembly.GetTypes();
				}
				catch
				{
				}
			}
		}

		private static void CacheTypes(Assembly asm)
		{
			Type[] types = asm.GetTypes();
			foreach (Type type in types)
			{
				if (!string.IsNullOrEmpty(type.Namespace) && !uniqueNamespaces.Contains(type.Namespace))
				{
					uniqueNamespaces.Add(type.Namespace);
					int j;
					for (j = 0; j < AllNamespaces.Count && type.Namespace.CompareTo(AllNamespaces[j]) >= 0; j++)
					{
					}
					AllNamespaces.Insert(j, type.Namespace);
				}
				AllTypes[type.FullName] = type;
				ReflectionUtility.OnTypeLoaded?.Invoke(type);
			}
		}

		public static Type GetTypeByName(string fullName)
		{
			return Instance.Internal_GetTypeByName(fullName);
		}

		internal virtual Type Internal_GetTypeByName(string fullName)
		{
			if (shorthandToType.TryGetValue(fullName, out var value))
			{
				return value;
			}
			AllTypes.TryGetValue(fullName, out var value2);
			return value2;
		}

		internal virtual Type Internal_GetActualType(object obj)
		{
			return obj?.GetType();
		}

		internal virtual object Internal_TryCast(object obj, Type castTo)
		{
			return obj;
		}

		public static string ProcessTypeInString(Type type, string theString)
		{
			return Instance.Internal_ProcessTypeInString(theString, type);
		}

		internal virtual string Internal_ProcessTypeInString(string theString, Type type)
		{
			return theString;
		}

		public static void FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			Instance.Internal_FindSingleton(possibleNames, type, flags, instances);
		}

		internal virtual void Internal_FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			foreach (string name in possibleNames)
			{
				FieldInfo field = type.GetField(name, flags);
				if ((object)field != null)
				{
					object value = field.GetValue(null);
					if (value != null)
					{
						instances.Add(value);
						break;
					}
				}
			}
		}

		public static Type[] TryExtractTypesFromException(ReflectionTypeLoadException e)
		{
			try
			{
				return e.Types.Where((Type it) => (object)it != null).ToArray();
			}
			catch
			{
				return ArgumentUtility.EmptyTypes;
			}
		}

		public static Type[] GetAllBaseTypes(object obj)
		{
			return GetAllBaseTypes(obj?.GetActualType());
		}

		public static Type[] GetAllBaseTypes(Type type)
		{
			if ((object)type == null)
			{
				throw new ArgumentNullException("type");
			}
			string assemblyQualifiedName = type.AssemblyQualifiedName;
			if (baseTypes.TryGetValue(assemblyQualifiedName, out var value))
			{
				return value;
			}
			List<Type> list = new List<Type>();
			while ((object)type != null)
			{
				list.Add(type);
				type = type.BaseType;
			}
			value = list.ToArray();
			baseTypes.Add(assemblyQualifiedName, value);
			return value;
		}

		public static void GetImplementationsOf(Type baseType, Action<HashSet<Type>> onResultsFetched, bool allowAbstract, bool allowGeneric, bool allowEnum)
		{
			RuntimeHelper.StartCoroutine(DoGetImplementations(onResultsFetched, baseType, allowAbstract, allowGeneric, allowEnum));
		}

		private static IEnumerator DoGetImplementations(Action<HashSet<Type>> onResultsFetched, Type baseType, bool allowAbstract, bool allowGeneric, bool allowEnum)
		{
			List<Type> resolvedTypes = new List<Type>();
			OnTypeLoaded += ourListener;
			HashSet<Type> set = new HashSet<Type>();
			IEnumerator coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, DefaultTypesEnumerator());
			while (coro2.MoveNext())
			{
				yield return null;
			}
			OnTypeLoaded -= ourListener;
			if (resolvedTypes.Count > 0)
			{
				coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, resolvedTypes.GetEnumerator());
				while (coro2.MoveNext())
				{
					yield return null;
				}
			}
			onResultsFetched(set);
			void ourListener(Type t)
			{
				resolvedTypes.Add(t);
			}
		}

		private static IEnumerator<Type> DefaultTypesEnumerator()
		{
			string[] names = GetTypeNameArray();
			foreach (string name in names)
			{
				yield return AllTypes[name];
			}
		}

		private static IEnumerator GetImplementationsAsync(Type baseType, HashSet<Type> set, bool allowAbstract, bool allowGeneric, bool allowEnum, IEnumerator<Type> enumerator)
		{
			Stopwatch sw = new Stopwatch();
			sw.Start();
			bool isGenericParam = baseType?.IsGenericParameter ?? false;
			while (enumerator.MoveNext())
			{
				if (sw.ElapsedMilliseconds > 10)
				{
					yield return null;
					sw.Reset();
					sw.Start();
				}
				try
				{
					Type type = enumerator.Current;
					if (set.Contains(type) || (!allowAbstract && type.IsAbstract) || (!allowGeneric && type.IsGenericType) || (!allowEnum && type.IsEnum) || type.FullName.Contains("PrivateImplementationDetails") || type.FullName.Contains("DisplayClass") || Enumerable.Contains(type.FullName, '<'))
					{
						continue;
					}
					if (!isGenericParam)
					{
						if ((object)baseType == null || baseType.IsAssignableFrom(type))
						{
							goto IL_0269;
						}
					}
					else if ((!type.IsClass || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.NotNullableValueTypeConstraint)) && (!type.IsValueType || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.ReferenceTypeConstraint)) && !baseType.GetGenericParameterConstraints().Any((Type it) => !it.IsAssignableFrom(type)))
					{
						goto IL_0269;
					}
					goto end_IL_009f;
					IL_0269:
					set.Add(type);
					end_IL_009f:;
				}
				catch
				{
				}
			}
		}

		public static bool IsEnumerable(Type type)
		{
			return Instance.Internal_IsEnumerable(type);
		}

		protected virtual bool Internal_IsEnumerable(Type type)
		{
			return typeof(IEnumerable).IsAssignableFrom(type);
		}

		public static bool TryGetEnumerator(object ienumerable, out IEnumerator enumerator)
		{
			return Instance.Internal_TryGetEnumerator(ienumerable, out enumerator);
		}

		protected virtual bool Internal_TryGetEnumerator(object list, out IEnumerator enumerator)
		{
			enumerator = (list as IEnumerable).GetEnumerator();
			return true;
		}

		public static bool TryGetEntryType(Type enumerableType, out Type type)
		{
			return Instance.Internal_TryGetEntryType(enumerableType, out type);
		}

		protected virtual bool Internal_TryGetEntryType(Type enumerableType, out Type type)
		{
			if (enumerableType.IsArray)
			{
				type = enumerableType.GetElementType();
				return true;
			}
			Type[] interfaces = enumerableType.GetInterfaces();
			foreach (Type type2 in interfaces)
			{
				if (type2.IsGenericType)
				{
					Type genericTypeDefinition = type2.GetGenericTypeDefinition();
					if ((object)genericTypeDefinition == typeof(IEnumerable<>) || (object)genericTypeDefinition == typeof(IList<>) || (object)genericTypeDefinition == typeof(ICollection<>))
					{
						type = type2.GetGenericArguments()[0];
						return true;
					}
				}
			}
			type = typeof(object);
			return false;
		}

		public static bool IsDictionary(Type type)
		{
			return Instance.Internal_IsDictionary(type);
		}

		protected virtual bool Internal_IsDictionary(Type type)
		{
			return typeof(IDictionary).IsAssignableFrom(type);
		}

		public static bool TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			return Instance.Internal_TryGetDictEnumerator(dictionary, out dictEnumerator);
		}

		protected virtual bool Internal_TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			dictEnumerator = EnumerateDictionary((IDictionary)dictionary);
			return true;
		}

		private IEnumerator<DictionaryEntry> EnumerateDictionary(IDictionary dict)
		{
			IDictionaryEnumerator enumerator = dict.GetEnumerator();
			while (enumerator.MoveNext())
			{
				yield return new DictionaryEntry(enumerator.Key, enumerator.Value);
			}
		}

		public static bool TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values)
		{
			return Instance.Internal_TryGetEntryTypes(dictionaryType, out keys, out values);
		}

		protected virtual bool Internal_TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values)
		{
			Type[] interfaces = dictionaryType.GetInterfaces();
			foreach (Type type in interfaces)
			{
				if (type.IsGenericType && (object)type.GetGenericTypeDefinition() == typeof(IDictionary<, >))
				{
					Type[] genericArguments = type.GetGenericArguments();
					keys = genericArguments[0];
					values = genericArguments[1];
					return true;
				}
			}
			keys = typeof(object);
			values = typeof(object);
			return false;
		}
	}
	public abstract class RuntimeHelper
	{
		internal static RuntimeHelper Instance { get; private set; }

		internal static void Init()
		{
			Instance = new MonoProvider();
			Instance.OnInitialize();
		}

		protected internal abstract void OnInitialize();

		public static Coroutine StartCoroutine(IEnumerator routine)
		{
			return Instance.Internal_StartCoroutine(routine);
		}

		protected internal abstract Coroutine Internal_StartCoroutine(IEnumerator routine);

		public static void StopCoroutine(Coroutine coroutine)
		{
			Instance.Internal_StopCoroutine(coroutine);
		}

		protected internal abstract void Internal_StopCoroutine(Coroutine coroutine);

		public static T AddComponent<T>(GameObject obj, Type type) where T : Component
		{
			return Instance.Internal_AddComponent<T>(obj, type);
		}

		protected internal abstract T Internal_AddComponent<T>(GameObject obj, Type type) where T : Component;

		public static ScriptableObject CreateScriptable(Type type)
		{
			return Instance.Internal_CreateScriptable(type);
		}

		protected internal abstract ScriptableObject Internal_CreateScriptable(Type type);

		public static string LayerToName(int layer)
		{
			return Instance.Internal_LayerToName(layer);
		}

		protected internal abstract string Internal_LayerToName(int layer);

		public static T[] FindObjectsOfTypeAll<T>() where T : Object
		{
			return Instance.Internal_FindObjectsOfTypeAll<T>();
		}

		public static Object[] FindObjectsOfTypeAll(Type type)
		{
			return Instance.Internal_FindObjectsOfTypeAll(type);
		}

		protected internal abstract T[] Internal_FindObjectsOfTypeAll<T>() where T : Object;

		protected internal abstract Object[] Internal_FindObjectsOfTypeAll(Type type);

		public static void GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list)
		{
			Instance.Internal_GraphicRaycast(raycaster, data, list);
		}

		protected internal abstract void Internal_GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list);

		public static GameObject[] GetRootGameObjects(Scene scene)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Instance.Internal_GetRootGameObjects(scene);
		}

		protected internal abstract GameObject[] Internal_GetRootGameObjects(Scene scene);

		public static int GetRootCount(Scene scene)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Instance.Internal_GetRootCount(scene);
		}

		protected internal abstract int Internal_GetRootCount(Scene scene);

		public static void SetColorBlockAuto(Selectable selectable, Color baseColor)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			Instance.Internal_SetColorBlock(selectable, baseColor, baseColor * 1.2f, baseColor * 0.8f);
		}

		public static void SetColorBlock(Selectable selectable, ColorBlock colors)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Instance.Internal_SetColorBlock(selectable, colors);
		}

		protected internal abstract void Internal_SetColorBlock(Selectable selectable, ColorBlock colors);

		public static void SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null)
		{
			Instance.Internal_SetColorBlock(selectable, normal, highlighted, pressed, disabled);
		}

		protected internal abstract void Internal_SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null);
	}
	internal class UniversalBehaviour : MonoBehaviour
	{
		internal static UniversalBehaviour Instance { get; private set; }

		internal static void Setup()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("UniverseLibBehaviour");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D);
			Instance = val.AddComponent<UniversalBehaviour>();
		}

		internal void Update()
		{
			Universe.Update();
		}
	}
	public class Universe
	{
		public enum GlobalState
		{
			WaitingToSetup,
			SettingUp,
			SetupCompleted
		}

		public const string NAME = "UniverseLib";

		public const string VERSION = "1.4.3";

		public const string AUTHOR = "Sinai";

		public const string GUID = "com.sinai.universelib";

		private static float startupDelay;

		private static Action<string, LogType> logHandler;

		public static RuntimeContext Context { get; } = RuntimeContext.Mono;


		public static GlobalState CurrentGlobalState { get; private set; }

		internal static Harmony Harmony { get; } = new Harmony("com.sinai.universelib");


		private static event Action OnInitialized;

		public static void Init(Action onInitialized = null, Action<string, LogType> logHandler = null)
		{
			Init(1f, onInitialized, logHandler, default(UniverseLibConfig));
		}

		public static void Init(float startupDelay, Action onInitialized, Action<string, LogType> logHandler, UniverseLibConfig config)
		{
			if (CurrentGlobalState == GlobalState.SetupCompleted)
			{
				InvokeOnInitialized(onInitialized);
				return;
			}
			if (startupDelay > Universe.startupDelay)
			{
				Universe.startupDelay = startupDelay;
			}
			ConfigManager.LoadConfig(config);
			OnInitialized += onInitialized;
			if (logHandler != null && Universe.logHandler == null)
			{
				Universe.logHandler = logHandler;
			}
			if (CurrentGlobalState == GlobalState.WaitingToSetup)
			{
				CurrentGlobalState = GlobalState.SettingUp;
				Log("UniverseLib 1.4.3 initializing...");
				UniversalBehaviour.Setup();
				ReflectionUtility.Init();
				RuntimeHelper.Init();
				RuntimeHelper.Instance.Internal_StartCoroutine(SetupCoroutine());
				Log("Finished UniverseLib initial setup.");
			}
		}

		internal static void Update()
		{
			UniversalUI.Update();
		}

		private static IEnumerator SetupCoroutine()
		{
			yield return null;
			Stopwatch sw = new Stopwatch();
			sw.Start();
			while (ReflectionUtility.Initializing || (float)sw.ElapsedMilliseconds * 0.001f < startupDelay)
			{
				yield return null;
			}
			InputManager.Init();
			UniversalUI.Init();
			Log("UniverseLib 1.4.3 initialized.");
			CurrentGlobalState = GlobalState.SetupCompleted;
			InvokeOnInitialized(Universe.OnInitialized);
		}

		private static void InvokeOnInitialized(Action onInitialized)
		{
			if (onInitialized == null)
			{
				return;
			}
			Delegate[] invocationList = onInitialized.GetInvocationList();
			foreach (Delegate @delegate in invocationList)
			{
				try
				{
					@delegate.DynamicInvoke();
				}
				catch (Exception arg)
				{
					LogWarning($"Exception invoking onInitialized callback! {arg}");
				}
			}
		}

		internal static void Log(object message)
		{
			Log(message, (LogType)3);
		}

		internal static void LogWarning(object message)
		{
			Log(message, (LogType)2);
		}

		internal static void LogError(object message)
		{
			Log(message, (LogType)0);
		}

		private static void Log(object message, LogType logType)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			logHandler("[UniverseLib] " + (message?.ToString() ?? string.Empty), logType);
		}

		internal static bool Patch(Type type, string methodName, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Invalid comparison between Unknown and I4
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Expected O, but got Unknown
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Expected O, but got Unknown
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			try
			{
				string text = (((int)methodType == 1) ? "get_" : (((int)methodType != 2) ? string.Empty : "set_"));
				string text2 = text;
				MethodInfo methodInfo = ((arguments == null) ? type.GetMethod(text2 + methodName, AccessTools.all) : type.GetMethod(text2 + methodName, AccessTools.all, null, arguments, null));
				if ((object)methodInfo == null)
				{
					return false;
				}
				PatchProcessor val = Harmony.CreateProcessor((MethodBase)methodInfo);
				if ((object)prefix != null)
				{
					val.AddPrefix(new HarmonyMethod(prefix));
				}
				if ((object)postfix != null)
				{
					val.AddPostfix(new HarmonyMethod(postfix));
				}
				if ((object)finalizer != null)
				{
					val.AddFinalizer(new HarmonyMethod(finalizer));
				}
				val.Patch();
				return true;
			}
			catch (Exception arg)
			{
				LogWarning($"\t Exception patching {type.FullName}.{methodName}: {arg}");
				return false;
			}
		}

		internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			foreach (string methodName in possibleNames)
			{
				if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
				{
					return true;
				}
			}
			return false;
		}

		internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			foreach (string methodName in possibleNames)
			{
				foreach (Type[] arguments in possibleArguments)
				{
					if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
					{
						return true;
					}
				}
			}
			return false;
		}

		internal static bool Patch(Type type, string methodName, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			foreach (Type[] arguments in possibleArguments)
			{
				if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
				{
					return true;
				}
			}
			return false;
		}
	}
}
namespace UniverseLib.Utility
{
	public static class ArgumentUtility
	{
		public static readonly Type[] EmptyTypes = new Type[0];

		public static readonly object[] EmptyArgs = new object[0];

		public static readonly Type[] ParseArgs = new Type[1] { typeof(string) };
	}
	public static class IOUtility
	{
		private static readonly char[] invalidDirectoryCharacters = Path.GetInvalidPathChars();

		private static readonly char[] invalidFilenameCharacters = Path.GetInvalidFileNameChars();

		public static string EnsureValidFilePath(string fullPathWithFile)
		{
			fullPathWithFile = string.Concat(fullPathWithFile.Split(invalidDirectoryCharacters));
			Directory.CreateDirectory(Path.GetDirectoryName(fullPathWithFile));
			return fullPathWithFile;
		}

		public static string EnsureValidFilename(string filename)
		{
			return string.Concat(filename.Split(invalidFilenameCharacters));
		}
	}
	public static class MiscUtility
	{
		public static bool ContainsIgnoreCase(this string _this, string s)
		{
			return CultureInfo.CurrentCulture.CompareInfo.IndexOf(_this, s, CompareOptions.IgnoreCase) >= 0;
		}

		public static bool HasFlag(this Enum flags, Enum value)
		{
			try
			{
				ulong num = Convert.ToUInt64(value);
				return (Convert.ToUInt64(flags) & num) == num;
			}
			catch
			{
				long num2 = Convert.ToInt64(value);
				return (Convert.ToInt64(flags) & num2) == num2;
			}
		}

		public static bool EndsWith(this StringBuilder sb, string _string)
		{
			int length = _string.Length;
			if (sb.Length < length)
			{
				return false;
			}
			int num = 0;
			int num2 = sb.Length - length;
			while (num2 < sb.Length)
			{
				if (sb[num2] != _string[num])
				{
					return false;
				}
				num2++;
				num++;
			}
			return true;
		}
	}
	public static class ParseUtility
	{
		internal delegate object ParseMethod(string input);

		internal delegate string ToStringMethod(object obj);

		public static readonly string NumberFormatString = "0.####";

		private static readonly Dictionary<int, string> numSequenceStrings = new Dictionary<int, string>();

		private static readonly HashSet<Type> nonPrimitiveTypes = new HashSet<Type>
		{
			typeof(string),
			typeof(decimal),
			typeof(DateTime)
		};

		private static readonly HashSet<Type> formattedTypes = new HashSet<Type>
		{
			typeof(float),
			typeof(double),
			typeof(decimal)
		};

		private static readonly Dictionary<string, string> typeInputExamples = new Dictionary<string, string>();

		private static readonly Dictionary<string, ParseMethod> customTypes = new Dictionary<string, ParseMethod>
		{
			{
				typeof(Vector2).FullName,
				TryParseVector2
			},
			{
				typeof(Vector3).FullName,
				TryParseVector3
			},
			{
				typeof(Vector4).FullName,
				TryParseVector4
			},
			{
				typeof(Quaternion).FullName,
				TryParseQuaternion
			},
			{
				typeof(Rect).FullName,
				TryParseRect
			},
			{
				typeof(Color).FullName,
				TryParseColor
			},
			{
				typeof(Color32).FullName,
				TryParseColor32
			},
			{
				typeof(LayerMask).FullName,
				TryParseLayerMask
			}
		};

		private static readonly Dictionary<string, ToStringMethod> customTypesToString = new Dictionary<string, ToStringMethod>
		{
			{
				typeof(Vector2).FullName,
				Vector2ToString
			},
			{
				typeof(Vector3).FullName,
				Vector3ToString
			},
			{
				typeof(Vector4).FullName,
				Vector4ToString
			},
			{
				typeof(Quaternion).FullName,
				QuaternionToString
			},
			{
				typeof(Rect).FullName,
				RectToString
			},
			{
				typeof(Color).FullName,
				ColorToString
			},
			{
				typeof(Color32).FullName,
				Color32ToString
			},
			{
				typeof(LayerMask).FullName,
				LayerMaskToString
			}
		};

		public static string FormatDecimalSequence(params object[] numbers)
		{
			if (numbers.Length == 0)
			{
				return null;
			}
			return string.Format(CultureInfo.CurrentCulture, GetSequenceFormatString(numbers.Length), numbers);
		}

		internal static string GetSequenceFormatString(int count)
		{
			if (count <= 0)
			{
				return null;
			}
			if (numSequenceStrings.ContainsKey(count))
			{
				return numSequenceStrings[count];
			}
			string[] array = new string[count];
			for (int i = 0; i < count; i++)
			{
				array[i] = $"{{{i}:{NumberFormatString}}}";
			}
			string text = string.Join(" ", array);
			numSequenceStrings.Add(count, text);
			return text;
		}

		public static bool CanParse(Type type)
		{
			return !string.IsNullOrEmpty(type?.FullName) && (type.IsPrimitive || type.IsEnum || nonPrimitiveTypes.Contains(type) || customTypes.ContainsKey(type.FullName));
		}

		public static bool CanParse<T>()
		{
			return CanParse(typeof(T));
		}

		public static bool TryParse<T>(string input, out T obj, out Exception parseException)
		{
			object obj2;
			bool result = TryParse(input, typeof(T), out obj2, out parseException);
			if (obj2 != null)
			{
				obj = (T)obj2;
			}
			else
			{
				obj = default(T);
			}
			return result;
		}

		public static bool TryParse(string input, Type type, out object obj, out Exception parseException)
		{
			obj = null;
			parseException = null;
			if ((object)type == null)
			{
				return false;
			}
			if ((object)type == typeof(string))
			{
				obj = input;
				return true;
			}
			if (type.IsEnum)
			{
				try
				{
					obj = Enum.Parse(type, input);
					return true;
				}
				catch (Exception e)
				{
					parseException = e.GetInnerMostException();
					return false;
				}
			}
			try
			{
				if (customTypes.ContainsKey(type.FullName))
				{
					obj = customTypes[type.FullName](input);
				}
				else
				{
					obj = AccessTools.Method(type, "Parse", ArgumentUtility.ParseArgs, (Type[])null).Invoke(null, new object[1] { input });
				}
				return true;
			}
			catch (Exception e2)
			{
				Exception innerMostException = e2.GetInnerMostException();
				parseException = innerMostException;
			}
			return false;
		}

		public static string ToStringForInput<T>(object obj)
		{
			return ToStringForInput(obj, typeof(T));
		}

		public static string ToStringForInput(object obj, Type type)
		{
			if ((object)type == null || obj == null)
			{
				return null;
			}
			if ((object)type == typeof(string))
			{
				return obj as string;
			}
			if (type.IsEnum)
			{
				return Enum.IsDefined(type, obj) ? Enum.GetName(type, obj) : obj.ToString();
			}
			try
			{
				if (customTypes.ContainsKey(type.FullName))
				{
					return customTypesToString[type.FullName](obj);
				}
				if (formattedTypes.Contains(type))
				{
					return AccessTools.Method(type, "ToString", new Type[2]
					{
						typeof(string),
						typeof(IFormatProvider)
					}, (Type[])null).Invoke(obj, new object[2]
					{
						NumberFormatString,
						CultureInfo.CurrentCulture
					}) as string;
				}
				return obj.ToString();
			}
			catch (Exception arg)
			{
				Universe.LogWarning($"Exception formatting object for input: {arg}");
				return null;
			}
		}

		public static string GetExampleInput<T>()
		{
			return GetExampleInput(typeof(T));
		}

		public static string GetExampleInput(Type type)
		{
			if (!typeInputExamples.ContainsKey(type.AssemblyQualifiedName))
			{
				try
				{
					if (type.IsEnum)
					{
						typeInputExamples.Add(type.AssemblyQualifiedName, Enum.GetNames(type).First());
					}
					else
					{
						object obj = Activator.CreateInstance(type);
						typeInputExamples.Add(type.AssemblyQualifiedName, ToStringForInput(obj, type));
					}
				}
				catch (Exception message)
				{
					Universe.LogWarning("Exception generating default instance for example input for '" + type.FullName + "'");
					Universe.Log(message);
					return "";
				}
			}
			return typeInputExamples[type.AssemblyQualifiedName];
		}

		internal static object TryParseVector2(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			Vector2 val = default(Vector2);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector2ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector2 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y);
		}

		internal static object TryParseVector3(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector3ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector3 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z);
		}

		internal static object TryParseVector4(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			Vector4 val = default(Vector4);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			val.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector4ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector4 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z, val.w);
		}

		internal static object TryParseQuaternion(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(new char[1] { ' ' });
			if (array.Length == 4)
			{
				Quaternion val2 = default(Quaternion);
				val2.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
				val2.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
				val2.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
				val2.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
				return val2;
			}
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			return Quaternion.Euler(val);
		}

		internal static string QuaternionToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Quaternion val) || 1 == 0)
			{
				return null;
			}
			Vector3 eulerAngles = ((Quaternion)(ref val)).eulerAngles;
			return FormatDecimalSequence(eulerAngles.x, eulerAngles.y, eulerAngles.z);
		}

		internal static object TryParseRect(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			Rect val = default(Rect);
			string[] array = input.Split(new char[1] { ' ' });
			((Rect)(ref val)).x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).width = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).height = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string RectToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Rect val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(((Rect)(ref val)).x, ((Rect)(ref val)).y, ((Rect)(ref val)).width, ((Rect)(ref val)).height);
		}

		internal static object TryParseColor(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			string[] array = input.Split(new char[1] { ' ' });
			val.r = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.g = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.b = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			if (array.Length > 3)
			{
				val.a = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			}
			else
			{
				val.a = 1f;
			}
			return val;
		}

		internal static string ColorToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.r, val.g, val.b, val.a);
		}

		internal static object TryParseColor32(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			Color32 val = default(Color32);
			string[] array = input.Split(new char[1] { ' ' });
			val.r = byte.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.g = byte.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.b = byte.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			if (array.Length > 3)
			{
				val.a = byte.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			}
			else
			{
				val.a = byte.MaxValue;
			}
			return val;
		}

		internal static string Color32ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color32 val) || 1 == 0)
			{
				return null;
			}
			return $"{val.r} {val.g} {val.b} {val.a}";
		}

		internal static object TryParseLayerMask(string input)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return LayerMask.op_Implicit(int.Parse(input));
		}

		internal static string LayerMaskToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is LayerMask val) || 1 == 0)
			{
				return null;
			}
			return ((LayerMask)(ref val)).value.ToString();
		}
	}
	public static class SignatureHighlighter
	{
		public const string NAMESPACE = "#a8a8a8";

		public const string CONST = "#92c470";

		public const string CLASS_STATIC = "#3a8d71";

		public const string CLASS_INSTANCE = "#2df7b2";

		public const string STRUCT = "#0fba3a";

		public const string INTERFACE = "#9b9b82";

		public const string FIELD_STATIC = "#8d8dc6";

		public const string FIELD_INSTANCE = "#c266ff";

		public const string METHOD_STATIC = "#b55b02";

		public const string METHOD_INSTANCE = "#ff8000";

		public const string PROP_STATIC = "#588075";

		public const string PROP_INSTANCE = "#55a38e";

		public const string LOCAL_ARG = "#a6e9e9";

		public const string OPEN_COLOR = "<color=";

		public const string CLOSE_COLOR = "</color>";

		public const string OPEN_ITALIC = "<i>";

		public const string CLOSE_ITALIC = "</i>";

		public static readonly Regex ArrayTokenRegex = new Regex("\\[,*?\\]");

		private static readonly Regex colorTagRegex = new Regex("<color=#?[\\d|\\w]*>");

		public static readonly Color StringOrange = new Color(0.83f, 0.61f, 0.52f);

		public static readonly Color EnumGreen = new Color(0.57f, 0.76f, 0.43f);

		public static readonly Color KeywordBlue = new Color(0.3f, 0.61f, 0.83f);

		public static readonly string keywordBlueHex = KeywordBlue.ToHex();

		public static readonly Color NumberGreen = new Color(0.71f, 0.8f, 0.65f);

		private static readonly Dictionary<string, string> typeToRichType = new Dictionary<string, string>();

		private static readonly Dictionary<string, string> highlightedMethods = new Dictionary<string, string>();

		private static readonly Dictionary<Type, string> builtInTypesToShorthand = new Dictionary<Type, string>
		{
			{
				typeof(object),
				"object"
			},
			{
				typeof(string),
				"string"
			},
			{
				typeof(bool),
				"bool"
			},
			{
				typeof(byte),
				"byte"
			},
			{
				typeof(sbyte),
				"sbyte"
			},
			{
				typeof(char),
				"char"
			},
			{
				typeof(decimal),
				"decimal"
			},
			{
				typeof(double),
				"double"
			},
			{
				typeof(float),
				"float"
			},
			{
				typeof(int),
				"int"
			},
			{
				typeof(uint),
				"uint"
			},
			{
				typeof(long),
				"long"
			},
			{
				typeof(ulong),
				"ulong"
			},
			{
				typeof(short),
				"short"
			},
			{
				typeof(ushort),
				"ushort"
			},
			{
				typeof(void),
				"void"
			}
		};

		public static string Parse(Type type, bool includeNamespace, MemberInfo memberInfo = null)
		{
			if ((object)type == null)
			{
				throw new ArgumentNullException("type");
			}
			if (memberInfo is MethodInfo method)
			{
				return ParseMethod(method);
			}
			if (memberInfo is ConstructorInfo ctor)
			{
				return ParseConstructor(ctor);
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (type.IsByRef)
			{
				AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append("ref ").Append("</color>");
			}
			Type type2 = type;
			while (type2.HasElementType)
			{
				type2 = type2.GetElementType();
			}
			includeNamespace &= !builtInTypesToShorthand.ContainsKey(type2);
			if (!type.IsGenericParameter && (!type.HasElementType || !type.GetElementType().IsGenericParameter) && includeNamespace && TryGetNamespace(type, out var ns))
			{
				AppendOpenColor(stringBuilder, "#a8a8a8").Append(ns).Append("</color>").Append('.');
			}
			stringBuilder.Append(ProcessType(type));
			if ((object)memberInfo != null)
			{
				stringBuilder.Append('.');
				int index = stringBuilder.Length - 1;
				AppendOpenColor(stringBuilder, GetMemberInfoColor(memberInfo, out var isStatic)).Append(memberInfo.Name).Append("</color>");
				if (isStatic)
				{
					stringBuilder.Insert(index, "<i>");
					stringBuilder.Append("</i>");
				}
			}
			return stringBuilder.ToString();
		}

		private static string ProcessType(Type type)
		{
			string key = type.ToString();
			if (typeToRichType.ContainsKey(key))
			{
				return typeToRichType[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (!type.IsGenericParameter)
			{
				int length = stringBuilder.Length;
				Type declaringType = type.DeclaringType;
				while ((object)declaringType != null)
				{
					stringBuilder.Insert(length, HighlightType(declaringType) + ".");
					declaringType = declaringType.DeclaringType;
				}
				stringBuilder.Append(HighlightType(type));
				if (type.IsGenericType)
				{
					ProcessGenericArguments(type, stringBuilder);
				}
			}
			else
			{
				stringBuilder.Append("<color=").Append("#92c470").Append('>')
					.Append(type.Name)
					.Append("</color>");
			}
			string text = stringBuilder.ToString();
			typeToRichType.Add(key, text);
			return text;
		}

		internal static string GetClassColor(Type type)
		{
			if (type.IsAbstract && type.IsSealed)
			{
				return "#3a8d71";
			}
			if (type.IsEnum || type.IsGenericParameter)
			{
				return "#92c470";
			}
			if (type.IsValueType)
			{
				return "#0fba3a";
			}
			if (type.IsInterface)
			{
				return "#9b9b82";
			}
			return "#2df7b2";
		}

		private static bool TryGetNamespace(Type type, out string ns)
		{
			return !string.IsNullOrEmpty(ns = type.Namespace?.Trim());
		}

		private static StringBuilder AppendOpenColor(StringBuilder sb, string color)
		{
			return sb.Append("<color=").Append(color).Append('>');
		}

		private static string HighlightType(Type type)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (type.IsByRef)
			{
				type = type.GetElementType();
			}
			int num = 0;
			Match match = ArrayTokenRegex.Match(type.Name);
			if (match != null && match.Success)
			{
				num = 1 + match.Value.Count((char c) => c == ',');
				type = type.GetElementType();
			}
			if (builtInTypesToShorthand.TryGetValue(type, out var value))
			{
				AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append(value).Append("</color>");
			}
			else
			{
				stringBuilder.Append("<color=" + GetClassColor(type) + ">").Append(type.Name).Append("</color>");
			}
			if (num > 0)
			{
				stringBuilder.Append('[').Append(new string(',', num - 1)).Append(']');
			}
			return stringBuilder.ToString();
		}

		private static void ProcessGenericArguments(Type type, StringBuilder sb)
		{
			List<Type> list = type.GetGenericArguments().ToList();
			for (int i = 0; i < sb.Length; i++)
			{
				if (!list.Any())
				{
					break;
				}
				if (sb[i] != '`')
				{
					continue;
				}
				int num = i;
				i++;
				StringBuilder stringBuilder = new StringBuilder();
				for (; char.IsDigit(sb[i]); i++)
				{
					stringBuilder.Append(sb[i]);
				}
				string text = stringBuilder.ToString();
				int num2 = int.Parse(text);
				sb.Remove(num, text.Length + 1);
				int num3 = 1;
				num++;
				while (num3 < "</color>".Length && sb[num] == "</color>"[num3])
				{
					num3++;
					num++;
				}
				sb.Insert(num, '<');
				num++;
				int length = sb.Length;
				while (num2 > 0 && list.Any())
				{
					num2--;
					Type type2 = list.First();
					list.RemoveAt(0);
					sb.Insert(num, ProcessType(type2));
					if (num2 > 0)
					{
						num += sb.Length - length;
						sb.Insert(num, ", ");
						num += 2;
						length = sb.Length;
					}
				}
				sb.Insert(num + sb.Length - length, '>');
			}
		}

		public static string RemoveHighlighting(string _string)
		{
			if (_string == null)
			{
				throw new ArgumentNullException("_string");
			}
			_string = _string.Replace("<i>", string.Empty);
			_string = _string.Replace("</i>", string.Empty);
			_string = colorTagRegex.Replace(_string, string.Empty);
			_string = _string.Replace("</color>", string.Empty);
			return _string;
		}

		[Obsolete("Use 'ParseMethod(MethodInfo)' instead (rename).")]
		public static string HighlightMethod(MethodInfo method)
		{
			return ParseMethod(method);
		}

		public static string ParseMethod(MethodInfo method)
		{
			string key = GeneralExtensions.FullDescription((MethodBase)method);
			if (highlightedMethods.ContainsKey(key))
			{
				return highlightedMethods[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(Parse(method.DeclaringType, includeNamespace: false));
			stringBuilder.Append('.');
			string text = ((!method.IsStatic) ? "#ff8000" : "#b55b02");
			stringBuilder.Append("<color=" + text + ">" + method.Name + "</color>");
			if (method.IsGenericMethod)
			{
				stringBuilder.Append("<");
				Type[] genericArguments = method.GetGenericArguments();
				for (int i = 0; i < genericArguments.Length; i++)
				{
					Type type = genericArguments[i];
					if (type.IsGenericParameter)
					{
						stringBuilder.Append("<color=#92c470>" + genericArguments[i].Name + "</color>");
					}
					else
					{
						stringBuilder.Append(Parse(type, includeNamespace: false));
					}
					if (i < genericArguments.Length - 1)
					{
						stringBuilder.Append(", ");
					}
				}
				stringBuilder.Append(">");
			}
			stringBuilder.Append('(');
			ParameterInfo[] parameters = method.GetParameters();
			for (int j = 0; j < parameters.Length; j++)
			{
				ParameterInfo parameterInfo = parameters[j];
				stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false));
				if (j < parameters.Length - 1)
				{
					stringBuilder.Append(", ");
				}
			}
			stringBuilder.Append(')');
			string text2 = stringBuilder.ToString();
			highlightedMethods.Add(key, text2);
			return text2;
		}

		[Obsolete("Use 'ParseConstructor(ConstructorInfo)' instead (rename).")]
		public static string HighlightConstructor(ConstructorInfo ctor)
		{
			return ParseConstructor(ctor);
		}

		public static string ParseConstructor(ConstructorInfo ctor)
		{
			string key = GeneralExtensions.FullDescription((MethodBase)ctor);
			if (highlightedMethods.ContainsKey(key))
			{
				return highlightedMethods[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(Parse(ctor.DeclaringType, includeNamespace: false));
			string value = stringBuilder.ToString();
			stringBuilder.Append('.');
			stringBuilder.Append(value);
			stringBuilder.Append('(');
			ParameterInfo[] parameters = ctor.GetParameters();
			for (int i = 0; i < parameters.Length; i++)
			{
				ParameterInfo parameterInfo = parameters[i];
				stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false));
				if (i < parameters.Length - 1)
				{
					stringBuilder.Append(", ");
				}
			}
			stringBuilder.Append(')');
			string text = stringBuilder.ToString();
			highlightedMethods.Add(key, text);
			return text;
		}

		public static string GetMemberInfoColor(MemberInfo memberInfo, out bool isStatic)
		{
			isStatic = false;
			if (memberInfo is FieldInfo fieldInfo)
			{
				if (fieldInfo.IsStatic)
				{
					isStatic = true;
					return "#8d8dc6";
				}
				return "#c266ff";
			}
			if (memberInfo is MethodInfo methodInfo)
			{
				if (methodInfo.IsStatic)
				{
					isStatic = true;
					return "#b55b02";
				}
				return "#ff8000";
			}
			if (memberInfo is PropertyInfo propertyInfo)
			{
				if (propertyInfo.GetAccessors(nonPublic: true)[0].IsStatic)
				{
					isStatic = true;
					return "#588075";
				}
				return "#55a38e";
			}
			if (memberInfo is ConstructorInfo)
			{
				isStatic = true;
				return "#2df7b2";
			}
			throw new NotImplementedException(memberInfo.GetType().Name + " is not supported");
		}
	}
	public static class ToStringUtility
	{
		internal static Dictionary<string, MethodInfo> toStringMethods = new Dictionary<string, MethodInfo>();

		private const string nullString = "<color=grey>null</color>";

		private const string nullUnknown = "<color=grey>null</color> (?)";

		private const string destroyedString = "<color=red>Destroyed</color>";

		private const string untitledString = "<i><color=grey>untitled</color></i>";

		private const string eventSystemNamespace = "UnityEngine.EventSystem";

		public static string PruneString(string s, int chars = 200, int lines = 5)
		{
			if (string.IsNullOrEmpty(s))
			{
				return s;
			}
			StringBuilder stringBuilder = new StringBuilder(Math.Max(chars, s.Length));
			int num = 0;
			for (int i = 0; i < s.Length; i++)
			{
				if (num >= lines || i >= chars)
				{
					stringBuilder.Append("...");
					break;
				}
				char c = s[i];
				if (c == '\r' || c == '\n')
				{
					num++;
				}
				stringBuilder.Append(c);
			}
			return stringBuilder.ToString();
		}

		public static string ToStringWithType(object value, Type fallbackType, bool includeNamespace = true)
		{
			if (value.IsNullOrDestroyed() && (object)fallbackType == null)
			{
				return "<color=grey>null</color> (?)";
			}
			Type type = value?.GetActualType() ?? fallbackType;
			string text = SignatureHighlighter.Parse(type, includeNamespace);
			StringBuilder stringBuilder = new StringBuilder();
			if (value.IsNullOrDestroyed())
			{
				if (value == null)
				{
					stringBuilder.Append("<color=grey>null</color>");
					AppendRichType(stringBuilder, text);
					return stringBuilder.ToString();
				}
				stringBuilder.Append("<color=red>Destroyed</color>");
				AppendRichType(stringBuilder, text);
				return stringBuilder.ToString();
			}
			Object val = (Object)((value is Object) ? value : null);
			if (val != null)
			{
				if (string.IsNullOrEmpty(val.name))
				{
					stringBuilder.Append("<i><color=grey>untitled</color></i>");
				}
				else
				{
					stringBuilder.Append('"');
					stringBuilder.Append(PruneString(val.name, 50, 1));
					stringBuilder.Append('"');
				}
				AppendRichType(stringBuilder, text);
			}
			else if (type.FullName.StartsWith("UnityEngine.EventSystem"))
			{
				stringBuilder.Append(text);
			}
			else
			{
				string text2 = ToString(value);
				if (type.IsGenericType || text2 == type.FullName || text2 == type.FullName + " " + type.FullName || text2 == "Il2Cpp" + type.FullName || type.FullName == "Il2Cpp" + text2)
				{
					stringBuilder.Append(text);
				}
				else
				{
					stringBuilder.Append(PruneString(text2));
					AppendRichType(stringBuilder, text);
				}
			}
			return stringBuilder.ToString();
		}

		private static void AppendRichType(StringBuilder sb, string richType)
		{
			sb.Append(' ');
			sb.Append('(');
			sb.Append(richType);
			sb.Append(')');
		}

		private static string ToString(object value)
		{
			if (value.IsNullOrDestroyed())
			{
				if (value == null)
				{
					return "<color=grey>null</color>";
				}
				return "<color=red>Destroyed</color>";
			}
			Type actualType = value.GetActualType();
			if (!toStringMethods.ContainsKey(actualType.AssemblyQualifiedName))
			{
				MethodInfo method = actualType.GetMethod("ToString", ArgumentUtility.EmptyTypes);
				toStringMethods.Add(actualType.AssemblyQualifiedName, method);
			}
			value = value.TryCast(actualType);
			string theString;
			try
			{
				theString = (string)toStringMethods[actualType.AssemblyQualifiedName].Invoke(value, ArgumentUtility.EmptyArgs);
			}
			catch (Exception e)
			{
				theString = e.ReflectionExToString();
			}
			return ReflectionUtility.ProcessTypeInString(actualType, theString);
		}
	}
	public static class UnityHelpers
	{
		private static PropertyInfo onEndEdit;

		public static bool OccuredEarlierThanDefault(this float time)
		{
			return Time.realtimeSinceStartup - 0.01f >= time;
		}

		public static bool OccuredEarlierThan(this float time, float secondsAgo)
		{
			return Time.realtimeSinceStartup - secondsAgo >= time;
		}

		public static bool IsNullOrDestroyed(this object obj, bool suppressWarning = true)
		{
			try
			{
				if (obj == null)
				{
					if (!suppressWarning)
					{
						Universe.LogWarning("The target instance is null!");
					}
					return true;
				}
				Object val = (Object)((obj is Object) ? obj : null);
				if (val != null && !Object.op_Implicit(val))
				{
					if (!suppressWarning)
					{
						Universe.LogWarning("The target UnityEngine.Object was destroyed!");
					}
					return true;
				}
				return false;
			}
			catch
			{
				return true;
			}
		}

		public static string GetTransformPath(this Transform transform, bool includeSelf = false)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (includeSelf)
			{
				stringBuilder.Append(((Object)transform).name);
			}
			while (Object.op_Implicit((Object)(object)transform.parent))
			{
				transform = transform.parent;
				stringBuilder.Insert(0, '/');
				stringBuilder.Insert(0, ((Object)transform).name);
			}
			return stringBuilder.ToString();
		}

		public static string ToHex(this Color color)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			byte b = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255);
			byte b2 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255);
			byte b3 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255);
			return $"{b:X2}{b2:X2}{b3:X2}";
		}

		public static Color ToColor(this string _string)
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			_string = _string.Replace("#", "");
			if (_string.Length != 6)
			{
				return Color.magenta;
			}
			byte b = byte.Parse(_string.Substring(0, 2), NumberStyles.HexNumber);
			byte b2 = byte.Parse(_string.Substring(2, 2), NumberStyles.HexNumber);
			byte b3 = byte.Parse(_string.Substring(4, 2), NumberStyles.HexNumber);
			Color result = default(Color);
			result.r = (float)((decimal)b / 255m);
			result.g = (float)((decimal)b2 / 255m);
			result.b = (float)((decimal)b3 / 255m);
			result.a = 1f;
			return result;
		}

		public static UnityEvent<string> GetOnEndEdit(this InputField _this)
		{
			if ((object)onEndEdit == null)
			{
				onEndEdit = AccessTools.Property(typeof(InputField), "onEndEdit") ?? throw new Exception("Could not get InputField.onEndEdit property!");
			}
			return onEndEdit.GetValue(_this, null).TryCast<UnityEvent<string>>();
		}
	}
}
namespace UniverseLib.UI
{
	public class UIBase
	{
		internal static readonly int TOP_SORTORDER = 30000;

		public string ID { get; }

		public GameObject RootObject { get; }

		public RectTransform RootRect { get; }

		public Canvas Canvas { get; }

		public Action UpdateMethod { get; }

		public PanelManager Panels { get; }

		public bool Enabled
		{
			get
			{
				return Object.op_Implicit((Object)(object)RootObject) && RootObject.activeSelf;
			}
			set
			{
				UniversalUI.SetUIActive(ID, value);
			}
		}

		public UIBase(string id, Action updateMethod)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			if (string.IsNullOrEmpty(id))
			{
				throw new ArgumentException("Cannot register a UI with a null or empty id!");
			}
			if (UniversalUI.registeredUIs.ContainsKey(id))
			{
				throw new ArgumentException("A UI with the id '" + id + "' is already registered!");
			}
			ID = id;
			UpdateMethod = updateMethod;
			RootObject = UIFactory.CreateUIObject(id + "_Root", UniversalUI.CanvasRoot);
			RootObject.SetActive(false);
			RootRect = RootObject.GetComponent<RectTransform>();
			Canvas = RootObject.AddComponent<Canvas>();
			Canvas.renderMode = (RenderMode)1;
			Canvas.referencePixelsPerUnit = 100f;
			Canvas.sortingOrder = TOP_SORTORDER;
			Canvas.overrideSorting = true;
			CanvasScaler val = RootObject.AddComponent<CanvasScaler>();
			val.referenceResolution = new Vector2(1920f, 1080f);
			val.screenMatchMode = (ScreenMatchMode)1;
			RootObject.AddComponent<GraphicRaycaster>();
			RectTransform component = RootObject.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.pivot = new Vector2(0.5f, 0.5f);
			Panels = CreatePanelManager();
			RootObject.SetActive(true);
			UniversalUI.registeredUIs.Add(id, this);
			UniversalUI.uiBases.Add(this);
		}

		protected virtual PanelManager CreatePanelManager()
		{
			return new PanelManager(this);
		}

		public void SetOnTop()
		{
			RootObject.transform.SetAsLastSibling();
			foreach (UIBase uiBasis in UniversalUI.uiBases)
			{
				int num = UniversalUI.CanvasRoot.transform.childCount - ((Transform)uiBasis.RootRect).GetSiblingIndex();
				uiBasis.Canvas.sortingOrder = TOP_SORTORDER - num;
			}
			UniversalUI.uiBases.Sort((UIBase a, UIBase b) => b.RootObject.transform.GetSiblingIndex().CompareTo(a.RootObject.transform.GetSiblingIndex()));
		}

		internal void Update()
		{
			try
			{
				Panels.Update();
				UpdateMethod?.Invoke();
			}
			catch (Exception arg)
			{
				Universe.LogWarning($"Exception invoking update method for {ID}: {arg}");
			}
		}
	}
	public static class UIFactory
	{
		internal static Vector2 largeElementSize = new Vector2(100f, 30f);

		internal static Vector2 smallElementSize = new Vector2(25f, 25f);

		internal static Color defaultTextColor = Color.white;

		public static GameObject CreateUIObject(string name, GameObject parent, Vector2 sizeDelta = default(Vector2))
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name)
			{
				layer = 5,
				hideFlags = (HideFlags)61
			};
			if (Object.op_Implicit((Object)(object)parent))
			{
				val.transform.SetParent(parent.transform, false);
			}
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = sizeDelta;
			return val;
		}

		internal static void SetDefaultTextValues(Text text)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)text).color = defaultTextColor;
			text.font = UniversalUI.DefaultFont;
			text.fontSize = 14;
		}

		internal static void SetDefaultSelectableValues(Selectable selectable)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			Navigation navigation = selectable.navigation;
			((Navigation)(ref navigation)).mode = (Mode)4;
			selectable.navigation = navigation;
			RuntimeHelper.Instance.Internal_SetColorBlock(selectable, (Color?)new Color(0.2f, 0.2f, 0.2f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)new Color(0.15f, 0.15f, 0.15f), (Color?)null);
		}

		public static LayoutElement SetLayoutElement(GameObject gameObject, int? minWidth = null, int? minHeight = null, int? flexibleWidth = null, int? flexibleHeight = null, int? preferredWidth = null, int? preferredHeight = null, bool? ignoreLayout = null)
		{
			LayoutElement val = gameObject.GetComponent<LayoutElement>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<LayoutElement>();
			}
			if (minWidth.HasValue)
			{
				val.minWidth = minWidth.Value;
			}
			if (minHeight.HasValue)
			{
				val.minHeight = minHeight.Value;
			}
			if (flexibleWidth.HasValue)
			{
				val.flexibleWidth = flexibleWidth.Value;
			}
			if (flexibleHeight.HasValue)
			{
				val.flexibleHeight = flexibleHeight.Value;
			}
			if (preferredWidth.HasValue)
			{
				val.preferredWidth = preferredWidth.Value;
			}
			if (preferredHeight.HasValue)
			{
				val.preferredHeight = preferredHeight.Value;
			}
			if (ignoreLayout.HasValue)
			{
				val.ignoreLayout = ignoreLayout.Value;
			}
			return val;
		}

		public static T SetLayoutGroup<T>(GameObject gameObject, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			T val = gameObject.GetComponent<T>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<T>();
			}
			return SetLayoutGroup(val, forceWidth, forceHeight, childControlWidth, childControlHeight, spacing, padTop, padBottom, padLeft, padRight, childAlignment);
		}

		public static T SetLayoutGroup<T>(T group, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			if (forceWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandWidth = forceWidth.Value;
			}
			if (forceHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandHeight = forceHeight.Value;
			}
			if (childControlWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlWidth(childControlWidth.Value);
			}
			if (childControlHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlHeight(childControlHeight.Value);
			}
			if (spacing.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).spacing = spacing.Value;
			}
			if (padTop.HasValue)
			{
				((LayoutGroup)(object)group).padding.top = padTop.Value;
			}
			if (padBottom.HasValue)
			{
				((LayoutGroup)(object)group).padding.bottom = padBottom.Value;
			}
			if (padLeft.HasValue)
			{
				((LayoutGroup)(object)group).padding.left = padLeft.Value;
			}
			if (padRight.HasValue)
			{
				((LayoutGroup)(object)group).padding.right = padRight.Value;
			}
			if (childAlignment.HasValue)
			{
				((LayoutGroup)(object)group).childAlignment = childAlignment.Value;
			}
			return group;
		}

		public static GameObject CreatePanel(string name, GameObject parent, out GameObject contentHolder, Color? bgColor = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)1, (int?)1, (int?)1, (int?)1, (TextAnchor?)null);
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.anchoredPosition = Vector2.zero;
			component.sizeDelta = Vector2.zero;
			((Graphic)val.AddComponent<Image>()).color = Color.black;
			val.AddComponent<RectMask2D>();
			contentHolder = CreateUIObject("Content", val);
			Image val2 = contentHolder.AddComponent<Image>();
			val2.type = (Type)3;
			((Graphic)val2).color = (Color)((!bgColor.HasValue) ? new Color(0.07f, 0.07f, 0.07f) : bgColor.Value);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(contentHolder, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)3, (int?)3, (int?)3, (int?)3, (int?)3, (TextAnchor?)null);
			return val;
		}

		public static GameObject CreateVerticalGroup(GameObject parent, string name, bool forceWidth, bool forceHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)forceWidth, (bool?)forceHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static GameObject CreateHorizontalGroup(GameObject parent, string name, bool forceExpandWidth, bool forceExpandHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)forceExpandWidth, (bool?)forceExpandHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static GameObject CreateGridGroup(GameObject parent, string name, Vector2 cellSize, Vector2 spacing, Color bgColor = default(Color))
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			GridLayoutGroup val2 = val.AddComponent<GridLayoutGroup>();
			((LayoutGroup)val2).childAlignment = (TextAnchor)0;
			val2.cellSize = cellSize;
			val2.spacing = spacing;
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static Text CreateLabel(GameObject parent, string name, string defaultText, TextAnchor alignment = 3, Color color = default(Color), bool supportRichText = true, int fontSize = 14)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			Text val2 = val.AddComponent<Text>();
			SetDefaultTextValues(val2);
			val2.text = defaultText;
			((Graphic)val2).color = ((color == default(Color)) ? defaultTextColor : color);
			val2.supportRichText = supportRichText;
			val2.alignment = alignment;
			val2.fontSize = fontSize;
			return val2;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, Color? normalColor = null)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			Color valueOrDefault = normalColor.GetValueOrDefault();
			if (!normalColor.HasValue)
			{
				((Color)(ref valueOrDefault))..ctor(0.25f, 0.25f, 0.25f);
				normalColor = valueOrDefault;
			}
			ButtonRef buttonRef = CreateButton(parent, name, text, default(ColorBlock));
			RuntimeHelper instance = RuntimeHelper.Instance;
			Button component = buttonRef.Component;
			Color? normal = normalColor;
			Color? val = normalColor;
			float num = 1.2f;
			Color? highlighted = (val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null);
			val = normalColor;
			num = 0.7f;
			instance.Internal_SetColorBlock((Selectable)(object)component, normal, highlighted, val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null);
			return buttonRef;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, ColorBlock colors)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Text", val);
			Image val3 = val.AddComponent<Image>();
			val3.type = (Type)1;
			((Graphic)val3).color = new Color(1f, 1f, 1f, 1f);
			Button val4 = val.AddComponent<Button>();
			SetDefaultSelectableValues((Selectable)(object)val4);
			((ColorBlock)(ref colors)).colorMultiplier = 1f;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val4, colors);
			Text val5 = val2.AddComponent<Text>();
			val5.text = text;
			SetDefaultTextValues(val5);
			val5.alignment = (TextAnchor)4;
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			SetButtonDeselectListener(val4);
			return new ButtonRef(val4);
		}

		internal static void SetButtonDeselectListener(Button button)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			((UnityEvent)button.onClick).AddListener((UnityAction)delegate
			{
				((Selectable)button).OnDeselect((BaseEventData)null);
			});
		}

		public static GameObject CreateSlider(GameObject parent, string name, out Slider slider)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Background", val);
			GameObject val3 = CreateUIObject("Fill Area", val);
			GameObject val4 = CreateUIObject("Fill", val3);
			GameObject val5 = CreateUIObject("Handle Slide Area", val);
			GameObject val6 = CreateUIObject("Handle", val5);
			Image val7 = val2.AddComponent<Image>();
			val7.type = (Type)1;
			((Graphic)val7).color = new Color(0.15f, 0.15f, 0.15f, 1f);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0.25f);
			component.anchorMax = new Vector2(1f, 0.75f);
			component.sizeDelta = new Vector2(0f, 0f);
			RectTransform component2 = val3.GetComponent<RectTransform>();
			component2.anchorMin = new Vector2(0f, 0.25f);
			component2.anchorMax = new Vector2(1f, 0.75f);
			component2.anchoredPosition = new Vector2(-5f, 0f);
			component2.sizeDelta = new Vector2(-20f, 0f);
			Image val8 = val4.AddComponent<Image>();
			val8.type = (Type)1;
			((Graphic)val8).color = new Color(0.3f, 0.3f, 0.3f, 1f);
			val4.GetComponent<RectTransform>().sizeDelta = new Vector2(10f, 0f);
			RectTransform component3 = val5.GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(-20f, 0f);
			component3.anchorMin = new Vector2(0f, 0f);
			component3.anchorMax = new Vector2(1f, 1f);
			Image val9 = val6.AddComponent<Image>();
			((Graphic)val9).color = new Color(0.5f, 0.5f, 0.5f, 1f);
			val6.GetComponent<RectTransform>().sizeDelta = new Vector2(20f, 0f);
			slider = val.AddComponent<Slider>();
			slider.fillRect = val4.GetComponent<RectTransform>();
			slider.handleRect = val6.GetComponent<RectTransform>();
			((Selectable)slider).targetGraphic = (Graphic)(object)val9;
			slider.direction = (Direction)0;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)slider, (Color?)new Color(0.4f, 0.4f, 0.4f), (Color?)new Color(0.55f, 0.55f, 0.55f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)null);
			return val;
		}

		public static GameObject CreateScrollbar(GameObject parent, string name, out Scrollbar scrollbar)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Sliding Area", val);
			GameObject val3 = CreateUIObject("Handle", val2);
			Image val4 = val.AddComponent<Image>();
			val4.type = (Type)1;
			((Graphic)val4).color = new Color(0.1f, 0.1f, 0.1f);
			Image val5 = val3.AddComponent<Image>();
			val5.type = (Type)1;
			((Graphic)val5).color = new Color(0.4f, 0.4f, 0.4f);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(-20f, -20f);
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			RectTransform component2 = val3.GetComponent<RectTransform>();
			component2.sizeDelta = new Vector2(20f, 20f);
			scrollbar = val.AddComponent<Scrollbar>();
			scrollbar.handleRect = component2;
			((Selectable)scrollbar).targetGraphic = (Graphic)(object)val5;
			SetDefaultSelectableValues((Selectable)(object)scrollbar);
			return val;
		}

		public static GameObject CreateToggle(GameObject parent, string name, out Toggle toggle, out Text text, Color bgColor = default(Color), int checkWidth = 20, int checkHeight = 20)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)(TextAnchor)3);
			toggle = val.AddComponent<Toggle>();
			toggle.isOn = true;
			SetDefaultSelectableValues((Selectable)(object)toggle);
			Toggle t2 = toggle;
			((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)delegate
			{
				((Selectable)t2).OnDeselect((BaseEventData)null);
			});
			GameObject val2 = CreateUIObject("Background", val);
			Image val3 = val2.AddComponent<Image>();
			((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.04f, 0.04f, 0.04f, 0.75f) : bgColor);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)2, (int?)2, (int?)2, (int?)2, (TextAnchor?)null);
			SetLayoutElement(val2, checkWidth, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			GameObject val4 = CreateUIObject("Checkmark", val2);
			Image val5 = val4.AddComponent<Image>();
			((Graphic)val5).color = new Color(0.8f, 1f, 0.8f, 0.3f);
			GameObject val6 = CreateUIObject("Label", val);
			text = val6.AddComponent<Text>();
			text.text = "";
			text.alignment = (TextAnchor)3;
			SetDefaultTextValues(text);
			SetLayoutElement(val6, 0, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			toggle.graphic = (Graphic)(object)val5;
			((Selectable)toggle).targetGraphic = (Graphic)(object)val3;
			return val;
		}

		public static InputFieldRef CreateInputField(GameObject parent, string name, string placeHolderText)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			Image val2 = val.AddComponent<Image>();
			val2.type = (Type)1;
			((Graphic)val2).color = new Color(0f, 0f, 0f, 0.5f);
			InputField val3 = val.AddComponent<InputField>();
			Navigation navigation = ((Selectable)val3).navigation;
			((Navigation)(ref navigation)).mode = (Mode)0;
			((Selectable)val3).navigation = navigation;
			val3.lineType = (LineType)0;
			((Selectable)val3).interactable = true;
			((Selectable)val3).transition = (Transition)1;
			((Selectable)val3).targetGraphic = (Graphic)(object)val2;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val3, (Color?)new Color(1f, 1f, 1f, 1f), (Color?)new Color(0.95f, 0.95f, 0.95f, 1f), (Color?)new Color(0.78f, 0.78f, 0.78f, 1f), (Color?)null);
			GameObject val4 = CreateUIObject("TextArea", val);
			val4.AddComponent<RectMask2D>();
			RectTransform component = val4.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.offsetMin = Vector2.zero;
			component.offsetMax = Vector2.zero;
			GameObject val5 = CreateUIObject("Placeholder", val4);
			Text val6 = val5.AddComponent<Text>();
			SetDefaultTextValues(val6);
			val6.text = placeHolderText ?? "...";
			((Graphic)val6).color = new Color(0.5f, 0.5f, 0.5f, 1f);
			val6.horizontalOverflow = (HorizontalWrapMode)0;
			val6.alignment = (TextAnchor)3;
			val6.fontSize = 14;
			RectTransform component2 = val5.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			component2.offsetMin = Vector2.zero;
			component2.offsetMax = Vector2.zero;
			val3.placeholder = (Graphic)(object)val6;
			GameObject val7 = CreateUIObject("Text", val4);
			Text val8 = val7.AddComponent<Text>();
			SetDefaultTextValues(val8);
			val8.text = "";
			((Graphic)val8).color = new Color(1f, 1f, 1f, 1f);
			val8.horizontalOverflow = (HorizontalWrapMode)0;
			val8.alignment = (TextAnchor)3;
			val8.fontSize = 14;
			RectTransform component3 = val7.GetComponent<RectTransform>();
			component3.anchorMin = Vector2.zero;
			component3.anchorMax = Vector2.one;
			component3.offsetMin = Vector2.zero;
			component3.offsetMax = Vector2.zero;
			val3.textComponent = val8;
			val3.characterLimit = 16000;
			return new InputFieldRef(val3);
		}

		public static GameObject CreateDropdown(GameObject parent, string name, out Dropdown dropdown, string defaultItemText, int itemFontSize, Action<int> onValueChanged, string[] defaultOptions = null)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or m