Quantcast

- Updated toc to 1.3.3.11404 for WoW 1.14.4 patch.

HonorGoG [08-23-23 - 03:34]
- Updated toc to 1.3.3.11404 for WoW 1.14.4 patch.
- Updated Ace3 and LibUIDropDownMenu libraries.
Filename
TitanClassic/TitanClassic.toc
TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-BCC.toc
TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-Classic.toc
TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-WOTLKC.toc
TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu.toc
TitanClassic/libs/!LibUIDropDownMenu/Docs/Readme.txt
TitanClassic/libs/!LibUIDropDownMenu/Docs/Revision.txt
TitanClassic/libs/!LibUIDropDownMenu/LibStub/LibStub.toc
TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenu.lua
TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenuTemplates.lua
TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenuTemplates.xml
TitanClassic/libs/Ace3.lua
TitanClassic/libs/Ace3.toc
TitanClassic/libs/Ace3_TBC.toc
TitanClassic/libs/Ace3_Vanilla.toc
TitanClassic/libs/Ace3_Wrath.toc
TitanClassic/libs/AceAddon-3.0/AceAddon-3.0.lua
TitanClassic/libs/AceConfig-3.0/AceConfig-3.0.lua
TitanClassic/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
TitanClassic/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
TitanClassic/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
TitanClassic/libs/AceGUI-3.0/AceGUI-3.0.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
TitanClassic/libs/AceHook-3.0/AceHook-3.0.lua
TitanClassic/libs/AceLocale-3.0/AceLocale-3.0.lua
TitanClassic/libs/AceTimer-3.0/AceTimer-3.0.lua
TitanClassic/libs/CHANGES.txt
TitanClassic/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
TitanClassic/libs/LibStub/LibStub.lua
TitanClassic/libs/README.md
TitanClassic/libs/changelog.txt
TitanClassicAmmo/TitanClassicAmmo.toc
TitanClassicBag/TitanClassicBag.toc
TitanClassicClock/TitanClassicClock.toc
TitanClassicGold/TitanClassicGold.toc
TitanClassicLocation/TitanClassicLocation.toc
TitanClassicLootType/TitanClassicLootType.toc
TitanClassicPerformance/TitanClassicPerformance.toc
TitanClassicRegen/TitanClassicRegen.toc
TitanClassicRepair/TitanClassicRepair.toc
TitanClassicVolume/TitanClassicVolume.toc
TitanClassicXP/TitanClassicXP.toc
diff --git a/TitanClassic/TitanClassic.toc b/TitanClassic/TitanClassic.toc
index 4293b5e..348f2de 100644
--- a/TitanClassic/TitanClassic.toc
+++ b/TitanClassic/TitanClassic.toc
@@ -1,7 +1,7 @@
-## Interface: 11403
-## Title: Titan Panel Classic |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic |cff00aa001.3.3.11404|r
 ## Author: Titan Panel Development Team
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## SavedVariables: TitanAll, TitanSettings, TitanSkins, ServerTimeOffsets, ServerHourFormat
 ## OptionalDeps: Ace3, AceGUI-3.0-SharedMediaWidgets, LibSharedMedia-3.0, LibQTip-1.0, !LibUIDropDownMenu
 ## Notes: Adds a display bar on the top and/or bottom of the screen. Allows users to show and control information/launcher plugins.
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-BCC.toc b/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-BCC.toc
new file mode 100755
index 0000000..ff36bbd
--- /dev/null
+++ b/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-BCC.toc
@@ -0,0 +1,12 @@
+## Interface: 20504
+## Title: Lib: UIDropDownMenu
+## Notes: A Replacement for standard UIDropDownMenu
+## Version: v4.21.10010550587
+## X-Category: Libraries
+## X-Website: https://www.wowace.com/projects/libuidropdownmenu
+## OptionalDeps: LibStub
+
+#@no-lib-strip@
+LibStub\LibStub.lua
+#@end-no-lib-strip@
+LibUIDropDownMenu\LibUIDropDownMenu.lua
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-Classic.toc b/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-Classic.toc
new file mode 100755
index 0000000..e956a6c
--- /dev/null
+++ b/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-Classic.toc
@@ -0,0 +1,12 @@
+## Interface: 11403
+## Title: Lib: UIDropDownMenu
+## Notes: A Replacement for standard UIDropDownMenu
+## Version: v4.21.10010550587
+## X-Category: Libraries
+## X-Website: https://www.wowace.com/projects/libuidropdownmenu
+## OptionalDeps: LibStub
+
+#@no-lib-strip@
+LibStub\LibStub.lua
+#@end-no-lib-strip@
+LibUIDropDownMenu\LibUIDropDownMenu.lua
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-WOTLKC.toc b/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-WOTLKC.toc
new file mode 100755
index 0000000..0906c3d
--- /dev/null
+++ b/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu-WOTLKC.toc
@@ -0,0 +1,12 @@
+## Interface: 30402
+## Title: Lib: UIDropDownMenu
+## Notes: A Replacement for standard UIDropDownMenu
+## Version: v4.21.10010550587
+## X-Category: Libraries
+## X-Website: https://www.wowace.com/projects/libuidropdownmenu
+## OptionalDeps: LibStub
+
+#@no-lib-strip@
+LibStub\LibStub.lua
+#@end-no-lib-strip@
+LibUIDropDownMenu\LibUIDropDownMenu.lua
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu.toc b/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu.toc
index dcb9c35..cdac1cb 100755
--- a/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu.toc
+++ b/TitanClassic/libs/!LibUIDropDownMenu/!LibUIDropDownMenu.toc
@@ -1,7 +1,7 @@
-## Interface: 80100
+## Interface: 100105
 ## Title: Lib: UIDropDownMenu
 ## Notes: A Replacement for standard UIDropDownMenu
-## Version: v2.00.8010028833
+## Version: v4.21.10010550587
 ## X-Category: Libraries
 ## X-Website: https://www.wowace.com/projects/libuidropdownmenu
 ## OptionalDeps: LibStub
@@ -9,4 +9,4 @@
 #@no-lib-strip@
 LibStub\LibStub.lua
 #@end-no-lib-strip@
-LibUIDropDownMenu\LibUIDropDownMenu.xml
+LibUIDropDownMenu\LibUIDropDownMenu.lua
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/Docs/Readme.txt b/TitanClassic/libs/!LibUIDropDownMenu/Docs/Readme.txt
index 7e23b95..53674f6 100755
--- a/TitanClassic/libs/!LibUIDropDownMenu/Docs/Readme.txt
+++ b/TitanClassic/libs/!LibUIDropDownMenu/Docs/Readme.txt
@@ -1,3 +1,5 @@
+$Id: Readme.txt 64 2020-11-18 13:13:15Z arithmandar $
+
 == About ==
 Standard UIDropDownMenu global functions using protected frames and causing taints
 when used by third-party addons. But it is possible to avoid taints by using same
@@ -11,11 +13,61 @@ and functions renamed to:
 * functions: "L_" added at the start

 == How to use it (for addon developer) ==
-* Embed LibUIDropDownMenu to your addon, you can specify to the folder to
-  LibUIDropDownMenu\LibUIDropDownMenu if you feel this keep the folder cleaner.
-* Add LibUIDropDownMenu.xml to your toc or your embeds.xml / libs.xml.
-* If your addon doesn't embed LibStub, you will need it.
-* Like ordinal code for UIDropDownMenu with "L_" instead.
+=== Initial Preparation ===
+Assuming your addon is using all the UIDropDownMenu functions from the WoW's
+built in function calls, then it is suggested that you have below preparation
+in your lua codes:
+    local LibDD = LibStub:GetLibrary("LibUIDropDownMenu-4.0")
+
+=== Function Call Replacement ===
+Depends on which UIDropDownMenu's function calls you have used in your addon,
+you will need below similar replacement:
+
+    UIDropDownMenu_Initialize => LibDD:UIDropDownMenu_Initialize
+    UIDropDownMenu_CreateInfo => LibDD:UIDropDownMenu_CreateInfo
+    UIDropDownMenu_AddButton => LibDD:UIDropDownMenu_AddButton
+
+    UIDropDownMenu_AddSeparator => LibDD:UIDropDownMenu_AddSeparator
+    UIDropDownMenu_AddSpace=> LibDD:UIDropDownMenu_AddSpace
+
+    UIDropDownMenu_SetSelectedValue => LibDD:UIDropDownMenu_SetSelectedValue
+    UIDropDownMenu_SetSelectedName=> LibDD:UIDropDownMenu_SetSelectedName
+
+    UIDropDownMenu_SetSelectedID => LibDD:UIDropDownMenu_SetSelectedID
+    UIDropDownMenu_SetWidth => LibDD:UIDropDownMenu_SetWidth
+
+    CloseDropDownMenus => LibDD:CloseDropDownMenus
+
+=== Creating new UIDropDownMenu ===
+Traditionally you will either create a new frame in your lua codes or with
+XML by setting the frame to inherit from "UIDropDownMenuTemplate".
+
+By using this library, you will need to create your menu from like below:
+    local frame = LibDD:Create_UIDropDownMenu("MyDropDownMenu", parent_frame)
+
+== Button Name ==
+As you (the developers) might be aware that at some point you might need to
+manipulate the dropdowns by accessing the button names. For example, you have
+multiple levels of menus and you would like to hide or show some level's menu
+button. In that case, you need to make sure you also revise the button name
+used in your original codes when you are migrating to use LibUIDropDownMenu.
+
+    "L_DropDownList"..i
+
+Example:
+
+	for i = 1, L_UIDROPDOWNMENU_MAXLEVELS, 1 do
+		dropDownList = _G["L_DropDownList"..i];
+		if ( i >= L_UIDROPDOWNMENU_MENU_LEVEL or frame ~= L_UIDROPDOWNMENU_OPEN_MENU ) then
+			dropDownList.numButtons = 0;
+			dropDownList.maxWidth = 0;
+			for j=1, L_UIDROPDOWNMENU_MAXBUTTONS, 1 do
+				button = _G["L_DropDownList"..i.."Button"..j];
+				button:Hide();
+			end
+			dropDownList:Hide();
+		end
+	end

 == Constants ==
 * L_UIDROPDOWNMENU_MINBUTTONS
@@ -32,60 +84,60 @@ and functions renamed to:
 * L_OPEN_DROPDOWNMENUS

 == Functions ==
-* L_EasyMenu
-* L_EasyMenu_Initialize
-
-* L_UIDropDownMenuDelegate_OnAttributeChanged
-* L_UIDropDownMenu_InitializeHelper
-* L_UIDropDownMenu_Initialize
-* L_UIDropDownMenu_SetInitializeFunction
-* L_UIDropDownMenu_RefreshDropDownSize
-* L_UIDropDownMenu_OnUpdate
-* L_UIDropDownMenu_StartCounting
-* L_UIDropDownMenu_StopCounting
-* L_UIDropDownMenu_CheckAddCustomFrame
-* L_UIDropDownMenu_CreateInfo
-* L_UIDropDownMenu_CreateFrames
-* L_UIDropDownMenu_AddSeparator
-* L_UIDropDownMenu_AddButton
-* L_UIDropDownMenu_AddSeparator
-* L_UIDropDownMenu_GetMaxButtonWidth
-* L_UIDropDownMenu_GetButtonWidth
-* L_UIDropDownMenu_Refresh
-* L_UIDropDownMenu_RefreshAll
-* L_UIDropDownMenu_RegisterCustomFrame
-* L_UIDropDownMenu_SetIconImage
-* L_UIDropDownMenu_SetSelectedName
-* L_UIDropDownMenu_SetSelectedValue
-* L_UIDropDownMenu_SetSelectedID
-* L_UIDropDownMenu_GetSelectedName
-* L_UIDropDownMenu_GetSelectedID
-* L_UIDropDownMenu_GetSelectedValue
-* L_UIDropDownMenuButton_OnClick
-* L_HideDropDownMenu
-* L_ToggleDropDownMenu
-* L_CloseDropDownMenus
-* L_UIDropDownMenu_OnHide
-* L_UIDropDownMenu_SetWidth
-* L_UIDropDownMenu_SetButtonWidth
-* L_UIDropDownMenu_SetText
-* L_UIDropDownMenu_GetText
-* L_UIDropDownMenu_ClearAll
-* L_UIDropDownMenu_JustifyText
-* L_UIDropDownMenu_SetAnchor
-* L_UIDropDownMenu_GetCurrentDropDown
-* L_UIDropDownMenuButton_GetChecked
-* L_UIDropDownMenuButton_GetName
-* L_UIDropDownMenuButton_OpenColorPicker
-* L_UIDropDownMenu_DisableButton
-* L_UIDropDownMenu_EnableButton
-* L_UIDropDownMenu_SetButtonText
-* L_UIDropDownMenu_SetButtonNotClickable
-* L_UIDropDownMenu_SetButtonClickable
-* L_UIDropDownMenu_DisableDropDown
-* L_UIDropDownMenu_EnableDropDown
-* L_UIDropDownMenu_IsEnabled
-* L_UIDropDownMenu_GetValue
+* lib:EasyMenu
+* lib:EasyMenu_Initialize
+
+* lib:UIDropDownMenuDelegate_OnAttributeChanged
+* lib:UIDropDownMenu_InitializeHelper
+* lib:UIDropDownMenu_Initialize
+* lib:UIDropDownMenu_SetInitializeFunction
+* lib:UIDropDownMenu_RefreshDropDownSize
+* lib:UIDropDownMenu_OnUpdate
+* lib:UIDropDownMenu_StartCounting
+* lib:UIDropDownMenu_StopCounting
+* lib:UIDropDownMenu_CheckAddCustomFrame
+* lib:UIDropDownMenu_CreateInfo
+* lib:UIDropDownMenu_CreateFrames
+* lib:UIDropDownMenu_AddSeparator
+* lib:UIDropDownMenu_AddButton
+* lib:UIDropDownMenu_AddSeparator
+* lib:UIDropDownMenu_GetMaxButtonWidth
+* lib:UIDropDownMenu_GetButtonWidth
+* lib:UIDropDownMenu_Refresh
+* lib:UIDropDownMenu_RefreshAll
+* lib:UIDropDownMenu_RegisterCustomFrame
+* lib:UIDropDownMenu_SetIconImage
+* lib:UIDropDownMenu_SetSelectedName
+* lib:UIDropDownMenu_SetSelectedValue
+* lib:UIDropDownMenu_SetSelectedID
+* lib:UIDropDownMenu_GetSelectedName
+* lib:UIDropDownMenu_GetSelectedID
+* lib:UIDropDownMenu_GetSelectedValue
+* lib:UIDropDownMenuButton_OnClick
+* lib:HideDropDownMenu
+* lib:ToggleDropDownMenu
+* lib:CloseDropDownMenus
+* lib:UIDropDownMenu_OnHide
+* lib:UIDropDownMenu_SetWidth
+* lib:UIDropDownMenu_SetButtonWidth
+* lib:UIDropDownMenu_SetText
+* lib:UIDropDownMenu_GetText
+* lib:UIDropDownMenu_ClearAll
+* lib:UIDropDownMenu_JustifyText
+* lib:UIDropDownMenu_SetAnchor
+* lib:UIDropDownMenu_GetCurrentDropDown
+* lib:UIDropDownMenuButton_GetChecked
+* lib:UIDropDownMenuButton_GetName
+* lib:UIDropDownMenuButton_OpenColorPicker
+* lib:UIDropDownMenu_DisableButton
+* lib:UIDropDownMenu_EnableButton
+* lib:UIDropDownMenu_SetButtonText
+* lib:UIDropDownMenu_SetButtonNotClickable
+* lib:UIDropDownMenu_SetButtonClickable
+* lib:UIDropDownMenu_DisableDropDown
+* lib:UIDropDownMenu_EnableDropDown
+* lib:UIDropDownMenu_IsEnabled
+* lib:UIDropDownMenu_GetValue

 == List of button attributes ==
 * info.text = [STRING]  --  The text of the button
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/Docs/Revision.txt b/TitanClassic/libs/!LibUIDropDownMenu/Docs/Revision.txt
index 5b8596c..65875da 100755
--- a/TitanClassic/libs/!LibUIDropDownMenu/Docs/Revision.txt
+++ b/TitanClassic/libs/!LibUIDropDownMenu/Docs/Revision.txt
@@ -1,7 +1,162 @@
-$Id: Revision.txt 41 2018-12-26 17:41:59Z arith $
+$Id: Revision.txt 123 2023-07-29 01:42:12Z arithmandar $
+
 Revision History:
 =================

+v4.21.10010550587 (2023/07/29)
+------------------------------
+- Toc update to support WoW 10.1.5 / 3.4.2
+- function sync with build 50587
+
+v4.20.10000748520 (2023/03/20)
+------------------------------
+- Toc update to support WoW 10.0.7
+
+v4.19.10000047936 (2023/02/05)
+------------------------------
+- Toc update to support WoW 10.0.5 / 3.4.1
+
+v4.18.10000046801 (2022/11/29)
+------------------------------
+- Replace SetBackdrop with backdropInfo
+
+v4.17.10000046801 (2022/11/29)
+------------------------------
+- update backdrop template to DialogBorderDarkTemplate
+  - update BACKDROP_DIALOG_DARK.insets.bottom to 11
+- update menubackdrop template to TooltipBackdropTemplate
+
+v4.16.10000046689 (2022/11/18)
+------------------------------
+- Fixing tagging error
+
+v4.15.10000046689 (2022/11/18)
+------------------------------
+- Toc update to support WoW 10.0.2
+- Updated lib:UIDropDownMenu_JustifyText()
+
+v4.14.10000046455 (2022/11/04)
+------------------------------
+- minor bug fix for menu icon onclick
+
+v4.13.10000046366 (2022/11/03)
+-----------------------------
+- Toc update to support WoW 10.0.0
+- function sync with build 46366
+
+v4.12.9020745161 (2022/08/23)
+-----------------------------
+- Classic ToC update to support WoW 1.14.3
+- Release for WOLTKC
+
+v4.11.9020745114 (2022/08/17)
+-----------------------------
+- Toc update to support WoW 9.2.7
+- Added support for Wrath of the Lich King Classic (WoW 3.4.0)
+
+v4.10.9020542423 (2022/07/17)
+-----------------------------
+- Toc update to support WoW 9.2.5
+- function sync with build 44232
+- Fixed: Global Mouse Down making menu not toggle properly from the button (TeeloJubeithos)
+
+v4.09.9020042698 (2022/03/23)
+-----------------------------
+- BCC ToC update to support WoW 2.5.4
+
+v4.09.9020042488 (2022/02/28)
+-----------------------------
+- Fixed issue while in Classic or BCC in counting maximum buttons
+
+v4.08.9020042423 (2022/02/23)
+-----------------------------
+- Toc update to support WoW 9.2.0
+- function sync with build 42423
+
+v4.07.9020042277 (2022/02/13)
+-----------------------------
+- function sync with build 42277
+- enhanced the auto hide feature in ClassicEra and Classic TBC
+
+v4.07.9020042257 (2022/02/10)
+-----------------------------
+- function sync with build 42257
+- BCC ToC update to support WoW 2.5.3
+- Classic ToC update to support WoW 1.14.2
+
+v4.07.9020042174 (2022/02/09)
+-----------------------------
+- Support multiple ToC
+- BCC ToC update to support WoW 2.5.3
+- Classic ToC update to support WoW 1.14.1
+
+v4.07.9020042069 (2022/01/26)
+-----------------------------
+- Toc update to support WoW 9.1.5
+- function sync with build 42069
+- fixed the issue that backdrop was not properly set
+
+v4.06.9010039185 (2021/06/30)
+-----------------------------
+- Toc update to support WoW 9.1.0
+- function sync with build 39185
+
+v4.05.9000538556 (2021/06/14)
+-----------------------------
+- Rework on dropdown menu's audo-hide
+
+v4.04.9000538556 (2021/06/14)
+-----------------------------
+- Allowing dropdown frame to be wihout a name (nil) given (for an anonymous frame)
+- Added timeout for classic (both classic era and TBC) so that dropdown menu will auto-hide when mouse is away (thanks to DahkCeles)
+
+v4.03.9000538556 (2021/05/19)
+-----------------------------
+- Added codes for fixing Tainting UIMenus and CloseMenus() (thanks to DahkCeles)
+
+v4.02.9000538556 (2021/05/19)
+-----------------------------
+- Supported WoW Classic 2.5.1 (38707)
+
+v4.01.9000236639 (2020/12/14)
+-----------------------------
+- Fixed issues that classic server doesn't have UIDropDownMenu_HandleGlobalMouseEvent()
+
+v4.00.9000236639 (2020/11/22)
+-----------------------------
+- Toc update to support WoW 9.0.2
+- LibUIDropDownMenu
+  - Set major version to 4.0
+  - Migrate all global functions to be under library tables
+  - Insert "L_DropDownList1" and "L_DropDownList2" to global UIMenus
+  - UIDropDownMenu_HandleGlobalMouseEvent (thanks to SLOKnightFall)
+- LibEasyMenu
+  - Move function calls to under LibUIDropDownMenu and under library tables
+- LibUIDropDownMenuTemplates
+  - Move codes to under LibUIDropDownMenu so that thet can de under one single library
+
+v3.02.9000136272.01 (2020/10/20)
+-----------------------------
+- Fixed version detection while setting ColorSwatch's backdrop template. It should now be correctly detecting the retail (as well as ShadowLands) version
+
+v3.02.9000136272 (2020/10/18)
+-----------------------------
+- Update to sync with 9.0.1 build 36272
+- ToC update to support WoW 9.0.1
+
+v3.01.9000135522 (2020/09/07)
+-----------------------------
+- Updated Backdrop's handling
+
+v3.00.9000135522 (2020/08/19)
+-----------------------------
+- Shadowlands support and backward compatibility for both WoW classic and BFA
+
+v2.01.8020031429 (2019/08/12)
+-----------------------------
+- Update to sync with 8.2.0 build 31429
+- ToC update
+
 v2.00.8010028833 (2018/12/27)
 -----------------------------
 - Migrate template to Lua function call
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/LibStub/LibStub.toc b/TitanClassic/libs/!LibUIDropDownMenu/LibStub/LibStub.toc
index acd0f7e..bf625c3 100755
--- a/TitanClassic/libs/!LibUIDropDownMenu/LibStub/LibStub.toc
+++ b/TitanClassic/libs/!LibUIDropDownMenu/LibStub/LibStub.toc
@@ -1,4 +1,4 @@
-## Interface: 80000
+## Interface: 90005
 ## Title: Lib: LibStub
 ## Notes: Universal Library Stub
 ## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenu.lua b/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenu.lua
index d6ba8d5..6617c58 100755
--- a/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenu.lua
+++ b/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenu.lua
@@ -1,4 +1,4 @@
--- $Id: LibUIDropDownMenu.lua 78 2021-06-14 08:29:17Z arithmandar $
+-- $Id: LibUIDropDownMenu.lua 123 2023-07-29 01:42:12Z arithmandar $
 -- ----------------------------------------------------------------------------
 -- Localized Lua globals.
 -- ----------------------------------------------------------------------------
@@ -18,7 +18,7 @@ local GameTooltip_SetTitle, GameTooltip_AddInstructionLine, GameTooltip_AddNorma

 -- ----------------------------------------------------------------------------
 local MAJOR_VERSION = "LibUIDropDownMenu-4.0"
-local MINOR_VERSION = 90000 + tonumber(("$Rev: 78 $"):match("%d+"))
+local MINOR_VERSION = 90000 + tonumber(("$Rev: 123 $"):match("%d+"))


 local LibStub = _G.LibStub
@@ -27,17 +27,22 @@ local lib = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
 if not lib then return end

 -- Determine WoW TOC Version
-local WoWClassicEra, WoWClassicTBC, WoWRetail
-local wowtocversion  = select(4, GetBuildInfo())
-if wowtocversion < 20000 then
+local WoWClassicEra, WoWClassicTBC, WoWWOTLKC, WoWRetail
+local wowversion  = select(4, GetBuildInfo())
+if wowversion < 20000 then
 	WoWClassicEra = true
-elseif wowtocversion > 19999 and wowtocversion < 90000 then
+elseif wowversion < 30000 then
 	WoWClassicTBC = true
-else
+elseif wowversion < 40000 then
+	WoWWOTLKC = true
+elseif wowversion > 90000 then
 	WoWRetail = true
+
+else
+	-- n/a
 end

-if WoWClassicEra or WoWClassicTBC then
+if WoWClassicEra or WoWClassicTBC or WoWWOTLKC then
 	GameTooltip = _G.GameTooltip
 	tooltip = GameTooltip
 else -- Retail
@@ -47,8 +52,9 @@ else -- Retail
 end

 -- //////////////////////////////////////////////////////////////
+L_UIDROPDOWNMENU_MINBUTTONS = 8; -- classic only
 L_UIDROPDOWNMENU_MAXBUTTONS = 1;
-L_UIDROPDOWNMENU_MAXLEVELS = 2;
+L_UIDROPDOWNMENU_MAXLEVELS = 3;
 L_UIDROPDOWNMENU_BUTTON_HEIGHT = 16;
 L_UIDROPDOWNMENU_BORDER_HEIGHT = 15;
 -- The current open menu
@@ -63,10 +69,14 @@ L_UIDROPDOWNMENU_MENU_VALUE = nil;
 L_UIDROPDOWNMENU_SHOW_TIME = 2;
 -- Default dropdown text height
 L_UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT = nil;
+-- For Classic checkmarks, this is the additional padding that we give to the button text.
+L_UIDROPDOWNMENU_CLASSIC_CHECK_PADDING = 4;
+-- Default dropdown width padding
+L_UIDROPDOWNMENU_DEFAULT_WIDTH_PADDING = 25;
 -- List of open menus
 L_OPEN_DROPDOWNMENUS = {};

-local L_DropDownList1, L_DropDownList2
+local L_DropDownList1, L_DropDownList2, L_DropDownList3

 local delegateFrame = CreateFrame("FRAME");
 delegateFrame:SetScript("OnAttributeChanged", function(self, attribute, value)
@@ -104,9 +114,178 @@ function lib:UIDropDownMenu_InitializeHelper(frame)
 	end
 	frame:SetHeight(L_UIDROPDOWNMENU_BUTTON_HEIGHT * 2);
 end
+
+function lib:UIDropDownMenuButton_ShouldShowIconTooltip(self)
+	if self.Icon and (self.iconTooltipTitle or self.iconTooltipText) and (self.icon or self.mouseOverIcon) then
+		return GetMouseFocus() == self.Icon;
+	end
+	return false;
+end
+
+
 -- //////////////////////////////////////////////////////////////
 -- L_UIDropDownMenuButtonTemplate
 local function create_MenuButton(name, parent)
+	-- UIDropDownMenuButton Scripts BEGIN
+	local function button_OnEnter(self)
+		if ( self.hasArrow ) then
+			local level =  self:GetParent():GetID() + 1;
+			local listFrame = _G["L_DropDownList"..level];
+			if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint(1)) ~= self ) then
+				lib:ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self, nil, self.menuListDisplayMode);
+			end
+		else
+			lib:CloseDropDownMenus(self:GetParent():GetID() + 1);
+		end
+		self.Highlight:Show();
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+	    		lib:UIDropDownMenu_StopCounting(self:GetParent());
+		end
+		-- To check: do we need special handle for classic since there is no UIDropDownMenuButton_ShouldShowIconTooltip()?
+		-- if ( self.tooltipTitle and not self.noTooltipWhileEnabled ) then
+		if ( self.tooltipTitle and not self.noTooltipWhileEnabled and not lib:UIDropDownMenuButton_ShouldShowIconTooltip(self)) then
+			if ( self.tooltipOnButton ) then
+				tooltip:SetOwner(self, "ANCHOR_RIGHT");
+				GameTooltip_SetTitle(tooltip, self.tooltipTitle);
+				if self.tooltipInstruction then
+					GameTooltip_AddInstructionLine(tooltip, self.tooltipInstruction);
+				end
+				if self.tooltipText then
+					GameTooltip_AddNormalLine(tooltip, self.tooltipText, true);
+				end
+				if self.tooltipWarning then
+					GameTooltip_AddColoredLine(tooltip, self.tooltipWarning, RED_FONT_COLOR, true);
+				end
+				if self.tooltipBackdropStyle then
+					SharedTooltip_SetBackdropStyle(tooltip, self.tooltipBackdropStyle);
+				end
+				tooltip:Show();
+			end
+		end
+
+		if ( self.mouseOverIcon ~= nil ) then
+			self.Icon:SetTexture(self.mouseOverIcon);
+			self.Icon:Show();
+		end
+		if (WoWRetail) then
+			GetValueOrCallFunction(self, "funcOnEnter", self);
+		end
+	end
+
+	local function button_OnLeave(self)
+		self.Highlight:Hide();
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			lib:UIDropDownMenu_StartCounting(self:GetParent());
+		end
+
+		tooltip:Hide();
+
+		if ( self.mouseOverIcon ~= nil ) then
+			if ( self.icon ~= nil ) then
+				self.Icon:SetTexture(self.icon);
+			else
+				self.Icon:Hide();
+			end
+		end
+
+		if (WoWRetail) then
+			GetValueOrCallFunction(self, "funcOnLeave", self);
+		end
+	end
+
+	local function button_OnClick(self, button)
+		local checked = self.checked;
+		if ( type (checked) == "function" ) then
+			checked = checked(self);
+		end
+
+		if ( self.keepShownOnClick ) then
+			if not self.notCheckable then
+				if ( checked ) then
+					_G[self:GetName().."Check"]:Hide();
+					_G[self:GetName().."UnCheck"]:Show();
+					checked = false;
+				else
+					_G[self:GetName().."Check"]:Show();
+					_G[self:GetName().."UnCheck"]:Hide();
+					checked = true;
+				end
+			end
+		else
+			self:GetParent():Hide();
+		end
+
+		if ( type (self.checked) ~= "function" ) then
+			self.checked = checked;
+		end
+
+		-- saving this here because func might use a dropdown, changing this self's attributes
+		local playSound = true;
+		if ( self.noClickSound ) then
+			playSound = false;
+		end
+
+		local func = self.func;
+		if ( func ) then
+			func(self, self.arg1, self.arg2, checked, button);
+		else
+			return;
+		end
+
+		if ( playSound ) then
+			PlaySound(SOUNDKIT.U_CHAT_SCROLL_BUTTON);
+		end
+	end
+	-- UIDropDownMenuButton Scripts END
+
+	-- UIDropDownMenuButtonIcon Script BEGIN
+	local function icon_OnClick(self, button)
+		local button = self:GetParent()
+		if not button then
+			return
+		end
+		button_OnClick(self, button)
+	end
+
+	local function icon_OnEnter(self)
+		local button = self:GetParent();
+		if not button then
+			return;
+		end
+
+		local shouldShowIconTooltip = lib:UIDropDownMenuButton_ShouldShowIconTooltip(button);
+
+		if shouldShowIconTooltip then
+			tooltip:SetOwner(button, "ANCHOR_RIGHT");
+			if button.iconTooltipTitle then
+				GameTooltip_SetTitle(tooltip, button.iconTooltipTitle);
+			end
+			if button.iconTooltipText then
+				GameTooltip_AddNormalLine(tooltip, button.iconTooltipText, true);
+			end
+			if button.iconTooltipBackdropStyle then
+				SharedTooltip_SetBackdropStyle(tooltip, button.iconTooltipBackdropStyle);
+			end
+			tooltip:Show();
+		end
+		button_OnEnter(button);
+	end
+
+	local function icon_OnLeave(self)
+		local button = self:GetParent();
+		if not button then
+			return;
+		end
+
+		button_OnLeave(button);
+	end
+	local function icon_OnMouseUp(self, button)
+		if ( button == "LeftButton" ) then
+			icon_OnClick(self, button)
+		end
+	end
+	-- UIDropDownMenuButtonIcon Script END
+
 	local f = CreateFrame("Button", name, parent or nil)
     f:SetWidth(100)
     f:SetHeight(16)
