Decompiled source of UnityExplorer v4.9.9

UnityExplorer.BIE5.Mono.dll

Decompiled 6 months ago
using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Diagnostics.SymbolStore;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Xml;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Mono.CSharp;
using Mono.CSharp.IL2CPP;
using Mono.CSharp.Linq;
using Mono.CSharp.Nullable;
using Mono.CSharp.yyParser;
using Mono.CSharp.yydebug;
using Mono.CompilerServices.SymbolWriter;
using MonoMod.RuntimeDetour;
using Tomlet;
using Tomlet.Attributes;
using Tomlet.Exceptions;
using Tomlet.Models;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityExplorer.CSConsole;
using UnityExplorer.CSConsole.Lexers;
using UnityExplorer.CacheObject;
using UnityExplorer.CacheObject.IValues;
using UnityExplorer.CacheObject.Views;
using UnityExplorer.Config;
using UnityExplorer.Hooks;
using UnityExplorer.Inspectors;
using UnityExplorer.Inspectors.MouseInspectors;
using UnityExplorer.Loader.BIE;
using UnityExplorer.ObjectExplorer;
using UnityExplorer.Runtime;
using UnityExplorer.UI;
using UnityExplorer.UI.Panels;
using UnityExplorer.UI.Widgets;
using UnityExplorer.UI.Widgets.AutoComplete;
using UniverseLib;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Runtime;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.ObjectPool;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.UI.Widgets.ButtonList;
using UniverseLib.UI.Widgets.ScrollView;
using UniverseLib.Utility;

[assembly: AssemblyCopyright("")]
[assembly: AssemblyProduct("UnityExplorer")]
[assembly: AssemblyCompany("Sinai")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyFileVersion("4.9.0")]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: ComVisible(false)]
[assembly: AssemblyDescription("")]
[assembly: AssemblyTitle("UnityExplorer")]
[assembly: AssemblyConfiguration("")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: CompilationRelaxations(8)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("4.9.0.0")]
[module: UnverifiableCode]
namespace UnityExplorer
{
	public class ExplorerBehaviour : MonoBehaviour
	{
		internal bool quitting;

		internal static ExplorerBehaviour 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
			GameObject val = new GameObject("ExplorerBehaviour");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)61;
			Instance = val.AddComponent<ExplorerBehaviour>();
		}

		internal void Update()
		{
			ExplorerCore.Update();
		}

		internal void OnDestroy()
		{
			OnApplicationQuit();
		}

		internal void OnApplicationQuit()
		{
			if (!quitting)
			{
				quitting = true;
				GameObject uIRoot = UIManager.UIRoot;
				TryDestroy((uIRoot != null) ? ((Component)uIRoot.transform.root).gameObject : null);
				object? value = typeof(Universe).Assembly.GetType("UniverseLib.UniversalBehaviour").GetProperty("Instance", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null);
				TryDestroy(((Component)((value is Component) ? value : null)).gameObject);
				TryDestroy(((Component)this).gameObject);
			}
		}

		internal void TryDestroy(GameObject obj)
		{
			try
			{
				if (Object.op_Implicit((Object)(object)obj))
				{
					Object.Destroy((Object)(object)obj);
				}
			}
			catch
			{
			}
		}
	}
	public static class ExplorerCore
	{
		public const string NAME = "UnityExplorer";

		public const string VERSION = "4.9.0";

		public const string AUTHOR = "Sinai";

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

		public const string DEFAULT_EXPLORER_FOLDER_NAME = "sinai-dev-UnityExplorer";

		public static IExplorerLoader Loader { get; private set; }

		public static string ExplorerFolder => Path.Combine(Loader.ExplorerFolderDestination, Loader.ExplorerFolderName);

		public static Harmony Harmony { get; } = new Harmony("com.sinai.unityexplorer");


		public static void Init(IExplorerLoader loader)
		{
			//IL_006f: 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)
			if (Loader != null)
			{
				throw new Exception("UnityExplorer is already loaded.");
			}
			Loader = loader;
			Log("UnityExplorer 4.9.0 initializing...");
			CheckLegacyExplorerFolder();
			Directory.CreateDirectory(ExplorerFolder);
			ConfigManager.Init(Loader.ConfigHandler);
			Universe.Init(ConfigManager.Startup_Delay_Time.Value, (Action)LateInit, (Action<string, LogType>)Log, new UniverseLibConfig
			{
				Disable_EventSystem_Override = ConfigManager.Disable_EventSystem_Override.Value,
				Force_Unlock_Mouse = ConfigManager.Force_Unlock_Mouse.Value,
				Unhollowed_Modules_Folder = loader.UnhollowedModulesFolder
			});
			UERuntimeHelper.Init();
			ExplorerBehaviour.Setup();
			UnityCrashPrevention.Init();
		}

		private static void LateInit()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			SceneHandler.Init();
			Log("Creating UI...");
			UIManager.InitUI();
			Log(string.Format("{0} {1} ({2}) initialized.", "UnityExplorer", "4.9.0", Universe.Context));
		}

		internal static void Update()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			if (InputManager.GetKeyDown(ConfigManager.Master_Toggle.Value))
			{
				UIManager.ShowMenu = !UIManager.ShowMenu;
			}
		}

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

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

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

		public static void LogUnity(object message, LogType logType)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			if (ConfigManager.Log_Unity_Debug.Value)
			{
				Log($"[Unity] {message}", logType);
			}
		}

		private static void Log(object message, LogType logType)
		{
			//IL_0018: 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_0020: 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_0022: 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)
			//IL_003d: Expected I4, but got Unknown
			string text = message?.ToString() ?? "";
			LogPanel.Log(text, logType);
			switch ((int)logType)
			{
			case 1:
			case 3:
				Loader.OnLogMessage(text);
				break;
			case 2:
				Loader.OnLogWarning(text);
				break;
			case 0:
			case 4:
				Loader.OnLogError(text);
				break;
			}
		}

		private static void CheckLegacyExplorerFolder()
		{
			string text = Path.Combine(Loader.ExplorerFolderDestination, "UnityExplorer");
			if (!Directory.Exists(text))
			{
				return;
			}
			LogWarning("Attempting to migrate old 'UnityExplorer/' folder to 'sinai-dev-UnityExplorer/'...");
			if (!Directory.Exists(ExplorerFolder))
			{
				try
				{
					Directory.Move(text, ExplorerFolder);
					Log("Migrated successfully.");
					return;
				}
				catch (Exception arg)
				{
					LogWarning($"Exception migrating folder: {arg}");
					return;
				}
			}
			try
			{
				CopyAll(new DirectoryInfo(text), new DirectoryInfo(ExplorerFolder));
				Directory.Delete(text, recursive: true);
				Log("Migrated successfully.");
			}
			catch (Exception arg2)
			{
				LogWarning($"Exception migrating folder: {arg2}");
			}
		}

		public static void CopyAll(DirectoryInfo source, DirectoryInfo target)
		{
			Directory.CreateDirectory(target.FullName);
			FileInfo[] files = source.GetFiles();
			foreach (FileInfo fileInfo in files)
			{
				fileInfo.MoveTo(Path.Combine(target.ToString(), fileInfo.Name));
			}
			DirectoryInfo[] directories = source.GetDirectories();
			foreach (DirectoryInfo directoryInfo in directories)
			{
				DirectoryInfo target2 = target.CreateSubdirectory(directoryInfo.Name);
				CopyAll(directoryInfo, target2);
			}
		}
	}
	public static class InspectorManager
	{
		public static readonly List<InspectorBase> Inspectors = new List<InspectorBase>();

		private static InspectorBase lastActiveInspector;

		public static float PanelWidth;

		public static InspectorBase ActiveInspector { get; private set; }

		public static event Action OnInspectedTabsChanged;

		public static void Inspect(object obj, CacheObjectBase parent = null)
		{
			if (UnityHelpers.IsNullOrDestroyed(obj, true))
			{
				return;
			}
			obj = ReflectionExtensions.TryCast(obj);
			if (!TryFocusActiveInspector(obj))
			{
				if (obj is GameObject)
				{
					CreateInspector<GameObjectInspector>(obj);
				}
				else
				{
					CreateInspector<ReflectionInspector>(obj, staticReflection: false, parent);
				}
			}
		}

		public static void Inspect(Type type)
		{
			if (!TryFocusActiveInspector(type))
			{
				CreateInspector<ReflectionInspector>(type, staticReflection: true);
			}
		}

		private static bool TryFocusActiveInspector(object target)
		{
			foreach (InspectorBase inspector in Inspectors)
			{
				bool flag = false;
				if (target is Type type)
				{
					if (inspector.TargetType.FullName == type.FullName)
					{
						flag = true;
					}
				}
				else if (ReflectionExtensions.ReferenceEqual(inspector.Target, target))
				{
					flag = true;
				}
				if (flag)
				{
					UIManager.SetPanelActive(UIManager.Panels.Inspector, active: true);
					SetInspectorActive(inspector);
					return true;
				}
			}
			return false;
		}

		public static void SetInspectorActive(InspectorBase inspector)
		{
			UnsetActiveInspector();
			ActiveInspector = inspector;
			inspector.OnSetActive();
		}

		public static void UnsetActiveInspector()
		{
			if (ActiveInspector != null)
			{
				lastActiveInspector = ActiveInspector;
				ActiveInspector.OnSetInactive();
				ActiveInspector = null;
			}
		}

		public static void CloseAllTabs()
		{
			if (Inspectors.Any())
			{
				for (int num = Inspectors.Count - 1; num >= 0; num--)
				{
					Inspectors[num].CloseInspector();
				}
				Inspectors.Clear();
			}
			UIManager.SetPanelActive(UIManager.Panels.Inspector, active: false);
		}

		private static void CreateInspector<T>(object target, bool staticReflection = false, CacheObjectBase parent = null) where T : InspectorBase
		{
			T val = Pool<T>.Borrow();
			Inspectors.Add(val);
			val.Target = target;
			if (parent != null && parent.CanWrite && target.GetType().IsValueType && val is ReflectionInspector reflectionInspector)
			{
				reflectionInspector.ParentCacheObject = parent;
			}
			UIManager.SetPanelActive(UIManager.Panels.Inspector, active: true);
			val.UIRoot.transform.SetParent(InspectorPanel.Instance.ContentHolder.transform, false);
			if (val is ReflectionInspector reflectionInspector2)
			{
				reflectionInspector2.StaticOnly = staticReflection;
			}
			val.OnBorrowedFromPool(target);
			SetInspectorActive(val);
			InspectorManager.OnInspectedTabsChanged?.Invoke();
		}

		public static void ReleaseInspector<T>(T inspector) where T : InspectorBase
		{
			if (lastActiveInspector == inspector)
			{
				lastActiveInspector = null;
			}
			bool flag = ActiveInspector == inspector;
			int num = Inspectors.IndexOf(inspector);
			Inspectors.Remove(inspector);
			inspector.OnReturnToPool();
			Pool<T>.Return(inspector);
			if (flag)
			{
				ActiveInspector = null;
				if (lastActiveInspector != null)
				{
					SetInspectorActive(lastActiveInspector);
					lastActiveInspector = null;
				}
				else if (Inspectors.Any())
				{
					int index = Math.Min(Inspectors.Count - 1, Math.Max(0, num - 1));
					SetInspectorActive(Inspectors[index]);
				}
				else
				{
					UIManager.SetPanelActive(UIManager.Panels.Inspector, active: false);
				}
			}
			InspectorManager.OnInspectedTabsChanged?.Invoke();
		}

		internal static void Update()
		{
			for (int num = Inspectors.Count - 1; num >= 0; num--)
			{
				Inspectors[num].Update();
			}
		}

		internal static void OnPanelResized(float width)
		{
			PanelWidth = width;
			foreach (InspectorBase inspector in Inspectors)
			{
				if (inspector is ReflectionInspector reflectionInspector)
				{
					reflectionInspector.SetLayouts();
				}
			}
		}
	}
	[BepInPlugin("com.sinai.unityexplorer", "UnityExplorer", "4.9.0")]
	public class ExplorerBepInPlugin : BaseUnityPlugin, IExplorerLoader
	{
		public static ExplorerBepInPlugin Instance;

		private const string IL2CPP_LIBS_FOLDER = "interop";

		private BepInExConfigHandler _configHandler;

		private static readonly Harmony s_harmony = new Harmony("com.sinai.unityexplorer");

		public ManualLogSource LogSource => ((BaseUnityPlugin)this).Logger;

		public string UnhollowedModulesFolder => Path.Combine(Paths.BepInExRootPath, "interop");

		public ConfigHandler ConfigHandler => _configHandler;

		public Harmony HarmonyInstance => s_harmony;

		public string ExplorerFolderName => "sinai-dev-UnityExplorer";

		public string ExplorerFolderDestination => Paths.PluginPath;

		public Action<object> OnLogMessage => LogSource.LogMessage;

		public Action<object> OnLogWarning => LogSource.LogWarning;

		public Action<object> OnLogError => LogSource.LogError;

		private void Init()
		{
			Instance = this;
			_configHandler = new BepInExConfigHandler();
			ExplorerCore.Init(this);
		}

		internal void Awake()
		{
			Init();
		}
	}
	public interface IExplorerLoader
	{
		string ExplorerFolderDestination { get; }

		string ExplorerFolderName { get; }

		string UnhollowedModulesFolder { get; }

		ConfigHandler ConfigHandler { get; }

		Action<object> OnLogMessage { get; }

		Action<object> OnLogWarning { get; }

		Action<object> OnLogError { get; }
	}
}
namespace UnityExplorer.UI
{
	public static class DisplayManager
	{
		private static Camera canvasCamera;