@@ -130,10 +309,23 @@ local function create_MenuButton(name, parent)
 	f.UnCheck:SetPoint("LEFT", f, 0, 0)
 	f.UnCheck:SetTexCoord(0.5, 1, 0.5, 1)

-	f.Icon = f:CreateTexture(name.."Icon", "ARTWORK")
-	f.Icon:SetSize(16, 16)
-	f.Icon:SetPoint("RIGHT", f, 0, 0)
-	f.Icon:Hide()
+	local fIcon
+	fIcon = f:CreateTexture(name.."Icon", "ARTWORK")
+	fIcon:SetSize(16, 16)
+	fIcon:SetPoint("RIGHT", f, 0, 0)
+	fIcon:Hide()
+	if (WoWRetail) then
+		fIcon:SetScript("OnEnter", function(self)
+			icon_OnEnter(self)
+		end)
+		fIcon:SetScript("OnLeave", function(self)
+			icon_OnLeave(self)
+		end)
+		fIcon:SetScript("OnMouseUp", function(self, button)
+			icon_OnMouseUp(self, button)
+		end)
+	end
+	f.Icon = fIcon

 	-- ColorSwatch
 	local fcw
@@ -206,6 +398,9 @@ local function create_MenuButton(name, parent)
 	fib:SetPoint("BOTTOMLEFT", f, 0, 0)
 	fib:SetPoint("RIGHT", fcw, "LEFT", 0, 0)
 	fib:SetScript("OnEnter", function(self, motion)
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			lib:UIDropDownMenu_StopCounting(self:GetParent():GetParent());
+		end
 		lib:CloseDropDownMenus(self:GetParent():GetParent():GetID() + 1);
 		local parent = self:GetParent();
 		if ( parent.tooltipTitle and parent.tooltipWhileDisabled) then
@@ -221,115 +416,23 @@ local function create_MenuButton(name, parent)
 				if parent.tooltipWarning then
 					GameTooltip_AddColoredLine(tooltip, parent.tooltipWarning, RED_FONT_COLOR, true);
 				end
+				if parent.tooltipBackdropStyle then
+					SharedTooltip_SetBackdropStyle(tooltip, parent.tooltipBackdropStyle);
+				end
 				tooltip:Show();
 			end
 		end
 	end)
 	fib:SetScript("OnLeave", function(self, motion)
-		lib:UIDropDownMenu_StartCounting(self:GetParent():GetParent());
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			lib:UIDropDownMenu_StartCounting(self:GetParent():GetParent());
+		end
 		tooltip:Hide();
 	end)
 	f.invisibleButton = fib

-	-- UIDropDownMenuButton Scripts
-	local function button_OnEnter(self)
-		if ( self.hasArrow ) then
-			local level =  self:GetParent():GetID() + 1;
-			local listFrame = _G["L_DropDownList"..level];
-			if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
-				lib:ToggleDropDownMenu(self:GetParent():GetID() + 1, self.value, nil, nil, nil, nil, self.menuList, self);
-			end
-		else
-			lib:CloseDropDownMenus(self:GetParent():GetID() + 1);
-		end
-		self.Highlight:Show();
-	    	lib:UIDropDownMenu_StopCounting(self:GetParent());
-
-		if ( self.tooltipTitle and not self.noTooltipWhileEnabled ) then
-			if ( self.tooltipOnButton ) then
-				tooltip:SetOwner(self, "ANCHOR_RIGHT");
-				GameTooltip_SetTitle(tooltip, self.tooltipTitle);
-				if self.tooltipText then
-					GameTooltip_AddNormalLine(tooltip, self.tooltipText, true);
-				end
-				tooltip:Show();
-			end
-		end
-
-		if ( self.mouseOverIcon ~= nil ) then
-			self.Icon:SetTexture(self.mouseOverIcon);
-			self.Icon:Show();
-		end
-		if WoWRetail then
-			GetValueOrCallFunction(self, "funcOnEnter", self);
-		end
-	end
-
-	local function button_OnLeave(self)
-		self.Highlight:Hide();
-		lib:UIDropDownMenu_StartCounting(self:GetParent());
-
-		tooltip:Hide();
-
-		if ( self.mouseOverIcon ~= nil ) then
-			if ( self.icon ~= nil ) then
-				self.Icon:SetTexture(self.icon);
-			else
-				self.Icon:Hide();
-			end
-		end
-
-		if WoWRetail then
-			GetValueOrCallFunction(self, "funcOnLeave", self);
-		end
-	end
-
-	local function button_OnClick(self)
-		local checked = self.checked;
-		if ( type (checked) == "function" ) then
-			checked = checked(self);
-		end
-
-		if ( self.keepShownOnClick ) then
-			if not self.notCheckable then
-				if ( checked ) then
-					_G[self:GetName().."Check"]:Hide();
-					_G[self:GetName().."UnCheck"]:Show();
-					checked = false;
-				else
-					_G[self:GetName().."Check"]:Show();
-					_G[self:GetName().."UnCheck"]:Hide();
-					checked = true;
-				end
-			end
-		else
-			self:GetParent():Hide();
-		end
-
-		if ( type (self.checked) ~= "function" ) then
-			self.checked = checked;
-		end
-
-		-- saving this here because func might use a dropdown, changing this self's attributes
-		local playSound = true;
-		if ( self.noClickSound ) then
-			playSound = false;
-		end
-
-		local func = self.func;
-		if ( func ) then
-			func(self, self.arg1, self.arg2, checked);
-		else
-			return;
-		end
-
-		if ( playSound ) then
-			PlaySound(SOUNDKIT.U_CHAT_SCROLL_BUTTON);
-		end
-	end
-
-	f:SetScript("OnClick", function(self, button, down)
-		button_OnClick(self, button, down)
+	f:SetScript("OnClick", function(self, button)
+		button_OnClick(self, button)
 	end)
 	f:SetScript("OnEnter", function(self, motion)
 		button_OnEnter(self)
@@ -356,56 +459,60 @@ end

 -- //////////////////////////////////////////////////////////////
 -- L_UIDropDownListTemplate
-local BACKDROP_DIALOG_DARK = {
+local function creatre_DropDownList(name, parent)
+	-- This has been removed from Backdrop.lua, so we added the definition here.
+	local BACKDROP_DIALOG_DARK = {
 		bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background-Dark",
 		edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
 		tile = true,
+		tileEdge = true,
 		tileSize = 32,
 		edgeSize = 32,
-		insets = { left = 11, right = 12, top = 12, bottom = 9, },
-}
-local BACKDROP_TOOLTIP_16_16_5555 = {
-	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true,
-	tileEdge = true,
-	tileSize = 16,
-	edgeSize = 16,
-	insets = { left = 5, right = 5, top = 5, bottom = 5 },
-};
-
-local function creatre_DropDownList(name, parent)
+		insets = { left = 11, right = 12, top = 12, bottom = 11, },
+	}
+	local BACKDROP_TOOLTIP_16_16_5555 = {
+		bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
+		edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
+		tile = true,
+		tileEdge = true,
+		tileSize = 16,
+		edgeSize = 16,
+		insets = { left = 5, right = 5, top = 5, bottom = 5 },
+	}
+
 	local f = _G[name] or CreateFrame("Button", name)
 	f:SetParent(parent or nil)
 	f:Hide()
 	f:SetFrameStrata("DIALOG")
 	f:EnableMouse(true)

-	--local fbd = _G[name.."Border"] or CreateFrame("Frame", name.."Border", f, BackdropTemplateMixin and "DialogBorderDarkTemplate" or nil)
-	local fbd = _G[name.."Border"] or CreateFrame("Frame", name.."Border", f, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local fbd = _G[name.."Backdrop"] or CreateFrame("Frame", name.."Backdrop", f, BackdropTemplateMixin and "DialogBorderDarkTemplate" or nil)
 	fbd:SetAllPoints()
-	fbd:SetBackdrop(BACKDROP_DIALOG_DARK)
-	f.Border = fbd
+	fbd.backdropInfo = BACKDROP_DIALOG_DARK
+	f.Backdrop = fbd

-	--local fmb = _G[name.."MenuBackdrop"] or CreateFrame("Frame", name.."MenuBackdrop", f, BackdropTemplateMixin and "TooltipBackdropTemplate" or nil)
-	local fmb = _G[name.."MenuBackdrop"] or CreateFrame("Frame", name.."MenuBackdrop", f, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local fmb = _G[name.."MenuBackdrop"] or CreateFrame("Frame", name.."MenuBackdrop", f, TooltipBackdropTemplateMixin and "TooltipBackdropTemplate" or nil)
 	fmb:SetAllPoints()
-	fmb:SetBackdrop(BACKDROP_TOOLTIP_16_16_5555)
+	fmb.backdropInfo = BACKDROP_TOOLTIP_16_16_5555
 	fmb:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b)
 	fmb:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b)
 	f.MenuBackdrop = fmb

-	f.Button1 = _G[name.."Button1"] or create_MenuButton(name.."Button1", f)
+	f.Button1 = _G[name.."Button1"] or create_MenuButton(name.."Button1", f) -- to replace the inherits of "UIDropDownMenuButtonTemplate"
 	f.Button1:SetID(1)

 	f:SetScript("OnClick", function(self)
 		self:Hide()
 	end)
 	f:SetScript("OnEnter", function(self, motion)
-		lib:UIDropDownMenu_StopCounting(self, motion)
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			lib:UIDropDownMenu_StopCounting(self, motion)
+		end
 	end)
 	f:SetScript("OnLeave", function(self, motion)
-		lib:UIDropDownMenu_StartCounting(self, motion)
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			lib:UIDropDownMenu_StartCounting(self, motion)
+		end
 	end)
 	-- If dropdown is visible then see if its timer has expired, if so hide the frame
 	f:SetScript("OnUpdate", function(self, elapsed)
@@ -413,14 +520,16 @@ local function creatre_DropDownList(name, parent)
 			lib:UIDropDownMenu_RefreshDropDownSize(self);
 			self.shouldRefresh = false;
 		end
-		if ( not self.showTimer or not self.isCounting ) then
-			return;
-		elseif ( self.showTimer < 0 ) then
-			self:Hide();
-			self.showTimer = nil;
-			self.isCounting = nil;
-		else
-			self.showTimer = self.showTimer - elapsed;
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			if ( not self.showTimer or not self.isCounting ) then
+				return;
+			elseif ( self.showTimer < 0 ) then
+				self:Hide();
+				self.showTimer = nil;
+				self.isCounting = nil;
+			else
+				self.showTimer = self.showTimer - elapsed;
+			end
 		end
 	end)
 	f:SetScript("OnShow", function(self)
@@ -438,20 +547,13 @@ local function creatre_DropDownList(name, parent)
 		if (not self.noResize) then
 			self:SetWidth(self.maxWidth+25);
 		end
-		self.showTimer = nil;
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			self.showTimer = nil;
+		end
 		if ( self:GetID() > 1 ) then
 			self.parent = _G["L_DropDownList"..(self:GetID() - 1)];
 		end
---[[
-		-- codes by DahkCeles
-		if (WoWClassicEra or WoWClassicTBC) then
-			self.hideTimer = self.hideTimer or C_Timer.NewTicker(L_UIDROPDOWNMENU_SHOW_TIME, function()
-				if (GetMouseFocus() ~= self) then
-					self:Hide();
-				end
-			end)
-		end
-]]
+		EventRegistry:TriggerEvent("UIDropDownMenu.Show", self);
 	end)
 	f:SetScript("OnHide", function(self)
 		local id = self:GetID()
@@ -459,26 +561,18 @@ local function creatre_DropDownList(name, parent)
 			self.onHide(id+1);
 			self.onHide = nil;
 		end
+		if ( self.baseFrameStrata ) then
+			self:SetFrameStrata(self.baseFrameStrata);
+			self.baseFrameStrata = nil;
+		end
 		lib:CloseDropDownMenus(id+1);
 		L_OPEN_DROPDOWNMENUS[id] = nil;
 		if (id == 1) then
 			L_UIDROPDOWNMENU_OPEN_MENU = nil;
 		end

-		if self.customFrames then
-			for index, frame in ipairs(self.customFrames) do
-				frame:Hide();
-			end
-
-			self.customFrames = nil;
-		end
---[[
-		-- codes by DahkCeles
-		if (self.hideTimer) then
-			self.hideTimer:Cancel();
-			self.hideTimer = nil;
-		end
-]]
+		lib:UIDropDownMenu_ClearCustomFrames(self);
+		EventRegistry:TriggerEvent("UIDropDownMenu.Hide");
 	end)

 	return f
@@ -528,6 +622,7 @@ local function create_DropDownMenu(name, parent)
 	f.Icon:SetSize(16, 16)
 	f.Icon:SetPoint("LEFT", 30, 2)

+	-- // UIDropDownMenuButtonScriptTemplate
 	f.Button = CreateFrame("Button", name.."Button", f)
 	f.Button:SetMotionScriptsWhileDisabled(true)
 	f.Button:SetSize(24, 24)
@@ -575,9 +670,9 @@ local function create_DropDownMenu(name, parent)
 	end)
 	f.Button:SetScript("OnMouseDown", function(self, button)
 		if self:IsEnabled() then
-		local parent = self:GetParent()
-		lib:ToggleDropDownMenu(nil, nil, parent)
-		PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
+			local parent = self:GetParent()
+			lib:ToggleDropDownMenu(nil, nil, parent)
+			PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
 		end
 	end)

@@ -610,14 +705,23 @@ local function create_DropDownButtons()
 	L_DropDownList2:SetID(2)
 	L_DropDownList2:SetSize(180, 10)

+	L_DropDownList3 = creatre_DropDownList("L_DropDownList3")
+	L_DropDownList3:SetToplevel(true)
+	L_DropDownList3:SetFrameStrata("FULLSCREEN_DIALOG")
+	L_DropDownList3:Hide()
+	L_DropDownList3:SetID(3)
+	L_DropDownList3:SetSize(180, 10)
+
 	-- UIParent integration; since we customize the name of DropDownList, we need to add it to golbal UIMenus table.
 	--tinsert(UIMenus, "L_DropDownList1");
 	--tinsert(UIMenus, "L_DropDownList2");
+	--tinsert(UIMenus, "L_DropDownList3");

 	-- Alternative by Dahk Celes (DDC) that avoids tainting UIMenus and CloseMenus()
 	hooksecurefunc("CloseMenus", function()
 		L_DropDownList1:Hide()
 		L_DropDownList2:Hide()
+		L_DropDownList3:Hide()
 	end)
 end

@@ -694,6 +798,10 @@ function lib:UIDropDownMenu_SetDisplayMode(frame, displayMode)
 	end
 end

+function lib:UIDropDownMenu_SetFrameStrata(frame, frameStrata)
+	frame.listFrameStrata = frameStrata;
+end
+
 function lib:UIDropDownMenu_RefreshDropDownSize(self)
 	self.maxWidth = lib:UIDropDownMenu_GetMaxButtonWidth(self);
 	self:SetWidth(self.maxWidth + 25);
@@ -739,6 +847,7 @@ info.isTitle = [nil, true]  --  If it's a title the button is disabled and the f
 info.disabled = [nil, true]  --  Disable the button and show an invisible button that still traps the mouseover event so menu doesn't time out
 info.tooltipWhileDisabled = [nil, 1] -- Show the tooltip, even when the button is disabled.
 info.hasArrow = [nil, true]  --  Show the expand arrow for multilevel menus
+info.arrowXOffset = [nil, NUMBER] -- Number of pixels to shift the button's icon to the left or right (positive numbers shift right, negative numbers shift left).
 info.hasColorSwatch = [nil, true]  --  Show color swatch or not, for color selection
 info.r = [1 - 255]  --  Red color value of the color swatch
 info.g = [1 - 255]  --  Green color value of the color swatch
@@ -755,20 +864,31 @@ info.owner = [Frame]  --  Dropdown frame that "owns" the current dropdownlist
 info.keepShownOnClick = [nil, 1]  --  Don't hide the dropdownlist after a button is clicked
 info.tooltipTitle = [nil, STRING] -- Title of the tooltip shown on mouseover
 info.tooltipText = [nil, STRING] -- Text of the tooltip shown on mouseover
+info.tooltipWarning = [nil, STRING] -- Warning-style text of the tooltip shown on mouseover
+info.tooltipInstruction = [nil, STRING] -- Instruction-style text of the tooltip shown on mouseover
 info.tooltipOnButton = [nil, 1] -- Show the tooltip attached to the button instead of as a Newbie tooltip.
+info.tooltipBackdropStyle = [nil, TABLE] -- Optional Backdrop style of the tooltip shown on mouseover
 info.justifyH = [nil, "CENTER"] -- Justify button text
 info.arg1 = [ANYTHING] -- This is the first argument used by info.func
 info.arg2 = [ANYTHING] -- This is the second argument used by info.func
 info.fontObject = [FONT] -- font object replacement for Normal and Highlight
-info.menuTable = [TABLE] -- This contains an array of info tables to be displayed as a child menu
+info.menuList = [TABLE] -- This contains an array of info tables to be displayed as a child menu
+info.menuListDisplayMode = [nil, "MENU"] -- If menuList is set, show the sub drop down with an override display mode.
 info.noClickSound = [nil, 1]  --  Set to 1 to suppress the sound when clicking the button. The sound only plays if .func is set.
 info.padding = [nil, NUMBER] -- Number of pixels to pad the text on the right side
+info.topPadding = [nil, NUMBER] -- Extra spacing between buttons.
 info.leftPadding = [nil, NUMBER] -- Number of pixels to pad the button on the left side
 info.minWidth = [nil, NUMBER] -- Minimum width for this line
 info.customFrame = frame -- Allows this button to be a completely custom frame, should inherit from UIDropDownCustomMenuEntryTemplate and override appropriate methods.
 info.icon = [TEXTURE] -- An icon for the button.
+info.iconXOffset = [nil, NUMBER] -- Number of pixels to shift the button's icon to the left or right (positive numbers shift right, negative numbers shift left).
+info.iconTooltipTitle = [nil, STRING] -- Title of the tooltip shown on icon mouseover
+info.iconTooltipText = [nil, STRING] -- Text of the tooltip shown on icon mouseover
+info.iconTooltipBackdropStyle = [nil, TABLE] -- Optional Backdrop style of the tooltip shown on icon mouseover
 info.mouseOverIcon = [TEXTURE] -- An override icon when a button is moused over.
 info.ignoreAsMenuSelection [nil, true] -- Never set the menu text/icon to this, even when this button is checked
+info.registerForRightClick [nil, true] -- Register dropdown buttons for right clicks
+info.registerForAnyClick [nil, true] -- Register dropdown buttons for any clicks
 ]]

 -- Create (return) empty table
@@ -787,6 +907,7 @@ function lib:UIDropDownMenu_CreateFrames(level, index)
 		newList:SetID(L_UIDROPDOWNMENU_MAXLEVELS);
 		newList:SetWidth(180)
 		newList:SetHeight(10)
+--		for i = WoWRetail and 1 or (L_UIDROPDOWNMENU_MINBUTTONS+1), L_UIDROPDOWNMENU_MAXBUTTONS do
 		for i=1, L_UIDROPDOWNMENU_MAXBUTTONS do
 			--local newButton = CreateFrame("Button", "L_DropDownList"..L_UIDROPDOWNMENU_MAXLEVELS.."Button"..i, newList, "L_UIDropDownMenuButtonTemplate");
 			local newButton = create_MenuButton("L_DropDownList"..L_UIDROPDOWNMENU_MAXLEVELS.."Button"..i, newList)
@@ -889,6 +1010,14 @@ function lib:UIDropDownMenu_AddButton(info, level)
 	invisibleButton:Hide();
 	button:Enable();

+	if ( info.registerForAnyClick ) then
+		button:RegisterForClicks("AnyUp");
+	elseif ( info.registerForRightClick ) then
+		button:RegisterForClicks("LeftButtonUp", "RightButtonUp");
+	else
+		button:RegisterForClicks("LeftButtonUp");
+	end
+
 	-- If not clickable then disable the button and set it white
 	if ( info.notClickable ) then
 		info.disabled = true;
@@ -925,9 +1054,19 @@ function lib:UIDropDownMenu_AddButton(info, level)
 		-- Set icon
 		if ( info.icon or info.mouseOverIcon ) then
 			icon:SetSize(16,16);
-			icon:SetTexture(info.icon);
-			icon:ClearAllPoints();
-			icon:SetPoint("RIGHT");
+			if (WoWRetail) then
+				if(info.icon and C_Texture.GetAtlasInfo(info.icon)) then
+					icon:SetAtlas(info.icon);
+				else
+					icon:SetTexture(info.icon);
+				end
+				icon:ClearAllPoints();
+				icon:SetPoint("RIGHT", info.iconXOffset or 0, 0);
+			else
+				icon:SetTexture(info.icon);
+				icon:ClearAllPoints();
+				icon:SetPoint("RIGHT");
+			end

 			if ( info.tCoordLeft ) then
 				icon:SetTexCoord(info.tCoordLeft, info.tCoordRight, info.tCoordTop, info.tCoordBottom);
@@ -975,6 +1114,12 @@ function lib:UIDropDownMenu_AddButton(info, level)
 	button.func = info.func;
 	button.funcOnEnter = info.funcOnEnter;
 	button.funcOnLeave = info.funcOnLeave;
+	if (WoWRetail) then
+		button.iconXOffset = info.iconXOffset;
+		button.ignoreAsMenuSelection = info.ignoreAsMenuSelection;
+	else
+		button.classicChecks = info.classicChecks;
+	end
 	button.owner = info.owner;
 	button.hasOpacity = info.hasOpacity;
 	button.opacity = info.opacity;
@@ -989,9 +1134,11 @@ function lib:UIDropDownMenu_AddButton(info, level)
 	button.arg1 = info.arg1;
 	button.arg2 = info.arg2;
 	button.hasArrow = info.hasArrow;
+	button.arrowXOffset = info.arrowXOffset;
 	button.hasColorSwatch = info.hasColorSwatch;
 	button.notCheckable = info.notCheckable;
 	button.menuList = info.menuList;
+	button.menuListDisplayMode = info.menuListDisplayMode;
 	button.tooltipWhileDisabled = info.tooltipWhileDisabled;
 	button.noTooltipWhileEnabled = info.noTooltipWhileEnabled;
 	button.tooltipOnButton = info.tooltipOnButton;
@@ -999,9 +1146,18 @@ function lib:UIDropDownMenu_AddButton(info, level)
 	button.padding = info.padding;
 	button.icon = info.icon;
 	button.mouseOverIcon = info.mouseOverIcon;
-	button.ignoreAsMenuSelection = info.ignoreAsMenuSelection;
+	if (WoWRetail) then
+		button.tooltipBackdropStyle = info.tooltipBackdropStyle;
+		button.iconTooltipTitle = info.iconTooltipTitle;
+		button.iconTooltipText = info.iconTooltipText;
+		button.iconTooltipBackdropStyle = info.iconTooltipBackdropStyle;
+		button.iconXOffset = info.iconXOffset;
+		button.ignoreAsMenuSelection = info.ignoreAsMenuSelection;
+	else
+		button.classicChecks = info.classicChecks;
+	end

-	if ( info.value ) then
+	if ( info.value ~= nil ) then
 		button.value = info.value;
 	elseif ( info.text ) then
 		button.value = info.text;
@@ -1010,12 +1166,14 @@ function lib:UIDropDownMenu_AddButton(info, level)
 	end

 	local expandArrow = _G[listFrameName.."Button"..index.."ExpandArrow"];
+	expandArrow:SetPoint("RIGHT", info.arrowXOffset or 0, 0);
 	expandArrow:SetShown(info.hasArrow);
 	expandArrow:SetEnabled(not info.disabled);

 	-- If not checkable move everything over to the left to fill in the gap where the check would be
 	local xPos = 5;
-	local yPos = -((button:GetID() - 1) * L_UIDROPDOWNMENU_BUTTON_HEIGHT) - L_UIDROPDOWNMENU_BORDER_HEIGHT;
+	local buttonHeight = (info.topPadding or 0) + L_UIDROPDOWNMENU_BUTTON_HEIGHT;
+	local yPos = -((button:GetID() - 1) * buttonHeight) - L_UIDROPDOWNMENU_BORDER_HEIGHT;
 	local displayInfo = normalText;
 	if (info.iconOnly) then
 		displayInfo = icon;
@@ -1061,7 +1219,7 @@ function lib:UIDropDownMenu_AddButton(info, level)
 			if ( button:GetID() == lib:UIDropDownMenu_GetSelectedID(frame) ) then
 				info.checked = 1;
 			end
-		elseif ( lib:UIDropDownMenu_GetSelectedValue(frame) ) then
+		elseif ( lib:UIDropDownMenu_GetSelectedValue(frame) ~= nil ) then
 			if ( button.value == lib:UIDropDownMenu_GetSelectedValue(frame) ) then
 				info.checked = 1;
 			end
@@ -1082,6 +1240,11 @@ function lib:UIDropDownMenu_AddButton(info, level)
 			uncheck:SetDesaturated(false);
 			uncheck:SetAlpha(1);
 		end
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			check:SetSize(16,16);
+			uncheck:SetSize(16,16);
+			normalText:SetPoint("LEFT", check, "RIGHT", 0, 0);
+		end

 		if info.customCheckIconAtlas or info.customCheckIconTexture then
 			check:SetTexCoord(0, 1, 0, 1);
@@ -1094,6 +1257,17 @@ function lib:UIDropDownMenu_AddButton(info, level)
 				check:SetTexture(info.customCheckIconTexture);
 				uncheck:SetTexture(info.customUncheckIconTexture or info.customCheckIconTexture);
 			end
+		elseif info.classicChecks then
+			check:SetTexCoord(0, 1, 0, 1);
+			uncheck:SetTexCoord(0, 1, 0, 1);
+
+			check:SetSize(24,24);
+			uncheck:SetSize(24,24);
+
+			check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check");
+			uncheck:SetTexture("");
+
+			normalText:SetPoint("LEFT", check, "RIGHT", L_UIDROPDOWNMENU_CLASSIC_CHECK_PADDING, 0);
 		elseif info.isNotRadio then
 			check:SetTexCoord(0.0, 0.5, 0.0, 0.5);
 			check:SetTexture("Interface\\Common\\UI-DropDownRadioChecks");
@@ -1131,7 +1305,7 @@ function lib:UIDropDownMenu_AddButton(info, level)
 	-- If has a colorswatch, show it and vertex color it
 	local colorSwatch = _G[listFrameName.."Button"..index.."ColorSwatch"];
 	if ( info.hasColorSwatch ) then