		public static int ActiveDisplayIndex { get; private set; }

		public static Display ActiveDisplay => Display.displays[ActiveDisplayIndex];

		public static int Width => ActiveDisplay.renderingWidth;

		public static int Height => ActiveDisplay.renderingHeight;

		public static Vector3 MousePosition => Application.isEditor ? InputManager.MousePosition : Display.RelativeMouseAt(InputManager.MousePosition);

		public static bool MouseInTargetDisplay => MousePosition.z == (float)ActiveDisplayIndex;

		internal static void Init()
		{
			SetDisplay(ConfigManager.Target_Display.Value);
			ConfigElement<int> target_Display = ConfigManager.Target_Display;
			target_Display.OnValueChanged = (Action<int>)System.Delegate.Combine(target_Display.OnValueChanged, new Action<int>(SetDisplay));
		}

		public static void SetDisplay(int display)
		{
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			if (ActiveDisplayIndex == display)
			{
				return;
			}
			if (Display.displays.Length <= display)
			{
				ExplorerCore.LogWarning($"Cannot set display index to {display} as there are not enough monitors connected!");
				if (ConfigManager.Target_Display.Value == display)
				{
					ConfigManager.Target_Display.Value = 0;
				}
				return;
			}
			ActiveDisplayIndex = display;
			ActiveDisplay.Activate();
			UIManager.UICanvas.targetDisplay = display;
			if (!Object.op_Implicit((Object)(object)Camera.main) || Camera.main.targetDisplay != display)
			{
				if (!Object.op_Implicit((Object)(object)canvasCamera))
				{
					canvasCamera = new GameObject("UnityExplorer_CanvasCamera").AddComponent<Camera>();
					Object.DontDestroyOnLoad((Object)(object)((Component)canvasCamera).gameObject);
					((Object)canvasCamera).hideFlags = (HideFlags)61;
				}
				canvasCamera.targetDisplay = display;
			}
			RuntimeHelper.StartCoroutine(FixPanels());
		}

		private static IEnumerator FixPanels()
		{
			yield return null;
			yield return null;
			foreach (UEPanel panel in UIManager.UIPanels.Values)
			{
				((PanelBase)panel).EnsureValidSize();
				((PanelBase)panel).EnsureValidPosition();
				((PanelBase)panel).Dragger.OnEndResize();
			}
		}
	}
	internal class ExplorerUIBase : UIBase
	{
		public ExplorerUIBase(string id, Action updateMethod)
			: base(id, updateMethod)
		{
		}

		protected override PanelManager CreatePanelManager()
		{
			return (PanelManager)(object)new UEPanelManager((UIBase)(object)this);
		}
	}
	public static class Notification
	{
		private static Text popupLabel;

		private static string _currentNotification;

		private static float _timeOfLastNotification;

		public static void Init()
		{
			ConstructUI();
		}

		public static void ShowMessage(string message)
		{
			//IL_002c: 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_0036: 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)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			popupLabel.text = message;
			_currentNotification = message;
			_timeOfLastNotification = Time.realtimeSinceStartup;
			((Component)popupLabel).transform.localPosition = ((Transform)UIManager.UIRootRect).InverseTransformPoint(DisplayManager.MousePosition) + Vector3.up * 25f;
		}

		public static void Update()
		{
			if (_currentNotification != null && Time.realtimeSinceStartup - _timeOfLastNotification > 2f)
			{
				_currentNotification = null;
				popupLabel.text = "";
			}
		}