-		if (WoWClassicEra or WoWClassicTBC) then
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
 			_G["L_DropDownList"..level.."Button"..index.."ColorSwatch".."NormalTexture"]:SetVertexColor(info.r, info.g, info.b);
 		else
 			_G["L_DropDownList"..level.."Button"..index.."ColorSwatch"].Color:SetVertexColor(info.r, info.g, info.b);
@@ -1156,8 +1330,22 @@ function lib:UIDropDownMenu_AddButton(info, level)
 		listFrame.maxWidth = width;
 	end

-	-- Set the height of the listframe
-	listFrame:SetHeight((index * L_UIDROPDOWNMENU_BUTTON_HEIGHT) + (L_UIDROPDOWNMENU_BORDER_HEIGHT * 2));
+	if (WoWRetail) then
+		local customFrameCount = listFrame.customFrames and #listFrame.customFrames or 0;
+		local height = ((index - customFrameCount) * buttonHeight) + (L_UIDROPDOWNMENU_BORDER_HEIGHT * 2);
+		for frameIndex = 1, customFrameCount do
+			local frame = listFrame.customFrames[frameIndex];
+			height = height + frame:GetPreferredEntryHeight();
+		end
+
+		-- Set the height of the listframe
+		listFrame:SetHeight(height);
+	else
+		-- Set the height of the listframe
+		listFrame:SetHeight((index * L_UIDROPDOWNMENU_BUTTON_HEIGHT) + (L_UIDROPDOWNMENU_BORDER_HEIGHT * 2));
+	end
+
+	return button;
 end

 function lib:UIDropDownMenu_CheckAddCustomFrame(self, button, info)
@@ -1214,6 +1402,9 @@ function lib:UIDropDownMenu_GetButtonWidth(button)
 			-- Add padding for the icon
 			width = width + 10;
 		end
+		if ( button.classicChecks ) then
+			width = width + L_UIDROPDOWNMENU_CLASSIC_CHECK_PADDING;
+		end
 	else
 		return minWidth;
 	end
@@ -1377,6 +1568,14 @@ function lib:UIDropDownMenu_GetSelectedID(frame)
 		return frame.selectedID;
 	else
 		-- If no explicit selectedID then try to send the id of a selected value or name
+--[[		local maxNum;
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			maxNum = L_UIDROPDOWNMENU_MAXBUTTONS
+		else
+			local listFrame = _G["L_DropDownList"..L_UIDROPDOWNMENU_MENU_LEVEL];
+			maxNum = listFrame.numButtons
+		end
+		for i=1, maxNum do]]
 		local listFrame = _G["L_DropDownList"..L_UIDROPDOWNMENU_MENU_LEVEL];
 		for i=1, listFrame.numButtons do
 			local button = _G["L_DropDownList"..L_UIDROPDOWNMENU_MENU_LEVEL.."Button"..i];
@@ -1403,7 +1602,7 @@ function lib:HideDropDownMenu(level)
 	listFrame:Hide();
 end

-function lib:ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset, yOffset, menuList, button, autoHideDelay)
+function lib:ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset, yOffset, menuList, button, autoHideDelay, overrideDisplayMode)
 	if ( not level ) then
 		level = 1;
 	end
@@ -1414,6 +1613,10 @@ function lib:ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset
 	L_UIDROPDOWNMENU_MENU_VALUE = value;
 	local listFrameName = "L_DropDownList"..level;
 	local listFrame = _G[listFrameName];
+	if (WoWRetail) then
+		lib:UIDropDownMenu_ClearCustomFrames(listFrame);
+	end
+
 	local tempFrame;
 	local point, relativePoint, relativeTo;
 	if ( not dropDownFrame ) then
@@ -1529,22 +1732,33 @@ function lib:ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset
 			listFrame:SetPoint(point, anchorFrame, relativePoint, 0, 0);
 		end

-		-- Change list box appearance depending on display mode
-		if ( dropDownFrame and dropDownFrame.displayMode == "MENU" ) then
-			_G[listFrameName.."Border"]:Hide();
-			_G[listFrameName.."MenuBackdrop"]:Show();
-		else
-			_G[listFrameName.."Border"]:Show();
+		if dropDownFrame.hideBackdrops then
+			_G[listFrameName.."Backdrop"]:Hide();
 			_G[listFrameName.."MenuBackdrop"]:Hide();
+		else
+			-- Change list box appearance depending on display mode
+			local displayMode = overrideDisplayMode or (dropDownFrame and dropDownFrame.displayMode) or nil;
+			if ( displayMode == "MENU" ) then
+				_G[listFrameName.."Backdrop"]:Hide();
+				_G[listFrameName.."MenuBackdrop"]:Show();
+			else
+				_G[listFrameName.."Backdrop"]:Show();
+				_G[listFrameName.."MenuBackdrop"]:Hide();
+			end
 		end
-		dropDownFrame.menuList = menuList;
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			dropDownFrame.menuList = menuList;
+		end
+
 		lib:UIDropDownMenu_Initialize(dropDownFrame, dropDownFrame.initialize, nil, level, menuList);
 		-- If no items in the drop down don't show it
 		if ( listFrame.numButtons == 0 ) then
 			return;
 		end

-		listFrame.onShow = dropDownFrame.listFrameOnShow;
+		if (WoWRetail) then
+			listFrame.onShow = dropDownFrame.listFrameOnShow;
+		end

 		-- Check to see if the dropdownlist is off the screen, if it is anchor it to the top of the dropdown button
 		listFrame:Show();
@@ -1558,6 +1772,11 @@ function lib:ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset

 		listFrame.onHide = dropDownFrame.onHide;

+		-- Set the listframe frameStrata
+		if dropDownFrame.listFrameStrata then
+			listFrame.baseFrameStrata = listFrame:GetFrameStrata();
+			listFrame:SetFrameStrata(dropDownFrame.listFrameStrata);
+		end

 		--  We just move level 1 enough to keep it on the screen. We don't necessarily change the anchors.
 		if ( level == 1 ) then
@@ -1622,9 +1841,11 @@ function lib:ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset
 			listFrame:SetPoint(point, anchorFrame, relativePoint, xOffset, yOffset);
 		end

-		if ( autoHideDelay and tonumber(autoHideDelay)) then
-			listFrame.showTimer = autoHideDelay;
-			listFrame.isCounting = 1;
+		if (WoWClassicEra or WoWClassicTBC or WoWWOTLKC) then
+			if ( autoHideDelay and tonumber(autoHideDelay)) then
+				listFrame.showTimer = autoHideDelay;
+				listFrame.isCounting = 1;
+			end
 		end
 	end
 end
@@ -1657,7 +1878,13 @@ local function containsMouse()
 			result = true;
 		end
 	end
-
+	-- TeeloJubeithos:
+	--   If the menu is open, and you click the button to close it,
+	--   the Global Mouse Down triggers to close it, but then the MouseDown for the button triggers to open it back up again.
+	--   I fixed this by adding a filter to the global mouse down check, don't count it if the mouse is still over the DropDownMenu's Button
+	if L_UIDROPDOWNMENU_OPEN_MENU and L_UIDROPDOWNMENU_OPEN_MENU.Button:IsMouseOver() then
+		result = true;
+	end

 	return result;
 end
@@ -1685,19 +1912,39 @@ do
 	end
 end

+function lib:UIDropDownMenu_ClearCustomFrames(self)
+	if self.customFrames then
+		for index, frame in ipairs(self.customFrames) do
+			frame:Hide();
+		end
+
+		self.customFrames = nil;
+	end
+end
+
+function lib:UIDropDownMenu_MatchTextWidth(frame, minWidth, maxWidth)
+	local frameName = frame:GetName();
+	local newWidth = GetChild(frame, frameName, "Text"):GetUnboundedStringWidth() + L_UIDROPDOWNMENU_DEFAULT_WIDTH_PADDING;
+
+	if minWidth or maxWidth then
+		newWidth = Clamp(newWidth, minWidth or newWidth, maxWidth or newWidth);
+	end
+
+	lib:UIDropDownMenu_SetWidth(frame, newWidth);
+end
+
 function lib:UIDropDownMenu_SetWidth(frame, width, padding)
 	local frameName = frame:GetName();
 	GetChild(frame, frameName, "Middle"):SetWidth(width);
-	local defaultPadding = 25;
 	if ( padding ) then
 		frame:SetWidth(width + padding);
 	else
-		frame:SetWidth(width + defaultPadding + defaultPadding);
+		frame:SetWidth(width + L_UIDROPDOWNMENU_DEFAULT_WIDTH_PADDING + L_UIDROPDOWNMENU_DEFAULT_WIDTH_PADDING);
 	end
 	if ( padding ) then
 		GetChild(frame, frameName, "Text"):SetWidth(width);
 	else
-		GetChild(frame, frameName, "Text"):SetWidth(width - defaultPadding);
+		GetChild(frame, frameName, "Text"):SetWidth(width - L_UIDROPDOWNMENU_DEFAULT_WIDTH_PADDING);
 	end
 	frame.noResize = 1;
 end
@@ -1741,18 +1988,18 @@ function lib:UIDropDownMenu_ClearAll(frame)
 	end
 end

-function lib:UIDropDownMenu_JustifyText(frame, justification, customXOffset)
+function lib:UIDropDownMenu_JustifyText(frame, justification, customXOffset, customYOffset)
 	local frameName = frame:GetName();
 	local text = GetChild(frame, frameName, "Text");
 	text:ClearAllPoints();
 	if ( justification == "LEFT" ) then
-		text:SetPoint("LEFT", GetChild(frame, frameName, "Left"), "LEFT", customXOffset or 27, 2);
+		text:SetPoint("LEFT", GetChild(frame, frameName, "Left"), "LEFT", customXOffset or 27, customYOffset or 2);
 		text:SetJustifyH("LEFT");
 	elseif ( justification == "RIGHT" ) then
-		text:SetPoint("RIGHT", GetChild(frame, frameName, "Right"), "RIGHT", customXOffset or -43, 2);
+		text:SetPoint("RIGHT", GetChild(frame, frameName, "Right"), "RIGHT", customXOffset or -43, customYOffset or 2);
 		text:SetJustifyH("RIGHT");
 	elseif ( justification == "CENTER" ) then
-		text:SetPoint("CENTER", GetChild(frame, frameName, "Middle"), "CENTER", customXOffset or -5, 2);
+		text:SetPoint("CENTER", GetChild(frame, frameName, "Middle"), "CENTER", customXOffset or -5, customYOffset or 2);
 		text:SetJustifyH("CENTER");
 	end
 end
@@ -1791,11 +2038,19 @@ function lib:UIDropDownMenuButton_OpenColorPicker(self, button)
 end

 function lib:UIDropDownMenu_DisableButton(level, id)
-	_G["L_DropDownList"..level.."Button"..id]:Disable();
+	lib:UIDropDownMenu_SetDropdownButtonEnabled(_G["DropDownList"..level.."Button"..id], false);
 end

 function lib:UIDropDownMenu_EnableButton(level, id)
-	_G["L_DropDownList"..level.."Button"..id]:Enable();
+	lib:UIDropDownMenu_SetDropdownButtonEnabled(_G["DropDownList"..level.."Button"..id], true);
+end
+
+function lib:UIDropDownMenu_SetDropdownButtonEnabled(button, enabled)
+	if enabled then
+		button:Enable();
+	else
+		button:Disable();
+	end
 end

 function lib:UIDropDownMenu_SetButtonText(level, id, text, colorCode)
@@ -1815,28 +2070,62 @@ function lib:UIDropDownMenu_SetButtonClickable(level, id)
 	_G["L_DropDownList"..level.."Button"..id]:SetDisabledFontObject(GameFontDisableSmallLeft);
 end

+
 function lib:UIDropDownMenu_DisableDropDown(dropDown)
-	local dropDownName = dropDown:GetName();
-	local label = GetChild(dropDown, dropDownName, "Label");
-	if label then
-		label:SetVertexColor(GRAY_FONT_COLOR:GetRGB());
-	end
-	GetChild(dropDown, dropDownName, "Icon"):SetVertexColor(GRAY_FONT_COLOR:GetRGB());
-	GetChild(dropDown, dropDownName, "Text"):SetVertexColor(GRAY_FONT_COLOR:GetRGB());
-	GetChild(dropDown, dropDownName, "Button"):Disable();
-	dropDown.isDisabled = 1;
+	lib:UIDropDownMenu_SetDropDownEnabled(dropDown, false, disabledtooltip);
 end

 function lib:UIDropDownMenu_EnableDropDown(dropDown)
+	lib:UIDropDownMenu_SetDropDownEnabled(dropDown, true);
+end
+
+function lib:UIDropDownMenu_SetDropDownEnabled(dropDown, enabled, disabledtooltip)
 	local dropDownName = dropDown:GetName();
 	local label = GetChild(dropDown, dropDownName, "Label");
 	if label then
-		label:SetVertexColor(NORMAL_FONT_COLOR:GetRGB());
+		label:SetVertexColor((enabled and NORMAL_FONT_COLOR or GRAY_FONT_COLOR):GetRGB());
+	end
+
+	local icon = GetChild(dropDown, dropDownName, "Icon");
+	if icon then
+		icon:SetVertexColor((enabled and HIGHLIGHT_FONT_COLOR or GRAY_FONT_COLOR):GetRGB());
+	end
+
+	local text = GetChild(dropDown, dropDownName, "Text");
+	if text then
+		text:SetVertexColor((enabled and HIGHLIGHT_FONT_COLOR or GRAY_FONT_COLOR):GetRGB());
+	end
+
+	local button = GetChild(dropDown, dropDownName, "Button");
+	if button then
+		button:SetEnabled(enabled);
+
+		-- Clear any previously set disabledTooltip (it will be reset below if needed).
+		if button:GetMotionScriptsWhileDisabled() then
+			button:SetMotionScriptsWhileDisabled(false);
+			button:SetScript("OnEnter", nil);
+			button:SetScript("OnLeave", nil);
+		end
+	end
+
+	if enabled then
+		dropDown.isDisabled = nil;
+	else
+		dropDown.isDisabled = 1;
+
+		if button then
+			if disabledTooltip then
+				button:SetMotionScriptsWhileDisabled(true);
+				button:SetScript("OnEnter", function()
+					GameTooltip:SetOwner(button, "ANCHOR_RIGHT");
+					GameTooltip_AddErrorLine(GameTooltip, disabledTooltip);
+					GameTooltip:Show();
+				end);
+
+				button:SetScript("OnLeave", GameTooltip_Hide);
+			end
+		end
 	end
-	GetChild(dropDown, dropDownName, "Icon"):SetVertexColor(HIGHLIGHT_FONT_COLOR:GetRGB());
-	GetChild(dropDown, dropDownName, "Text"):SetVertexColor(HIGHLIGHT_FONT_COLOR:GetRGB());
-	GetChild(dropDown, dropDownName, "Button"):Enable();
-	dropDown.isDisabled = nil;
 end

 function lib:UIDropDownMenu_IsEnabled(dropDown)
@@ -1917,14 +2206,14 @@ function lib.DropDownExpandArrowMixin:OnEnter()
 	if self:IsEnabled() then
 		local listFrame = _G["L_DropDownList"..level];
 		if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
-			lib:ToggleDropDownMenu(level, self:GetParent().value, nil, nil, nil, nil, self:GetParent().menuList, self);
+			lib:ToggleDropDownMenu(level, self:GetParent().value, nil, nil, nil, nil, self:GetParent().menuList, self, nil, self:GetParent().menuListDisplayMode);
 		end
 	end
 end

 function lib.DropDownExpandArrowMixin:OnMouseDown(button)
 	if self:IsEnabled() then
-		lib:ToggleDropDownMenu(self:GetParent():GetParent():GetID() + 1, self:GetParent().value, nil, nil, nil, nil, self:GetParent().menuList, self);
+		lib:ToggleDropDownMenu(self:GetParent():GetParent():GetID() + 1, self:GetParent().value, nil, nil, nil, nil, self:GetParent().menuList, self, nil, self:GetParent().menuListDisplayMode);
 		PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
 	end
 end
@@ -1932,10 +2221,13 @@ end
 lib.UIDropDownCustomMenuEntryMixin = {};

 function lib.UIDropDownCustomMenuEntryMixin:GetPreferredEntryWidth()
-	-- NOTE: Only width is currently supported, dropdown menus size vertically based on how many buttons are present.
 	return self:GetWidth();
 end

+function lib.UIDropDownCustomMenuEntryMixin:GetPreferredEntryHeight()
+	return self:GetHeight();
+end
+
 function lib.UIDropDownCustomMenuEntryMixin:OnSetOwningButton()
 	-- for derived objects to implement
 end
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenuTemplates.lua b/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenuTemplates.lua
deleted file mode 100755
index 28c8b8f..0000000
--- a/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenuTemplates.lua
+++ /dev/null
@@ -1,126 +0,0 @@
--- $Id: LibUIDropDownMenuTemplates.lua 64 2020-11-18 13:13:15Z arithmandar $
--- ----------------------------------------------------------------------------
--- Localized Lua globals.
--- ----------------------------------------------------------------------------
---[[local _G = getfenv(0)
--- ----------------------------------------------------------------------------
-local MAJOR_VERSION = "LibUIDropDownMenuTemplates-3.0"
-local MINOR_VERSION = 90000 + tonumber(("$Rev: 64 $"):match("%d+"))
-
-local LibStub = _G.LibStub
-if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
-local Lib = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
-if not Lib then return end
-
--- Custom dropdown buttons are instantiated by some external system.
--- When calling L_UIDropDownMenu_AddButton that system sets info.customFrame to the instance of the frame it wants to place on the menu.
--- The dropdown menu creates its button for the entry as it normally would, but hides all elements.  The custom frame is then anchored
--- to that button and assumes responsibility for all relevant dropdown menu operations.
--- The hidden button will request a size that it should become from the custom frame.
-
-L_DropDownMenuButtonMixin = {}
-
-function L_DropDownMenuButtonMixin:OnEnter(...)
-	ExecuteFrameScript(self:GetParent(), "OnEnter", ...);
-end
-
-function L_DropDownMenuButtonMixin:OnLeave(...)
-	ExecuteFrameScript(self:GetParent(), "OnLeave", ...);
-end
-
-function L_DropDownMenuButtonMixin:OnMouseDown(button)
-	if self:IsEnabled() then
-		L_ToggleDropDownMenu(nil, nil, self:GetParent());
-		PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
-	end
-end
-
-L_LargeDropDownMenuButtonMixin = CreateFromMixins(L_DropDownMenuButtonMixin);
-
-function L_LargeDropDownMenuButtonMixin:OnMouseDown(button)
-	if self:IsEnabled() then
-		local parent = self:GetParent();
-		L_ToggleDropDownMenu(nil, nil, parent, parent, -8, 8);
-		PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
-	end
-end
-
-L_DropDownExpandArrowMixin = {};
-
-function L_DropDownExpandArrowMixin:OnEnter()
-	local level =  self:GetParent():GetParent():GetID() + 1;
-
-	L_CloseDropDownMenus(level);
-
-	if self:IsEnabled() then
-		local listFrame = _G["L_DropDownList"..level];
-		if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
-			L_ToggleDropDownMenu(level, self:GetParent().value, nil, nil, nil, nil, self:GetParent().menuList, self);
-		end
-	end
-end
-
-function L_DropDownExpandArrowMixin:OnMouseDown(button)
-	if self:IsEnabled() then
-		L_ToggleDropDownMenu(self:GetParent():GetParent():GetID() + 1, self:GetParent().value, nil, nil, nil, nil, self:GetParent().menuList, self);
-	end
-end
-
-L_UIDropDownCustomMenuEntryMixin = {};
-
-function L_UIDropDownCustomMenuEntryMixin:GetPreferredEntryWidth()
-	-- NOTE: Only width is currently supported, dropdown menus size vertically based on how many buttons are present.
-	return self:GetWidth();
-end
-
-function L_UIDropDownCustomMenuEntryMixin:OnSetOwningButton()
-	-- for derived objects to implement
-end
-
-function L_UIDropDownCustomMenuEntryMixin:SetOwningButton(button)
-	self:SetParent(button:GetParent());
-	self.owningButton = button;
-	self:OnSetOwningButton();
-end
-
-function L_UIDropDownCustomMenuEntryMixin:GetOwningDropdown()
-	return self.owningButton:GetParent();
-end
-
-function L_UIDropDownCustomMenuEntryMixin:SetContextData(contextData)
-	self.contextData = contextData;
-end
-
-function L_UIDropDownCustomMenuEntryMixin:GetContextData()
-	return self.contextData;
-end
-
--- //////////////////////////////////////////////////////////////
--- L_UIDropDownCustomMenuEntryTemplate
-function L_Create_UIDropDownCustomMenuEntry(name, parent)
-	local f = _G[name] or CreateFrame("Frame", name, parent or nil)
-	f:EnableMouse(true)
-	f:Hide()
-
-	-- I am not 100% sure if below works for replacing the mixins
-	f:SetScript("GetPreferredEntryWidth", function(self)
-		return self:GetWidth()
-	end)
-	f:SetScript("SetOwningButton", function(self, button)
-		self:SetParent(button:GetParent())
-		self.owningButton = button
-		self:OnSetOwningButton()
-	end)
-	f:SetScript("GetOwningDropdown", function(self)
-		return self.owningButton:GetParent()
-	end)
-	f:SetScript("SetContextData", function(self, contextData)
-		self.contextData = contextData
-	end)
-	f:SetScript("GetContextData", function(self)
-		return self.contextData
-	end)
-
-	return f
-end
-]]
diff --git a/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenuTemplates.xml b/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenuTemplates.xml
deleted file mode 100755
index bf89718..0000000
--- a/TitanClassic/libs/!LibUIDropDownMenu/LibUIDropDownMenu/LibUIDropDownMenuTemplates.xml
+++ /dev/null
@@ -1,412 +0,0 @@
-<!-- $Id: LibUIDropDownMenuTemplates.xml 64 2020-11-18 13:13:15Z arithmandar $ -->
-<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
-..\FrameXML\UI.xsd">
-	<Include file="LibUIDropDownMenuTemplates.lua"/>
-<!--
-	<Frame name="L_UIDropDownCustomMenuEntryTemplate" enableMouse="true" hidden="true" mixin="L_UIDropDownCustomMenuEntryMixin" virtual="true/">
-
-	<Button name="ColorSwatchTemplate" virtual="true">
-		<Size x="16" y="16"/>
-		<Layers>
-			<Layer level="BACKGROUND" textureSubLevel="-3">
-				<Texture name="$parentSwatchBg" parentKey="SwatchBg" texelSnappingBias="0.0" snapToPixelGrid="false">
-					<Size x="14" y="14"/>
-					<Anchors>
-						<Anchor point="CENTER"/>
-					</Anchors>
-					<Color color="HIGHLIGHT_FONT_COLOR"/>
-				</Texture>
-			</Layer>
-			<Layer level="BACKGROUND" textureSubLevel="-2">
-				<Texture parentKey="InnerBorder" texelSnappingBias="0.0" snapToPixelGrid="false">
-					<Size x="12" y="12"/>
-					<Anchors>
-						<Anchor point="CENTER"/>
-					</Anchors>
-					<Color color="BLACK_FONT_COLOR"/>
-				</Texture>
-			</Layer>
-			<Layer level="BACKGROUND" textureSubLevel="-1">
-				<Texture parentKey="Color" texelSnappingBias="0.0" snapToPixelGrid="false">
-					<Size x="10" y="10"/>
-					<Anchors>
-						<Anchor point="CENTER"/>
-					</Anchors>
-					<Color color="HIGHLIGHT_FONT_COLOR"/>
-				</Texture>
-			</Layer>
-		</Layers>
-		<Scripts>
-			<OnShow inherit="prepend">
-				PixelUtil.SetSize(self.SwatchBg, 14, 14);
-				PixelUtil.SetSize(self.InnerBorder, 12, 12);
-				PixelUtil.SetSize(self.Color, 10, 10);
-			</OnShow>
-		</Scripts>
-	</Button>
-	<Button name="L_UIDropDownMenuButtonTemplate" virtual="true">
-		<Size x="100" y="16"/>
-		<Layers>
-			<Layer level="BACKGROUND">
-				<Texture name="$parentHighlight" parentKey="Highlight" file="Interface\QuestFrame\UI-QuestTitleHighlight" alphaMode="ADD" setAllPoints="true" hidden="true"/>
-			</Layer>
-			<Layer level="ARTWORK">
-				<Texture name="$parentCheck" file="Interface\Common\UI-DropDownRadioChecks">
-					<Size x="16" y="16"/>
-					<Anchors>
-						<Anchor point="LEFT">
-							<Offset x="0" y="0"/>
-						</Anchor>
-					</Anchors>
-					<TexCoords left="0" right="0.5" top="0.5" bottom="1.0"/>
-				</Texture>
-				<Texture name="$parentUnCheck" file="Interface\Common\UI-DropDownRadioChecks">
-					<Size x="16" y="16"/>
-					<Anchors>
-						<Anchor point="LEFT">
-							<Offset x="0" y="0"/>
-						</Anchor>
-					</Anchors>
-					<TexCoords left="0.5" right="1.0" top="0.5" bottom="1.0"/>
-				</Texture>
-				<Texture parentKey="Icon" name="$parentIcon" hidden="true">
-					<Size>
-						<AbsDimension x="16" y="16"/>
-					</Size>
-					<Anchors>
-						<Anchor point="RIGHT">
-							<Offset x="0" y="0"/>
-						</Anchor>
-					</Anchors>
-				</Texture>
-			</Layer>
-		</Layers>
-		<Frames>
-			<Button name="$parentColorSwatch" hidden="true">
-				<Size>
-					<AbsDimension x="16" y="16"/>
-				</Size>
-				<Anchors>
-					<Anchor point="RIGHT">
-						<Offset>
-							<AbsDimension x="-6" y="0"/>
-						</Offset>
-					</Anchor>
-				</Anchors>
-				<Layers>
-					<Layer level="BACKGROUND">
-						<Texture name="$parentSwatchBg">
-							<Size>
-								<AbsDimension x="14" y="14"/>
-							</Size>
-							<Anchors>
-								<Anchor point="CENTER">
-									<Offset>
-										<AbsDimension x="0" y="0"/>
-									</Offset>
-								</Anchor>
-							</Anchors>
-							<Color r="1.0" g="1.0" b="1.0"/>
-						</Texture>
-					</Layer>
-				</Layers>
-				<Scripts>
-					<OnClick>
-						CloseMenus();
-						L_UIDropDownMenuButton_OpenColorPicker(self:GetParent());
-					</OnClick>
-					<OnEnter>
-						L_CloseDropDownMenus(self:GetParent():GetParent():GetID() + 1);
-						_G[self:GetName().."SwatchBg"]:SetVertexColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b);
-						L_UIDropDownMenu_StopCounting(self:GetParent():GetParent());
-					</OnEnter>
-					<OnLeave>
-						_G[self:GetName().."SwatchBg"]:SetVertexColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
-						L_UIDropDownMenu_StartCounting(self:GetParent():GetParent());
-					</OnLeave>
-				</Scripts>
-				<NormalTexture name="$parentNormalTexture" file="Interface\ChatFrame\ChatFrameColorSwatch"/>
-			</Button>
-			<Button name="$parentExpandArrow" hidden="true" motionScriptsWhileDisabled="true">
-				<Size>
-					<AbsDimension x="16" y="16"/>
-				</Size>
-				<Anchors>
-					<Anchor point="RIGHT">
-						<Offset>
-							<AbsDimension x="0" y="0"/>
-						</Offset>
-					</Anchor>
-				</Anchors>
-				<Scripts>
-					<OnClick>
-						L_ToggleDropDownMenu(self:GetParent():GetParent():GetID() + 1, self:GetParent().value, nil, nil, nil, nil, self:GetParent().menuList, self);
-					</OnClick>
-					<OnEnter>
-						local level =  self:GetParent():GetParent():GetID() + 1;
-
-						L_CloseDropDownMenus(level);
-
-						if self:IsEnabled() then
-							local listFrame = _G["L_DropDownList"..level];
-							if ( not listFrame or not listFrame:IsShown() or select(2, listFrame:GetPoint()) ~= self ) then
-								L_ToggleDropDownMenu(level, self:GetParent().value, nil, nil, nil, nil, self:GetParent().menuList, self);
-							end
-						end
-
-						L_UIDropDownMenu_StopCounting(self:GetParent():GetParent());
-					</OnEnter>
-					<OnLeave>
-						L_UIDropDownMenu_StartCounting(self:GetParent():GetParent());
-					</OnLeave>
-				</Scripts>
-				<NormalTexture file="Interface\ChatFrame\ChatFrameExpandArrow"/>
-			</Button>
-			<Button name="$parentInvisibleButton" hidden="true" parentKey="invisibleButton">
-				<Anchors>
-					<Anchor point="TOPLEFT"/>
-					<Anchor point="BOTTOMLEFT"/>
-					<Anchor point="RIGHT" relativeTo="$parentColorSwatch" relativePoint="LEFT">
-						<Offset>
-							<AbsDimension x="0" y="0"/>
-						</Offset>
-					</Anchor>
-				</Anchors>
-				<Scripts>
-					<OnEnter function="L_UIDropDownMenuButtonInvisibleButton_OnEnter"/>
-					<OnLeave function="L_UIDropDownMenuButtonInvisibleButton_OnLeave"/>
-				</Scripts>
-			</Button>
-		</Frames>
-		<Scripts>
-			<OnLoad>
-				self:SetFrameLevel(self:GetParent():GetFrameLevel()+2);
-			</OnLoad>
-			<OnClick>
-				L_UIDropDownMenuButton_OnClick(self, button, down);
-			</OnClick>
-			<OnEnter function="L_UIDropDownMenuButton_OnEnter"/>
-			<OnLeave function="L_UIDropDownMenuButton_OnLeave"/>
-			<OnEnable>
-				self.invisibleButton:Hide();
-			</OnEnable>
-			<OnDisable>
-				self.invisibleButton:Show();
-			</OnDisable>
-		</Scripts>
-		<ButtonText name="$parentNormalText">
-			<Anchors>
-				<Anchor point="LEFT">
-					<Offset x="-5" y="0"/>
-				</Anchor>
-			</Anchors>
-		</ButtonText>
-		<NormalFont style="GameFontHighlightSmallLeft"/>
-		<HighlightFont style="GameFontHighlightSmallLeft"/>
-		<DisabledFont style="GameFontDisableSmallLeft"/>
-	</Button>
-	<Button name="L_UIDropDownListTemplate" hidden="true" frameStrata="DIALOG" enableMouse="true" virtual="true">
-		<Frames>
-			<Frame name="$parentBackdrop" setAllPoints="true">
-				<Backdrop bgFile="Interface\DialogFrame\UI-DialogBox-Background-Dark" edgeFile="Interface\DialogFrame\UI-DialogBox-Border" tile="true">
-					<BackgroundInsets>
-						<AbsInset left="11" right="11" top="11" bottom="9"/>
-					</BackgroundInsets>
-					<TileSize>
-						<AbsValue val="32"/>
-					</TileSize>
-					<EdgeSize>
-						<AbsValue val="32"/>
-					</EdgeSize>
-				</Backdrop>
-			</Frame>
-			<Frame name="$parentMenuBackdrop" setAllPoints="true">
-				<Backdrop bgFile="Interface\Tooltips\UI-Tooltip-Background" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
-					<EdgeSize>
-						<AbsValue val="16"/>
-					</EdgeSize>
-					<TileSize>
-						<AbsValue val="16"/>
-					</TileSize>
-					<BackgroundInsets>
-						<AbsInset left="5" right="4" top="4" bottom="4"/>
-					</BackgroundInsets>
-				</Backdrop>
-				<Scripts>
-					<OnLoad>
-						self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b);
-						self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b);
-					</OnLoad>
-				</Scripts>
-			</Frame>
-			<Button name="$parentButton1" inherits="L_UIDropDownMenuButtonTemplate" id="1"/>
-		</Frames>
-		<Scripts>
-			<OnClick>
-				self:Hide();
-			</OnClick>
-			<OnEnter>
-				L_UIDropDownMenu_StopCounting(self, motion);
-			</OnEnter>
-			<OnLeave>
-				L_UIDropDownMenu_StartCounting(self, motion);
-			</OnLeave>
-			<OnUpdate>
-				L_UIDropDownMenu_OnUpdate(self, elapsed);
-			</OnUpdate>
-			<OnShow>
-				for i=1, L_UIDROPDOWNMENU_MAXBUTTONS do
-					if (not self.noResize) then
-						_G[self:GetName().."Button"..i]:SetWidth(self.maxWidth);
-					end
-				end
-				if (not self.noResize) then
-					self:SetWidth(self.maxWidth+25);
-				end
-				self.showTimer = nil;
-				if ( self:GetID() > 1 ) then
-					self.parent = _G["L_DropDownList"..(self:GetID() - 1)];
-				end
-			</OnShow>
-			<OnHide>
-				L_UIDropDownMenu_OnHide(self);
-			</OnHide>
-		</Scripts>
-	</Button>
-	<Frame name="L_UIDropDownMenuTemplate" virtual="true">
-		<Size>
-			<AbsDimension x="40" y="32"/>
-		</Size>
-		<Layers>
-			<Layer level="ARTWORK">
-				<Texture name="$parentLeft" parentKey="Left" file="Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame">
-					<Size>
-						<AbsDimension x="25" y="64"/>
-					</Size>
-					<Anchors>
-						<Anchor point="TOPLEFT">
-							<Offset>
-								<AbsDimension x="0" y="17"/>
-							</Offset>
-						</Anchor>
-					</Anchors>
-					<TexCoords left="0" right="0.1953125" top="0" bottom="1"/>
-				</Texture>
-				<Texture name="$parentMiddle" parentKey="Middle" file="Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame">
-					<Size>
-						<AbsDimension x="115" y="64"/>
-					</Size>
-					<Anchors>
-						<Anchor point="LEFT" relativeKey="$parent.Left" relativePoint="RIGHT"/>
-					</Anchors>
-					<TexCoords left="0.1953125" right="0.8046875" top="0" bottom="1"/>
-				</Texture>
-				<Texture name="$parentRight" parentKey="Right" file="Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame">
-					<Size>
-						<AbsDimension x="25" y="64"/>
-					</Size>
-					<Anchors>
-						<Anchor point="LEFT" relativeKey="$parent.Middle" relativePoint="RIGHT"/>
-					</Anchors>
-					<TexCoords left="0.8046875" right="1" top="0" bottom="1"/>
-				</Texture>
-				<FontString parentKey="Text" name="$parentText" inherits="GameFontHighlightSmall" wordwrap="false" justifyH="RIGHT">
-					<Size>
-						<AbsDimension x="0" y="10"/>
-					</Size>
-					<Anchors>
-						<Anchor point="RIGHT" relativeKey="$parent.Right">
-							<Offset>
-								<AbsDimension x="-43" y="2"/>
-							</Offset>
-						</Anchor>
-					</Anchors>
-				</FontString>
-			</Layer>
-			<Layer level="OVERLAY">
-				<Texture parentKey="Icon" name="$parentIcon" hidden="true">
-					<Size>
-						<AbsDimension x="16" y="16"/>
-					</Size>
-					<Anchors>
-						<Anchor point="LEFT">
-							<Offset x="30" y="2"/>
-						</Anchor>
-					</Anchors>
-				</Texture>
-			</Layer>
-		</Layers>
-		<Frames>
-			<Button parentKey="Button" name="$parentButton" motionScriptsWhileDisabled="true" >
-				<Size>
-					<AbsDimension x="24" y="24"/>
-				</Size>
-				<Anchors>
-					<Anchor point="TOPRIGHT" relativeKey="$parent.Right">
-						<Offset>
-							<AbsDimension x="-16" y="-18"/>
-						</Offset>
-					</Anchor>
-				</Anchors>
-				<Scripts>
-					<OnEnter>
-						local parent = self:GetParent();
-						local myscript = parent:GetScript("OnEnter");
-						if(myscript ~= nil) then
-							myscript(parent);
-						end
-					</OnEnter>
-					<OnLeave>
-						local parent = self:GetParent();
-						local myscript = parent:GetScript("OnLeave");
-						if(myscript ~= nil) then
-							myscript(parent);
-						end
-					</OnLeave>
-					<OnClick>
-						L_ToggleDropDownMenu(nil, nil, self:GetParent());
-						PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
-					</OnClick>
-				</Scripts>
-				<NormalTexture name="$parentNormalTexture" parentKey="NormalTexture" file="Interface\ChatFrame\UI-ChatIcon-ScrollDown-Up">
-					<Size>
-						<AbsDimension x="24" y="24"/>
-					</Size>
-					<Anchors>
-						<Anchor point="RIGHT"/>
-					</Anchors>
-				</NormalTexture>
-				<PushedTexture name="$parentPushedTexture" parentKey="PushedTexture" file="Interface\ChatFrame\UI-ChatIcon-ScrollDown-Down">
-					<Size>
-						<AbsDimension x="24" y="24"/>
-					</Size>
-					<Anchors>
-						<Anchor point="RIGHT"/>
-					</Anchors>
-				</PushedTexture>
-				<DisabledTexture name="$parentDisabledTexture" parentKey="DisabledTexture" file="Interface\ChatFrame\UI-ChatIcon-ScrollDown-Disabled">
-					<Size>
-						<AbsDimension x="24" y="24"/>
-					</Size>
-					<Anchors>
-						<Anchor point="RIGHT"/>
-					</Anchors>
-				</DisabledTexture>
-				<HighlightTexture name="$parentHighlightTexture" parentKey="HighlightTexture" file="Interface\Buttons\UI-Common-MouseHilight" alphaMode="ADD">
-					<Size>
-						<AbsDimension x="24" y="24"/>
-					</Size>
-					<Anchors>
-						<Anchor point="RIGHT"/>
-					</Anchors>
-				</HighlightTexture>
-			</Button>
-		</Frames>
-		<Scripts>
-			<OnHide>
-				L_CloseDropDownMenus();
-			</OnHide>
-		</Scripts>
-	</Frame>
--->
-</Ui>
diff --git a/TitanClassic/libs/Ace3.lua b/TitanClassic/libs/Ace3.lua
index fb0a3fa..aef37e7 100755
--- a/TitanClassic/libs/Ace3.lua
+++ b/TitanClassic/libs/Ace3.lua
@@ -60,14 +60,14 @@ function Ace3:Open()
 		self:Print("No Configs are Registered")
 		return
 	end