		private static void ConstructUI()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: 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)
			popupLabel = UIFactory.CreateLabel(UIManager.UIRoot, "ClipboardNotification", "", (TextAnchor)4, default(Color), true, 14);
			((Graphic)popupLabel).rectTransform.sizeDelta = new Vector2(500f, 100f);
			((Component)popupLabel).gameObject.AddComponent<Outline>();
			CanvasGroup val = ((Component)popupLabel).gameObject.AddComponent<CanvasGroup>();
			val.blocksRaycasts = false;
		}
	}
	public class UEPanelManager : PanelManager
	{
		protected override Vector3 MousePosition => DisplayManager.MousePosition;

		protected override Vector2 ScreenDimensions => new Vector2((float)DisplayManager.Width, (float)DisplayManager.Height);

		protected override bool MouseInTargetDisplay => DisplayManager.MouseInTargetDisplay;

		public UEPanelManager(UIBase owner)
			: base(owner)
		{
		}

		internal void DoInvokeOnPanelsReordered()
		{
			((PanelManager)this).InvokeOnPanelsReordered();
		}

		protected override void SortDraggerHeirarchy()
		{
			((PanelManager)this).SortDraggerHeirarchy();
			if (!UIManager.Initializing && AutoCompleteModal.Instance != null)
			{
				base.draggerInstances.Remove(((PanelBase)AutoCompleteModal.Instance).Dragger);
				base.draggerInstances.Insert(0, ((PanelBase)AutoCompleteModal.Instance).Dragger);
			}
		}
	}
	public static class UIManager
	{
		public enum Panels
		{
			ObjectExplorer,
			Inspector,
			CSConsole,
			Options,
			ConsoleLog,
			AutoCompleter,
			UIInspectorResults,
			HookManager,
			Clipboard,
			Freecam
		}

		public enum VerticalAnchor
		{
			Top,
			Bottom
		}

		public static VerticalAnchor NavbarAnchor = VerticalAnchor.Top;

		internal static readonly Dictionary<Panels, UEPanel> UIPanels = new Dictionary<Panels, UEPanel>();

		public static RectTransform NavBarRect;

		public static GameObject NavbarTabButtonHolder;

		private static readonly Vector2 NAVBAR_DIMENSIONS = new Vector2(1020f, 35f);

		private static ButtonRef closeBtn;

		private static TimeScaleWidget timeScaleWidget;

		private static int lastScreenWidth;

		private static int lastScreenHeight;

		public static bool Initializing { get; internal set; } = true;


		internal static UIBase UiBase { get; private set; }

		public static GameObject UIRoot
		{
			get
			{
				UIBase uiBase = UiBase;
				return (uiBase != null) ? uiBase.RootObject : null;
			}
		}

		public static RectTransform UIRootRect { get; private set; }

		public static Canvas UICanvas { get; private set; }

		public static bool ShowMenu
		{
			get
			{
				return UiBase != null && UiBase.Enabled;
			}
			set
			{
				if (UiBase != null && Object.op_Implicit((Object)(object)UIRoot) && UiBase.Enabled != value)
				{
					UniversalUI.SetUIActive("com.sinai.unityexplorer", value);
					UniversalUI.SetUIActive(MouseInspector.UIBaseGUID, value);
				}
			}
		}

		internal static void InitUI()
		{
			UiBase = (UIBase)(object)UniversalUI.RegisterUI<ExplorerUIBase>("com.sinai.unityexplorer", (Action)Update);
			UIRootRect = UIRoot.GetComponent<RectTransform>();
			UICanvas = UIRoot.GetComponent<Canvas>();
			DisplayManager.Init();
			Display activeDisplay = DisplayManager.ActiveDisplay;
			lastScreenWidth = activeDisplay.renderingWidth;
			lastScreenHeight = activeDisplay.renderingHeight;
			CreateTopNavBar();
			UIPanels.Add(Panels.AutoCompleter, new AutoCompleteModal(UiBase));
			UIPanels.Add(Panels.ObjectExplorer, new ObjectExplorerPanel(UiBase));
			UIPanels.Add(Panels.Inspector, new InspectorPanel(UiBase));
			UIPanels.Add(Panels.CSConsole, new CSConsolePanel(UiBase));
			UIPanels.Add(Panels.HookManager, new HookManagerPanel(UiBase));
			UIPanels.Add(Panels.Freecam, new FreeCamPanel(UiBase));
			UIPanels.Add(Panels.Clipboard, new ClipboardPanel(UiBase));
			UIPanels.Add(Panels.ConsoleLog, new LogPanel(UiBase));
			UIPanels.Add(Panels.Options, new OptionsPanel(UiBase));
			UIPanels.Add(Panels.UIInspectorResults, new MouseInspectorResultsPanel(UiBase));
			MouseInspector.inspectorUIBase = UniversalUI.RegisterUI(MouseInspector.UIBaseGUID, (Action)null);
			new MouseInspector(MouseInspector.inspectorUIBase);
			Notification.Init();
			ConsoleController.Init();
			Dropdown[] componentsInChildren = UIRoot.GetComponentsInChildren<Dropdown>(true);
			foreach (Dropdown val in componentsInChildren)
			{
				val.RefreshShownValue();
			}
			Initializing = false;
			if (ConfigManager.Hide_On_Startup.Value)
			{
				ShowMenu = false;
			}
		}

		public static void Update()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)UIRoot) && !MouseInspector.Instance.TryUpdate())
			{
				Notification.Update();
				if (InputManager.GetKeyDown(ConfigManager.Force_Unlock_Toggle.Value))
				{
					ConfigManager.Force_Unlock_Mouse = !ConfigManager.Force_Unlock_Mouse;
				}
				timeScaleWidget.Update();
				Display activeDisplay = DisplayManager.ActiveDisplay;
				if (activeDisplay.renderingWidth != lastScreenWidth || activeDisplay.renderingHeight != lastScreenHeight)
				{
					OnScreenDimensionsChanged();
				}
			}
		}

		public static UEPanel GetPanel(Panels panel)
		{
			return UIPanels[panel];
		}

		public static T GetPanel<T>(Panels panel) where T : UEPanel
		{
			return (T)UIPanels[panel];
		}

		public static void TogglePanel(Panels panel)
		{
			UEPanel panel2 = GetPanel(panel);
			SetPanelActive(panel, !((UIModel)panel2).Enabled);
		}

		public static void SetPanelActive(Panels panelType, bool active)
		{
			((UIModel)GetPanel(panelType)).SetActive(active);
		}

		public static void SetPanelActive(UEPanel panel, bool active)
		{
			((UIModel)panel).SetActive(active);
		}

		public static void SetNavBarAnchor()
		{
			//IL_0026: 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)
			//IL_0055: 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_0074: 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_00aa: 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_00ce: 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)
			switch (NavbarAnchor)
			{
			case VerticalAnchor.Top:
				NavBarRect.anchorMin = new Vector2(0.5f, 1f);
				NavBarRect.anchorMax = new Vector2(0.5f, 1f);
				NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 0f);
				NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
				break;
			case VerticalAnchor.Bottom:
				NavBarRect.anchorMin = new Vector2(0.5f, 0f);
				NavBarRect.anchorMax = new Vector2(0.5f, 0f);
				NavBarRect.anchoredPosition = new Vector2(NavBarRect.anchoredPosition.x, 35f);
				NavBarRect.sizeDelta = NAVBAR_DIMENSIONS;
				break;
			}
		}

		private static void OnScreenDimensionsChanged()
		{
			Display activeDisplay = DisplayManager.ActiveDisplay;
			lastScreenWidth = activeDisplay.renderingWidth;
			lastScreenHeight = activeDisplay.renderingHeight;
			foreach (KeyValuePair<Panels, UEPanel> uIPanel in UIPanels)
			{
				((PanelBase)uIPanel.Value).EnsureValidSize();
				((PanelBase)uIPanel.Value).EnsureValidPosition();
				((PanelBase)uIPanel.Value).Dragger.OnEndResize();
			}
		}

		private static void OnCloseButtonClicked()
		{
			ShowMenu = false;
		}

		private static void Master_Toggle_OnValueChanged(KeyCode val)
		{
			closeBtn.ButtonText.text = ((object)(KeyCode)(ref val)).ToString();
		}

		private static void CreateTopNavBar()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: 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_0101: 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)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: 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_029b: Unknown result type (might be due to invalid IL or missing references)
			//IL_032c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0345: Unknown result type (might be due to invalid IL or missing references)
			//IL_035e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val2 = UIFactory.CreateUIObject("MainNavbar", UIRoot, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)4, (int?)4, (int?)4, (int?)4, (TextAnchor?)(TextAnchor)4);
			((Graphic)val2.AddComponent<Image>()).color = new Color(0.1f, 0.1f, 0.1f);
			NavBarRect = val2.GetComponent<RectTransform>();
			NavBarRect.pivot = new Vector2(0.5f, 1f);
			NavbarAnchor = ConfigManager.Main_Navbar_Anchor.Value;
			SetNavBarAnchor();
			ConfigElement<VerticalAnchor> main_Navbar_Anchor = ConfigManager.Main_Navbar_Anchor;
			main_Navbar_Anchor.OnValueChanged = (Action<VerticalAnchor>)System.Delegate.Combine(main_Navbar_Anchor.OnValueChanged, (Action<VerticalAnchor>)delegate(VerticalAnchor val)
			{
				NavbarAnchor = val;
				SetNavBarAnchor();
			});
			string text = "UE <i><color=grey>4.9.0</color></i>";
			Text val3 = UIFactory.CreateLabel(val2, "Title", text, (TextAnchor)4, default(Color), true, 14);
			GameObject gameObject = ((Component)val3).gameObject;
			int? num = 75;
			int? num2 = 0;
			UIFactory.SetLayoutElement(gameObject, num, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			NavbarTabButtonHolder = UIFactory.CreateUIObject("NavTabButtonHolder", val2, default(Vector2));
			GameObject navbarTabButtonHolder = NavbarTabButtonHolder;
			num2 = 25;
			int? num3 = 999;
			int? num4 = 999;
			UIFactory.SetLayoutElement(navbarTabButtonHolder, (int?)null, num2, num4, num3, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(NavbarTabButtonHolder, (bool?)false, (bool?)true, (bool?)true, (bool?)true, (int?)4, (int?)2, (int?)2, (int?)2, (int?)2, (TextAnchor?)null);
			timeScaleWidget = new TimeScaleWidget(val2);
			GameObject val4 = UIFactory.CreateUIObject("Spacer", val2, default(Vector2));
			UIFactory.SetLayoutElement(val4, (int?)15, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			KeyCode value = ConfigManager.Master_Toggle.Value;
			closeBtn = UIFactory.CreateButton(val2, "CloseButton", ((object)(KeyCode)(ref value)).ToString(), (Color?)null);
			GameObject gameObject2 = ((Component)closeBtn.Component).gameObject;
			num4 = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)60, num4, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			RuntimeHelper.SetColorBlock((Selectable)(object)closeBtn.Component, (Color?)new Color(0.63f, 0.32f, 0.31f), (Color?)new Color(0.81f, 0.25f, 0.2f), (Color?)new Color(0.6f, 0.18f, 0.16f), (Color?)null);
			ConfigElement<KeyCode> master_Toggle = ConfigManager.Master_Toggle;
			master_Toggle.OnValueChanged = (Action<KeyCode>)System.Delegate.Combine(master_Toggle.OnValueChanged, new Action<KeyCode>(Master_Toggle_OnValueChanged));
			ButtonRef obj = closeBtn;
			obj.OnClick = (Action)System.Delegate.Combine(obj.OnClick, new Action(OnCloseButtonClicked));
		}
	}
}
namespace UnityExplorer.UI.Widgets
{
	public abstract class BaseArgumentHandler : IPooledObject
	{
		internal Text argNameLabel;

		internal InputFieldRef inputField;

		internal TypeCompleter typeCompleter;

		public float DefaultHeight => 25f;

		public GameObject UIRoot { get; set; }

		public abstract void CreateSpecialContent();

		public GameObject CreateContent(GameObject parent)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
			UIRoot = UIFactory.CreateUIObject("ArgRow", parent, default(Vector2));
			GameObject uIRoot = UIRoot;
			int? num = 25;
			int? num2 = 50;
			UIFactory.SetLayoutElement(uIRoot, (int?)50, num, (int?)9999, num2, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(UIRoot, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			UIRoot.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			argNameLabel = UIFactory.CreateLabel(UIRoot, "ArgLabel", "not set", (TextAnchor)3, default(Color), true, 14);
			GameObject gameObject = ((Component)argNameLabel).gameObject;
			int? num3 = 40;
			num2 = 90;
			UIFactory.SetLayoutElement(gameObject, num3, (int?)25, num2, (int?)50, (int?)null, (int?)null, (bool?)null);
			argNameLabel.horizontalOverflow = (HorizontalWrapMode)0;
			inputField = UIFactory.CreateInputField(UIRoot, "InputField", "...");
			GameObject uIRoot2 = ((UIModel)inputField).UIRoot;
			num2 = 25;
			num = 50;
			UIFactory.SetLayoutElement(uIRoot2, (int?)100, num2, (int?)1000, num, (int?)null, (int?)null, (bool?)null);
			inputField.Component.lineType = (LineType)2;
			((UIModel)inputField).UIRoot.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			typeCompleter = new TypeCompleter(typeof(object), inputField)
			{
				Enabled = false
			};
			CreateSpecialContent();
			return UIRoot;
		}
	}
	public class EvaluateWidget : IPooledObject
	{
		private ParameterInfo[] parameters;

		internal GameObject parametersHolder;

		private ParameterHandler[] paramHandlers;

		private Type[] genericArguments;

		internal GameObject genericArgumentsHolder;

		private GenericArgumentHandler[] genericHandlers;

		public CacheMember Owner { get; set; }

		public GameObject UIRoot { get; set; }

		public float DefaultHeight => -1f;

		public void OnBorrowedFromPool(CacheMember owner)
		{
			Owner = owner;
			parameters = owner.Arguments;
			paramHandlers = new ParameterHandler[parameters.Length];
			genericArguments = owner.GenericArguments;
			genericHandlers = new GenericArgumentHandler[genericArguments.Length];
			SetArgRows();
			UIRoot.SetActive(true);
		}

		public void OnReturnToPool()
		{
			ParameterHandler[] array = paramHandlers;
			foreach (ParameterHandler parameterHandler in array)
			{
				parameterHandler.OnReturned();
				Pool<ParameterHandler>.Return(parameterHandler);
			}
			paramHandlers = null;
			GenericArgumentHandler[] array2 = genericHandlers;
			foreach (GenericArgumentHandler genericArgumentHandler in array2)
			{
				genericArgumentHandler.OnReturned();
				Pool<GenericArgumentHandler>.Return(genericArgumentHandler);
			}
			genericHandlers = null;
			Owner = null;
		}

		public Type[] TryParseGenericArguments()
		{
			Type[] array = new Type[genericArguments.Length];
			for (int i = 0; i < genericArguments.Length; i++)
			{
				array[i] = genericHandlers[i].Evaluate();
			}
			return array;
		}

		public object[] TryParseArguments()
		{
			if (!parameters.Any())
			{
				return ArgumentUtility.EmptyArgs;
			}
			object[] array = new object[parameters.Length];
			for (int i = 0; i < parameters.Length; i++)
			{
				array[i] = paramHandlers[i].Evaluate();
			}
			return array;
		}

		private void SetArgRows()
		{
			if (genericArguments.Any())
			{
				genericArgumentsHolder.SetActive(true);
				SetGenericRows();
			}
			else
			{
				genericArgumentsHolder.SetActive(false);
			}
			if (parameters.Any())
			{
				parametersHolder.SetActive(true);
				SetNormalArgRows();
			}
			else
			{
				parametersHolder.SetActive(false);
			}
		}

		private void SetGenericRows()
		{
			for (int i = 0; i < genericArguments.Length; i++)
			{
				Type genericArgument = genericArguments[i];
				GenericArgumentHandler genericArgumentHandler = (genericHandlers[i] = Pool<GenericArgumentHandler>.Borrow());
				genericArgumentHandler.UIRoot.transform.SetParent(genericArgumentsHolder.transform, false);
				genericArgumentHandler.OnBorrowed(genericArgument);
			}
		}

		private void SetNormalArgRows()
		{
			for (int i = 0; i < parameters.Length; i++)
			{
				ParameterInfo paramInfo = parameters[i];
				ParameterHandler parameterHandler = (paramHandlers[i] = Pool<ParameterHandler>.Borrow());
				parameterHandler.UIRoot.transform.SetParent(parametersHolder.transform, false);
				parameterHandler.OnBorrowed(paramInfo);
			}
		}