-
+
 	if not frame then
 		frame = gui:Create("Frame")
 		frame:ReleaseChildren()
 		frame:SetTitle("Ace3 Options")
 		frame:SetLayout("FILL")
 		frame:SetCallback("OnClose", frameOnClose)
-
+
 		select = gui:Create("DropdownGroup")
 		select:SetGroupList(configs)
 		select:SetCallback("OnGroupSelected", ConfigSelected)
diff --git a/TitanClassic/libs/Ace3.toc b/TitanClassic/libs/Ace3.toc
index 0d3e5ce..480dfbc 100755
--- a/TitanClassic/libs/Ace3.toc
+++ b/TitanClassic/libs/Ace3.toc
@@ -1,4 +1,4 @@
-## Interface: 80100
+## Interface: 100105

 ## Title: Lib: Ace3
 ## Notes: AddOn development framework
@@ -6,6 +6,7 @@
 ## X-Website: http://www.wowace.com
 ## X-Category: Library
 ## X-License: Limited BSD
+## Version: Release-r1309

 LibStub\LibStub.lua
 CallbackHandler-1.0\CallbackHandler-1.0.xml
diff --git a/TitanClassic/libs/Ace3_TBC.toc b/TitanClassic/libs/Ace3_TBC.toc
new file mode 100755
index 0000000..2abd467
--- /dev/null
+++ b/TitanClassic/libs/Ace3_TBC.toc
@@ -0,0 +1,28 @@
+## Interface: 20504
+
+## Title: Lib: Ace3
+## Notes: AddOn development framework
+## Author: Ace3 Development Team
+## X-Website: http://www.wowace.com
+## X-Category: Library
+## X-License: Limited BSD
+## Version: Release-r1309
+
+LibStub\LibStub.lua
+CallbackHandler-1.0\CallbackHandler-1.0.xml
+AceAddon-3.0\AceAddon-3.0.xml
+AceEvent-3.0\AceEvent-3.0.xml
+AceTimer-3.0\AceTimer-3.0.xml
+AceBucket-3.0\AceBucket-3.0.xml
+AceHook-3.0\AceHook-3.0.xml
+AceDB-3.0\AceDB-3.0.xml
+AceDBOptions-3.0\AceDBOptions-3.0.xml
+AceLocale-3.0\AceLocale-3.0.xml
+AceConsole-3.0\AceConsole-3.0.xml
+AceGUI-3.0\AceGUI-3.0.xml
+AceConfig-3.0\AceConfig-3.0.xml
+AceComm-3.0\AceComm-3.0.xml
+AceTab-3.0\AceTab-3.0.xml
+AceSerializer-3.0\AceSerializer-3.0.xml
+
+Ace3.lua
diff --git a/TitanClassic/libs/Ace3_Vanilla.toc b/TitanClassic/libs/Ace3_Vanilla.toc
new file mode 100755
index 0000000..5af2a11
--- /dev/null
+++ b/TitanClassic/libs/Ace3_Vanilla.toc
@@ -0,0 +1,28 @@
+## Interface: 11403
+
+## Title: Lib: Ace3
+## Notes: AddOn development framework
+## Author: Ace3 Development Team
+## X-Website: http://www.wowace.com
+## X-Category: Library
+## X-License: Limited BSD
+## Version: Release-r1309
+
+LibStub\LibStub.lua
+CallbackHandler-1.0\CallbackHandler-1.0.xml
+AceAddon-3.0\AceAddon-3.0.xml
+AceEvent-3.0\AceEvent-3.0.xml
+AceTimer-3.0\AceTimer-3.0.xml
+AceBucket-3.0\AceBucket-3.0.xml
+AceHook-3.0\AceHook-3.0.xml
+AceDB-3.0\AceDB-3.0.xml
+AceDBOptions-3.0\AceDBOptions-3.0.xml
+AceLocale-3.0\AceLocale-3.0.xml
+AceConsole-3.0\AceConsole-3.0.xml
+AceGUI-3.0\AceGUI-3.0.xml
+AceConfig-3.0\AceConfig-3.0.xml
+AceComm-3.0\AceComm-3.0.xml
+AceTab-3.0\AceTab-3.0.xml
+AceSerializer-3.0\AceSerializer-3.0.xml
+
+Ace3.lua
diff --git a/TitanClassic/libs/Ace3_Wrath.toc b/TitanClassic/libs/Ace3_Wrath.toc
new file mode 100755
index 0000000..0b56640
--- /dev/null
+++ b/TitanClassic/libs/Ace3_Wrath.toc
@@ -0,0 +1,28 @@
+## Interface: 30402
+
+## Title: Lib: Ace3
+## Notes: AddOn development framework
+## Author: Ace3 Development Team
+## X-Website: http://www.wowace.com
+## X-Category: Library
+## X-License: Limited BSD
+## Version: Release-r1309
+
+LibStub\LibStub.lua
+CallbackHandler-1.0\CallbackHandler-1.0.xml
+AceAddon-3.0\AceAddon-3.0.xml
+AceEvent-3.0\AceEvent-3.0.xml
+AceTimer-3.0\AceTimer-3.0.xml
+AceBucket-3.0\AceBucket-3.0.xml
+AceHook-3.0\AceHook-3.0.xml
+AceDB-3.0\AceDB-3.0.xml
+AceDBOptions-3.0\AceDBOptions-3.0.xml
+AceLocale-3.0\AceLocale-3.0.xml
+AceConsole-3.0\AceConsole-3.0.xml
+AceGUI-3.0\AceGUI-3.0.xml
+AceConfig-3.0\AceConfig-3.0.xml
+AceComm-3.0\AceComm-3.0.xml
+AceTab-3.0\AceTab-3.0.xml
+AceSerializer-3.0\AceSerializer-3.0.xml
+
+Ace3.lua
diff --git a/TitanClassic/libs/AceAddon-3.0/AceAddon-3.0.lua b/TitanClassic/libs/AceAddon-3.0/AceAddon-3.0.lua
index b338695..0ea93d1 100755
--- a/TitanClassic/libs/AceAddon-3.0/AceAddon-3.0.lua
+++ b/TitanClassic/libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -6,31 +6,31 @@
 -- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
 -- * **OnDisable**, which is only called when your addon is manually being disabled.
 -- @usage
--- -- A small (but complete) addon, that doesn't do anything,
+-- -- A small (but complete) addon, that doesn't do anything,
 -- -- but shows usage of the callbacks.
 -- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
---
+--
 -- function MyAddon:OnInitialize()
---   -- do init tasks here, like loading the Saved Variables,
+--   -- do init tasks here, like loading the Saved Variables,
 --   -- or setting up slash commands.
 -- end
---
+--
 -- function MyAddon:OnEnable()
 --   -- Do more initialization here, that really enables the use of your addon.
---   -- Register Events, Hook functions, Create Frames, Get information from
+--   -- Register Events, Hook functions, Create Frames, Get information from
 --   -- the game that wasn't available in OnInitialize
 -- end
 --
 -- function MyAddon:OnDisable()
 --   -- Unhook, Unregister Events, Hide frames that you created.
---   -- You would probably only use an OnDisable if you want to
+--   -- You would probably only use an OnDisable if you want to
 --   -- build a "standby" mode, or be able to toggle modules on/off.
 -- end
 -- @class file
 -- @name AceAddon-3.0.lua
--- @release $Id: AceAddon-3.0.lua 1084 2013-04-27 20:14:11Z nevcairiel $
+-- @release $Id: AceAddon-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $

-local MAJOR, MINOR = "AceAddon-3.0", 12
+local MAJOR, MINOR = "AceAddon-3.0", 13
 local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceAddon then return end -- No Upgrade needed.
@@ -49,10 +49,6 @@ local select, pairs, next, type, unpack = select, pairs, next, type, unpack
 local loadstring, assert, error = loadstring, assert, error
 local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: LibStub, IsLoggedIn, geterrorhandler
-
 --[[
 	 xpcall safecall implementation
 ]]
@@ -62,43 +58,12 @@ local function errorhandler(err)
 	return geterrorhandler()(err)
 end

-local function CreateDispatcher(argCount)
-	local code = [[
-		local xpcall, eh = ...
-		local method, ARGS
-		local function call() return method(ARGS) end
-
-		local function dispatch(func, ...)
-			 method = func
-			 if not method then return end
-			 ARGS = ...
-			 return xpcall(call, eh)
-		end
-
-		return dispatch
-	]]
-
-	local ARGS = {}
-	for i = 1, argCount do ARGS[i] = "arg"..i end
-	code = code:gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-Dispatchers[0] = function(func)
-	return xpcall(func, errorhandler)
-end
-
 local function safecall(func, ...)
 	-- we check to see if the func is passed is actually a function here and don't error when it isn't
 	-- this safecall is used for optional functions like OnInitialize OnEnable etc. When they are not
 	-- present execution should continue without hinderance
 	if type(func) == "function" then
-		return Dispatchers[select('#', ...)](func, ...)
+		return xpcall(func, errorhandler, ...)
 	end
 end

@@ -106,7 +71,7 @@ end
 local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype

 -- used in the addon metatable
-local function addontostring( self ) return self.name end
+local function addontostring( self ) return self.name end

 -- Check if the addon is queued for initialization
 local function queuedForInitialization(addon)
@@ -119,14 +84,14 @@ local function queuedForInitialization(addon)
 end

 --- Create a new AceAddon-3.0 addon.
--- Any libraries you specified will be embeded, and the addon will be scheduled for
+-- Any libraries you specified will be embeded, and the addon will be scheduled for
 -- its OnInitialize and OnEnable callbacks.
 -- The final addon object, with all libraries embeded, will be returned.
 -- @paramsig [object ,]name[, lib, ...]
 -- @param object Table to use as a base for the addon (optional)
 -- @param name Name of the addon object to create
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create a simple addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
 --
@@ -146,10 +111,10 @@ function AceAddon:NewAddon(objectorname, ...)
 	if type(name)~="string" then
 		error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
 	end
-	if self.addons[name] then
+	if self.addons[name] then
 		error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
 	end
-
+
 	object = object or {}
 	object.name = name

@@ -159,7 +124,7 @@ function AceAddon:NewAddon(objectorname, ...)
 		for k, v in pairs(oldmeta) do addonmeta[k] = v end
 	end
 	addonmeta.__tostring = addontostring
-
+
 	setmetatable( object, addonmeta )
 	self.addons[name] = object
 	object.modules = {}
@@ -167,7 +132,7 @@ function AceAddon:NewAddon(objectorname, ...)
 	object.defaultModuleLibraries = {}
 	Embed( object ) -- embed NewModule, GetModule methods
 	self:EmbedLibraries(object, select(i,...))
-
+
 	-- add to queue of addons to be initialized upon ADDON_LOADED
 	tinsert(self.initializequeue, object)
 	return object
@@ -178,7 +143,7 @@ end
 -- Throws an error if the addon object cannot be found (except if silent is set).
 -- @param name unique name of the addon object
 -- @param silent if true, the addon is optional, silently return nil if its not found
--- @usage
+-- @usage
 -- -- Get the Addon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 function AceAddon:GetAddon(name, silent)
@@ -233,7 +198,7 @@ end
 -- @paramsig name[, silent]
 -- @param name unique name of the module
 -- @param silent if true, the module is optional, silently return nil if its not found (optional)
--- @usage
+-- @usage
 -- -- Get the Addon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- -- Get the Module
@@ -256,23 +221,23 @@ local function IsModuleTrue(self) return true end
 -- @param name unique name of the module
 -- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create a module with some embeded libraries
 -- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
---
+--
 -- -- Create a module with a prototype
 -- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
 -- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
 function NewModule(self, name, prototype, ...)
 	if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
 	if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
-
+
 	if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
-
+
 	-- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
 	-- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
 	local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
-
+
 	module.IsModule = IsModuleTrue
 	module:SetEnabledState(self.defaultModuleState)
 	module.moduleName = name
@@ -287,24 +252,24 @@ function NewModule(self, name, prototype, ...)
 	if not prototype or type(prototype) == "string" then
 		prototype = self.defaultModulePrototype or nil
 	end
-
+
 	if type(prototype) == "table" then
 		local mt = getmetatable(module)
 		mt.__index = prototype
 		setmetatable(module, mt)  -- More of a Base class type feel.
 	end
-
+
 	safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
 	self.modules[name] = module
 	tinsert(self.orderedModules, module)
-
+
 	return module
 end

 --- Returns the real name of the addon or module, without any prefix.
 -- @name //addon//:GetName
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- print(MyAddon:GetName())
 -- -- prints "MyAddon"
 function GetName(self)
@@ -316,8 +281,8 @@ end
 -- and enabling all modules of the addon (unless explicitly disabled).\\
 -- :Enable() also sets the internal `enableState` variable to true
 -- @name //addon//:Enable
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Enable MyModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -337,8 +302,8 @@ end
 -- and disabling all modules of the addon.\\
 -- :Disable() also sets the internal `enableState` variable to false
 -- @name //addon//:Disable
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Disable MyAddon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyAddon:Disable()
@@ -351,7 +316,7 @@ end
 -- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
 -- @name //addon//:EnableModule
 -- @paramsig name
--- @usage
+-- @usage
 -- -- Enable MyModule using :GetModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -369,7 +334,7 @@ end
 -- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
 -- @name //addon//:DisableModule
 -- @paramsig name
--- @usage
+-- @usage
 -- -- Disable MyModule using :GetModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -388,7 +353,7 @@ end
 -- @name //addon//:SetDefaultModuleLibraries
 -- @paramsig lib[, lib, ...]
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create the addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
 -- -- Configure default libraries for modules (all modules need AceEvent-3.0)
@@ -407,7 +372,7 @@ end
 -- @name //addon//:SetDefaultModuleState
 -- @paramsig state
 -- @param state Default state for new modules, true for enabled, false for disabled
--- @usage
+-- @usage
 -- -- Create the addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
 -- -- Set the default state to "disabled"
@@ -427,7 +392,7 @@ end
 -- @name //addon//:SetDefaultModulePrototype
 -- @paramsig prototype
 -- @param prototype Default prototype for the new modules (table)
--- @usage
+-- @usage
 -- -- Define a prototype
 -- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
 -- -- Set the default prototype
@@ -459,8 +424,8 @@ end

 --- Return an iterator of all modules associated to the addon.
 -- @name //addon//:IterateModules
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Enable all modules
 -- for name, module in MyAddon:IterateModules() do
 --    module:Enable()
@@ -469,13 +434,13 @@ local function IterateModules(self) return pairs(self.modules) end

 -- Returns an iterator of all embeds in the addon
 -- @name //addon//:IterateEmbeds
--- @paramsig
+-- @paramsig
 local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end

 --- Query the enabledState of an addon.
 -- @name //addon//:IsEnabled
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- if MyAddon:IsEnabled() then
 --     MyAddon:Disable()
 -- end
@@ -520,20 +485,20 @@ end

 -- - Initialize the addon after creation.
 -- This function is only used internally during the ADDON_LOADED event
--- It will call the **OnInitialize** function on the addon object (if present),
+-- It will call the **OnInitialize** function on the addon object (if present),
 -- and the **OnEmbedInitialize** function on all embeded libraries.
---
+--
 -- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
 -- @param addon addon object to intialize
 function AceAddon:InitializeAddon(addon)
 	safecall(addon.OnInitialize, addon)
-
+
 	local embeds = self.embeds[addon]
 	for i = 1, #embeds do
 		local lib = LibStub:GetLibrary(embeds[i], true)
 		if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
 	end
-
+
 	-- we don't call InitializeAddon on modules specifically, this is handled
 	-- from the event handler and only done _once_
 end
@@ -541,7 +506,7 @@ end
 -- - Enable the addon after creation.
 -- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
 -- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
--- It will call the **OnEnable** function on the addon object (if present),
+-- It will call the **OnEnable** function on the addon object (if present),
 -- and the **OnEmbedEnable** function on all embeded libraries.\\
 -- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
 --
@@ -551,12 +516,12 @@ end
 function AceAddon:EnableAddon(addon)
 	if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
 	if self.statuses[addon.name] or not addon.enabledState then return false end
-
+
 	-- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
 	self.statuses[addon.name] = true
-
+
 	safecall(addon.OnEnable, addon)
-
+
 	-- make sure we're still enabled before continueing
 	if self.statuses[addon.name] then
 		local embeds = self.embeds[addon]
@@ -564,7 +529,7 @@ function AceAddon:EnableAddon(addon)
 			local lib = LibStub:GetLibrary(embeds[i], true)
 			if lib then safecall(lib.OnEmbedEnable, lib, addon) end
 		end
-
+
 		-- enable possible modules.
 		local modules = addon.orderedModules
 		for i = 1, #modules do
@@ -576,24 +541,24 @@ end

 -- - Disable the addon
 -- Note: This function is only used internally.
--- It will call the **OnDisable** function on the addon object (if present),
+-- It will call the **OnDisable** function on the addon object (if present),
 -- and the **OnEmbedDisable** function on all embeded libraries.\\
 -- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
 --
--- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
 -- Use :Disable on the addon itself instead.
 -- @param addon addon object to enable
 function AceAddon:DisableAddon(addon)
 	if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
 	if not self.statuses[addon.name] then return false end
-
+
 	-- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
 	self.statuses[addon.name] = false
-
+
 	safecall( addon.OnDisable, addon )
-
+
 	-- make sure we're still disabling...
-	if not self.statuses[addon.name] then
+	if not self.statuses[addon.name] then
 		local embeds = self.embeds[addon]
 		for i = 1, #embeds do
 			local lib = LibStub:GetLibrary(embeds[i], true)
@@ -605,12 +570,12 @@ function AceAddon:DisableAddon(addon)
 			self:DisableAddon(modules[i])
 		end
 	end
-
+
 	return not self.statuses[addon.name] -- return true if we're disabled
 end

 --- Get an iterator over all registered addons.
--- @usage
+-- @usage
 -- -- Print a list of all installed AceAddon's
 -- for name, addon in AceAddon:IterateAddons() do
 --   print("Addon: " .. name)
@@ -618,7 +583,7 @@ end
 function AceAddon:IterateAddons() return pairs(self.addons) end

 --- Get an iterator over the internal status registry.
--- @usage
+-- @usage
 -- -- Print a list of all enabled addons
 -- for name, status in AceAddon:IterateAddonStatus() do
 --   if status then
@@ -632,10 +597,20 @@ function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
 function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
 function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end

+-- Blizzard AddOns which can load very early in the loading process and mess with Ace3 addon loading
+local BlizzardEarlyLoadAddons = {
+	Blizzard_DebugTools = true,
+	Blizzard_TimeManager = true,
+	Blizzard_BattlefieldMap = true,
+	Blizzard_MapCanvas = true,
+	Blizzard_SharedMapDataProviders = true,
+	Blizzard_CombatLog = true,
+}
+
 -- Event Handling
 local function onEvent(this, event, arg1)
-	-- 2011-08-17 nevcairiel - ignore the load event of Blizzard_DebugTools, so a potential startup error isn't swallowed up
-	if (event == "ADDON_LOADED"  and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then
+	-- 2020-08-28 nevcairiel - ignore the load event of Blizzard addons which occur early in the loading process
+	if (event == "ADDON_LOADED"  and (arg1 == nil or not BlizzardEarlyLoadAddons[arg1])) or event == "PLAYER_LOGIN" then
 		-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
 		while(#AceAddon.initializequeue > 0) do
 			local addon = tremove(AceAddon.initializequeue, 1)
@@ -644,7 +619,7 @@ local function onEvent(this, event, arg1)
 			AceAddon:InitializeAddon(addon)
 			tinsert(AceAddon.enablequeue, addon)
 		end
-
+
 		if IsLoggedIn() then
 			while(#AceAddon.enablequeue > 0) do
 				local addon = tremove(AceAddon.enablequeue, 1)
diff --git a/TitanClassic/libs/AceConfig-3.0/AceConfig-3.0.lua b/TitanClassic/libs/AceConfig-3.0/AceConfig-3.0.lua
index c2ac7cc..aae348b 100755
--- a/TitanClassic/libs/AceConfig-3.0/AceConfig-3.0.lua
+++ b/TitanClassic/libs/AceConfig-3.0/AceConfig-3.0.lua
@@ -3,7 +3,7 @@
 -- as well as associate it with a slash command.
 -- @class file
 -- @name AceConfig-3.0
--- @release $Id: AceConfig-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 --[[
 AceConfig-3.0
@@ -45,7 +45,7 @@ local pcall, error, type, pairs = pcall, error, type, pairs
 function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
 	local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
 	if not ok then error(msg, 2) end
-
+
 	if slashcmd then
 		if type(slashcmd) == "table" then
 			for _,cmd in pairs(slashcmd) do
diff --git a/TitanClassic/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/TitanClassic/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
index 7902fd1..a4240ce 100755
--- a/TitanClassic/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
+++ b/TitanClassic/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
@@ -1,7 +1,7 @@
 --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
 -- @class file
 -- @name AceConfigCmd-3.0
--- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfigCmd-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $

 --[[
 AceConfigCmd-3.0
@@ -37,17 +37,10 @@ local error, assert = error, assert
 -- WoW APIs
 local _G = _G

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: LibStub, SELECTED_CHAT_FRAME, DEFAULT_CHAT_FRAME
-
-
 local L = setmetatable({}, {	-- TODO: replace with proper locale
 	__index = function(self,k) return k end
 })

-
-
 local function print(msg)
 	(SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg)
 end
@@ -63,7 +56,7 @@ local funcmsg = "expected function or member name"

 -- pickfirstset() - picks the first non-nil value and returns it

-local function pickfirstset(...)
+local function pickfirstset(...)
 	for i=1,select("#",...) do
 		if select(i,...)~=nil then
 			return select(i,...)
@@ -120,7 +113,7 @@ local function callfunction(info, tab, methodtype, ...)
 	info.arg = tab.arg
 	info.option = tab
 	info.type = tab.type
-
+
 	if type(method)=="function" then
 		return method(info, ...)
 	else
@@ -131,7 +124,7 @@ end
 -- do_final() - do the final step (set/execute) along with validation and confirmation

 local function do_final(info, inputpos, tab, methodtype, ...)
-	if info.validate then
+	if info.validate then
 		local res = callmethod(info,inputpos,tab,"validate",...)
 		if type(res)=="string" then
 			usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
@@ -139,7 +132,7 @@ local function do_final(info, inputpos, tab, methodtype, ...)
 		end
 	end
 	-- console ignores .confirm
-
+
 	callmethod(info,inputpos,tab,methodtype, ...)
 end

@@ -152,8 +145,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
 	if val~=nil then
 		if val==false then
 			val=nil
-		elseif not types[type(val)] then
-			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
+		elseif not types[type(val)] then
+			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
 		end
 		info[paramname] = val
 		info[paramname.."_at"] = depth
@@ -166,13 +159,13 @@ end
 local dummytable={}

 local function iterateargs(tab)
-	if not tab.plugins then
-		return pairs(tab.args)
+	if not tab.plugins then
+		return pairs(tab.args)
 	end
-
+
 	local argtabkey,argtab=next(tab.plugins)
 	local v
-
+
 	return function(_, k)
 		while argtab do
 			k,v = next(argtab, k)
@@ -206,18 +199,18 @@ local function showhelp(info, inputpos, tab, depth, noHead)
 	if not noHead then
 		print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
 	end
-
+
 	local sortTbl = {}	-- [1..n]=name
 	local refTbl = {}   -- [name]=tableref
-
+
 	for k,v in iterateargs(tab) do
 		if not refTbl[k] then	-- a plugin overriding something in .args
 			tinsert(sortTbl, k)
 			refTbl[k] = v
 		end
 	end
-
-	tsort(sortTbl, function(one, two)
+
+	tsort(sortTbl, function(one, two)
 		local o1 = refTbl[one].order or 100
 		local o2 = refTbl[two].order or 100
 		if type(o1) == "function" or type(o1) == "string" then
@@ -240,7 +233,7 @@ local function showhelp(info, inputpos, tab, depth, noHead)
 		if o1==o2 then return tostring(one)<tostring(two) end   -- compare names
 		return o1<o2
 	end)
-
+
 	for i = 1, #sortTbl do
 		local k = sortTbl[i]
 		local v = refTbl[k]
@@ -327,7 +320,7 @@ local function keybindingValidateFunc(text)
 	return s
 end

--- handle() - selfrecursing function that processes input->optiontable
+-- handle() - selfrecursing function that processes input->optiontable
 -- - depth - starts at 0
 -- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)

@@ -346,16 +339,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
 	local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
 	local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
 	--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
-
+
 	-------------------------------------------------------------------
 	-- Act according to .type of this table
-
+
 	if tab.type=="group" then
 		------------ group --------------------------------------------
-
+
 		if type(tab.args)~="table" then err(info, inputpos) end
 		if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
-
+
 		-- grab next arg from input
 		local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
 		if not arg then
@@ -363,11 +356,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			return
 		end
 		nextpos=nextpos+1
-
+
 		-- loop .args and try to find a key with a matching name
 		for k,v in iterateargs(tab) do
 			if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
-
+
 			-- is this child an inline group? if so, traverse into it
 			if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
 				info[depth+1] = k
@@ -383,8 +376,8 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				return handle(info,nextpos,v,depth+1)
 			end
 		end
-
-		-- no match
+
+		-- no match
 		if retfalse then
 			-- restore old infotable members and return false to indicate failure
 			info.handler,info.handler_at = oldhandler,oldhandler_at
@@ -395,40 +388,40 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
 			return false
 		end
-
+
 		-- couldn't find the command, display error
 		usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
 		return
 	end
-
-	local str = strsub(info.input,inputpos);
-
+
+	local strInput = strsub(info.input,inputpos);
+
 	if tab.type=="execute" then
 		------------ execute --------------------------------------------
 		do_final(info, inputpos, tab, "func")
-

-
+
+
 	elseif tab.type=="input" then
 		------------ input --------------------------------------------
-
+
 		local res = true
 		if tab.pattern then
-			if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
-			if not strmatch(str, tab.pattern) then
-				usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
+			if type(tab.pattern)~="string" then err(info, inputpos, "'pattern' - expected a string") end
+			if not strmatch(strInput, tab.pattern) then
+				usererr(info, inputpos, "'"..strInput.."' - " .. L["invalid input"])
 				return
 			end
 		end
-
-		do_final(info, inputpos, tab, "set", str)
-

-
+		do_final(info, inputpos, tab, "set", strInput)
+
+
+
 	elseif tab.type=="toggle" then
 		------------ toggle --------------------------------------------
 		local b
-		local str = strtrim(strlower(str))
+		local str = strtrim(strlower(strInput))
 		if str=="" then
 			b = callmethod(info, inputpos, tab, "get")

@@ -444,7 +437,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			else
 				b = not b
 			end
-
+
 		elseif str==L["on"] then
 			b = true
 		elseif str==L["off"] then
@@ -459,15 +452,15 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			end
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", b)
-
+

 	elseif tab.type=="range" then
 		------------ range --------------------------------------------
-		local val = tonumber(str)
+		local val = tonumber(strInput)
 		if not val then
-			usererr(info, inputpos, "'"..str.."' - "..L["expected number"])
+			usererr(info, inputpos, "'"..strInput.."' - "..L["expected number"])
 			return
 		end
 		if type(info.step)=="number" then
@@ -481,21 +474,21 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", val)

-
+
 	elseif tab.type=="select" then
 		------------ select ------------------------------------
-		local str = strtrim(strlower(str))
-
+		local str = strtrim(strlower(strInput))
+
 		local values = tab.values
 		if type(values) == "function" or type(values) == "string" then
 			info.values = values
 			values = callmethod(info, inputpos, tab, "values")
 			info.values = nil
 		end
-
+
 		if str == "" then
 			local b = callmethod(info, inputpos, tab, "get")
 			local fmt = "|cffffff78- [%s]|r %s"
@@ -512,7 +505,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 		end

 		local ok
-		for k,v in pairs(values) do
+		for k,v in pairs(values) do
 			if strlower(k)==str then
 				str = k	-- overwrite with key (in case of case mismatches)
 				ok = true
@@ -523,20 +516,20 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", str)
-
+
 	elseif tab.type=="multiselect" then
 		------------ multiselect -------------------------------------------
-		local str = strtrim(strlower(str))
-
+		local str = strtrim(strlower(strInput))
+
 		local values = tab.values
 		if type(values) == "function" or type(values) == "string" then
 			info.values = values
 			values = callmethod(info, inputpos, tab, "values")
 			info.values = nil
 		end
-
+
 		if str == "" then
 			local fmt = "|cffffff78- [%s]|r %s"
 			local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
@@ -550,7 +543,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			end
 			return
 		end
-
+
 		--build a table of the selections, checking that they exist
 		--parse for =on =off =default in the process
 		--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
@@ -559,25 +552,25 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--parse option=on etc
 			local opt, val = v:match('(.+)=(.+)')
 			--get option if toggling
-			if not opt then
-				opt = v
+			if not opt then
+				opt = v
 			end
-
+
 			--check that the opt is valid
 			local ok
-			for k,v in pairs(values) do
+			for k in pairs(values) do
 				if strlower(k)==opt then
 					opt = k	-- overwrite with key (in case of case mismatches)
 					ok = true
 					break
 				end
 			end
-
+
 			if not ok then
 				usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
 				return
 			end
-
+
 			--check that if val was supplied it is valid
 			if val then
 				if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
@@ -596,14 +589,14 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				sels[opt] = true
 			end
 		end
-
+
 		for opt, val in pairs(sels) do
 			local newval
-
+
 			if (val == true) then
 				--toggle the option
 				local b = callmethod(info, inputpos, tab, "get", opt)
-
+
 				if tab.tristate then
 					--cycle in true, nil, false order
 					if b then
@@ -627,28 +620,28 @@ local function handle(info, inputpos, tab, depth, retfalse)
 					newval = nil
 				end
 			end
-
+
 			do_final(info, inputpos, tab, "set", opt, newval)
 		end
-
-
+
+
 	elseif tab.type=="color" then
 		------------ color --------------------------------------------
-		local str = strtrim(strlower(str))
+		local str = strtrim(strlower(strInput))
 		if str == "" then
 			--TODO: Show current value
 			return
 		end
-
+
 		local r, g, b, a
-
+
 		local hasAlpha = tab.hasAlpha
 		if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
 			info.hasAlpha = hasAlpha
 			hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
 			info.hasAlpha = nil
 		end
-
+
 		if hasAlpha then
 			if str:len() == 8 and str:find("^%x*$")  then
 				--parse a hex string
@@ -662,7 +655,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
 				return
 			end
-
+
 			if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
 				--values are valid
 			elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
@@ -701,12 +694,12 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
 			end
 		end
-
+
 		do_final(info, inputpos, tab, "set", r,g,b,a)

 	elseif tab.type=="keybinding" then
 		------------ keybinding --------------------------------------------
-		local str = strtrim(strlower(str))
+		local str = strtrim(strlower(strInput))
 		if str == "" then
 			--TODO: Show current value
 			return
@@ -737,7 +730,7 @@ end
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
 -- -- Use AceConsole-3.0 to register a Chat Command
 -- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
---
+--
 -- -- Show the GUI if no input is supplied, otherwise handle the chat input.
 -- function MyAddon:ChatCommand(input)
 --   -- Assuming "MyOptions" is the appName of a valid options table
@@ -754,7 +747,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 		error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
 	end
 	local options = assert( optgetter("cmd", MAJOR) )
-
+
 	local info = {   -- Don't try to recycle this, it gets handed off to callbacks and whatnot
 		[0] = slashcmd,
 		appName = appName,
@@ -765,7 +758,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 		uiType = "cmd",
 		uiName = MAJOR,
 	}
-
+
 	handle(info, 1, options, 0)  -- (info, inputpos, table, depth)
 end

diff --git a/TitanClassic/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/TitanClassic/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index 81885ae..146bb7c 100755
--- a/TitanClassic/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/TitanClassic/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
@@ -1,13 +1,13 @@
 --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
 -- @class file
 -- @name AceConfigDialog-3.0
--- @release $Id: AceConfigDialog-3.0.lua 1197 2019-01-21 23:41:10Z nevcairiel $
+-- @release $Id: AceConfigDialog-3.0.lua 1296 2022-11-04 18:50:10Z nevcairiel $

 local LibStub = LibStub
 local gui = LibStub("AceGUI-3.0")
 local reg = LibStub("AceConfigRegistry-3.0")

-local MAJOR, MINOR = "AceConfigDialog-3.0", 69
+local MAJOR, MINOR = "AceConfigDialog-3.0", 86
 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigDialog then return end
@@ -15,25 +15,20 @@ if not AceConfigDialog then return end
 AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {}
 AceConfigDialog.Status = AceConfigDialog.Status or {}
 AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame")
+AceConfigDialog.tooltip = AceConfigDialog.tooltip or CreateFrame("GameTooltip", "AceConfigDialogTooltip", UIParent, "GameTooltipTemplate")

 AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {}
 AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {}
 AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {}

 -- Lua APIs
-local tinsert, tsort, tremove = table.insert, table.sort, table.remove
+local tinsert, tsort, tremove, wipe = table.insert, table.sort, table.remove, table.wipe
 local strmatch, format = string.match, string.format
 local error = error
-local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs
+local pairs, next, select, type, unpack, ipairs = pairs, next, select, type, unpack, ipairs
 local tostring, tonumber = tostring, tonumber
 local math_min, math_max, math_floor = math.min, math.max, math.floor

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NORMAL_FONT_COLOR, GameTooltip, StaticPopupDialogs, ACCEPT, CANCEL, StaticPopup_Show
--- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
--- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
-
 local emptyTbl = {}

 --[[
@@ -56,18 +51,18 @@ local width_multiplier = 170
 --[[
 Group Types
   Tree 	- All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
-  		- Descendant Groups with inline=true and thier children will not become nodes
+        - Descendant Groups with inline=true and thier children will not become nodes

   Tab	- Direct Child Groups will become tabs, direct child options will appear above the tab control
-  		- Grandchild groups will default to inline unless specified otherwise
+        - Grandchild groups will default to inline unless specified otherwise

   Select- Same as Tab but with entries in a dropdown rather than tabs


   Inline Groups
-  	- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
-  	- If declared on a direct child of a root node of a select group, they will appear above the group container control
-  	- When a group is displayed inline, all descendants will also be inline members of the group
+    - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
+    - If declared on a direct child of a root node of a select group, they will appear above the group container control
+    - When a group is displayed inline, all descendants will also be inline members of the group

 ]]

@@ -152,6 +147,7 @@ local stringIsLiteral = {
 	width = true,
 	image = true,
 	fontSize = true,
+	tooltipHyperlink = true
 }

 --Is Never a function or method
@@ -168,11 +164,11 @@ local allIsLiteral = {
 local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
 	--get definition for the member
 	local inherits = isInherited[membername]
-
+

 	--get the member of the option, traversing the tree if it can be inherited
 	local member
-
+
 	if inherits then
 		local group = options
 		if group[membername] ~= nil then
@@ -187,22 +183,21 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 	else
 		member = option[membername]
 	end
-
+
 	--check if we need to call a functon, or if we have a literal value
 	if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
 		--We have a function to call
 		local info = new()
 		--traverse the options table, picking up the handler and filling the info with the path
-		local handler
 		local group = options
-		handler = group.handler or handler
-
+		local handler = group.handler
+
 		for i = 1, #path do
 			group = GetSubOption(group, path[i])
 			info[i] = path[i]
 			handler = group.handler or handler
 		end
-
+
 		info.options = options
 		info.appName = appName
 		info[0] = appName
@@ -212,8 +207,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		info.type = option.type
 		info.uiType = "dialog"
 		info.uiName = MAJOR
-
-		local a, b, c ,d
+
+		local a, b, c ,d
 		--using 4 returns for the get of a color type, increase if a type needs more
 		if type(member) == "function" then
 			--Call the function
@@ -230,8 +225,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		return a,b,c,d
 	else
 		--The value isnt a function to call, return it
-		return member
-	end
+		return member
+	end
 end

 --[[calls an options function that could be inherited, method name or function ref
@@ -296,7 +291,7 @@ local function compareOptions(a,b)
 		return NameA:upper() < NameB:upper()
 	end
 	if OrderA < 0 then
-		if OrderB > 0 then
+		if OrderB >= 0 then
 			return false
 		end
 	else
@@ -315,7 +310,7 @@ end
 local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 	tempOrders = new()
 	tempNames = new()
-
+
 	if group.plugins then
 		for plugin, t in pairs(group.plugins) do
 			for k, v in pairs(t) do
@@ -331,7 +326,7 @@ local function BuildSortedOptionsTable(group, keySort, opts, options, path, appN
 			end
 		end
 	end
-
+
 	for k, v in pairs(group.args) do
 		if not opts[k] then
 			tinsert(keySort, k)
@@ -362,7 +357,7 @@ local function DelTree(tree)
 end

 local function CleanUserData(widget, event)
-
+
 	local user = widget:GetUserDataTable()

 	if user.path then
@@ -402,7 +397,7 @@ end
 -- - Gets a status table for the given appname and options path.
 -- @param appName The application name as given to `:RegisterOptionsTable()`
 -- @param path The path to the options (a table with all group keys)
--- @return
+-- @return
 function AceConfigDialog:GetStatusTable(appName, path)
 	local status = self.Status

@@ -436,7 +431,7 @@ end
 function AceConfigDialog:SelectGroup(appName, ...)
 	local path = new()

-
+
 	local app = reg:GetOptionsTable(appName)
 	if not app then
 		error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
@@ -448,9 +443,9 @@ function AceConfigDialog:SelectGroup(appName, ...)
 		status.groups = {}
 	end
 	status = status.groups
-	local treevalue
-	local treestatus
-
+	local treevalue
+	local treestatus
+
 	for n = 1, select("#",...) do
 		local key = select(n, ...)

@@ -477,12 +472,12 @@ function AceConfigDialog:SelectGroup(appName, ...)
 			--the selected group will be overwritten if a child is the final target but still needs to be open
 			treestatus.selected = treevalue
 			treestatus.groups[treevalue] = true
-
+
 		end
-
+
 		--move to the next group in the path
 		group = GetSubOption(group, key)
-		if not group then
+		if not group then
 			break
 		end
 		tinsert(path, key)
@@ -492,10 +487,10 @@ function AceConfigDialog:SelectGroup(appName, ...)
 		end
 		status = status.groups
 	end
-
+
 	del(path)
 	reg:NotifyChange(appName)
-end
+end

 local function OptionOnMouseOver(widget, event)
 	--show a tooltip/set the status bar to the desc text
@@ -504,107 +499,160 @@ local function OptionOnMouseOver(widget, event)
 	local options = user.options
 	local path = user.path
 	local appName = user.appName
+	local tooltip = AceConfigDialog.tooltip
+
+	tooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
+
+	local tooltipHyperlink = GetOptionsMemberValue("tooltipHyperlink", opt, options, path, appName)
+	if tooltipHyperlink then
+		tooltip:SetHyperlink(tooltipHyperlink)
+		tooltip:Show()
+		return
+	end

-	GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
 	local name = GetOptionsMemberValue("name", opt, options, path, appName)
 	local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
 	local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
 	local descStyle = opt.descStyle
-
+
 	if descStyle and descStyle ~= "tooltip" then return end
-
-	GameTooltip:SetText(name, 1, .82, 0, true)
-
+
+	tooltip:SetText(name, 1, .82, 0, true)
+
 	if opt.type == "multiselect" then
-		GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
-	end
+		tooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
+	end
 	if type(desc) == "string" then
-		GameTooltip:AddLine(desc, 1, 1, 1, true)
+		tooltip:AddLine(desc, 1, 1, 1, true)
 	end
 	if type(usage) == "string" then
-		GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true)
+		tooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true)
 	end

-	GameTooltip:Show()
+	tooltip:Show()
 end

 local function OptionOnMouseLeave(widget, event)
-	GameTooltip:Hide()
+	AceConfigDialog.tooltip:Hide()
 end

 local function GetFuncName(option)
-	local type = option.type
-	if type == "execute" then
+	if option.type == "execute" then
 		return "func"
 	else
 		return "set"
 	end
 end
+do
+	local frame = AceConfigDialog.popup
+	if not frame or oldminor < 81 then
+		frame = CreateFrame("Frame", nil, UIParent)
+		AceConfigDialog.popup = frame
+		frame:Hide()
+		frame:SetPoint("CENTER", UIParent, "CENTER")
+		frame:SetSize(320, 72)
+		frame:EnableMouse(true) -- Do not allow click-through on the frame
+		frame:SetFrameStrata("TOOLTIP")
+		frame:SetFrameLevel(100) -- Lots of room to draw under it
+		frame:SetScript("OnKeyDown", function(self, key)
+			if key == "ESCAPE" then
+				self:SetPropagateKeyboardInput(false)
+				if self.cancel:IsShown() then
+					self.cancel:Click()
+				else -- Showing a validation error
+					self:Hide()
+				end
+			else
+				self:SetPropagateKeyboardInput(true)
+			end
+		end)
+
+		local border = CreateFrame("Frame", nil, frame, "DialogBorderOpaqueTemplate")
+		border:SetAllPoints(frame)
+		frame:SetFixedFrameStrata(true)
+		frame:SetFixedFrameLevel(true)
+
+		local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
+		text:SetSize(290, 0)
+		text:SetPoint("TOP", 0, -16)
+		frame.text = text
+
+		local function newButton(newText)
+			local button = CreateFrame("Button", nil, frame)
+			button:SetSize(128, 21)
+			button:SetNormalFontObject(GameFontNormal)
+			button:SetHighlightFontObject(GameFontHighlight)
+			button:SetNormalTexture(130763) -- "Interface\\Buttons\\UI-DialogBox-Button-Up"
+			button:GetNormalTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
+			button:SetPushedTexture(130761) -- "Interface\\Buttons\\UI-DialogBox-Button-Down"
+			button:GetPushedTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
+			button:SetHighlightTexture(130762) -- "Interface\\Buttons\\UI-DialogBox-Button-Highlight"
+			button:GetHighlightTexture():SetTexCoord(0.0, 1.0, 0.0, 0.71875)
+			button:SetText(newText)
+			return button
+		end
+
+		local accept = newButton(ACCEPT)
+		accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
+		frame.accept = accept
+
+		local cancel = newButton(CANCEL)
+		cancel:SetPoint("LEFT", accept, "RIGHT", 13, 0)
+		frame.cancel = cancel
+	end
+end
 local function confirmPopup(appName, rootframe, basepath, info, message, func, ...)
-	if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then
-		StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {}
-	end
-	local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"]
-	for k in pairs(t) do
-		t[k] = nil
-	end
-	t.text = message
-	t.button1 = ACCEPT
-	t.button2 = CANCEL
-	t.preferredIndex = STATICPOPUP_NUMDIALOGS
-	local dialog, oldstrata
-	t.OnAccept = function()
-		safecall(func, unpack(t))
-		if dialog and oldstrata then
-			dialog:SetFrameStrata(oldstrata)
-		end
+	local frame = AceConfigDialog.popup
+	frame:Show()
+	frame.text:SetText(message)
+	-- From StaticPopup.lua
+	-- local height = 32 + text:GetHeight() + 2;
+	-- height = height + 6 + accept:GetHeight()
+	-- We add 32 + 2 + 6 + 21 (button height) == 61
+	local height = 61 + frame.text:GetHeight()
+	frame:SetHeight(height)
+
+	frame.accept:ClearAllPoints()
+	frame.accept:SetPoint("BOTTOMRIGHT", frame, "BOTTOM", -6, 16)
+	frame.cancel:Show()
+
+	local t = {...}
+	local tCount = select("#", ...)
+	frame.accept:SetScript("OnClick", function(self)
+		safecall(func, unpack(t, 1, tCount)) -- Manually set count as unpack() stops on nil (bug with #table)
 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
+		frame:Hide()
+		self:SetScript("OnClick", nil)
+		frame.cancel:SetScript("OnClick", nil)
 		del(info)
-	end
-	t.OnCancel = function()
-		if dialog and oldstrata then
-			dialog:SetFrameStrata(oldstrata)
-		end
+	end)
+	frame.cancel:SetScript("OnClick", function(self)
 		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
+		frame:Hide()
+		self:SetScript("OnClick", nil)
+		frame.accept:SetScript("OnClick", nil)
 		del(info)
-	end
-	for i = 1, select("#", ...) do
-		t[i] = select(i, ...) or false
-	end
-	t.timeout = 0
-	t.whileDead = 1
-	t.hideOnEscape = 1
-
-	dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG")
-	if dialog then
-		oldstrata = dialog:GetFrameStrata()
-		dialog:SetFrameStrata("TOOLTIP")
-	end
+	end)
 end

 local function validationErrorPopup(message)
-	if not StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] then
-		StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"] = {}
-	end
-	local t = StaticPopupDialogs["ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG"]
-	t.text = message
-	t.button1 = OKAY
-	t.preferredIndex = STATICPOPUP_NUMDIALOGS
-	local dialog, oldstrata
-	t.OnAccept = function()
-		if dialog and oldstrata then
-			dialog:SetFrameStrata(oldstrata)
-		end
-	end
-	t.timeout = 0
-	t.whileDead = 1
-	t.hideOnEscape = 1
-
-	dialog = StaticPopup_Show("ACECONFIGDIALOG30_VALIDATION_ERROR_DIALOG")
-	if dialog then
-		oldstrata = dialog:GetFrameStrata()
-		dialog:SetFrameStrata("TOOLTIP")
-	end
+	local frame = AceConfigDialog.popup
+	frame:Show()
+	frame.text:SetText(message)
+	-- From StaticPopup.lua
+	-- local height = 32 + text:GetHeight() + 2;
+	-- height = height + 6 + accept:GetHeight()
+	-- We add 32 + 2 + 6 + 21 (button height) == 61
+	local height = 61 + frame.text:GetHeight()
+	frame:SetHeight(height)
+
+	frame.accept:ClearAllPoints()
+	frame.accept:SetPoint("BOTTOM", frame, "BOTTOM", 0, 16)
+	frame.cancel:Hide()
+
+	frame.accept:SetScript("OnClick", function()
+		frame:Hide()
+	end)
 end

 local function ActivateControl(widget, event, ...)
@@ -627,7 +675,7 @@ local function ActivateControl(widget, event, ...)
 	if group[funcname] ~= nil then
 		func =  group[funcname]
 	end
-	handler = group.handler or handler
+	handler = group.handler
 	confirm = group.confirm
 	validate = group.validate
 	for i = 1, #path do
@@ -675,7 +723,7 @@ local function ActivateControl(widget, event, ...)
 			end
 		end
 	end
-
+
 	local success
 	if validated and option.type ~= "execute" then
 		if type(validate) == "string" then
@@ -690,8 +738,7 @@ local function ActivateControl(widget, event, ...)
 			if not success then validated = false end
 		end
 	end
-
-	local rootframe = user.rootframe
+
 	if not validated or type(validated) == "string" then
 		if not validated then
 			if usage then
@@ -706,8 +753,8 @@ local function ActivateControl(widget, event, ...)
 		end

 		-- show validate message
-		if rootframe.SetStatusText then
-			rootframe:SetStatusText(validated)
+		if user.rootframe.SetStatusText then
+			user.rootframe:SetStatusText(validated)
 		else
 			validationErrorPopup(validated)
 		end
@@ -715,7 +762,7 @@ local function ActivateControl(widget, event, ...)
 		del(info)
 		return true
 	else
-
+
 		local confirmText = option.confirmText
 		--call confirm func/method
 		if type(confirm) == "string" then
@@ -744,22 +791,22 @@ local function ActivateControl(widget, event, ...)
 		if type(confirm) == "boolean" then
 			if confirm then
 				if not confirmText then
-					local name, desc = option.name, option.desc
-					if type(name) == "function" then
-						name = name(info)
+					local option_name, desc = option.name, option.desc
+					if type(option_name) == "function" then
+						option_name = option_name(info)
 					end
 					if type(desc) == "function" then
 						desc = desc(info)
 					end
-					confirmText = name
+					confirmText = option_name
 					if desc then
 						confirmText = confirmText.." - "..desc
 					end
 				end
-
+
 				local iscustom = user.rootframe:GetUserData("iscustom")
 				local rootframe
-
+
 				if iscustom then
 					rootframe = user.rootframe
 				end
@@ -796,7 +843,7 @@ local function ActivateControl(widget, event, ...)
 		--full refresh of the frame, some controls dont cause this on all events
 		if option.type == "color" then
 			if event == "OnValueConfirmed" then
-
+
 				if iscustom then
 					AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
 				else
@@ -857,7 +904,7 @@ end

 local function MultiControlOnClosed(widget, event, ...)
 	local user = widget:GetUserDataTable()
-	if user.valuechanged then
+	if user.valuechanged and not widget:IsReleasing() then
 		local iscustom = user.rootframe:GetUserData("iscustom")
 		local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
 		if iscustom then
@@ -1049,6 +1096,10 @@ local function CreateControl(userControlType, fallbackControlType)
 	return control
 end

+local function sortTblAsStrings(x,y)
+	return tostring(x) < tostring(y) -- Support numbers as keys
+end
+
 --[[
 	options - root of the options table being fed
 	container - widget that controls will be placed in
@@ -1079,7 +1130,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					else
 						GroupContainer = gui:Create("SimpleGroup")
 					end
-
+
 					GroupContainer.width = "fill"
 					GroupContainer:SetLayout("flow")
 					container:AddChild(GroupContainer)
@@ -1088,14 +1139,12 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 			else
 				--Control to feed
 				local control
-
-				local name = GetOptionsMemberValue("name", v, options, path, appName)
-
+
 				if v.type == "execute" then
-
+
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
+
 					local iconControl = type(image) == "string" or type(image) == "number"
 					control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button")
 					if iconControl then
@@ -1125,7 +1174,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 				elseif v.type == "input" then
 					control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox")
-
+
 					if v.multiline and control.SetNumLines then
 						control:SetNumLines(tonumber(v.multiline) or 4)
 					end
@@ -1144,15 +1193,15 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					local value = GetOptionsMemberValue("get",v, options, path, appName)
 					control:SetValue(value)
 					control:SetCallback("OnValueChanged",ActivateControl)
-
+
 					if v.descStyle == "inline" then
 						local desc = GetOptionsMemberValue("desc", v, options, path, appName)
 						control:SetDescription(desc)
 					end
-
+
 					local image = GetOptionsMemberValue("image", v, options, path, appName)
 					local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)
-
+
 					if type(image) == "string" or type(image) == "number" then
 						if type(imageCoords) == "table" then
 							control:SetImage(image, unpack(imageCoords))
@@ -1175,6 +1224,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 				elseif v.type == "select" then
 					local values = GetOptionsMemberValue("values", v, options, path, appName)
+					local sorting = GetOptionsMemberValue("sorting", v, options, path, appName)
 					if v.style == "radio" then
 						local disabled = CheckOptionDisabled(v, options, path, appName)
 						local width = GetOptionsMemberValue("width",v,options,path,appName)
@@ -1185,12 +1235,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 						control:PauseLayout()
 						local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
-						local t = {}
-						for value, text in pairs(values) do
-							t[#t+1]=value
+						if not sorting then
+							sorting = {}
+							for value, text in pairs(values) do
+								sorting[#sorting+1]=value
+							end
+							tsort(sorting, sortTblAsStrings)
 						end
-						tsort(t)
-						for k, value in ipairs(t) do
+						for _, value in ipairs(sorting) do
 							local text = values[value]
 							local radio = gui:Create("CheckBox")
 							radio:SetLabel(text)
@@ -1224,7 +1276,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 							itemType = nil
 						end
 						control:SetLabel(name)
-						control:SetList(values, nil, itemType)
+						control:SetList(values, sorting, itemType)
 						local value = GetOptionsMemberValue("get",v, options, path, appName)
 						if not values[value] then
 							value = nil
@@ -1236,7 +1288,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				elseif v.type == "multiselect" then
 					local values = GetOptionsMemberValue("values", v, options, path, appName)
 					local disabled = CheckOptionDisabled(v, options, path, appName)
-
+
 					local valuesort = new()
 					if values then
 						for value, text in pairs(values) do
@@ -1244,7 +1296,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						end
 					end
 					tsort(valuesort)
-
+
 					local controlType = v.dialogControl or v.control
 					if controlType then
 						control = gui:Create(controlType)
@@ -1272,8 +1324,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 							control:SetWidth(width_multiplier)
 						end
 						--check:SetTriState(v.tristate)
-						for i = 1, #valuesort do
-							local key = valuesort[i]
+						for s = 1, #valuesort do
+							local key = valuesort[s]
 							local value = GetOptionsMemberValue("get",v, options, path, appName, key)
 							control:SetItemValue(key,value)
 						end
@@ -1285,8 +1337,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 						control:PauseLayout()
 						local width = GetOptionsMemberValue("width",v,options,path,appName)
-						for i = 1, #valuesort do
-							local value = valuesort[i]
+						for s = 1, #valuesort do
+							local value = valuesort[s]
 							local text = values[value]
 							local check = gui:Create("CheckBox")
 							check:SetLabel(text)
@@ -1303,7 +1355,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 							elseif width == "half" then
 								check:SetWidth(width_multiplier / 2)
 							elseif (type(width) == "number") then
-								control:SetWidth(width_multiplier * width)
+								check:SetWidth(width_multiplier * width)
 							elseif width == "full" then
 								check.width = "fill"
 							else
@@ -1313,9 +1365,9 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						control:ResumeLayout()
 						control:DoLayout()

-
+
 					end
-
+
 					del(valuesort)

 				elseif v.type == "color" then
@@ -1340,7 +1392,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				elseif v.type == "description" then
 					control = CreateControl(v.dialogControl or v.control, "Label")
 					control:SetText(name)
-
+
 					local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
 					if fontSize == "medium" then
 						control:SetFontObject(GameFontHighlight)
@@ -1349,10 +1401,10 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					else -- small or invalid
 						control:SetFontObject(GameFontHighlightSmall)
 					end
-
+
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
+
 					if type(image) == "string" or type(image) == "number" then
 						if not width then
 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
@@ -1373,8 +1425,8 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						end
 						control:SetImageSize(width, height)
 					end
-					local width = GetOptionsMemberValue("width",v,options,path,appName)
-					control.width = not width and "fill"
+					local controlWidth = GetOptionsMemberValue("width",v,options,path,appName)
+					control.width = not controlWidth and "fill"
 				end

 				--Common Init
@@ -1401,7 +1453,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					InjectInfo(control, options, v, path, rootframe, appName)
 					container:AddChild(control)
 				end
-
+
 			end
 		end
 		tremove(path)
@@ -1426,7 +1478,8 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
 	local option = user.option
 	local path = user.path
 	local appName = user.appName
-
+	local tooltip = AceConfigDialog.tooltip
+
 	local feedpath = new()
 	for i = 1, #path do
 		feedpath[i] = path[i]
@@ -1441,49 +1494,50 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)

 	local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
 	local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
-
-	GameTooltip:SetOwner(button, "ANCHOR_NONE")
+
+	tooltip:SetOwner(button, "ANCHOR_NONE")
+	tooltip:ClearAllPoints()
 	if widget.type == "TabGroup" then
-		GameTooltip:SetPoint("BOTTOM",button,"TOP")
+		tooltip:SetPoint("BOTTOM",button,"TOP")
 	else
-		GameTooltip:SetPoint("LEFT",button,"RIGHT")
+		tooltip:SetPoint("LEFT",button,"RIGHT")
 	end

-	GameTooltip:SetText(name, 1, .82, 0, true)
-
+	tooltip:SetText(name, 1, .82, 0, true)
+
 	if type(desc) == "string" then
-		GameTooltip:AddLine(desc, 1, 1, 1, true)
+		tooltip:AddLine(desc, 1, 1, 1, true)
 	end
-
-	GameTooltip:Show()
+
+	tooltip:Show()
 end

 local function TreeOnButtonLeave(widget, event, value, button)
-	GameTooltip:Hide()
+	AceConfigDialog.tooltip:Hide()
 end


 local function GroupExists(appName, options, path, uniquevalue)
 	if not uniquevalue then return false end
-
+
 	local feedpath = new()
 	local temppath = new()
 	for i = 1, #path do
 		feedpath[i] = path[i]
 	end
-
+
 	BuildPath(feedpath, ("\001"):split(uniquevalue))
-
+
 	local group = options
 	for i = 1, #feedpath do
 		local v = feedpath[i]
 		temppath[i] = v
 		group = GetSubOption(group, v)
-
-		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
+
+		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
 			del(feedpath)
 			del(temppath)
-			return false
+			return false
 		end
 	end
 	del(feedpath)
@@ -1602,7 +1656,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			tab:SetCallback("OnGroupSelected", GroupSelected)
 			tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
 			tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
-
+
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
@@ -1622,34 +1676,34 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 					break
 				end
 			end
-
+
 			container:AddChild(tab)

 		elseif grouptype == "select" then

-			local select = gui:Create("DropdownGroup")
-			select:SetTitle(name)
-			InjectInfo(select, options, group, path, rootframe, appName)
-			select:SetCallback("OnGroupSelected", GroupSelected)
+			local selectGroup = gui:Create("DropdownGroup")
+			selectGroup:SetTitle(name)
+			InjectInfo(selectGroup, options, group, path, rootframe, appName)
+			selectGroup:SetCallback("OnGroupSelected", GroupSelected)
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
 			end
-			select:SetStatusTable(status.groups)
+			selectGroup:SetStatusTable(status.groups)
 			local grouplist, orderlist = BuildSelect(group, options, path, appName)
-			select:SetGroupList(grouplist, orderlist)
-			select:SetUserData("grouplist", grouplist)
-			select:SetUserData("orderlist", orderlist)
+			selectGroup:SetGroupList(grouplist, orderlist)
+			selectGroup:SetUserData("grouplist", grouplist)
+			selectGroup:SetUserData("orderlist", orderlist)

 			local firstgroup = orderlist[1]
 			if firstgroup then
-				select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
+				selectGroup:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
 			end
-
-			select.width = "fill"
-			select.height = "fill"

-			container:AddChild(select)
+			selectGroup.width = "fill"
+			selectGroup.height = "fill"
+
+			container:AddChild(selectGroup)

 		--assume tree group by default
 		--if parenttype is tree then this group is already a node on that tree
@@ -1657,14 +1711,14 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			local tree = gui:Create("TreeGroup")
 			InjectInfo(tree, options, group, path, rootframe, appName)
 			tree:EnableButtonTooltips(false)
-
+
 			tree.width = "fill"
 			tree.height = "fill"

 			tree:SetCallback("OnGroupSelected", GroupSelected)
 			tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
 			tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
-
+
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
@@ -1705,7 +1759,7 @@ local function RefreshOnUpdate(this)
 		end
 		this.closing[appName] = nil
 	end
-
+
 	if this.closeAll then
 		for k, v in pairs(AceConfigDialog.OpenFrames) do
 			if not this.closeAllOverride[k] then
@@ -1715,7 +1769,7 @@ local function RefreshOnUpdate(this)
 		this.closeAll = nil
 		wipe(this.closeAllOverride)
 	end
-
+
 	for appName in pairs(this.apps) do
 		if AceConfigDialog.OpenFrames[appName] then
 			local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
@@ -1800,10 +1854,10 @@ function AceConfigDialog:Open(appName, container, ...)
 	local options = app("dialog", MAJOR)

 	local f
-
+
 	local path = new()
 	local name = GetOptionsMemberValue("name", options, options, path, appName)
-
+
 	--If an optional path is specified add it to the path table before feeding the options
 	--as container is optional as well it may contain the first element of the path
 	if type(container) == "string" then
@@ -1813,7 +1867,7 @@ function AceConfigDialog:Open(appName, container, ...)
 	for n = 1, select("#",...) do
 		tinsert(path, (select(n, ...)))
 	end
-
+
 	local option = options
 	if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then
 		for i = 1, #path do
@@ -1821,7 +1875,7 @@ function AceConfigDialog:Open(appName, container, ...)
 		end
 		name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName))
 	end
-
+
 	--if a container is given feed into that
 	if container then
 		f = container
@@ -1877,13 +1931,13 @@ end
 -- convert pre-39 BlizOptions structure to the new format
 if oldminor and oldminor < 39 and AceConfigDialog.BlizOptions then
 	local old = AceConfigDialog.BlizOptions
-	local new = {}
+	local newOpt = {}
 	for key, widget in pairs(old) do
 		local appName = widget:GetUserData("appName")
-		if not new[appName] then new[appName] = {} end
-		new[appName][key] = widget
+		if not newOpt[appName] then newOpt[appName] = {} end
+		newOpt[appName][key] = widget
 	end
-	AceConfigDialog.BlizOptions = new
+	AceConfigDialog.BlizOptions = newOpt
 else
 	AceConfigDialog.BlizOptions = AceConfigDialog.BlizOptions or {}
 end
@@ -1915,23 +1969,23 @@ end
 -- @param name A descriptive name to display in the options tree (defaults to appName)
 -- @param parent The parent to use in the interface options tree.
 -- @param ... The path in the options table to feed into the interface options panel.
--- @return The reference to the frame registered into the Interface Options.
+-- @return The reference to the frame registered into the Interface Options.
+-- @return The category ID to pass to Settings.OpenToCategory (or InterfaceOptionsFrame_OpenToCategory)
 function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
 	local BlizOptions = AceConfigDialog.BlizOptions
-
+
 	local key = appName
 	for n = 1, select("#", ...) do
 		key = key.."\001"..select(n, ...)
 	end
-
+
 	if not BlizOptions[appName] then
 		BlizOptions[appName] = {}
 	end
-
+
 	if not BlizOptions[appName][key] then
 		local group = gui:Create("BlizOptionsGroup")
 		BlizOptions[appName][key] = group
-		group:SetName(name or appName, parent)

 		group:SetTitle(name or appName)
 		group:SetUserData("appName", appName)
@@ -1944,8 +1998,30 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
 		end
 		group:SetCallback("OnShow", FeedToBlizPanel)
 		group:SetCallback("OnHide", ClearBlizPanel)
-		InterfaceOptions_AddCategory(group.frame)
-		return group.frame
+		if Settings and Settings.RegisterCanvasLayoutCategory then
+			local categoryName = name or appName
+			if parent then
+				local category = Settings.GetCategory(parent)
+				if not category then
+					error(("The parent category '%s' was not found"):format(parent), 2)
+				end
+				local subcategory = Settings.RegisterCanvasLayoutSubcategory(category, group.frame, categoryName)
+
+				-- force the generated ID to be used for subcategories, as these can have very simple names like "Profiles"
+				group:SetName(subcategory.ID, parent)
+			else
+				local category = Settings.RegisterCanvasLayoutCategory(group.frame, categoryName)
+				-- using appName here would be cleaner, but would not be 100% compatible
+				-- but for top-level categories it should be fine, as these are typically addon names
+				category.ID = categoryName
+				group:SetName(categoryName, parent)
+				Settings.RegisterAddOnCategory(category)
+			end
+		else
+			group:SetName(name or appName, parent)
+			InterfaceOptions_AddCategory(group.frame)
+		end
+		return group.frame, group.frame.name
 	else
 		error(("%s has already been added to the Blizzard Options Window with the given path"):format(appName), 2)
 	end
diff --git a/TitanClassic/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/TitanClassic/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
index e7a6d76..175224d 100755
--- a/TitanClassic/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+++ b/TitanClassic/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
@@ -4,14 +4,14 @@
 -- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
 -- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
 -- * The **appName** field is the options table name as given at registration time \\
---
+--
 -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
 -- @class file
 -- @name AceConfigRegistry-3.0
--- @release $Id: AceConfigRegistry-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $
+-- @release $Id: AceConfigRegistry-3.0.lua 1296 2022-11-04 18:50:10Z nevcairiel $
 local CallbackHandler = LibStub("CallbackHandler-1.0")

-local MAJOR, MINOR = "AceConfigRegistry-3.0", 18
+local MAJOR, MINOR = "AceConfigRegistry-3.0", 21
 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigRegistry then return end
@@ -33,7 +33,7 @@ local error, assert = error, assert


 AceConfigRegistry.validated = {
-	-- list of options table names ran through :ValidateOptionsTable automatically.
+	-- list of options table names ran through :ValidateOptionsTable automatically.
 	-- CLEARED ON PURPOSE, since newer versions may have newer validators
 	cmd = {},
 	dropdown = {},
@@ -59,7 +59,6 @@ local optstring={["nil"]=true,["string"]=true, _="string"}
 local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"}
 local optstringnumberfunc={["nil"]=true,["string"]=true,["number"]=true,["function"]=true, _="string, number or funcref"}
 local optnumber={["nil"]=true,["number"]=true, _="number"}
-local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"}
 local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true},  _="methodname, funcref or false"}
 local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true,  _="methodname, funcref or number"}
 local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true,  _="methodname, funcref or table"}
@@ -84,6 +83,7 @@ local basekeys={
 		dialogHidden=optmethodbool,
 		dropdownHidden=optmethodbool,
 	cmdHidden=optmethodbool,
+	tooltipHyperlink=optstringfunc,
 	icon=optstringnumberfunc,
 	iconCoords=optmethodtable,
 	handler=opttable,
@@ -95,13 +95,20 @@ local basekeys={
 }

 local typedkeys={
-	header={},
+	header={
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
+	},
 	description={
 		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
 		fontSize=optstringfunc,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	group={
 		args=istable,
@@ -118,6 +125,9 @@ local typedkeys={
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	input={
 		pattern=optstring,
@@ -131,6 +141,9 @@ local typedkeys={
 		tristate=optbool,
 		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	tristate={
 	},
@@ -142,12 +155,16 @@ local typedkeys={
 		step=optnumber,
 		bigStep=optnumber,
 		isPercent=optbool,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	select={
 		values=ismethodtable,
+		sorting=optmethodtable,
 		style={
-			["nil"]=true,
-			["string"]={dropdown=true,radio=true},
+			["nil"]=true,
+			["string"]={dropdown=true,radio=true},
 			_="string: 'dropdown' or 'radio'"
 		},
 		control=optstring,
@@ -165,9 +182,14 @@ local typedkeys={
 	},
 	color={
 		hasAlpha=optmethodbool,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	keybinding={
-		-- TODO
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 }

@@ -204,13 +226,13 @@ local function validate(options,errlvl,...)
 	if type(options.type)~="string" then
 		err(".type: expected a string, got a "..type(options.type), errlvl,...)
 	end
-
+
 	-- get type and 'typedkeys' member
 	local tk = typedkeys[options.type]
 	if not tk then
 		err(".type: unknown type '"..options.type.."'", errlvl,...)
 	end
-
+
 	-- make sure that all options[] are known parameters
 	for k,v in pairs(options) do
 		if not (tk[k] or basekeys[k]) then
@@ -303,7 +325,7 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation
 				AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl)	-- upgradable
 				AceConfigRegistry.validated[uiType][appName] = true
 			end
-			return options
+			return options
 		end
 	elseif type(options)=="function" then
 		AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
@@ -341,7 +363,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
 	if not f then
 		return nil
 	end
-
+
 	if uiType then
 		return f(uiType,uiName,1)	-- get the table for us
 	else
diff --git a/TitanClassic/libs/AceGUI-3.0/AceGUI-3.0.lua b/TitanClassic/libs/AceGUI-3.0/AceGUI-3.0.lua
index 3c376c7..7d9a2cf 100755
--- a/TitanClassic/libs/AceGUI-3.0/AceGUI-3.0.lua
+++ b/TitanClassic/libs/AceGUI-3.0/AceGUI-3.0.lua
@@ -24,7 +24,7 @@
 -- f:AddChild(btn)
 -- @class file
 -- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1247 2021-01-23 23:16:39Z funkehdude $
+-- @release $Id: AceGUI-3.0.lua 1288 2022-09-25 14:19:00Z funkehdude $
 local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41
 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)

@@ -35,17 +35,11 @@ local tinsert, wipe = table.insert, table.wipe
 local select, pairs, next, type = select, pairs, next, type
 local error, assert = error, assert
 local setmetatable, rawget = setmetatable, rawget
-local math_max = math.max
+local math_max, math_min, math_ceil = math.max, math.min, math.ceil

 -- WoW APIs
 local UIParent = UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: geterrorhandler, LibStub
-
---local con = LibStub("AceConsole-3.0",true)
-
 AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
 AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
 AceGUI.WidgetBase = AceGUI.WidgetBase or {}
@@ -94,38 +88,38 @@ do
 	AceGUI.objPools = AceGUI.objPools or {}
 	local objPools = AceGUI.objPools
 	--Returns a new instance, if none are available either returns a new table or calls the given contructor
-	function newWidget(type)
-		if not WidgetRegistry[type] then
+	function newWidget(widgetType)
+		if not WidgetRegistry[widgetType] then
 			error("Attempt to instantiate unknown widget type", 2)
 		end

-		if not objPools[type] then
-			objPools[type] = {}
+		if not objPools[widgetType] then
+			objPools[widgetType] = {}
 		end

-		local newObj = next(objPools[type])
+		local newObj = next(objPools[widgetType])
 		if not newObj then
-			newObj = WidgetRegistry[type]()
-			newObj.AceGUIWidgetVersion = WidgetVersions[type]
+			newObj = WidgetRegistry[widgetType]()
+			newObj.AceGUIWidgetVersion = WidgetVersions[widgetType]
 		else
-			objPools[type][newObj] = nil
+			objPools[widgetType][newObj] = nil
 			-- if the widget is older then the latest, don't even try to reuse it
 			-- just forget about it, and grab a new one.
-			if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then
-				return newWidget(type)
+			if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[widgetType] then
+				return newWidget(widgetType)
 			end
 		end
 		return newObj
 	end
 	-- Releases an instance to the Pool
-	function delWidget(obj,type)
-		if not objPools[type] then
-			objPools[type] = {}
+	function delWidget(obj,widgetType)
+		if not objPools[widgetType] then
+			objPools[widgetType] = {}
 		end
-		if objPools[type][obj] then
+		if objPools[widgetType][obj] then
 			error("Attempt to Release Widget that is already released", 2)
 		end
-		objPools[type][obj] = true
+		objPools[widgetType][obj] = true
 	end
 end

@@ -141,9 +135,9 @@ end
 -- OnAcquire function on it, before returning.
 -- @param type The type of the widget.
 -- @return The newly created widget.
-function AceGUI:Create(type)
-	if WidgetRegistry[type] then
-		local widget = newWidget(type)
+function AceGUI:Create(widgetType)
+	if WidgetRegistry[widgetType] then
+		local widget = newWidget(widgetType)

 		if rawget(widget, "Acquire") then
 			widget.OnAcquire = widget.Acquire
@@ -161,7 +155,7 @@ function AceGUI:Create(type)
 		if widget.OnAcquire then
 			widget:OnAcquire()
 		else
-			error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
+			error(("Widget type %s doesn't supply an OnAcquire Function"):format(widgetType))
 		end
 		-- Set the default Layout ("List")
 		safecall(widget.SetLayout, widget, "List")
@@ -589,25 +583,25 @@ AceGUI.counts = AceGUI.counts or {}
 -- This is used by widgets that require a named frame, e.g. when a Blizzard
 -- Template requires it.
 -- @param type The widget type
-function AceGUI:GetNextWidgetNum(type)
-	if not self.counts[type] then
-		self.counts[type] = 0
+function AceGUI:GetNextWidgetNum(widgetType)
+	if not self.counts[widgetType] then
+		self.counts[widgetType] = 0
 	end
-	self.counts[type] = self.counts[type] + 1
-	return self.counts[type]
+	self.counts[widgetType] = self.counts[widgetType] + 1
+	return self.counts[widgetType]
 end

 --- Return the number of created widgets for this type.
 -- In contrast to GetNextWidgetNum, the number is not incremented.
--- @param type The widget type
-function AceGUI:GetWidgetCount(type)
-	return self.counts[type] or 0
+-- @param widgetType The widget type
+function AceGUI:GetWidgetCount(widgetType)
+	return self.counts[widgetType] or 0
 end

 --- Return the version of the currently registered widget type.
--- @param type The widget type
-function AceGUI:GetWidgetVersion(type)
-	return WidgetVersions[type]
+-- @param widgetType The widget type
+function AceGUI:GetWidgetVersion(widgetType)
+	return WidgetVersions[widgetType]
 end

 -------------
@@ -770,7 +764,6 @@ AceGUI:RegisterLayout("Flow",

 				usedwidth = 0
 				rowstart = frame
-				rowstartoffset = frameoffset

 				if child.DoLayout then
 					child:DoLayout()
@@ -813,7 +806,8 @@ local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child)
 			or colObj and (colObj["align" .. dir] or colObj.align)
 			or tableObj["align" .. dir] or tableObj.align
 			or "CENTERLEFT"
-	local child, cell, val = child or 0, cell or 0, nil
+	local val
+	child, cell = child or 0, cell or 0

 	if type(fn) == "string" then
 		fn = fn:lower()
@@ -827,7 +821,7 @@ local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child)
 		val = fn
 	end

-	return fn, max(0, min(val, cell))
+	return fn, math_max(0, math_min(val, cell))
 end

 -- Get width or height for multiple cells combined
@@ -836,7 +830,7 @@ local GetCellDimension = function (dir, laneDim, from, to, space)
 	for cell=from,to do
 		dim = dim + (laneDim[cell] or 0)
 	end
-	return dim + max(0, to - from) * (space or 0)
+	return dim + math_max(0, to - from) * (space or 0)
 end

 --[[ Options
@@ -882,7 +876,7 @@ AceGUI:RegisterLayout("Table",
 				repeat
 					n = n + 1
 					local col = (n - 1) % #cols + 1
-					local row = ceil(n / #cols)
+					local row = math_ceil(n / #cols)
 					local rowspan = rowspans[col]
 					local cell = rowspan and rowspan.child or child
 					local cellObj = cell:GetUserData("cell")
@@ -898,7 +892,7 @@ AceGUI:RegisterLayout("Table",
 					end

 					-- Colspan
-					local colspan = max(0, min((cellObj and cellObj.colspan or 1) - 1, #cols - col))
+					local colspan = math_max(0, math_min((cellObj and cellObj.colspan or 1) - 1, #cols - col))
 					n = n + colspan

 					-- Place the cell
@@ -915,7 +909,7 @@ AceGUI:RegisterLayout("Table",
 			end
 		end

-		local rows = ceil(n / #cols)
+		local rows = math_ceil(n / #cols)

 		-- Determine fixed size cols and collect weights
 		local extantH, totalWeight = totalH, 0
@@ -940,16 +934,16 @@ AceGUI:RegisterLayout("Table",
 							f:ClearAllPoints()
 							local childH = f:GetWidth() or 0

-							laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
+							laneH[col] = math_max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
 						end
 					end

-					laneH[col] = max(colObj.min or colObj[1] or 0, min(laneH[col], colObj.max or colObj[2] or laneH[col]))
+					laneH[col] = math_max(colObj.min or colObj[1] or 0, math_min(laneH[col], colObj.max or colObj[2] or laneH[col]))
 				else
 					-- Rel./Abs. width
 					laneH[col] = colObj.width < 1 and colObj.width * totalH or colObj.width
 				end
-				extantH = max(0, extantH - laneH[col])
+				extantH = math_max(0, extantH - laneH[col])
 			end
 		end

@@ -988,7 +982,7 @@ AceGUI:RegisterLayout("Table",
 						child:DoLayout()
 					end

-					rowV = max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV))
+					rowV = math_max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV))
 				end
 			end

diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
index 200fc71..bf1eae7 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
@@ -2,7 +2,7 @@
 BlizOptionsGroup Container
 Simple container widget for the integration of AceGUI into the Blizzard Interface Options
 -------------------------------------------------------------------------------]]
-local Type, Version = "BlizOptionsGroup", 21
+local Type, Version = "BlizOptionsGroup", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -99,7 +99,7 @@ local methods = {
 Constructor
 -------------------------------------------------------------------------------]]
 local function Constructor()
-	local frame = CreateFrame("Frame")
+	local frame = CreateFrame("Frame", nil, InterfaceOptionsFramePanelContainer)
 	frame:Hide()

 	-- support functions for the Blizzard Interface Options
@@ -108,6 +108,11 @@ local function Constructor()
 	frame.default = default
 	frame.refresh = refresh

+	-- 10.0 support function aliases (cancel has been removed)
+	frame.OnCommit = okay
+	frame.OnDefault = default
+	frame.OnRefresh = refresh
+
 	frame:SetScript("OnHide", OnHide)
 	frame:SetScript("OnShow", OnShow)

diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
index c4c6092..2322e3d 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
@@ -125,7 +125,7 @@ local function Constructor()
 	dropdown.frame:Show()
 	dropdown:SetLabel("")

-	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local border = CreateFrame("Frame", nil, frame, "BackdropTemplate")
 	border:SetPoint("TOPLEFT", 0, -26)
 	border:SetPoint("BOTTOMRIGHT", 0, 3)
 	border:SetBackdrop(PaneBackdrop)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
index b9581d6..ca90890 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 Frame Container
 -------------------------------------------------------------------------------]]
-local Type, Version = "Frame", 28
+local Type, Version = "Frame", 30
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -13,10 +13,6 @@ local wipe = table.wipe
 local PlaySound = PlaySound
 local CreateFrame, UIParent = CreateFrame, UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: CLOSE
-
 --[[-----------------------------------------------------------------------------
 Scripts
 -------------------------------------------------------------------------------]]
@@ -180,7 +176,7 @@ local PaneBackdrop  = {
 }

 local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local frame = CreateFrame("Frame", nil, UIParent, "BackdropTemplate")
 	frame:Hide()

 	frame:EnableMouse(true)
@@ -190,7 +186,11 @@ local function Constructor()
 	frame:SetFrameLevel(100) -- Lots of room to draw under it
 	frame:SetBackdrop(FrameBackdrop)
 	frame:SetBackdropColor(0, 0, 0, 1)
-	frame:SetMinResize(400, 200)
+	if frame.SetResizeBounds then -- WoW 10.0
+		frame:SetResizeBounds(400, 200)
+	else
+		frame:SetMinResize(400, 200)
+	end
 	frame:SetToplevel(true)
 	frame:SetScript("OnShow", Frame_OnShow)
 	frame:SetScript("OnHide", Frame_OnClose)
@@ -203,7 +203,7 @@ local function Constructor()
 	closebutton:SetWidth(100)
 	closebutton:SetText(CLOSE)

-	local statusbg = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local statusbg = CreateFrame("Button", nil, frame, "BackdropTemplate")
 	statusbg:SetPoint("BOTTOMLEFT", 15, 15)
 	statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
 	statusbg:SetHeight(24)
@@ -271,7 +271,7 @@ local function Constructor()
 	line2:SetHeight(8)
 	line2:SetPoint("BOTTOMRIGHT", -8, 8)
 	line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
-	local x = 0.1 * 8/17
+	x = 0.1 * 8/17
 	line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

 	local sizer_s = CreateFrame("Frame", nil, frame)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
index 26db900..04b4d5d 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
@@ -75,7 +75,7 @@ local function Constructor()
 	titletext:SetJustifyH("LEFT")
 	titletext:SetHeight(18)

-	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local border = CreateFrame("Frame", nil, frame, "BackdropTemplate")
 	border:SetPoint("TOPLEFT", 0, -17)
 	border:SetPoint("BOTTOMRIGHT", -1, 3)
 	border:SetBackdrop(PaneBackdrop)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
index 0649c06..8a5756f 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
@@ -2,7 +2,7 @@
 TabGroup Container
 Container that uses tabs on top to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TabGroup", 37
+local Type, Version = "TabGroup", 38
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -14,10 +14,6 @@ local PlaySound = PlaySound
 local CreateFrame, UIParent = CreateFrame, UIParent
 local _G = _G

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
-
 -- local upvalue storage used by BuildTabs
 local widths = {}
 local rowwidths = {}
@@ -26,6 +22,143 @@ local rowends = {}
 --[[-----------------------------------------------------------------------------
 Support functions
 -------------------------------------------------------------------------------]]
+
+local function PanelTemplates_TabResize(tab, padding, absoluteSize, minWidth, maxWidth, absoluteTextSize)
+	local tabName = tab:GetName();
+
+	local buttonMiddle = tab.Middle or tab.middleTexture or _G[tabName.."Middle"];
+	local buttonMiddleDisabled = tab.MiddleDisabled or (tabName and _G[tabName.."MiddleDisabled"]);
+	local left = tab.Left or tab.leftTexture or _G[tabName.."Left"];
+	local sideWidths = 2 * left:GetWidth();
+	local tabText = tab.Text or _G[tab:GetName().."Text"];
+	local highlightTexture = tab.HighlightTexture or (tabName and _G[tabName.."HighlightTexture"]);
+
+	local width, tabWidth;
+	local textWidth;
+	if ( absoluteTextSize ) then
+		textWidth = absoluteTextSize;
+	else
+		tabText:SetWidth(0);
+		textWidth = tabText:GetWidth();
+	end
+	-- If there's an absolute size specified then use it
+	if ( absoluteSize ) then
+		if ( absoluteSize < sideWidths) then
+			width = 1;
+			tabWidth = sideWidths
+		else
+			width = absoluteSize - sideWidths;
+			tabWidth = absoluteSize
+		end
+		tabText:SetWidth(width);
+	else
+		-- Otherwise try to use padding
+		if ( padding ) then
+			width = textWidth + padding;
+		else
+			width = textWidth + 24;
+		end
+		-- If greater than the maxWidth then cap it
+		if ( maxWidth and width > maxWidth ) then
+			if ( padding ) then
+				width = maxWidth + padding;
+			else
+				width = maxWidth + 24;
+			end
+			tabText:SetWidth(width);
+		else
+			tabText:SetWidth(0);
+		end
+		if (minWidth and width < minWidth) then
+			width = minWidth;
+		end
+		tabWidth = width + sideWidths;
+	end
+
+	if ( buttonMiddle ) then
+		buttonMiddle:SetWidth(width);
+	end
+	if ( buttonMiddleDisabled ) then
+		buttonMiddleDisabled:SetWidth(width);
+	end
+
+	tab:SetWidth(tabWidth);
+
+	if ( highlightTexture ) then
+		highlightTexture:SetWidth(tabWidth);
+	end
+end
+
+local function PanelTemplates_DeselectTab(tab)
+	local name = tab:GetName();
+
+	local left = tab.Left or _G[name.."Left"];
+	local middle = tab.Middle or _G[name.."Middle"];
+	local right = tab.Right or _G[name.."Right"];
+	left:Show();
+	middle:Show();
+	right:Show();
+	--tab:UnlockHighlight();
+	tab:Enable();
+	local text = tab.Text or _G[name.."Text"];
+	text:SetPoint("CENTER", tab, "CENTER", (tab.deselectedTextX or 0), (tab.deselectedTextY or 2));
+
+	local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+	local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+	local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+	leftDisabled:Hide();
+	middleDisabled:Hide();
+	rightDisabled:Hide();
+end
+
+local function PanelTemplates_SelectTab(tab)
+	local name = tab:GetName();
+
+	local left = tab.Left or _G[name.."Left"];
+	local middle = tab.Middle or _G[name.."Middle"];
+	local right = tab.Right or _G[name.."Right"];
+	left:Hide();
+	middle:Hide();
+	right:Hide();
+	--tab:LockHighlight();
+	tab:Disable();
+	tab:SetDisabledFontObject(GameFontHighlightSmall);
+	local text = tab.Text or _G[name.."Text"];
+	text:SetPoint("CENTER", tab, "CENTER", (tab.selectedTextX or 0), (tab.selectedTextY or -3));
+
+	local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+	local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+	local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+	leftDisabled:Show();
+	middleDisabled:Show();
+	rightDisabled:Show();
+
+	if GameTooltip:IsOwned(tab) then
+		GameTooltip:Hide();
+	end
+end
+
+local function PanelTemplates_SetDisabledTabState(tab)
+	local name = tab:GetName();
+	local left = tab.Left or _G[name.."Left"];
+	local middle = tab.Middle or _G[name.."Middle"];
+	local right = tab.Right or _G[name.."Right"];
+	left:Show();
+	middle:Show();
+	right:Show();
+	--tab:UnlockHighlight();
+	tab:Disable();
+	tab.text = tab:GetText();
+	-- Gray out text
+	tab:SetDisabledFontObject(GameFontDisableSmall);
+	local leftDisabled = tab.LeftDisabled or _G[name.."LeftDisabled"];
+	local middleDisabled = tab.MiddleDisabled or _G[name.."MiddleDisabled"];
+	local rightDisabled = tab.RightDisabled or _G[name.."RightDisabled"];
+	leftDisabled:Hide();
+	middleDisabled:Hide();
+	rightDisabled:Hide();
+end
+
 local function UpdateTabLook(frame)
 	if frame.disabled then
 		PanelTemplates_SetDisabledTabState(frame)
@@ -103,11 +236,64 @@ local methods = {

 	["CreateTab"] = function(self, id)
 		local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id)
-		local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
+		local tab = CreateFrame("Button", tabname, self.border)
+		tab:SetSize(115, 24)
+		tab.deselectedTextY = -3
+		tab.selectedTextY = -2
+
+		tab.LeftDisabled = tab:CreateTexture(tabname .. "LeftDisabled", "BORDER")
+		tab.LeftDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+		tab.LeftDisabled:SetSize(20, 24)
+		tab.LeftDisabled:SetPoint("BOTTOMLEFT", 0, -3)
+		tab.LeftDisabled:SetTexCoord(0, 0.15625, 0, 1.0)
+
+		tab.MiddleDisabled = tab:CreateTexture(tabname .. "MiddleDisabled", "BORDER")
+		tab.MiddleDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+		tab.MiddleDisabled:SetSize(88, 24)
+		tab.MiddleDisabled:SetPoint("LEFT", tab.LeftDisabled, "RIGHT")
+		tab.MiddleDisabled:SetTexCoord(0.15625, 0.84375, 0, 1.0)
+
+		tab.RightDisabled = tab:CreateTexture(tabname .. "RightDisabled", "BORDER")
+		tab.RightDisabled:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-ActiveTab")
+		tab.RightDisabled:SetSize(20, 24)
+		tab.RightDisabled:SetPoint("LEFT", tab.MiddleDisabled, "RIGHT")
+		tab.RightDisabled:SetTexCoord(0.84375, 1.0, 0, 1.0)
+
+		tab.Left = tab:CreateTexture(tabname .. "Left", "BORDER")
+		tab.Left:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+		tab.Left:SetSize(20, 24)
+		tab.Left:SetPoint("TOPLEFT")
+		tab.Left:SetTexCoord(0, 0.15625, 0, 1.0)
+
+		tab.Middle = tab:CreateTexture(tabname .. "Middle", "BORDER")
+		tab.Middle:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+		tab.Middle:SetSize(88, 24)
+		tab.Middle:SetPoint("LEFT", tab.Left, "RIGHT")
+		tab.Middle:SetTexCoord(0.15625, 0.84375, 0, 1.0)
+
+		tab.Right = tab:CreateTexture(tabname .. "Right", "BORDER")
+		tab.Right:SetTexture("Interface\\OptionsFrame\\UI-OptionsFrame-InActiveTab")
+		tab.Right:SetSize(20, 24)
+		tab.Right:SetPoint("LEFT", tab.Middle, "RIGHT")
+		tab.Right:SetTexCoord(0.84375, 1.0, 0, 1.0)
+
+		tab.Text = tab:CreateFontString(tabname .. "Text")
+		tab:SetFontString(tab.Text)
+
+		tab:SetNormalFontObject(GameFontNormalSmall)
+		tab:SetHighlightFontObject(GameFontHighlightSmall)
+		tab:SetDisabledFontObject(GameFontHighlightSmall)
+		tab:SetHighlightTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight", "ADD")
+		tab.HighlightTexture = tab:GetHighlightTexture()
+		tab.HighlightTexture:ClearAllPoints()
+		tab.HighlightTexture:SetPoint("LEFT", tab, "LEFT", 10, -4)
+		tab.HighlightTexture:SetPoint("RIGHT", tab, "RIGHT", -10, -4)
+		_G[tabname .. "HighlightTexture"] = tab.HighlightTexture
+
 		tab.obj = self
 		tab.id = id

-		tab.text = _G[tabname .. "Text"]
+		tab.text = tab.Text -- compat
 		tab.text:ClearAllPoints()
 		tab.text:SetPoint("LEFT", 14, -3)
 		tab.text:SetPoint("RIGHT", -12, -3)
@@ -316,7 +502,7 @@ local function Constructor()
 	titletext:SetHeight(18)
 	titletext:SetText("")

-	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local border = CreateFrame("Frame", nil, frame, "BackdropTemplate")
 	border:SetPoint("TOPLEFT", 1, -27)
 	border:SetPoint("BOTTOMRIGHT", -1, 3)
 	border:SetBackdrop(PaneBackdrop)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
index c09c5ec..ca9b2df 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,22 +2,18 @@
 TreeGroup Container
 Container that uses a tree control to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 45
+local Type, Version = "TreeGroup", 47
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

 -- Lua APIs
 local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
-local math_min, math_max, floor = math.min, math.max, floor
+local math_min, math_max, floor = math.min, math.max, math.floor
 local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat

 -- WoW APIs
 local CreateFrame, UIParent = CreateFrame, UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: FONT_COLOR_CODE_CLOSE
-
 -- Recycling functions
 local new, del
 do
@@ -567,7 +563,11 @@ local methods = {
 		if maxtreewidth > 100 and status.treewidth > maxtreewidth then
 			self:SetTreeWidth(maxtreewidth, status.treesizable)
 		end
-		treeframe:SetMaxResize(maxtreewidth, 1600)
+		if treeframe.SetResizeBounds then
+			treeframe:SetResizeBounds(100, 1, maxtreewidth, 1600)
+		else
+			treeframe:SetMaxResize(maxtreewidth, 1600)
+		end
 	end,

 	["OnHeightSet"] = function(self, height)
@@ -637,7 +637,7 @@ local function Constructor()
 	local num = AceGUI:GetNextWidgetNum(Type)
 	local frame = CreateFrame("Frame", nil, UIParent)

-	local treeframe = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local treeframe = CreateFrame("Frame", nil, frame, "BackdropTemplate")
 	treeframe:SetPoint("TOPLEFT")
 	treeframe:SetPoint("BOTTOMLEFT")
 	treeframe:SetWidth(DEFAULT_TREE_WIDTH)
@@ -646,13 +646,17 @@ local function Constructor()
 	treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
 	treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
 	treeframe:SetResizable(true)
-	treeframe:SetMinResize(100, 1)
-	treeframe:SetMaxResize(400, 1600)
+	if treeframe.SetResizeBounds then -- WoW 10.0
+		treeframe:SetResizeBounds(100, 1, 400, 1600)
+	else
+		treeframe:SetMinResize(100, 1)
+		treeframe:SetMaxResize(400, 1600)
+	end
 	treeframe:SetScript("OnUpdate", FirstFrameUpdate)
 	treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
 	treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)

-	local dragger = CreateFrame("Frame", nil, treeframe, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local dragger = CreateFrame("Frame", nil, treeframe, "BackdropTemplate")
 	dragger:SetWidth(8)
 	dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
 	dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
@@ -677,7 +681,7 @@ local function Constructor()
 	scrollbg:SetAllPoints(scrollbar)
 	scrollbg:SetColorTexture(0,0,0,0.4)

-	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local border = CreateFrame("Frame", nil, frame, "BackdropTemplate")
 	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
 	border:SetPoint("BOTTOMRIGHT")
 	border:SetBackdrop(PaneBackdrop)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
index a9192b3..5729bfd 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
@@ -7,10 +7,6 @@ local pairs, assert, type = pairs, assert, type
 local PlaySound = PlaySound
 local CreateFrame, UIParent = CreateFrame, UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontNormal
-
 ----------------
 -- Main Frame --
 ----------------
@@ -21,7 +17,7 @@ local CreateFrame, UIParent = CreateFrame, UIParent
 ]]
 do
 	local Type = "Window"
-	local Version = 6
+	local Version = 8

 	local function frameOnShow(this)
 		this.obj:Fire("OnShow")
@@ -186,7 +182,11 @@ do

 		frame:SetScript("OnShow",frameOnShow)
 		frame:SetScript("OnHide",frameOnClose)
-		frame:SetMinResize(240,240)
+		if frame.SetResizeBounds then -- WoW 10.0
+			frame:SetResizeBounds(240,240)
+		else
+			frame:SetMinResize(240,240)
+		end
 		frame:SetToplevel(true)

 		local titlebg = frame:CreateTexture(nil, "BACKGROUND")
@@ -300,7 +300,7 @@ do
 		line2:SetHeight(8)
 		line2:SetPoint("BOTTOMRIGHT", -8, 8)
 		line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
-		local x = 0.1 * 8/17
+		x = 0.1 * 8/17
 		line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

 		local sizer_s = CreateFrame("Frame",nil,frame)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
index d2adb88..6e64292 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
@@ -12,10 +12,6 @@ local select, pairs = select, pairs
 local PlaySound = PlaySound
 local CreateFrame, UIParent = CreateFrame, UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: SetDesaturation, GameFontHighlight
-
 --[[-----------------------------------------------------------------------------
 Support functions
 -------------------------------------------------------------------------------]]
@@ -199,14 +195,14 @@ local methods = {
 	["SetDescription"] = function(self, desc)
 		if desc then
 			if not self.desc then
-				local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
-				desc:ClearAllPoints()
-				desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
-				desc:SetWidth(self.frame.width - 30)
-				desc:SetPoint("RIGHT", self.frame, "RIGHT", -30, 0)
-				desc:SetJustifyH("LEFT")
-				desc:SetJustifyV("TOP")
-				self.desc = desc
+				local f = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
+				f:ClearAllPoints()
+				f:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
+				f:SetWidth(self.frame.width - 30)
+				f:SetPoint("RIGHT", self.frame, "RIGHT", -30, 0)
+				f:SetJustifyH("LEFT")
+				f:SetJustifyV("TOP")
+				self.desc = f
 			end
 			self.desc:Show()
 			--self.text:SetFontObject(GameFontNormal)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
index f4cab66..699d583 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
@@ -11,10 +11,6 @@ local pairs = pairs
 -- WoW APIs
 local CreateFrame, UIParent = CreateFrame, UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: ColorPickerFrame, OpacitySliderFrame
-
 --[[-----------------------------------------------------------------------------
 Support functions
 -------------------------------------------------------------------------------]]
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
index 9dd4b60..0ad94f8 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--
+--[[ $Id: AceGUIWidget-DropDown-Items.lua 1272 2022-08-29 15:56:35Z nevcairiel $ ]]--

 local AceGUI = LibStub("AceGUI-3.0")

@@ -41,7 +41,7 @@ local ItemBase = {
 	-- NOTE: The ItemBase version is added to each item's version number
 	--       to ensure proper updates on ItemBase changes.
 	--       Use at least 1000er steps.
-	version = 1000,
+	version = 2000,
 	counter = 0,
 }

@@ -178,7 +178,7 @@ function ItemBase.Create(type)
 	highlight:Hide()
 	self.highlight = highlight

-	local check = frame:CreateTexture("OVERLAY")
+	local check = frame:CreateTexture(nil, "OVERLAY")
 	check:SetWidth(16)
 	check:SetHeight(16)
 	check:SetPoint("LEFT",frame,"LEFT",3,-1)
@@ -186,7 +186,7 @@ function ItemBase.Create(type)
 	check:Hide()
 	self.check = check

-	local sub = frame:CreateTexture("OVERLAY")
+	local sub = frame:CreateTexture(nil, "OVERLAY")
 	sub:SetWidth(16)
 	sub:SetHeight(16)
 	sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
index 94c5ded..3d8dd11 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1239 2020-09-20 10:22:02Z nevcairiel $ ]]--
+--[[ $Id: AceGUIWidget-DropDown.lua 1284 2022-09-25 09:15:30Z nevcairiel $ ]]--
 local AceGUI = LibStub("AceGUI-3.0")

 -- Lua APIs
@@ -11,10 +11,6 @@ local PlaySound = PlaySound
 local UIParent, CreateFrame = UIParent, CreateFrame
 local _G = _G

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: CLOSE
-
 local function fixlevels(parent,...)
 	local i = 1
 	local child = select(i, ...)
@@ -253,7 +249,7 @@ do

 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
-		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
+		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, "BackdropTemplate")
 		local self = {}
 		self.count = count
 		self.type = widgetType
@@ -304,7 +300,7 @@ do
 		scrollFrame.obj = self
 		itemFrame.obj = self

-		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, "BackdropTemplate")
 		slider:SetOrientation("VERTICAL")
 		slider:SetHitRectInsets(0, 0, -10, 0)
 		slider:SetBackdrop(sliderBackdrop)
@@ -351,7 +347,7 @@ end

 do
 	local widgetType = "Dropdown"
-	local widgetVersion = 35
+	local widgetVersion = 36

 	--[[ Static data ]]--

@@ -376,7 +372,6 @@ do

 	local function Dropdown_TogglePullout(this)
 		local self = this.obj
-		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		if self.open then
 			self.open = nil
 			self.pullout:Close()
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
index cc1b6a3..85a32a0 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
@@ -14,10 +14,6 @@ local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, Get
 local CreateFrame, UIParent = CreateFrame, UIParent
 local _G = _G

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
-
 --[[-----------------------------------------------------------------------------
 Support functions
 -------------------------------------------------------------------------------]]
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
index b195e0c..96f7e5b 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
@@ -13,10 +13,6 @@ local pairs = pairs
 local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
 local CreateFrame, UIParent = CreateFrame, UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NOT_BOUND
-
 --[[-----------------------------------------------------------------------------
 Scripts
 -------------------------------------------------------------------------------]]
@@ -214,7 +210,7 @@ local function Constructor()
 	label:SetJustifyH("CENTER")
 	label:SetHeight(18)

-	local msgframe = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local msgframe = CreateFrame("Frame", nil, UIParent, "BackdropTemplate")
 	msgframe:SetHeight(30)
 	msgframe:SetBackdrop(ControlBackdrop)
 	msgframe:SetBackdropColor(0,0,0)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
index 2cce725..6bbcf3b 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
@@ -2,7 +2,7 @@
 Label Widget
 Displays text and optionally an icon.
 -------------------------------------------------------------------------------]]
-local Type, Version = "Label", 27
+local Type, Version = "Label", 28
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -12,10 +12,6 @@ local max, select, pairs = math.max, select, pairs
 -- WoW APIs
 local CreateFrame, UIParent = CreateFrame, UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
 --[[-----------------------------------------------------------------------------
 Support functions
 -------------------------------------------------------------------------------]]
@@ -129,12 +125,16 @@ local methods = {
 	end,

 	["SetFont"] = function(self, font, height, flags)
-		self.label:SetFont(font, height, flags)
-		UpdateImageAnchor(self)
+		if not self.fontObject then
+			self.fontObject = CreateFont("AceGUI30LabelFont" .. AceGUI:GetNextWidgetNum(Type))
+		end
+		self.fontObject:SetFont(font, height, flags)
+		self:SetFontObject(self.fontObject)
 	end,

 	["SetFontObject"] = function(self, font)
-		self:SetFont((font or GameFontHighlightSmall):GetFont())
+		self.label:SetFontObject(font or GameFontHighlightSmall)
+		UpdateImageAnchor(self)
 	end,

 	["SetImageSize"] = function(self, width, height)
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
index cfcb500..c33a986 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -1,4 +1,4 @@
-local Type, Version = "MultiLineEditBox", 29
+local Type, Version = "MultiLineEditBox", 32
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -10,10 +10,6 @@ local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, Cl
 local CreateFrame, UIParent = CreateFrame, UIParent
 local _G = _G

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: ACCEPT, ChatFontNormal
-
 --[[-----------------------------------------------------------------------------
 Support functions
 -------------------------------------------------------------------------------]]
@@ -145,6 +141,14 @@ local function OnVerticalScroll(self, offset)
 	editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
 end

+local function OnScrollRangeChanged(self, xrange, yrange)
+	if yrange == 0 then
+		self.obj.editBox:SetHitRectInsets(0, 0, 0, 0)
+	else
+		OnVerticalScroll(self, self:GetVerticalScroll())
+	end
+end
+
 local function OnShowFocus(frame)
 	frame.obj.editBox:SetFocus()
 	frame:SetScript("OnShow", nil)
@@ -257,8 +261,6 @@ local methods = {
 	["SetCursorPosition"] = function(self, ...)
 		return self.editBox:SetCursorPosition(...)
 	end,
-
-
 }

 --[[-----------------------------------------------------------------------------
@@ -297,7 +299,7 @@ local function Constructor()
 	text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
 	text:SetJustifyV("MIDDLE")

-	local scrollBG = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local scrollBG = CreateFrame("Frame", nil, frame, "BackdropTemplate")
 	scrollBG:SetBackdrop(backdrop)
 	scrollBG:SetBackdropColor(0, 0, 0)
 	scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
@@ -321,6 +323,7 @@ local function Constructor()
 	scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
 	scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
 	scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
+	scrollFrame:HookScript("OnScrollRangeChanged", OnScrollRangeChanged)

 	local editBox = CreateFrame("EditBox", ("%s%dEdit"):format(Type, widgetNum), scrollFrame)
 	editBox:SetAllPoints()
diff --git a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
index ea655b6..8989608 100755
--- a/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ b/TitanClassic/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
@@ -14,10 +14,6 @@ local tonumber, pairs = tonumber, pairs
 local PlaySound = PlaySound
 local CreateFrame, UIParent = CreateFrame, UIParent

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
 --[[-----------------------------------------------------------------------------
 Support functions
 -------------------------------------------------------------------------------]]
@@ -31,13 +27,13 @@ local function UpdateText(self)
 end

 local function UpdateLabels(self)
-	local min, max = (self.min or 0), (self.max or 100)
+	local min_value, max_value = (self.min or 0), (self.max or 100)
 	if self.ispercent then
-		self.lowtext:SetFormattedText("%s%%", (min * 100))
-		self.hightext:SetFormattedText("%s%%", (max * 100))
+		self.lowtext:SetFormattedText("%s%%", (min_value * 100))
+		self.hightext:SetFormattedText("%s%%", (max_value * 100))
 	else
-		self.lowtext:SetText(min)
-		self.hightext:SetText(max)
+		self.lowtext:SetText(min_value)
+		self.hightext:SetText(max_value)
 	end
 end

@@ -175,13 +171,13 @@ local methods = {
 		self.label:SetText(text)
 	end,

-	["SetSliderValues"] = function(self, min, max, step)
+	["SetSliderValues"] = function(self, min_value, max_value, step)
 		local frame = self.slider
 		frame.setup = true
-		self.min = min
-		self.max = max
+		self.min = min_value
+		self.max = max_value
 		self.step = step
-		frame:SetMinMaxValues(min or 0,max or 100)
+		frame:SetMinMaxValues(min_value or 0,max_value or 100)
 		UpdateLabels(self)
 		frame:SetValueStep(step or 1)
 		if self.value then
@@ -225,7 +221,7 @@ local function Constructor()
 	label:SetJustifyH("CENTER")
 	label:SetHeight(15)

-	local slider = CreateFrame("Slider", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local slider = CreateFrame("Slider", nil, frame, "BackdropTemplate")
 	slider:SetOrientation("HORIZONTAL")
 	slider:SetHeight(15)
 	slider:SetHitRectInsets(0, 0, -10, 0)
@@ -247,7 +243,7 @@ local function Constructor()
 	local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
 	hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)

-	local editbox = CreateFrame("EditBox", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
+	local editbox = CreateFrame("EditBox", nil, frame, "BackdropTemplate")
 	editbox:SetAutoFocus(false)
 	editbox:SetFontObject(GameFontHighlightSmall)
 	editbox:SetPoint("TOP", slider, "BOTTOM")
diff --git a/TitanClassic/libs/AceHook-3.0/AceHook-3.0.lua b/TitanClassic/libs/AceHook-3.0/AceHook-3.0.lua
index ad91467..6bfc798 100755
--- a/TitanClassic/libs/AceHook-3.0/AceHook-3.0.lua
+++ b/TitanClassic/libs/AceHook-3.0/AceHook-3.0.lua
@@ -2,15 +2,15 @@
 -- Using AceHook-3.0 is recommended when you need to unhook your hooks again, so the hook chain isn't broken
 -- when you manually restore the original function.
 --
--- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by
+-- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceHook itself.\\
 -- It is recommended to embed AceHook, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceHook.
 -- @class file
 -- @name AceHook-3.0
--- @release $Id: AceHook-3.0.lua 1118 2014-10-12 08:21:54Z nevcairiel $
-local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8
+-- @release $Id: AceHook-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
+local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 9
 local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)

 if not AceHook then return end -- No upgrade needed
@@ -117,14 +117,14 @@ function donothing() end

 function hook(self, obj, method, handler, script, secure, raw, forceSecure, usage)
 	if not handler then handler = method end
-
+
 	-- These asserts make sure AceHooks's devs play by the rules.
 	assert(not script or type(script) == "boolean")
 	assert(not secure or type(secure) == "boolean")
 	assert(not raw or type(raw) == "boolean")
 	assert(not forceSecure or type(forceSecure) == "boolean")
 	assert(usage)
-
+
 	-- Error checking Battery!
 	if obj and type(obj) ~= "table" then
 		error(format("%s: 'object' - nil or table expected got %s", usage, type(obj)), 3)
@@ -146,8 +146,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			error(format("Cannot hook secure script %q; Use SecureHookScript(obj, method, [handler]) instead.", method), 3)
 		end
 	else
-		local issecure
-		if obj then
+		local issecure
+		if obj then
 			issecure = onceSecure[obj] and onceSecure[obj][method] or issecurevariable(obj, method)
 		else
 			issecure = onceSecure[method] or issecurevariable(method)
@@ -165,21 +165,21 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			end
 		end
 	end
-
+
 	local uid
 	if obj then
 		uid = registry[self][obj] and registry[self][obj][method]
 	else
 		uid = registry[self][method]
 	end
-
+
 	if uid then
 		if actives[uid] then
 			-- Only two sane choices exist here.  We either a) error 100% of the time or b) always unhook and then hook
 			-- choice b would likely lead to odd debuging conditions or other mysteries so we're going with a.
 			error(format("Attempting to rehook already active hook %s.", method))
 		end
-
+
 		if handlers[uid] == handler then -- turn on a decative hook, note enclosures break this ability, small memory leak
 			actives[uid] = true
 			return
@@ -195,9 +195,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			registry[self][method] = nil
 		end
 		handlers[uid], actives[uid], scripts[uid] = nil, nil, nil
-		uid = nil
 	end
-
+
 	local orig
 	if script then
 		orig = obj:GetScript(method) or donothing
@@ -206,13 +205,13 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 	else
 		orig = _G[method]
 	end
-
+
 	if not orig then
 		error(format("%s: Attempting to hook a non existing target", usage), 3)
 	end
-
+
 	uid = createHook(self, handler, orig, secure, not (raw or secure))
-
+
 	if obj then
 		self.hooks[obj] = self.hooks[obj] or {}
 		registry[self][obj] = registry[self][obj] or {}
@@ -221,7 +220,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 		if not secure then
 			self.hooks[obj][method] = orig
 		end
-
+
 		if script then
 			if not secure then
 				obj:SetScript(method, uid)
@@ -237,7 +236,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 		end
 	else
 		registry[self][method] = uid
-
+
 		if not secure then
 			_G[method] = uid
 			self.hooks[method] = orig
@@ -245,8 +244,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			hooksecurefunc(method, uid)
 		end
 	end
-
-	actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil
+
+	actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil
 end

 --- Hook a function or a method on an object.
@@ -262,7 +261,7 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
 --   -- Hook ActionButton_UpdateHotkeys, overwriting the secure status
 --   self:Hook("ActionButton_UpdateHotkeys", true)
@@ -275,12 +274,12 @@ function AceHook:Hook(object, method, handler, hookSecure)
 	if type(object) == "string" then
 		method, handler, hookSecure, object = object, method, handler, nil
 	end
-
+
 	if handler == true then
 		handler, hookSecure = nil, true
 	end

-	hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])")
+	hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])")
 end

 --- RawHook a function or a method on an object.
@@ -297,7 +296,7 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
 --   -- Hook ActionButton_UpdateHotkeys, overwriting the secure status
 --   self:RawHook("ActionButton_UpdateHotkeys", true)
@@ -314,11 +313,11 @@ function AceHook:RawHook(object, method, handler, hookSecure)
 	if type(object) == "string" then
 		method, handler, hookSecure, object = object, method, handler, nil
 	end
-
+
 	if handler == true then
 		handler, hookSecure = nil, true
 	end
-
+
 	hook(self, object, method, handler, false, false, true, hookSecure or false,  "Usage: RawHook([object], method, [handler], [hookSecure])")
 end

@@ -337,7 +336,7 @@ function AceHook:SecureHook(object, method, handler)
 	if type(object) == "string" then
 		method, handler, object = object, method, nil
 	end
-
+
 	hook(self, object, method, handler, false, true, false, false,  "Usage: SecureHook([object], method, [handler])")
 end

@@ -354,9 +353,9 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
---   -- Hook the OnShow of FriendsFrame
+--   -- Hook the OnShow of FriendsFrame
 --   self:HookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow")
 -- end
 --
@@ -380,9 +379,9 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
---   -- Hook the OnShow of FriendsFrame
+--   -- Hook the OnShow of FriendsFrame
 --   self:RawHookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow")
 -- end
 --
@@ -420,54 +419,54 @@ function AceHook:Unhook(obj, method)
 	if type(obj) == "string" then
 		method, obj = obj, nil
 	end
-
+
 	if obj and type(obj) ~= "table" then
 		error(format("%s: 'obj' - expecting nil or table got %s", usage, type(obj)), 2)
 	end
 	if type(method) ~= "string" then
 		error(format("%s: 'method' - expeting string got %s", usage, type(method)), 2)
 	end
-
+
 	local uid
 	if obj then
 		uid = registry[self][obj] and registry[self][obj][method]
 	else
 		uid = registry[self][method]
 	end
-
+
 	if not uid or not actives[uid] then
 		-- Declining to error on an unneeded unhook since the end effect is the same and this would just be annoying.
 		return false
 	end
-
+
 	actives[uid], handlers[uid] = nil, nil
-
+
 	if obj then
 		registry[self][obj][method] = nil
 		registry[self][obj] = next(registry[self][obj]) and registry[self][obj] or nil
-
+
 		-- if the hook reference doesnt exist, then its a secure hook, just bail out and dont do any unhooking
 		if not self.hooks[obj] or not self.hooks[obj][method] then return true end
-
+
 		if scripts[uid] and obj:GetScript(method) == uid then  -- unhooks scripts
-			obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil)
+			obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil)
 			scripts[uid] = nil
 		elseif obj and self.hooks[obj] and self.hooks[obj][method] and obj[method] == uid then -- unhooks methods
 			obj[method] = self.hooks[obj][method]
 		end
-
+
 		self.hooks[obj][method] = nil
 		self.hooks[obj] = next(self.hooks[obj]) and self.hooks[obj] or nil
 	else
 		registry[self][method] = nil
-
+
 		-- if self.hooks[method] doesn't exist, then this is a SecureHook, just bail out
 		if not self.hooks[method] then return true end
-
+
 		if self.hooks[method] and _G[method] == uid then -- unhooks functions
 			_G[method] = self.hooks[method]
 		end
-
+
 		self.hooks[method] = nil
 	end
 	return true
@@ -478,10 +477,10 @@ function AceHook:UnhookAll()
 	for key, value in pairs(registry[self]) do
 		if type(key) == "table" then
 			for method in pairs(value) do
-				self:Unhook(key, method)
+				AceHook.Unhook(self, key, method)
 			end
 		else
-			self:Unhook(key)
+			AceHook.Unhook(self, key)
 		end
 	end
 end
@@ -501,7 +500,7 @@ function AceHook:IsHooked(obj, method)
 			return true, handlers[registry[self][obj][method]]
 		end
 	end
-
+
 	return false, nil
 end

diff --git a/TitanClassic/libs/AceLocale-3.0/AceLocale-3.0.lua b/TitanClassic/libs/AceLocale-3.0/AceLocale-3.0.lua
index 2ecc0cb..e67f82c 100755
--- a/TitanClassic/libs/AceLocale-3.0/AceLocale-3.0.lua
+++ b/TitanClassic/libs/AceLocale-3.0/AceLocale-3.0.lua
@@ -1,7 +1,7 @@
 --- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings.
 -- @class file
 -- @name AceLocale-3.0
--- @release $Id: AceLocale-3.0.lua 1035 2011-07-09 03:20:13Z kaelten $
+-- @release $Id: AceLocale-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $
 local MAJOR,MINOR = "AceLocale-3.0", 6

 local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -12,10 +12,6 @@ if not AceLocale then return end -- no upgrade needed
 local assert, tostring, error = assert, tostring, error
 local getmetatable, setmetatable, rawset, rawget = getmetatable, setmetatable, rawset, rawget

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GAME_LOCALE, geterrorhandler
-
 local gameLocale = GetLocale()
 if gameLocale == "enGB" then
 	gameLocale = "enUS"
@@ -93,7 +89,7 @@ local writedefaultproxy = setmetatable({}, {
 function AceLocale:NewLocale(application, locale, isDefault, silent)

 	-- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
-	local gameLocale = GAME_LOCALE or gameLocale
+	local activeGameLocale = GAME_LOCALE or gameLocale

 	local app = AceLocale.apps[application]

@@ -111,7 +107,7 @@ function AceLocale:NewLocale(application, locale, isDefault, silent)
 		AceLocale.appnames[app] = application
 	end

-	if locale ~= gameLocale and not isDefault then
+	if locale ~= activeGameLocale and not isDefault then
 		return -- nop, we don't need these translations
 	end

diff --git a/TitanClassic/libs/AceTimer-3.0/AceTimer-3.0.lua b/TitanClassic/libs/AceTimer-3.0/AceTimer-3.0.lua
index 7d89500..c337398 100755
--- a/TitanClassic/libs/AceTimer-3.0/AceTimer-3.0.lua
+++ b/TitanClassic/libs/AceTimer-3.0/AceTimer-3.0.lua
@@ -15,7 +15,7 @@
 -- make into AceTimer.
 -- @class file
 -- @name AceTimer-3.0
--- @release $Id: AceTimer-3.0.lua 1170 2018-03-29 17:38:58Z funkydude $
+-- @release $Id: AceTimer-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $

 local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes
 local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -47,7 +47,7 @@ local function new(self, loop, func, delay, ...)
 	activeTimers[timer] = timer

 	-- Create new timer closure to wrap the "timer" object
-	timer.callback = function()
+	timer.callback = function()
 		if not timer.cancelled then
 			if type(timer.func) == "string" then
 				-- We manually set the unpack count to prevent issues with an arg set that contains nil and ends with nil
@@ -61,11 +61,11 @@ local function new(self, loop, func, delay, ...)
 				-- Compensate delay to get a perfect average delay, even if individual times don't match up perfectly
 				-- due to fps differences
 				local time = GetTime()
-				local delay = timer.delay - (time - timer.ends)
+				local ndelay = timer.delay - (time - timer.ends)
 				-- Ensure the delay doesn't go below the threshold
-				if delay < 0.01 then delay = 0.01 end
-				C_TimerAfter(delay, timer.callback)
-				timer.ends = time + delay
+				if ndelay < 0.01 then ndelay = 0.01 end
+				C_TimerAfter(ndelay, timer.callback)
+				timer.ends = time + ndelay
 			else
 				activeTimers[timer.handle or timer] = nil
 			end
diff --git a/TitanClassic/libs/CHANGES.txt b/TitanClassic/libs/CHANGES.txt
index f709a8c..b7a6f2d 100755
--- a/TitanClassic/libs/CHANGES.txt
+++ b/TitanClassic/libs/CHANGES.txt
@@ -1,8 +1,109 @@
 ------------------------------------------------------------------------
-r102 | funkydude | 2018-07-17 19:25:42 +0000 (Tue, 17 Jul 2018) | 1 line
+r1308 | nevcairiel | 2023-07-12 10:15:09 +0000 (Wed, 12 Jul 2023) | 1 line
 Changed paths:
-   M /trunk/LibSharedMedia-3.0.toc
+   M /trunk
+   M /trunk/changelog.txt

-bump version
+Update changelog
+------------------------------------------------------------------------
+r1307 | funkehdude | 2023-07-12 02:24:07 +0000 (Wed, 12 Jul 2023) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+bump toc
+------------------------------------------------------------------------
+r1306 | nevcairiel | 2023-06-23 14:55:09 +0000 (Fri, 23 Jun 2023) | 9 lines
+Changed paths:
+   M /trunk
+   M /trunk/.luacheckrc
+   M /trunk/AceDB-3.0/AceDB-3.0.lua
+
+AceDB-3.0: Add fallbacks for region names
+
+PTRs now return region 72, instead of extending the table fallback to
+GetCurrentRegionName(), and an absolute fallback if even that fails, so
+AceDB does not error out on loading.
+
+GetCurrentRegionName() could be used as the primary source, instead of
+the look-up table, however we need to confirm first that the region keys
+would remain stable.
+------------------------------------------------------------------------
+r1305 | funkehdude | 2023-06-21 11:59:15 +0000 (Wed, 21 Jun 2023) | 1 line
+Changed paths:
+   M /trunk/Ace3_Wrath.toc
+
+bump wrath toc
+------------------------------------------------------------------------
+r1304 | nevcairiel | 2023-05-19 19:50:10 +0000 (Fri, 19 May 2023) | 1 line
+Changed paths:
+   M /trunk
+   M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua
+
+AceDBOptions-3.0: Minor locale fixes for russian
+------------------------------------------------------------------------
+r1303 | nevcairiel | 2023-05-16 15:05:10 +0000 (Tue, 16 May 2023) | 3 lines
+Changed paths:
+   M /trunk
+   M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua
+
+AceDBOptions-3.0: Update locale strings
+
+Fixes WoWAce #629
+------------------------------------------------------------------------
+r1302 | nevcairiel | 2023-05-03 07:00:09 +0000 (Wed, 03 May 2023) | 1 line
+Changed paths:
+   M /trunk
+   M /trunk/Ace3.toc
+
+Update TOC for 10.1
+------------------------------------------------------------------------
+r1301 | funkehdude | 2023-03-22 02:53:32 +0000 (Wed, 22 Mar 2023) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+bump toc
+------------------------------------------------------------------------
+r1300 | funkehdude | 2023-01-28 00:06:37 +0000 (Sat, 28 Jan 2023) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+bump toc
+------------------------------------------------------------------------
+r1299 | funkehdude | 2023-01-22 03:36:39 +0000 (Sun, 22 Jan 2023) | 1 line
+Changed paths:
+   M /trunk/Ace3_Wrath.toc
+
+bump toc
+------------------------------------------------------------------------
+r1298 | nevcairiel | 2022-12-12 15:10:10 +0000 (Mon, 12 Dec 2022) | 1 line
+Changed paths:
+   M /trunk
+   M /trunk/.luacheckrc
+   M /trunk/CallbackHandler-1.0/CallbackHandler-1.0.lua
+
+Update CallbackHandler to rev 8
+------------------------------------------------------------------------
+r1297 | funkehdude | 2022-11-15 01:19:09 +0000 (Tue, 15 Nov 2022) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+bump toc
+------------------------------------------------------------------------
+r1296 | nevcairiel | 2022-11-04 18:50:10 +0000 (Fri, 04 Nov 2022) | 4 lines
+Changed paths:
+   M /trunk
+   M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+   M /trunk/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+
+AceConfigDialog-3.0: Add support for displaying items on hover in GameTooltip
+
+This adds a new element to the config table, "tooltipHyperlink", which
+will be used to fill the tooltip when hovering over the element.
+------------------------------------------------------------------------
+r1295 | funkehdude | 2022-10-26 01:18:39 +0000 (Wed, 26 Oct 2022) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+bump toc
 ------------------------------------------------------------------------

diff --git a/TitanClassic/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/TitanClassic/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
index e0fe1af..01287bd 100755
--- a/TitanClassic/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
+++ b/TitanClassic/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -1,5 +1,5 @@
---[[ $Id: CallbackHandler-1.0.lua 14 2010-08-09 00:43:38Z mikk $ ]]
-local MAJOR, MINOR = "CallbackHandler-1.0", 6
+--[[ $Id: CallbackHandler-1.0.lua 1298 2022-12-12 15:10:10Z nevcairiel $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 8
 local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)

 if not CallbackHandler then return end -- No upgrade needed
@@ -7,56 +7,20 @@ if not CallbackHandler then return end -- No upgrade needed
 local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}

 -- Lua APIs
-local tconcat = table.concat
-local assert, error, loadstring = assert, error, loadstring
-local setmetatable, rawset, rawget = setmetatable, rawset, rawget
+local securecallfunction, error = securecallfunction, error
+local setmetatable, rawget = setmetatable, rawget
 local next, select, pairs, type, tostring = next, select, pairs, type, tostring

--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: geterrorhandler

-local xpcall = xpcall
-
-local function errorhandler(err)
-	return geterrorhandler()(err)
+local function Dispatch(handlers, ...)
+	local index, method = next(handlers)
+	if not method then return end
+	repeat
+		securecallfunction(method, ...)
+		index, method = next(handlers, index)
+	until not method
 end

-local function CreateDispatcher(argCount)
-	local code = [[
-	local next, xpcall, eh = ...
-
-	local method, ARGS
-	local function call() method(ARGS) end
-
-	local function dispatch(handlers, ...)
-		local index
-		index, method = next(handlers)
-		if not method then return end
-		local OLD_ARGS = ARGS
-		ARGS = ...
-		repeat
-			xpcall(call, eh)
-			index, method = next(handlers, index)
-		until not method
-		ARGS = OLD_ARGS
-	end
-
-	return dispatch
-	]]
-
-	local ARGS, OLD_ARGS = {}, {}
-	for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
-	code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-
 --------------------------------------------------------------------------
 -- CallbackHandler:New
 --
@@ -65,9 +29,7 @@ end})
 --   UnregisterName    - name of the callback unregistration API, default "UnregisterCallback"
 --   UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.

-function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
-	-- TODO: Remove this after beta has gone out
-	assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
+function CallbackHandler.New(_self, target, RegisterName, UnregisterName, UnregisterAllName)

 	RegisterName = RegisterName or "RegisterCallback"
 	UnregisterName = UnregisterName or "UnregisterCallback"
@@ -89,19 +51,19 @@ function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAll
 		local oldrecurse = registry.recurse
 		registry.recurse = oldrecurse + 1

-		Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
+		Dispatch(events[eventname], eventname, ...)

 		registry.recurse = oldrecurse

 		if registry.insertQueue and oldrecurse==0 then
 			-- Something in one of our callbacks wanted to register more callbacks; they got queued
-			for eventname,callbacks in pairs(registry.insertQueue) do
-				local first = not rawget(events, eventname) or not next(events[eventname])	-- test for empty before. not test for one member after. that one member may have been overwritten.
-				for self,func in pairs(callbacks) do
-					events[eventname][self] = func
+			for event,callbacks in pairs(registry.insertQueue) do
+				local first = not rawget(events, event) or not next(events[event])	-- test for empty before. not test for one member after. that one member may have been overwritten.
+				for object,func in pairs(callbacks) do
+					events[event][object] = func
 					-- fire OnUsed callback?
 					if first and registry.OnUsed then
-						registry.OnUsed(registry, target, eventname)
+						registry.OnUsed(registry, target, event)
 						first = nil
 					end
 				end
diff --git a/TitanClassic/libs/LibStub/LibStub.lua b/TitanClassic/libs/LibStub/LibStub.lua
index cfc97de..7a442e2 100755
--- a/TitanClassic/libs/LibStub/LibStub.lua
+++ b/TitanClassic/libs/LibStub/LibStub.lua
@@ -7,24 +7,24 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then
 	LibStub = LibStub or {libs = {}, minors = {} }
 	_G[LIBSTUB_MAJOR] = LibStub
 	LibStub.minor = LIBSTUB_MINOR
-
+
 	function LibStub:NewLibrary(major, minor)
 		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
-		minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
-
+		minor = assert(tonumber(string.match(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
 		local oldminor = self.minors[major]
 		if oldminor and oldminor >= minor then return nil end
 		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
 		return self.libs[major], oldminor
 	end
-
+
 	function LibStub:GetLibrary(major, silent)
 		if not self.libs[major] and not silent then
 			error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
 		end
 		return self.libs[major], self.minors[major]
 	end
-
+
 	function LibStub:IterateLibraries() return pairs(self.libs) end
 	setmetatable(LibStub, { __call = LibStub.GetLibrary })
 end
diff --git a/TitanClassic/libs/README.md b/TitanClassic/libs/README.md
new file mode 100755
index 0000000..e608c06
--- /dev/null
+++ b/TitanClassic/libs/README.md
@@ -0,0 +1,26 @@
+Ace3 - AddOn development framework
+==================================
+
+Ace3 is a comprehensive framework for WoW AddOn development to streamline many of the common tasks in developing addons. This includes lifecycles, saved variables, configuration, event handling, network communications, and more.
+
+Documentation
+-------------
+
+A basic introduction to usage can be found here:
+https://www.wowace.com/projects/ace3/pages/getting-started
+
+Documentation can be found here:
+https://www.wowace.com/addons/ace3/pages/
+
+Resources
+---------
+A development repository is available on GitHub:
+https://github.com/WoWUIDev/Ace3
+
+Please note that the CurseForge/WoWAce SVN repository remains the primary authority, and what should be used in .pkgmeta to reference Ace3.
+
+.pkgmeta reference:
+Base Path: https://repos.wowace.com/wow/ace3/trunk
+Example for AceAddon-3.0: https://repos.wowace.com/wow/ace3/trunk/AceAddon-3.0
+
+It is recommended to reference the specific Ace3 libraries you are using directly, instead of pulling in the entire package.
diff --git a/TitanClassic/libs/changelog.txt b/TitanClassic/libs/changelog.txt
index 3a7599d..cf9b1b9 100755
--- a/TitanClassic/libs/changelog.txt
+++ b/TitanClassic/libs/changelog.txt
@@ -1,3 +1,58 @@
+Ace3 Release - Revision r1309 (July 12th, 2023)
+-----------------------------------------------
+- AceDB-3.0: Fixed an issue due to a region change on the PTR
+- AceDBOptions-3.0: Updated locale strings
+
+Ace3 Release - Revision r1294 (October 22nd, 2022)
+--------------------------------------------------
+- Ace3 should be fully supported on WoW 10.0
+- AceGUI-3.0: TabGroup: Fixes for WoW 10.0 template changes
+- AceConfigDialog-3.0: New Settings panel integration for WoW 10.0
+
+Ace3 Release - Revision r1281 (September 21st, 2022)
+--------------------------------------------------
+- AceGUI-3.0: Preliminary support for WoW 10.0
+- AceGUI-3.0: MultiLineEditBox: Fixed an issue with mouse interactivity on re-cycled editboxes in certain circumstances
+- AceGUI-3.0: Label: Use font objects to allow font fallback mechanics to be used
+
+Ace3 Release - Revision r1259 (February 23rd, 2022)
+--------------------------------------------------
+- AceGUI-3.0: Dropdown: Fix double click sound on toggling the dropdown (Issue #575)
+- AceConfigDialog-3.0: Fix width number multiplier on multiselects (Issue #584)
+
+Ace3 Release - Revision r1252 (May 17th, 2021)
+--------------------------------------------------
+- AceConfigDialog-3.0: Increased the frame level of dialogs to allow other addons to draw below them
+- AceConfigDialog-3.0: The validation/confirmation popup is now opaque and not click-through, to avoid accidentally activating options below it
+- AceHook-3.0: Allow UnhookAll to be used without embedding (Fixes #558)
+
+Ace3 Release - Revision r1241 (October 13th, 2020)
+--------------------------------------------------
+- AceAddon-3.0: Suppress more Blizzard addon load events from activating Ace3 addons "too early", causing loading issues.
+- AceGUI-3.0: Updated for Backdrop changes in WoW 9.0
+- AceGUI-3.0: Re-structured widget releasing to avoid recursive release in some circumstances
+- AceGUI-3.0: Label: Anchors are being refreshed when the font is changed (Ticket #540)
+- AceGUI-3.0: Dropdown: Initialize the widget with an empty list so that AddItem can be used on a fresh dropdown (Ticket #542)
+
+Ace3 Release - Revision r1227 (August 12th, 2019)
+-------------------------------------------------
+- AceConfigDialog-3.0: Fixed an issue with a missing template on WoW Classic (Ticket #517)
+
+Ace3 Release - Revision r1224 (August 1st, 2019)
+------------------------------------------------
+- AceConfigDialog-3.0: Replace use of StaticPopup with a custom frame to minimize taint
+- AceGUI-3.0: Ensure the OnLeave callback on various widgets still fires when its being released while visible (Ticket #505)
+- AceGUI-3.0: Various fixes for anchoring problems in WoW 8.2 (Ticket #512, and other reports)
+
+Ace3 Release - Revision r1214 (June 26th, 2019)
+-----------------------------------------------
+- AceConfigDialog-3.0: Exposed "select" type sorting control through a new "sorting" config table member
+- AceConfigDialog-3.0: Clear existing anchors on the GameTooltip before re-anchoring it for 8.2 compatibility
+- AceConfigDialog-3.0: Improved options table sorting algorithm to produce a stable result in certain edge cases (Ticket #501)
+- AceConfigRegistry-3.0: Added missing custom controls entries for all types added in the last release (Ticket  #494)
+- AceGUI-3.0: ColorPicker: Removed usage of Show/HideUIPanel for WoW 8.2 compatibiliy
+- AceGUI-3.0: DropDown: Improved dropdown sorting algorithm to support tables with mixed string and numeric keys
+
 Ace3 Release - Revision r1200 (January 24th, 2019)
 --------------------------------------------------
 - Cleanup for WoW 8.0 improvements
@@ -186,7 +241,7 @@ Ace3 Release - Revision r900 (December 8th, 2009)
 - AceGUI-3.0: TreeGroup: Allow iconCoords to be passed for the tree elements. (Ticket #59)
 - AceGUI-3.0: Slider: Add a more visible backdrop/border around the manual input area (Ticket #98, #46)
 - AceGUI-3.0: Allow displaying a image in front of the checkbox label. (Ticket #82)
-- AceConfig-3.0: Added an experimental "descStyle" member to all option table nodes that allows you to control the way the description is presented.
+- AceConfig-3.0: Added an experimental "descStyle" member to all option table nodes that allows you to control the way the description is presented.
                  Supported values are "tooltip" for the old behaviour, and "inline" for a inline display of the description, pending support in AceGUI-3.0 widgets.
 - AceConfigCmd-3.0: Properly parse functions and methods supplied for the "hidden" option table member. (Ticket #96)
 - AceConfigDialog-3.0: Fix the unpacking of the basepath arguments when internally calling :Open (Ticket #90)
@@ -405,4 +460,4 @@ Ace3 Beta - Revision 60545 (Feb 7th, 2008)

 Ace3 Beta - Revision 60163 (Feb 3rd, 2008)
 ---------------------------------------------
-- Initial Beta release
\ No newline at end of file
+- Initial Beta release
diff --git a/TitanClassicAmmo/TitanClassicAmmo.toc b/TitanClassicAmmo/TitanClassicAmmo.toc
index 456387a..150719c 100644
--- a/TitanClassicAmmo/TitanClassicAmmo.toc
+++ b/TitanClassicAmmo/TitanClassicAmmo.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fAmmo|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fAmmo|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds an ammo monitor to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicAmmo.xml
\ No newline at end of file
diff --git a/TitanClassicBag/TitanClassicBag.toc b/TitanClassicBag/TitanClassicBag.toc
index 735b6da..cae2a88 100644
--- a/TitanClassicBag/TitanClassicBag.toc
+++ b/TitanClassicBag/TitanClassicBag.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fBag|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fBag|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds bag and free slot information to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicBag.xml
diff --git a/TitanClassicClock/TitanClassicClock.toc b/TitanClassicClock/TitanClassicClock.toc
index 7ff2cd2..c1d9125 100644
--- a/TitanClassicClock/TitanClassicClock.toc
+++ b/TitanClassicClock/TitanClassicClock.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fClock|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fClock|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds a clock to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicClock.xml
diff --git a/TitanClassicGold/TitanClassicGold.toc b/TitanClassicGold/TitanClassicGold.toc
index 23ed10a..a8bfd83 100644
--- a/TitanClassicGold/TitanClassicGold.toc
+++ b/TitanClassicGold/TitanClassicGold.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fGold|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fGold|r] |cff00aa001.3.3.11404|r
 ## Notes: Keeps track of all gold held by a player's toons on a per server/faction basis.
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables: GoldSave
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicGold.xml
diff --git a/TitanClassicLocation/TitanClassicLocation.toc b/TitanClassicLocation/TitanClassicLocation.toc
index 49f18db..500b374 100644
--- a/TitanClassicLocation/TitanClassicLocation.toc
+++ b/TitanClassicLocation/TitanClassicLocation.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fLocation|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fLocation|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds coordinates and location information to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicLocation.xml
diff --git a/TitanClassicLootType/TitanClassicLootType.toc b/TitanClassicLootType/TitanClassicLootType.toc
index c9b6ab6..4edeaa1 100644
--- a/TitanClassicLootType/TitanClassicLootType.toc
+++ b/TitanClassicLootType/TitanClassicLootType.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fLootType|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fLootType|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds group loot and instance difficulty information to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables: TitanClassicLootTypeSaved
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicLootType.xml
diff --git a/TitanClassicPerformance/TitanClassicPerformance.toc b/TitanClassicPerformance/TitanClassicPerformance.toc
index f9ca115..6c15ba2 100644
--- a/TitanClassicPerformance/TitanClassicPerformance.toc
+++ b/TitanClassicPerformance/TitanClassicPerformance.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fPerformance|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fPerformance|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds FPS and Garbage collection information to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicPerformance.xml
diff --git a/TitanClassicRegen/TitanClassicRegen.toc b/TitanClassicRegen/TitanClassicRegen.toc
index 5f4ece1..e17de9f 100644
--- a/TitanClassicRegen/TitanClassicRegen.toc
+++ b/TitanClassicRegen/TitanClassicRegen.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fRegen|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fRegen|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds a regen monitor to Titan panel to show HP/MANA regen
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicRegen.xml
\ No newline at end of file
diff --git a/TitanClassicRepair/TitanClassicRepair.toc b/TitanClassicRepair/TitanClassicRepair.toc
index 315ad68..ac6268a 100644
--- a/TitanClassicRepair/TitanClassicRepair.toc
+++ b/TitanClassicRepair/TitanClassicRepair.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fRepair|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fRepair|r] |cff00aa001.3.3.11404|r
 ## Notes: Provides a configurable durability display. Also adds the ability to auto repair items and inventory at vendors
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicRepair.xml
diff --git a/TitanClassicVolume/TitanClassicVolume.toc b/TitanClassicVolume/TitanClassicVolume.toc
index 8364f11..75cb532 100644
--- a/TitanClassicVolume/TitanClassicVolume.toc
+++ b/TitanClassicVolume/TitanClassicVolume.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fVolume|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fVolume|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds a volume control icon on your Titan Bar
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicVolume.xml
diff --git a/TitanClassicXP/TitanClassicXP.toc b/TitanClassicXP/TitanClassicXP.toc
index 4453bba..751a8f9 100644
--- a/TitanClassicXP/TitanClassicXP.toc
+++ b/TitanClassicXP/TitanClassicXP.toc
@@ -1,10 +1,10 @@
-## Interface: 11403
-## Title: Titan Panel Classic [|cffeda55fXP|r] |cff00aa001.3.2.11403|r
+## Interface: 11404
+## Title: Titan Panel Classic [|cffeda55fXP|r] |cff00aa001.3.3.11404|r
 ## Notes: Adds information to Titan Panel about XP earned and time to level
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-## Version: 1.3.2.11403
+## Version: 1.3.3.11404
 ## X-Child-Of: TitanClassic
 TitanClassicXP.xml