		public GameObject CreateContent(GameObject parent)
		{
			//IL_0021: 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_00ac: 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_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0252: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fd: Unknown result type (might be due to invalid IL or missing references)
			UIRoot = UIFactory.CreateVerticalGroup(parent, "EvaluateWidget", false, false, true, true, 3, new Vector4(2f, 2f, 2f, 2f), new Color(0.15f, 0.15f, 0.15f), (TextAnchor?)null);
			GameObject uIRoot = UIRoot;
			int? num = 50;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(uIRoot, num, (int?)50, num2, (int?)800, (int?)null, (int?)null, (bool?)null);
			genericArgumentsHolder = UIFactory.CreateUIObject("GenericHolder", UIRoot, default(Vector2));
			GameObject obj = genericArgumentsHolder;
			num2 = 1000;
			UIFactory.SetLayoutElement(obj, (int?)null, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			Text val = UIFactory.CreateLabel(genericArgumentsHolder, "GenericsTitle", "Generic Arguments", (TextAnchor)3, default(Color), true, 14);
			GameObject gameObject = ((Component)val).gameObject;
			num2 = 25;
			int? num3 = 1000;
			UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num3, (int?)null, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(genericArgumentsHolder, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)3, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			GameObject obj2 = genericArgumentsHolder;
			num3 = 25;
			num2 = 750;
			UIFactory.SetLayoutElement(obj2, (int?)50, num3, (int?)9999, num2, (int?)null, (int?)null, (bool?)null);
			parametersHolder = UIFactory.CreateUIObject("ArgHolder", UIRoot, default(Vector2));
			GameObject obj3 = parametersHolder;
			num2 = 1000;
			UIFactory.SetLayoutElement(obj3, (int?)null, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			Text val2 = UIFactory.CreateLabel(parametersHolder, "ArgsTitle", "Arguments", (TextAnchor)3, default(Color), true, 14);
			GameObject gameObject2 = ((Component)val2).gameObject;
			num2 = 25;
			num3 = 1000;
			UIFactory.SetLayoutElement(gameObject2, (int?)null, num2, num3, (int?)null, (int?)null, (int?)null, (bool?)null);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(parametersHolder, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)3, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			GameObject obj4 = parametersHolder;
			num3 = 25;
			num2 = 750;
			UIFactory.SetLayoutElement(obj4, (int?)50, num3, (int?)9999, num2, (int?)null, (int?)null, (bool?)null);
			ButtonRef val3 = UIFactory.CreateButton(UIRoot, "EvaluateButton", "Evaluate", (Color?)new Color(0.2f, 0.2f, 0.2f));
			GameObject gameObject3 = ((Component)val3.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject3, (int?)150, num2, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			val3.OnClick = (Action)System.Delegate.Combine(val3.OnClick, (Action)delegate
			{
				Owner.EvaluateAndSetCell();
			});
			return UIRoot;
		}
	}
	public class GenericArgumentHandler : BaseArgumentHandler
	{
		private Type genericArgument;

		public void OnBorrowed(Type genericArgument)
		{
			this.genericArgument = genericArgument;
			typeCompleter.Enabled = true;
			typeCompleter.BaseType = this.genericArgument;
			typeCompleter.CacheTypes();
			Type[] genericParameterConstraints = this.genericArgument.GetGenericParameterConstraints();
			StringBuilder stringBuilder = new StringBuilder("<color=#92c470>" + this.genericArgument.Name + "</color>");
			for (int i = 0; i < genericParameterConstraints.Length; i++)
			{
				if (i == 0)
				{
					stringBuilder.Append(' ').Append('(');
				}
				else
				{
					stringBuilder.Append(',').Append(' ');
				}
				stringBuilder.Append(SignatureHighlighter.Parse(genericParameterConstraints[i], false, (MemberInfo)null));
				if (i + 1 == genericParameterConstraints.Length)
				{
					stringBuilder.Append(')');
				}
			}
			argNameLabel.text = stringBuilder.ToString();
		}

		public void OnReturned()
		{
			genericArgument = null;
			typeCompleter.Enabled = false;
			inputField.Text = "";
		}

		public Type Evaluate()
		{
			return ReflectionUtility.GetTypeByName(inputField.Text) ?? throw new Exception("Could not find any type by name '" + inputField.Text + "'!");
		}

		public override void CreateSpecialContent()
		{
		}
	}
	public class GenericConstructorWidget
	{
		private GenericArgumentHandler[] handlers;

		private Type[] currentGenericParameters;

		private Action<Type[]> currentOnSubmit;

		private Action currentOnCancel;

		public GameObject UIRoot;

		private Text Title;

		private GameObject ArgsHolder;

		public void Show(Action<Type[]> onSubmit, Action onCancel, Type genericTypeDefinition)
		{
			Title.text = "Setting generic arguments for " + SignatureHighlighter.Parse(genericTypeDefinition, false, (MemberInfo)null) + "...";
			OnShow(onSubmit, onCancel, genericTypeDefinition.GetGenericArguments());
		}

		public void Show(Action<Type[]> onSubmit, Action onCancel, MethodInfo genericMethodDefinition)
		{
			Title.text = "Setting generic arguments for " + SignatureHighlighter.ParseMethod(genericMethodDefinition) + "...";
			OnShow(onSubmit, onCancel, genericMethodDefinition.GetGenericArguments());
		}

		private void OnShow(Action<Type[]> onSubmit, Action onCancel, Type[] genericParameters)
		{
			currentOnSubmit = onSubmit;
			currentOnCancel = onCancel;
			SetGenericParameters(genericParameters);
		}

		private void SetGenericParameters(Type[] genericParameters)
		{
			currentGenericParameters = genericParameters;
			handlers = new GenericArgumentHandler[genericParameters.Length];
			for (int i = 0; i < genericParameters.Length; i++)
			{
				Type genericArgument = genericParameters[i];
				GenericArgumentHandler genericArgumentHandler = (handlers[i] = Pool<GenericArgumentHandler>.Borrow());
				genericArgumentHandler.UIRoot.transform.SetParent(ArgsHolder.transform, false);
				genericArgumentHandler.OnBorrowed(genericArgument);
			}
		}

		public void TrySubmit()
		{
			Type[] array = new Type[currentGenericParameters.Length];
			for (int i = 0; i < array.Length; i++)
			{
				GenericArgumentHandler genericArgumentHandler = handlers[i];
				Type type;
				try
				{
					type = genericArgumentHandler.Evaluate();
					if ((object)type == null)
					{
						throw new Exception();
					}
				}
				catch
				{
					ExplorerCore.LogWarning("Generic argument '" + genericArgumentHandler.inputField.Text + "' is not a valid type.");
					return;
				}
				array[i] = type;
			}
			OnClose();
			currentOnSubmit(array);
		}

		public void Cancel()
		{
			OnClose();
			currentOnCancel?.Invoke();
		}

		private void OnClose()
		{
			if (handlers != null)
			{
				GenericArgumentHandler[] array = handlers;
				foreach (GenericArgumentHandler genericArgumentHandler in array)
				{
					genericArgumentHandler.OnReturned();
					Pool<GenericArgumentHandler>.Return(genericArgumentHandler);
				}
				handlers = null;
			}
		}

		internal void ConstructUI(GameObject parent)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			Vector4 val = new Vector4(5f, 5f, 5f, 5f);
			TextAnchor? val2 = (TextAnchor)4;
			UIRoot = UIFactory.CreateVerticalGroup(parent, "GenericArgsHandler", false, false, true, true, 5, val, default(Color), val2);
			GameObject uIRoot = UIRoot;
			int? num = 9999;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(uIRoot, (int?)null, (int?)null, num, num2, (int?)null, (int?)null, (bool?)null);
			ButtonRef val3 = UIFactory.CreateButton(UIRoot, "SubmitButton", "Submit", (Color?)new Color(0.2f, 0.3f, 0.2f));
			GameObject gameObject = val3.GameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)200, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val3.OnClick = (Action)System.Delegate.Combine(val3.OnClick, new Action(TrySubmit));
			ButtonRef val4 = UIFactory.CreateButton(UIRoot, "CancelButton", "Cancel", (Color?)new Color(0.3f, 0.2f, 0.2f));
			GameObject gameObject2 = val4.GameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)200, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val4.OnClick = (Action)System.Delegate.Combine(val4.OnClick, new Action(Cancel));
			Title = UIFactory.CreateLabel(UIRoot, "Title", "Generic Arguments", (TextAnchor)4, default(Color), true, 14);
			GameObject gameObject3 = ((Component)Title).gameObject;
			num2 = 25;
			num = 9999;
			UIFactory.SetLayoutElement(gameObject3, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			AutoSliderScrollbar val5 = default(AutoSliderScrollbar);
			GameObject val6 = UIFactory.CreateScrollView(UIRoot, "GenericArgsScrollView", ref ArgsHolder, ref val5, new Color(0.1f, 0.1f, 0.1f));
			num = 9999;
			num2 = 9999;
			UIFactory.SetLayoutElement(val6, (int?)null, (int?)null, num, num2, (int?)null, (int?)null, (bool?)null);
			GameObject argsHolder = ArgsHolder;
			num2 = 5;
			num = 5;
			int? num3 = 5;
			int? num4 = 5;
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(argsHolder, (bool?)null, (bool?)null, (bool?)null, (bool?)null, (int?)null, num2, num3, num, num4, (TextAnchor?)null);
		}
	}
	public class ParameterHandler : BaseArgumentHandler
	{
		private ParameterInfo paramInfo;

		private Type paramType;

		internal EnumCompleter enumCompleter;

		private ButtonRef enumHelperButton;

		private bool usingBasicLabel;

		private object basicValue;

		private GameObject basicLabelHolder;

		private Text basicLabel;

		private ButtonRef pasteButton;

		public void OnBorrowed(ParameterInfo paramInfo)
		{
			this.paramInfo = paramInfo;
			paramType = paramInfo.ParameterType;
			if (paramType.IsByRef)
			{
				paramType = paramType.GetElementType();
			}
			argNameLabel.text = SignatureHighlighter.Parse(paramType, false, (MemberInfo)null) + " <color=#a6e9e9>" + paramInfo.Name + "</color>";
			if (ParseUtility.CanParse(paramType) || typeof(Type).IsAssignableFrom(paramType))
			{
				usingBasicLabel = false;
				((Component)inputField.Component).gameObject.SetActive(true);
				basicLabelHolder.SetActive(false);
				typeCompleter.Enabled = typeof(Type).IsAssignableFrom(paramType);
				enumCompleter.Enabled = paramType.IsEnum;
				((Component)enumHelperButton.Component).gameObject.SetActive(paramType.IsEnum);
				if (!typeCompleter.Enabled)
				{
					if ((object)paramType == typeof(string))
					{
						inputField.PlaceholderText.text = "...";
					}
					else
					{
						inputField.PlaceholderText.text = "eg. " + ParseUtility.GetExampleInput(paramType);
					}
				}
				else
				{
					inputField.PlaceholderText.text = "Enter a Type name...";
					typeCompleter.BaseType = typeof(object);
					typeCompleter.CacheTypes();
				}
				if (enumCompleter.Enabled)
				{
					enumCompleter.EnumType = paramType;
					enumCompleter.CacheEnumValues();
				}
			}
			else
			{
				usingBasicLabel = true;
				((Component)inputField.Component).gameObject.SetActive(false);
				basicLabelHolder.SetActive(true);
				typeCompleter.Enabled = false;
				enumCompleter.Enabled = false;
				((Component)enumHelperButton.Component).gameObject.SetActive(false);
				SetDisplayedValueFromPaste();
			}
		}

		public void OnReturned()
		{
			paramInfo = null;
			enumCompleter.Enabled = false;
			typeCompleter.Enabled = false;
			inputField.Text = "";
			usingBasicLabel = false;
			basicValue = null;
		}

		public object Evaluate()
		{
			if (usingBasicLabel)
			{
				return basicValue;
			}
			string text = inputField.Text;
			if (typeof(Type).IsAssignableFrom(paramType))
			{
				return ReflectionUtility.GetTypeByName(text);
			}
			if ((object)paramType == typeof(string))
			{
				return text;
			}
			if (string.IsNullOrEmpty(text))
			{
				if (paramInfo.IsOptional)
				{
					return paramInfo.DefaultValue;
				}
				return null;
			}
			object result = default(object);
			Exception ex = default(Exception);
			if (!ParseUtility.TryParse(text, paramType, ref result, ref ex))
			{
				ExplorerCore.LogWarning("Cannot parse argument '" + paramInfo.Name + "' (" + paramInfo.ParameterType.Name + ")" + ((ex == null) ? "" : (", " + ex.GetType().Name + ": " + ex.Message)));
				return null;
			}
			return result;
		}

		private void OnPasteClicked()
		{
			if (ClipboardPanel.TryPaste(paramType, out var paste))
			{
				basicValue = paste;
				SetDisplayedValueFromPaste();
			}
		}

		private void SetDisplayedValueFromPaste()
		{
			if (usingBasicLabel)
			{
				basicLabel.text = ToStringUtility.ToStringWithType(basicValue, paramType, false);
			}
			else if (typeof(Type).IsAssignableFrom(paramType))
			{
				inputField.Text = GeneralExtensions.FullDescription(basicValue as Type);
			}
			else
			{
				inputField.Text = ParseUtility.ToStringForInput(basicValue, paramType);
			}
		}

		public override void CreateSpecialContent()
		{
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: 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)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			enumCompleter = new EnumCompleter(paramType, inputField)
			{
				Enabled = false
			};
			enumHelperButton = UIFactory.CreateButton(base.UIRoot, "EnumHelper", "▼", (Color?)null);
			UIFactory.SetLayoutElement(((Component)enumHelperButton.Component).gameObject, (int?)25, (int?)25, (int?)0, (int?)0, (int?)null, (int?)null, (bool?)null);
			ButtonRef obj = enumHelperButton;
			obj.OnClick = (Action)System.Delegate.Combine(obj.OnClick, new Action(enumCompleter.HelperButtonClicked));
			GameObject uIRoot = base.UIRoot;
			Color val = default(Color);
			((Color)(ref val))..ctor(0.1f, 0.1f, 0.1f);
			basicLabelHolder = UIFactory.CreateHorizontalGroup(uIRoot, "BasicLabelHolder", true, true, true, true, 0, default(Vector4), val, (TextAnchor?)null);
			GameObject obj2 = basicLabelHolder;
			int? num = 25;
			int? num2 = 50;
			UIFactory.SetLayoutElement(obj2, (int?)100, num, (int?)1000, num2, (int?)null, (int?)null, (bool?)null);
			GameObject obj3 = basicLabelHolder;
			val = default(Color);
			basicLabel = UIFactory.CreateLabel(obj3, "BasicLabel", "null", (TextAnchor)3, val, true, 14);
			((Component)basicLabel).gameObject.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			pasteButton = UIFactory.CreateButton(base.UIRoot, "PasteButton", "Paste", (Color?)new Color(0.13f, 0.13f, 0.13f, 1f));
			GameObject gameObject = ((Component)pasteButton.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)28, num2, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)pasteButton.ButtonText).color = Color.green;
			pasteButton.ButtonText.fontSize = 10;
			ButtonRef obj4 = pasteButton;
			obj4.OnClick = (Action)System.Delegate.Combine(obj4.OnClick, new Action(OnPasteClicked));
		}
	}
	public class AxisControl
	{
		public readonly Vector3Control parent;

		public readonly int axis;

		public readonly Slider slider;

		public AxisControl(int axis, Slider slider, Vector3Control parentControl)
		{
			parent = parentControl;
			this.axis = axis;
			this.slider = slider;
		}

		private void OnVectorSliderChanged(float value)
		{
			parent.Owner.CurrentSlidingAxisControl = ((value == 0f) ? null : this);
		}

		private void OnVectorMinusClicked()
		{
			parent.Owner.AxisControlOperation(0f - parent.Increment, parent, axis);
		}

		private void OnVectorPlusClicked()
		{
			parent.Owner.AxisControlOperation(parent.Increment, parent, axis);
		}

		public static AxisControl Create(GameObject parent, string title, int axis, Vector3Control owner)
		{
			//IL_0019: 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)
			Text val = UIFactory.CreateLabel(parent, "Label_" + title, title + ":", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject = ((Component)val).gameObject;
			int? num = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)30, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			Slider val2 = default(Slider);
			GameObject val3 = UIFactory.CreateSlider(parent, "Slider_" + title, ref val2);
			num = 25;
			UIFactory.SetLayoutElement(val3, (int?)75, num, (int?)0, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)val2.m_FillImage).color = Color.clear;
			val2.minValue = -0.1f;
			val2.maxValue = 0.1f;
			AxisControl axisControl = new AxisControl(axis, val2, owner);
			((UnityEvent<float>)(object)val2.onValueChanged).AddListener((UnityAction<float>)axisControl.OnVectorSliderChanged);
			ButtonRef val4 = UIFactory.CreateButton(parent, "MinusIncrementButton", "-", (Color?)null);
			GameObject gameObject2 = val4.GameObject;
			int? num2 = 20;
			num = 0;
			UIFactory.SetLayoutElement(gameObject2, num2, (int?)25, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			val4.OnClick = (Action)System.Delegate.Combine(val4.OnClick, new Action(axisControl.OnVectorMinusClicked));
			ButtonRef val5 = UIFactory.CreateButton(parent, "PlusIncrementButton", "+", (Color?)null);
			GameObject gameObject3 = val5.GameObject;
			int? num3 = 20;
			num = 0;
			UIFactory.SetLayoutElement(gameObject3, num3, (int?)25, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			val5.OnClick = (Action)System.Delegate.Combine(val5.OnClick, new Action(axisControl.OnVectorPlusClicked));
			return axisControl;
		}
	}
	public class ComponentCell : ButtonCell
	{
		public Toggle BehaviourToggle;

		public ButtonRef DestroyButton;

		public Action<bool, int> OnBehaviourToggled;

		public Action<int> OnDestroyClicked;

		private void BehaviourToggled(bool val)
		{
			OnBehaviourToggled?.Invoke(val, ((ButtonCell)this).CurrentDataIndex);
		}

		private void DestroyClicked()
		{
			OnDestroyClicked?.Invoke(((ButtonCell)this).CurrentDataIndex);
		}

		public override GameObject CreateContent(GameObject parent)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			GameObject result = ((ButtonCell)this).CreateContent(parent);
			((ButtonCell)this).Button.ButtonText.horizontalOverflow = (HorizontalWrapMode)0;
			Text val = default(Text);
			GameObject val2 = UIFactory.CreateToggle(((ButtonCell)this).UIRoot, "BehaviourToggle", ref BehaviourToggle, ref val, default(Color), 20, 20);
			int? num = 25;
			UIFactory.SetLayoutElement(val2, (int?)25, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			((UnityEvent<bool>)(object)BehaviourToggle.onValueChanged).AddListener((UnityAction<bool>)BehaviourToggled);
			val2.transform.SetSiblingIndex(0);
			DestroyButton = UIFactory.CreateButton(((ButtonCell)this).UIRoot, "DestroyButton", "X", (Color?)new Color(0.3f, 0.2f, 0.2f));
			GameObject gameObject = ((Component)DestroyButton.Component).gameObject;
			num = 21;
			UIFactory.SetLayoutElement(gameObject, (int?)25, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef destroyButton = DestroyButton;
			destroyButton.OnClick = (Action)System.Delegate.Combine(destroyButton.OnClick, new Action(DestroyClicked));
			return result;
		}
	}
	public class ComponentList : ButtonListHandler<Component, ComponentCell>
	{
		public GameObjectInspector Parent;

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

		public ComponentList(ScrollPool<ComponentCell> scrollPool, Func<List<Component>> getEntriesMethod)
			: base(scrollPool, getEntriesMethod, (Action<ComponentCell, int>)null, (Func<Component, string, bool>)null, (Action<int>)null)
		{
			base.SetICell = SetComponentCell;
			base.ShouldDisplay = CheckShouldDisplay;
			base.OnCellClicked = OnComponentClicked;
		}

		public void Clear()
		{
			base.RefreshData();
			base.ScrollPool.Refresh(true, true);
		}

		private bool CheckShouldDisplay(Component _, string __)
		{
			return true;
		}

		public override void OnCellBorrowed(ComponentCell cell)
		{
			base.OnCellBorrowed(cell);
			cell.OnBehaviourToggled = (Action<bool, int>)System.Delegate.Combine(cell.OnBehaviourToggled, new Action<bool, int>(OnBehaviourToggled));
			cell.OnDestroyClicked = (Action<int>)System.Delegate.Combine(cell.OnDestroyClicked, new Action<int>(OnDestroyClicked));
		}

		public override void SetCell(ComponentCell cell, int index)
		{
			base.SetCell(cell, index);
		}

		private void OnComponentClicked(int index)
		{
			List<Component> list = base.GetEntries();
			if (index >= 0 && index < list.Count)
			{
				Component val = list[index];
				if (Object.op_Implicit((Object)(object)val))
				{
					InspectorManager.Inspect(val);
				}
			}
		}

		private void OnBehaviourToggled(bool value, int index)
		{
			try
			{
				List<Component> list = base.GetEntries();
				Component val = list[index];
				Behaviour val2 = ReflectionExtensions.TryCast<Behaviour>((object)val);
				if (val2 != null)
				{
					val2.enabled = value;
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("Exception toggling Behaviour.enabled: " + ReflectionExtensions.ReflectionExToString(ex, true));
			}
		}

		private void OnDestroyClicked(int index)
		{
			try
			{
				List<Component> list = base.GetEntries();
				Component val = list[index];
				Object.DestroyImmediate((Object)(object)val);
				Parent.UpdateComponents();
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("Exception destroying Component: " + ReflectionExtensions.ReflectionExToString(ex, true));
			}
		}

		private void SetComponentCell(ComponentCell cell, int index)
		{
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			List<Component> list = base.GetEntries();
			((ButtonCell)cell).Enable();
			Component val = list[index];
			Type actualType = ReflectionExtensions.GetActualType((object)val);
			if (!compToStringCache.ContainsKey(actualType.AssemblyQualifiedName))
			{
				compToStringCache.Add(actualType.AssemblyQualifiedName, SignatureHighlighter.Parse(actualType, true, (MemberInfo)null));
			}
			((ButtonCell)cell).Button.ButtonText.text = compToStringCache[actualType.AssemblyQualifiedName];
			if (typeof(Behaviour).IsAssignableFrom(actualType))
			{
				((Selectable)cell.BehaviourToggle).interactable = true;
				cell.BehaviourToggle.Set(ReflectionExtensions.TryCast<Behaviour>((object)val).enabled, false);
				cell.BehaviourToggle.graphic.color = new Color(0.8f, 1f, 0.8f, 0.3f);
			}
			else
			{
				((Selectable)cell.BehaviourToggle).interactable = false;
				cell.BehaviourToggle.Set(true, false);
				cell.BehaviourToggle.graphic.color = new Color(0.2f, 0.2f, 0.2f);
			}
			if (index == 0 && ((Component)cell.DestroyButton.Component).gameObject.activeSelf)
			{
				((Component)cell.DestroyButton.Component).gameObject.SetActive(false);
			}
			else if (index > 0 && !((Component)cell.DestroyButton.Component).gameObject.activeSelf)
			{
				((Component)cell.DestroyButton.Component).gameObject.SetActive(true);
			}
		}
	}
	public class GameObjectControls
	{
		public GameObjectInspector Parent { get; }

		public GameObject Target => Parent.Target;

		public GameObjectInfoPanel GameObjectInfo { get; }

		public TransformControls TransformControl { get; }

		public GameObjectControls(GameObjectInspector parent)
		{
			Parent = parent;
			GameObjectInfo = new GameObjectInfoPanel(this);
			TransformControl = new TransformControls(this);
		}

		public void UpdateGameObjectInfo(bool firstUpdate, bool force)
		{
			GameObjectInfo.UpdateGameObjectInfo(firstUpdate, force);
		}

		public void UpdateVectorSlider()
		{
			TransformControl.UpdateVectorSlider();
		}
	}
	public class GameObjectInfoPanel
	{
		private string lastGoName;

		private string lastPath;

		private bool lastParentState;

		private int lastSceneHandle;

		private string lastTag;

		private int lastLayer;

		private int lastFlags;

		private ButtonRef ViewParentButton;

		private InputFieldRef PathInput;

		private InputFieldRef NameInput;

		private Toggle ActiveSelfToggle;

		private Text ActiveSelfText;

		private Toggle IsStaticToggle;

		private ButtonRef SceneButton;

		private InputFieldRef InstanceIDInput;

		private InputFieldRef TagInput;

		private Dropdown LayerDropdown;

		private Dropdown FlagsDropdown;

		private static List<string> layerToNames;

		private static Dictionary<string, HideFlags> hideFlagsValues;

		public GameObjectControls Owner { get; }

		private GameObject Target => Owner.Target;

		public GameObjectInfoPanel(GameObjectControls owner)
		{
			Owner = owner;
			Create();
		}

		public void UpdateGameObjectInfo(bool firstUpdate, bool force)
		{
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02de: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0300: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cc: Invalid comparison between Unknown and I4
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ec: Expected I4, but got Unknown
			//IL_03fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0402: Unknown result type (might be due to invalid IL or missing references)
			if (firstUpdate)
			{
				InstanceIDInput.Text = ((Object)Target).GetInstanceID().ToString();
			}
			if (force || (!NameInput.Component.isFocused && ((Object)Target).name != lastGoName))
			{
				lastGoName = ((Object)Target).name;
				Owner.Parent.Tab.TabText.text = "[G] " + ((Object)Target).name;
				NameInput.Text = ((Object)Target).name;
			}
			if (force || !PathInput.Component.isFocused)
			{
				string transformPath = UnityHelpers.GetTransformPath(Target.transform, false);
				if (transformPath != lastPath)
				{
					lastPath = transformPath;
					PathInput.Text = transformPath;
				}
			}
			if (force || Object.op_Implicit((Object)(object)Target.transform.parent) != lastParentState)
			{
				lastParentState = Object.op_Implicit((Object)(object)Target.transform.parent);
				((Selectable)ViewParentButton.Component).interactable = lastParentState;
				if (lastParentState)
				{
					((Graphic)ViewParentButton.ButtonText).color = Color.white;
					ViewParentButton.ButtonText.text = "◄ View Parent";
				}
				else
				{
					((Graphic)ViewParentButton.ButtonText).color = Color.grey;
					ViewParentButton.ButtonText.text = "No parent";
				}
			}
			if (force || Target.activeSelf != ActiveSelfToggle.isOn)
			{
				ActiveSelfToggle.Set(Target.activeSelf, false);
				((Graphic)ActiveSelfText).color = (ActiveSelfToggle.isOn ? Color.green : Color.red);
			}
			if (force || Target.isStatic != IsStaticToggle.isOn)
			{
				IsStaticToggle.Set(Target.isStatic, false);
			}
			Scene scene;
			if (!force)
			{
				scene = Target.scene;
				if (((Scene)(ref scene)).handle == lastSceneHandle)
				{
					goto IL_0310;
				}
			}
			scene = Target.scene;
			lastSceneHandle = ((Scene)(ref scene)).handle;
			Text buttonText = SceneButton.ButtonText;
			scene = Target.scene;
			object text;
			if (!((Scene)(ref scene)).IsValid())
			{
				text = "None (Asset/Resource)";
			}
			else
			{
				scene = Target.scene;
				text = ((Scene)(ref scene)).name;
			}
			buttonText.text = (string)text;
			goto IL_0310;
			IL_0310:
			if (force || (!TagInput.Component.isFocused && Target.tag != lastTag))
			{
				lastTag = Target.tag;
				TagInput.Text = lastTag;
			}
			if (force || Target.layer != lastLayer)
			{
				lastLayer = Target.layer;
				LayerDropdown.value = Target.layer;
			}
			if (force || (int)((Object)Target).hideFlags != lastFlags)
			{
				lastFlags = (int)((Object)Target).hideFlags;
				Text captionText = FlagsDropdown.captionText;
				HideFlags hideFlags = ((Object)Target).hideFlags;
				captionText.text = ((object)(HideFlags)(ref hideFlags)).ToString();
			}
		}

		private void DoSetParent(Transform transform)
		{
			ExplorerCore.Log("Setting target's transform parent to: " + (((Object)(object)transform == (Object)null) ? "null" : ("'" + ((Object)transform).name + "'")));
			if (Object.op_Implicit((Object)(object)Target.GetComponent<RectTransform>()))
			{
				Target.transform.SetParent(transform, false);
			}
			else
			{
				Target.transform.parent = transform;
			}
			UpdateGameObjectInfo(firstUpdate: false, force: false);
			Owner.TransformControl.UpdateTransformControlValues(force: false);
		}

		private void OnViewParentClicked()
		{
			if (Object.op_Implicit((Object)(object)Target) && Object.op_Implicit((Object)(object)Target.transform.parent))
			{
				Owner.Parent.OnTransformCellClicked(((Component)Target.transform.parent).gameObject);
			}
		}

		private void OnPathEndEdit(string input)
		{
			lastPath = input;
			if (string.IsNullOrEmpty(input))
			{
				DoSetParent(null);
				return;
			}
			Transform val = null;
			if (input.EndsWith("/"))
			{
				input = input.Remove(input.Length - 1);
			}
			GameObject val2 = GameObject.Find(input);
			if (val2 != null)
			{
				val = val2.transform;
			}
			else
			{
				string text = input.Split(new char[1] { '/' }).Last();
				Object[] array = RuntimeHelper.FindObjectsOfTypeAll(typeof(GameObject));
				List<GameObject> list = new List<GameObject>();
				Object[] array2 = array;
				foreach (Object val3 in array2)
				{
					if (val3.name == text)
					{
						list.Add(ReflectionExtensions.TryCast<GameObject>((object)val3));
					}
				}
				foreach (GameObject item in list)
				{
					string text2 = UnityHelpers.GetTransformPath(item.transform, true);
					if (text2.EndsWith("/"))
					{
						text2 = text2.Remove(text2.Length - 1);
					}
					if (text2 == input)
					{
						val = item.transform;
						break;
					}
				}
			}
			if (Object.op_Implicit((Object)(object)val))
			{
				DoSetParent(val);
				return;
			}
			ExplorerCore.LogWarning("Could not find any GameObject name or path '" + input + "'!");
			UpdateGameObjectInfo(firstUpdate: false, force: true);
		}

		private void OnNameEndEdit(string value)
		{
			((Object)Target).name = value;
			UpdateGameObjectInfo(firstUpdate: false, force: true);
		}

		private void OnCopyClicked()
		{
			ClipboardPanel.Copy(Target);
		}

		private void OnActiveSelfToggled(bool value)
		{
			Target.SetActive(value);
			UpdateGameObjectInfo(firstUpdate: false, force: true);
		}

		private void OnTagEndEdit(string value)
		{
			try
			{
				Target.tag = value;
				UpdateGameObjectInfo(firstUpdate: false, force: true);
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("Exception setting tag! " + ReflectionExtensions.ReflectionExToString(ex, true));
			}
		}

		private void OnSceneButtonClicked()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			InspectorManager.Inspect(Target.scene);
		}

		private void OnExploreButtonClicked()
		{
			ObjectExplorerPanel panel = UIManager.GetPanel<ObjectExplorerPanel>(UIManager.Panels.ObjectExplorer);
			panel.SceneExplorer.JumpToTransform(Owner.Parent.Target.transform);
		}

		private void OnLayerDropdownChanged(int value)
		{
			Target.layer = value;
			UpdateGameObjectInfo(firstUpdate: false, force: true);
		}

		private void OnFlagsDropdownChanged(int value)
		{
			//IL_001d: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				HideFlags hideFlags = hideFlagsValues[FlagsDropdown.options[value].text];
				((Object)Target).hideFlags = hideFlags;
				UpdateGameObjectInfo(firstUpdate: false, force: true);
			}
			catch (Exception arg)
			{
				ExplorerCore.LogWarning($"Exception setting hideFlags: {arg}");
			}
		}

		private void OnDestroyClicked()
		{
			Object.Destroy((Object)(object)Target);
			InspectorManager.ReleaseInspector(Owner.Parent);
		}

		private void OnInstantiateClicked()
		{
			GameObject obj = Object.Instantiate<GameObject>(Target);
			InspectorManager.Inspect(obj);
		}

		public void Create()
		{
			//IL_002f: 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_00bb: 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_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_030a: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0435: Unknown result type (might be due to invalid IL or missing references)
			//IL_043b: Unknown result type (might be due to invalid IL or missing references)
			//IL_054a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0550: Unknown result type (might be due to invalid IL or missing references)
			//IL_0609: Unknown result type (might be due to invalid IL or missing references)
			//IL_060f: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_0715: Unknown result type (might be due to invalid IL or missing references)
			//IL_073a: Unknown result type (might be due to invalid IL or missing references)
			//IL_081b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0845: Unknown result type (might be due to invalid IL or missing references)
			//IL_0926: Unknown result type (might be due to invalid IL or missing references)
			//IL_096e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a13: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aa5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aab: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b6a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c10: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d1f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0dfe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e42: Unknown result type (might be due to invalid IL or missing references)
			//IL_0e4c: Expected O, but got Unknown
			//IL_0e8d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f20: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fb8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fc2: Expected O, but got Unknown
			GameObject val2 = UIFactory.CreateVerticalGroup(Owner.Parent.Content, "TopInfoHolder", false, false, true, true, 3, new Vector4(3f, 3f, 3f, 3f), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)(TextAnchor)3);
			int? num = 100;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(val2, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			val2.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			GameObject val3 = UIFactory.CreateUIObject("ParentRow", val2, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val3, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)null);
			num2 = 25;
			num = 9999;
			UIFactory.SetLayoutElement(val3, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			ViewParentButton = UIFactory.CreateButton(val3, "ViewParentButton", "◄ View Parent", (Color?)new Color(0.2f, 0.2f, 0.2f));
			ViewParentButton.ButtonText.fontSize = 13;
			GameObject gameObject = ((Component)ViewParentButton.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef viewParentButton = ViewParentButton;
			viewParentButton.OnClick = (Action)System.Delegate.Combine(viewParentButton.OnClick, new Action(OnViewParentClicked));
			PathInput = UIFactory.CreateInputField(val3, "PathInput", "...");
			((Graphic)PathInput.Component.textComponent).color = Color.grey;
			PathInput.Component.textComponent.fontSize = 14;
			GameObject uIRoot = ((UIModel)PathInput).UIRoot;
			num = 25;
			UIFactory.SetLayoutElement(uIRoot, (int?)100, num, (int?)9999, (int?)null, (int?)null, (int?)null, (bool?)null);
			PathInput.Component.lineType = (LineType)1;
			ButtonRef val4 = UIFactory.CreateButton(val3, "CopyButton", "Copy to Clipboard", (Color?)new Color(0.2f, 0.2f, 0.2f, 1f));
			((Graphic)val4.ButtonText).color = Color.yellow;
			GameObject gameObject2 = ((Component)val4.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)120, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val4.OnClick = (Action)System.Delegate.Combine(val4.OnClick, new Action(OnCopyClicked));
			UnityHelpers.GetOnEndEdit(PathInput.Component).AddListener((UnityAction<string>)delegate(string val)
			{
				OnPathEndEdit(val);
			});
			GameObject val5 = UIFactory.CreateUIObject("TitleRow", val2, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val5, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			Text val6 = UIFactory.CreateLabel(val5, "Title", SignatureHighlighter.Parse(typeof(GameObject), false, (MemberInfo)null), (TextAnchor)3, default(Color), true, 17);
			GameObject gameObject3 = ((Component)val6).gameObject;
			num = 30;
			UIFactory.SetLayoutElement(gameObject3, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			NameInput = UIFactory.CreateInputField(val5, "NameInput", "untitled");
			GameObject gameObject4 = ((Component)NameInput.Component).gameObject;
			num = 30;
			UIFactory.SetLayoutElement(gameObject4, (int?)100, num, (int?)9999, (int?)null, (int?)null, (int?)null, (bool?)null);
			NameInput.Component.textComponent.fontSize = 15;
			UnityHelpers.GetOnEndEdit(NameInput.Component).AddListener((UnityAction<string>)delegate(string val)
			{
				OnNameEndEdit(val);
			});
			GameObject val7 = UIFactory.CreateUIObject("ParentRow", val2, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val7, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)null);
			num = 25;
			num2 = 9999;
			UIFactory.SetLayoutElement(val7, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			GameObject val8 = UIFactory.CreateToggle(val7, "ActiveSelf", ref ActiveSelfToggle, ref ActiveSelfText, default(Color), 20, 20);
			num2 = 25;
			UIFactory.SetLayoutElement(val8, (int?)100, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ActiveSelfText.text = "ActiveSelf";
			((UnityEvent<bool>)(object)ActiveSelfToggle.onValueChanged).AddListener((UnityAction<bool>)OnActiveSelfToggled);
			Text val9 = default(Text);
			GameObject val10 = UIFactory.CreateToggle(val7, "IsStatic", ref IsStaticToggle, ref val9, default(Color), 20, 20);
			num2 = 25;
			UIFactory.SetLayoutElement(val10, (int?)80, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val9.text = "IsStatic";
			((Graphic)val9).color = Color.grey;
			((Selectable)IsStaticToggle).interactable = false;
			Text val11 = UIFactory.CreateLabel(val7, "InstanceIDLabel", "Instance ID:", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject5 = ((Component)val11).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject5, (int?)90, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			InstanceIDInput = UIFactory.CreateInputField(val7, "InstanceIDInput", "error");
			GameObject gameObject6 = ((Component)InstanceIDInput.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject6, (int?)110, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)InstanceIDInput.Component.textComponent).color = Color.grey;
			InstanceIDInput.Component.readOnly = true;
			Text val12 = UIFactory.CreateLabel(val7, "TagLabel", "Tag:", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject7 = ((Component)val12).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject7, (int?)40, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			TagInput = UIFactory.CreateInputField(val7, "TagInput", "none");
			GameObject gameObject8 = ((Component)TagInput.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject8, (int?)100, num2, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)TagInput.Component.textComponent).color = Color.white;
			UnityHelpers.GetOnEndEdit(TagInput.Component).AddListener((UnityAction<string>)delegate(string val)
			{
				OnTagEndEdit(val);
			});
			ButtonRef val13 = UIFactory.CreateButton(val7, "InstantiateBtn", "Instantiate", (Color?)new Color(0.2f, 0.2f, 0.2f));
			GameObject gameObject9 = ((Component)val13.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject9, (int?)120, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val13.OnClick = (Action)System.Delegate.Combine(val13.OnClick, new Action(OnInstantiateClicked));
			ButtonRef val14 = UIFactory.CreateButton(val7, "DestroyBtn", "Destroy", (Color?)new Color(0.3f, 0.2f, 0.2f));
			GameObject gameObject10 = ((Component)val14.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject10, (int?)80, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val14.OnClick = (Action)System.Delegate.Combine(val14.OnClick, new Action(OnDestroyClicked));
			GameObject val15 = UIFactory.CreateUIObject("ParentRow", val2, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val15, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)null);
			num2 = 25;
			num = 9999;
			UIFactory.SetLayoutElement(val15, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef val16 = UIFactory.CreateButton(val15, "ExploreBtn", "Show in Explorer", (Color?)new Color(0.15f, 0.15f, 0.15f));
			GameObject gameObject11 = ((Component)val16.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject11, (int?)100, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			val16.ButtonText.fontSize = 12;
			val16.OnClick = (Action)System.Delegate.Combine(val16.OnClick, new Action(OnExploreButtonClicked));
			Text val17 = UIFactory.CreateLabel(val15, "SceneLabel", "Scene:", (TextAnchor)3, Color.grey, true, 14);
			GameObject gameObject12 = ((Component)val17).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject12, (int?)50, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			SceneButton = UIFactory.CreateButton(val15, "SceneButton", "untitled", (Color?)null);
			GameObject gameObject13 = ((Component)SceneButton.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject13, (int?)120, num, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef sceneButton = SceneButton;
			sceneButton.OnClick = (Action)System.Delegate.Combine(sceneButton.OnClick, new Action(OnSceneButtonClicked));
			Text val18 = UIFactory.CreateLabel(val15, "LayerLabel", "Layer:", (TextAnchor)3, Color.grey, true, 14);
			GameObject gameObject14 = ((Component)val18).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject14, (int?)50, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			GameObject val19 = UIFactory.CreateDropdown(val15, "LayerDropdown", ref LayerDropdown, "0", 14, (Action<int>)OnLayerDropdownChanged, (string[])null);
			num = 25;
			UIFactory.SetLayoutElement(val19, (int?)110, num, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			((Graphic)LayerDropdown.captionText).color = SignatureHighlighter.EnumGreen;
			if (layerToNames == null)
			{
				GetLayerNames();
			}
			foreach (string layerToName in layerToNames)
			{
				LayerDropdown.options.Add(new OptionData(layerToName));
			}
			LayerDropdown.value = 0;
			LayerDropdown.RefreshShownValue();
			Text val20 = UIFactory.CreateLabel(val15, "FlagsLabel", "Flags:", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject15 = ((Component)val20).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject15, (int?)50, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			GameObject val21 = UIFactory.CreateDropdown(val15, "FlagsDropdown", ref FlagsDropdown, "None", 14, (Action<int>)OnFlagsDropdownChanged, (string[])null);
			((Graphic)FlagsDropdown.captionText).color = SignatureHighlighter.EnumGreen;
			num = 25;
			UIFactory.SetLayoutElement(val21, (int?)135, num, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			if (hideFlagsValues == null)
			{
				GetHideFlagNames();
			}
			foreach (string key in hideFlagsValues.Keys)
			{
				FlagsDropdown.options.Add(new OptionData(key));
			}
			FlagsDropdown.value = 0;
			FlagsDropdown.RefreshShownValue();
		}

		private static void GetLayerNames()
		{
			layerToNames = new List<string>();
			for (int i = 0; i < 32; i++)
			{
				string text = RuntimeHelper.LayerToName(i);
				if (string.IsNullOrEmpty(text))
				{
					text = i.ToString();
				}
				layerToNames.Add(text);
			}
		}

		private static void GetHideFlagNames()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: 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)
			hideFlagsValues = new Dictionary<string, HideFlags>();
			Array values = System.Enum.GetValues(typeof(HideFlags));
			foreach (HideFlags item in values)
			{
				HideFlags value = item;
				hideFlagsValues.Add(((object)(HideFlags)(ref value)).ToString(), value);
			}
		}
	}
	public class TransformControls
	{
		private Vector3Control PositionControl;

		private Vector3Control LocalPositionControl;

		private Vector3Control RotationControl;

		private Vector3Control ScaleControl;

		public GameObjectControls Owner { get; }

		private GameObject Target => Owner.Target;

		public AxisControl CurrentSlidingAxisControl { get; set; }

		public TransformControls(GameObjectControls owner)
		{
			Owner = owner;
			Create();
		}

		public void UpdateTransformControlValues(bool force)
		{
			PositionControl.Update(force);
			LocalPositionControl.Update(force);
			RotationControl.Update(force);
			ScaleControl.Update(force);
		}

		public void UpdateVectorSlider()
		{
			AxisControl currentSlidingAxisControl = CurrentSlidingAxisControl;
			if (currentSlidingAxisControl != null)
			{
				if (!InputManager.GetMouseButton(0))
				{
					currentSlidingAxisControl.slider.value = 0f;
					currentSlidingAxisControl = null;
				}
				else
				{
					AxisControlOperation(currentSlidingAxisControl.slider.value, currentSlidingAxisControl.parent, currentSlidingAxisControl.axis);
				}
			}
		}

		public void AxisControlOperation(float value, Vector3Control parent, int axis)
		{
			//IL_002d: 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_0036: 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_003f: 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_0048: 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)
			//IL_0056: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: 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_00e2: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = Target.transform;
			Vector3 val = (Vector3)(parent.Type switch
			{
				TransformType.Position => transform.position, 
				TransformType.LocalPosition => transform.localPosition, 
				TransformType.Rotation => transform.localEulerAngles, 
				TransformType.Scale => transform.localScale, 
				_ => throw new NotImplementedException(), 
			});
			switch (axis)
			{
			case 0:
				val.x += value;
				break;
			case 1:
				val.y += value;
				break;
			case 2:
				val.z += value;
				break;
			}
			switch (parent.Type)
			{
			case TransformType.Position:
				transform.position = val;
				break;
			case TransformType.LocalPosition:
				transform.localPosition = val;
				break;
			case TransformType.Rotation:
				transform.localEulerAngles = val;
				break;
			case TransformType.Scale:
				transform.localScale = val;
				break;
			}
			UpdateTransformControlValues(force: false);
		}

		public void Create()
		{
			//IL_002f: 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)
			GameObject val = UIFactory.CreateVerticalGroup(Owner.Parent.Content, "TransformControls", false, false, true, true, 2, new Vector4(2f, 2f, 0f, 0f), new Color(0.1f, 0.1f, 0.1f), (TextAnchor?)null);
			int? num = 100;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(val, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			PositionControl = Vector3Control.Create(this, val, "Position:", TransformType.Position);
			LocalPositionControl = Vector3Control.Create(this, val, "Local Position:", TransformType.LocalPosition);
			RotationControl = Vector3Control.Create(this, val, "Rotation:", TransformType.Rotation);
			ScaleControl = Vector3Control.Create(this, val, "Scale:", TransformType.Scale);
		}
	}
	public enum TransformType
	{
		Position,
		LocalPosition,
		Rotation,
		Scale
	}
	public class Vector3Control
	{
		private Vector3 lastValue;

		public TransformControls Owner { get; }

		public GameObject Target => Owner.Owner.Target;

		public Transform Transform => Target.transform;

		public TransformType Type { get; }

		public InputFieldRef MainInput { get; }

		public AxisControl[] AxisControls { get; } = new AxisControl[3];


		public InputFieldRef IncrementInput { get; set; }

		public float Increment { get; set; } = 0.1f;


		private Vector3 CurrentValue => (Vector3)(Type switch
		{
			TransformType.Position => Transform.position, 
			TransformType.LocalPosition => Transform.localPosition, 
			TransformType.Rotation => Transform.localEulerAngles, 
			TransformType.Scale => Transform.localScale, 
			_ => throw new NotImplementedException(), 
		});

		public Vector3Control(TransformControls owner, TransformType type, InputFieldRef input)
		{
			Owner = owner;
			Type = type;
			MainInput = input;
		}

		public void Update(bool force)
		{
			//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_0023: 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_005a: 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)
			Vector3 currentValue = CurrentValue;
			if (force || (!MainInput.Component.isFocused && !((object)(Vector3)(ref lastValue)).Equals((object?)currentValue)))
			{
				MainInput.Text = ParseUtility.ToStringForInput<Vector3>((object)currentValue);
				lastValue = currentValue;
			}
		}

		private void OnTransformInputEndEdit(TransformType type, string input)
		{
			//IL_003a: 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_0087: 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)
			Exception ex = default(Exception);
			switch (type)
			{
			case TransformType.Position:
			{
				Vector3 position = default(Vector3);
				if (ParseUtility.TryParse<Vector3>(input, ref position, ref ex))
				{
					Target.transform.position = position;
				}
				break;
			}
			case TransformType.LocalPosition:
			{
				Vector3 localPosition = default(Vector3);
				if (ParseUtility.TryParse<Vector3>(input, ref localPosition, ref ex))
				{
					Target.transform.localPosition = localPosition;
				}
				break;
			}
			case TransformType.Rotation:
			{
				Vector3 localEulerAngles = default(Vector3);
				if (ParseUtility.TryParse<Vector3>(input, ref localEulerAngles, ref ex))
				{
					Target.transform.localEulerAngles = localEulerAngles;
				}
				break;
			}
			case TransformType.Scale:
			{
				Vector3 localScale = default(Vector3);
				if (ParseUtility.TryParse<Vector3>(input, ref localScale, ref ex))
				{
					Target.transform.localScale = localScale;
				}
				break;
			}
			}
			Owner.UpdateTransformControlValues(force: true);
		}

		private void IncrementInput_OnEndEdit(string value)
		{
			float num = default(float);
			Exception ex = default(Exception);
			if (!ParseUtility.TryParse<float>(value, ref num, ref ex))
			{
				IncrementInput.Text = ParseUtility.ToStringForInput<float>((object)Increment);
				return;
			}
			Increment = num;
			AxisControl[] axisControls = AxisControls;
			foreach (AxisControl axisControl in axisControls)
			{
				axisControl.slider.minValue = 0f - num;
				axisControl.slider.maxValue = num;
			}
		}

		public static Vector3Control Create(TransformControls owner, GameObject transformGroup, string title, TransformType type)
		{
			//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_00cb: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = UIFactory.CreateUIObject("Row_" + title, transformGroup, default(Vector2));
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)null);
			int? num = 25;
			int? num2 = 9999;
			UIFactory.SetLayoutElement(val, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			Text val2 = UIFactory.CreateLabel(val, "PositionLabel", title, (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject = ((Component)val2).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)110, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			InputFieldRef val3 = UIFactory.CreateInputField(val, "InputField", "...");
			GameObject gameObject2 = ((Component)val3.Component).gameObject;
			num2 = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)100, num2, (int?)999, (int?)null, (int?)null, (int?)null, (bool?)null);
			Vector3Control control = new Vector3Control(owner, type, val3);
			UnityHelpers.GetOnEndEdit(val3.Component).AddListener((UnityAction<string>)delegate(string value)
			{
				control.OnTransformInputEndEdit(type, value);
			});
			control.AxisControls[0] = AxisControl.Create(val, "X", 0, control);
			control.AxisControls[1] = AxisControl.Create(val, "Y", 1, control);
			control.AxisControls[2] = AxisControl.Create(val, "Z", 2, control);
			control.IncrementInput = UIFactory.CreateInputField(val, "IncrementInput", "...");
			control.IncrementInput.Text = "0.1";
			GameObject gameObject3 = control.IncrementInput.GameObject;
			int? num3 = 30;
			num2 = 0;
			UIFactory.SetLayoutElement(gameObject3, num3, (int?)25, num2, (int?)null, (int?)null, (int?)null, (bool?)null);
			UnityHelpers.GetOnEndEdit(control.IncrementInput.Component).AddListener((UnityAction<string>)control.IncrementInput_OnEndEdit);
			return control;
		}
	}
	internal class TimeScaleWidget
	{
		private static TimeScaleWidget Instance;

		private ButtonRef lockBtn;

		private bool locked;

		private InputFieldRef timeInput;

		private float desiredTime;

		private bool settingTimeScale;

		public TimeScaleWidget(GameObject parent)
		{
			Instance = this;
			ConstructUI(parent);
			InitPatch();
		}

		public void Update()
		{
			if (locked)
			{
				SetTimeScale(desiredTime);
			}
			if (!timeInput.Component.isFocused)
			{
				timeInput.Text = Time.timeScale.ToString("F2");
			}
		}

		private void SetTimeScale(float time)
		{
			settingTimeScale = true;
			Time.timeScale = time;
			settingTimeScale = false;
		}

		private void OnTimeInputEndEdit(string val)
		{
			if (float.TryParse(val, out var result))
			{
				SetTimeScale(result);
				desiredTime = result;
			}
		}

		private void OnPauseButtonClicked()
		{
			//IL_004f: 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_0054: 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_006c: 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_007c: Unknown result type (might be due to invalid IL or missing references)
			OnTimeInputEndEdit(timeInput.Text);
			locked = !locked;
			Color val = (locked ? new Color(0.3f, 0.3f, 0.2f) : new Color(0.2f, 0.2f, 0.2f));
			RuntimeHelper.SetColorBlock((Selectable)(object)lockBtn.Component, (Color?)val, (Color?)(val * 1.2f), (Color?)(val * 0.7f), (Color?)null);
			lockBtn.ButtonText.text = (locked ? "Unlock" : "Lock");
		}

		private void ConstructUI(GameObject parent)
		{
			//IL_000d: 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)
			Text val = UIFactory.CreateLabel(parent, "TimeLabel", "Time:", (TextAnchor)5, Color.grey, true, 14);
			GameObject gameObject = ((Component)val).gameObject;
			int? num = 25;
			UIFactory.SetLayoutElement(gameObject, (int?)35, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			timeInput = UIFactory.CreateInputField(parent, "TimeInput", "timeScale");
			GameObject gameObject2 = ((Component)timeInput.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject2, (int?)40, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			UnityHelpers.GetOnEndEdit(timeInput.Component).AddListener((UnityAction<string>)OnTimeInputEndEdit);
			timeInput.Text = string.Empty;
			timeInput.Text = Time.timeScale.ToString();
			lockBtn = UIFactory.CreateButton(parent, "PauseButton", "Lock", (Color?)new Color(0.2f, 0.2f, 0.2f));
			GameObject gameObject3 = ((Component)lockBtn.Component).gameObject;
			num = 25;
			UIFactory.SetLayoutElement(gameObject3, (int?)50, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null);
			ButtonRef obj = lockBtn;
			obj.OnClick = (Action)System.Delegate.Combine(obj.OnClick, new Action(OnPauseButtonClicked));
		}

		private static void InitPatch()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Expected O, but got Unknown
			try
			{
				MethodInfo setMethod = typeof(Time).GetProperty("timeScale").GetSetMethod();
				ExplorerCore.Harmony.Patch((MethodBase)setMethod, new HarmonyMethod(AccessTools.Method(typeof(TimeScaleWidget), "Prefix_Time_set_timeScale", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
		}

		private static bool Prefix_Time_set_timeScale()
		{
			return !Instance.locked || Instance.settingTimeScale;
		}
	}
	public class AudioClipWidget : UnityObjectWidget
	{
		private static GameObject AudioPlayerObject;

		private static AudioSource Source;

		private static AudioClipWidget CurrentlyPlaying;

		private static Coroutine CurrentlyPlayingCoroutine;

		private static readonly string zeroLengthString = GetLengthString(0f);

		public AudioClip audioClip;

		private string fullLengthText;

		private ButtonRef toggleButton;

		private bool audioPlayerWanted;

		private GameObject audioPlayerRoot;

		private ButtonRef playStopButton;

		private Text progressLabel;

		private GameObject saveObjectRow;

		private InputFieldRef savePathInput;

		private GameObject cantSaveRow;

		public override void OnBorrowed(object target, Type targetType, ReflectionInspector inspector)
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Invalid comparison between Unknown and I4
			base.OnBorrowed(target, targetType, inspector);
			audioPlayerRoot.transform.SetParent(inspector.UIRoot.transform);
			audioPlayerRoot.transform.SetSiblingIndex(inspector.UIRoot.transform.childCount - 2);
			audioClip = ReflectionExtensions.TryCast<AudioClip>(target);
			fullLengthText = GetLengthString(audioClip.length);
			if ((int)audioClip.loadType == 0)
			{
				cantSaveRow.SetActive(false);
				saveObjectRow.SetActive(true);
				SetDefaultSavePath();
			}
			else
			{
				cantSaveRow.SetActive(true);
				saveObjectRow.SetActive(false);
			}
			ResetProgressLabel();
		}

		public override void OnReturnToPool()
		{
			audioClip = null;
			if (audioPlayerWanted)
			{
				ToggleAudioWidget();
			}
			if (CurrentlyPlaying == this)
			{
				StopClip();
			}
			audioPlayerRoot.transform.SetParent(Pool<AudioClipWidget>.Instance.InactiveHolder.transform);
			base.OnReturnToPool();
		}

		private void ToggleAudioWidget()
		{
			if (audioPlayerWanted)
			{
				audioPlayerWanted = false;
				toggleButton.ButtonText.text = "Show Player";
				audioPlayerRoot.SetActive(false);
			}
			else
			{
				audioPlayerWanted = true;
				toggleButton.ButtonText.text = "Hide Player";
				audioPlayerRoot.SetActive(true);
			}
		}

		private void SetDefaultSavePath()
		{
			string text = ((Object)audioClip).name;
			if (string.IsNullOrEmpty(text))
			{
				text = "untitled";
			}
			savePathInput.Text = Path.Combine(ConfigManager.Default_Output_Path.Value, text + ".wav");
		}

		private static string GetLengthString(float seconds)
		{
			TimeSpan timeSpan = TimeSpan.FromSeconds(seconds);
			StringBuilder stringBuilder = new StringBuilder();
			if (timeSpan.Hours > 0)
			{

UniverseLib.Mono.dll

Decompiled 6 months 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.5.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.5.1.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
				{
				}
			}
		}

		internal 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);
			if ((object)value2 == null)
			{
				value2 = Type.GetType(fullName);
			}
			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.5.1";

		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.5.1 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.5.1 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