Quantcast

- Update Ace 3 libs and lib notes

urnati [12-12-23 - 13:28]
- Update Ace 3 libs and lib notes
Filename
Titan/_Titan_Lib_Notes.txt
Titan/libs/Ace/Ace3.toc
Titan/libs/Ace/Ace3_TBC.toc
Titan/libs/Ace/Ace3_Vanilla.toc
Titan/libs/Ace/Ace3_Wrath.toc
Titan/libs/Ace/AceAddon-3.0/AceAddon-3.0.lua
Titan/libs/Ace/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
Titan/libs/Ace/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
Titan/libs/Ace/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
Titan/libs/Ace/AceHook-3.0/AceHook-3.0.lua
Titan/libs/Ace/AceLocale-3.0/AceLocale-3.0.lua
Titan/libs/Ace/AceTimer-3.0/AceTimer-3.0.lua
Titan/libs/Ace/CHANGES.txt
Titan/libs/Ace/CallbackHandler-1.0/CallbackHandler-1.0.lua
Titan/libs/Ace/LibSharedMedia-3.0/CHANGES.txt
Titan/libs/Ace/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua
Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0.toc
Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_TBC.toc
Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_Vanilla.toc
Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_Wrath.toc
Titan/libs/Ace/LibStub/LibStub.lua
Titan/libs/Ace/README.md
Titan/libs/Ace/changelog.txt
diff --git a/Titan/_Titan_Lib_Notes.txt b/Titan/_Titan_Lib_Notes.txt
index db2545a..4434cde 100644
--- a/Titan/_Titan_Lib_Notes.txt
+++ b/Titan/_Titan_Lib_Notes.txt
@@ -1,3 +1,14 @@
+From:
+Ace3 - https://www.curseforge.com/wow/addons/ace3
+
+AceGUI-3.0-SharedMediaWidgets - https://www.curseforge.com/wow/addons/ace-gui-3-0-shared-media-widgets
+LibSharedMedia-3.0 - https://www.curseforge.com/wow/addons/libsharedmedia-3-0
+LibUIDropDownMenu - https://www.curseforge.com/wow/addons/libuidropdownmenu
+
+
+*** 2023-Dec ***
+- Updated libs to latest
+- Added back !LibUIDropDownMenu per combined Titan versions
 *** 2023-04-12 ***
 - libs created folder for Ace libraries for clarity
 - Moved LDB lib to libs
diff --git a/Titan/libs/Ace/Ace3.toc b/Titan/libs/Ace/Ace3.toc
index 1b59e11..13f0d97 100644
--- a/Titan/libs/Ace/Ace3.toc
+++ b/Titan/libs/Ace/Ace3.toc
@@ -1,4 +1,4 @@
-## Interface: 90001
+## 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/Titan/libs/Ace/Ace3_TBC.toc b/Titan/libs/Ace/Ace3_TBC.toc
new file mode 100644
index 0000000..3cd438e
--- /dev/null
+++ b/Titan/libs/Ace/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/Titan/libs/Ace/Ace3_Vanilla.toc b/Titan/libs/Ace/Ace3_Vanilla.toc
new file mode 100644
index 0000000..1386798
--- /dev/null
+++ b/Titan/libs/Ace/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/Titan/libs/Ace/Ace3_Wrath.toc b/Titan/libs/Ace/Ace3_Wrath.toc
new file mode 100644
index 0000000..b26899f
--- /dev/null
+++ b/Titan/libs/Ace/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/Titan/libs/Ace/AceAddon-3.0/AceAddon-3.0.lua b/Titan/libs/Ace/AceAddon-3.0/AceAddon-3.0.lua
index 1b63bd1..f392a21 100644
--- a/Titan/libs/Ace/AceAddon-3.0/AceAddon-3.0.lua
+++ b/Titan/libs/Ace/AceAddon-3.0/AceAddon-3.0.lua
@@ -28,7 +28,7 @@
 -- end
 -- @class file
 -- @name AceAddon-3.0.lua
--- @release $Id: AceAddon-3.0.lua 1238 2020-08-28 16:18:42Z nevcairiel $
+-- @release $Id: AceAddon-3.0.lua 1284 2022-09-25 09:15:30Z nevcairiel $

 local MAJOR, MINOR = "AceAddon-3.0", 13
 local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -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
 ]]
diff --git a/Titan/libs/Ace/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/Titan/libs/Ace/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
index 5113875..6dd6438 100644
--- a/Titan/libs/Ace/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
+++ b/Titan/libs/Ace/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 1202 2019-05-15 23:11:22Z nevcairiel $
+-- @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
@@ -401,7 +394,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 		return
 	end

-	local str = strsub(info.input,inputpos);
+	local strInput = strsub(info.input,inputpos);

 	if tab.type=="execute" then
 		------------ execute --------------------------------------------
@@ -414,21 +407,21 @@ local function handle(info, inputpos, tab, depth, retfalse)

 		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")

@@ -465,9 +458,9 @@ local function handle(info, inputpos, tab, depth, retfalse)

 	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
@@ -487,7 +480,7 @@ local function handle(info, inputpos, tab, depth, retfalse)

 	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
@@ -528,7 +521,7 @@ local function handle(info, inputpos, tab, depth, retfalse)

 	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
@@ -565,7 +558,7 @@ local function handle(info, inputpos, tab, depth, retfalse)

 			--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
@@ -634,7 +627,7 @@ local function handle(info, inputpos, tab, depth, retfalse)

 	elseif tab.type=="color" then
 		------------ color --------------------------------------------
-		local str = strtrim(strlower(str))
+		local str = strtrim(strlower(strInput))
 		if str == "" then
 			--TODO: Show current value
 			return
@@ -706,7 +699,7 @@ local function handle(info, inputpos, tab, depth, retfalse)

 	elseif tab.type=="keybinding" then
 		------------ keybinding --------------------------------------------
-		local str = strtrim(strlower(str))
+		local str = strtrim(strlower(strInput))
 		if str == "" then
 			--TODO: Show current value
 			return
diff --git a/Titan/libs/Ace/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/Titan/libs/Ace/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index a14e07d..11254eb 100644
--- a/Titan/libs/Ace/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/Titan/libs/Ace/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 1232 2020-04-14 22:21:22Z 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", 79
+local MAJOR, MINOR = "AceConfigDialog-3.0", 86
 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigDialog then return end
@@ -22,19 +22,13 @@ 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, ACCEPT, CANCEL
--- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
--- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
-
 local emptyTbl = {}

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

 --Is Never a function or method
@@ -194,9 +189,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		--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])
@@ -508,6 +502,14 @@ local function OptionOnMouseOver(widget, event)
 	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
+
 	local name = GetOptionsMemberValue("name", opt, options, path, appName)
 	local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
 	local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
@@ -535,8 +537,7 @@ local function OptionOnMouseLeave(widget, event)
 end

 local function GetFuncName(option)
-	local type = option.type
-	if type == "execute" then
+	if option.type == "execute" then
 		return "func"
 	else
 		return "set"
@@ -544,13 +545,15 @@ local function GetFuncName(option)
 end
 do
 	local frame = AceConfigDialog.popup
-	if not frame then
+	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)
@@ -564,26 +567,17 @@ do
 			end
 		end)

-		if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then
-			frame:SetBackdrop({
-				bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
-				edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
-				tile = true,
-				tileSize = 32,
-				edgeSize = 32,
-				insets = { left = 11, right = 11, top = 11, bottom = 11 },
-			})
-		else
-			local border = CreateFrame("Frame", nil, frame, "DialogBorderDarkTemplate")
-			border:SetAllPoints(frame)
-		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(text)
+		local function newButton(newText)
 			local button = CreateFrame("Button", nil, frame)
 			button:SetSize(128, 21)
 			button:SetNormalFontObject(GameFontNormal)
@@ -594,7 +588,7 @@ do
 			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(text)
+			button:SetText(newText)
 			return button
 		end

@@ -681,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
@@ -745,7 +739,6 @@ local function ActivateControl(widget, event, ...)
 		end
 	end

-	local rootframe = user.rootframe
 	if not validated or type(validated) == "string" then
 		if not validated then
 			if usage then
@@ -760,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
@@ -798,14 +791,14 @@ 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
@@ -1147,8 +1140,6 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				--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)
@@ -1251,7 +1242,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 							end
 							tsort(sorting, sortTblAsStrings)
 						end
-						for k, value in ipairs(sorting) do
+						for _, value in ipairs(sorting) do
 							local text = values[value]
 							local radio = gui:Create("CheckBox")
 							radio:SetLabel(text)
@@ -1333,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
@@ -1346,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)
@@ -1364,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
@@ -1434,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
@@ -1690,29 +1681,29 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR

 		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"
+			selectGroup.width = "fill"
+			selectGroup.height = "fill"

-			container:AddChild(select)
+			container:AddChild(selectGroup)

 		--assume tree group by default
 		--if parenttype is tree then this group is already a node on that tree
@@ -1940,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
@@ -1979,6 +1970,7 @@ end
 -- @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 category ID to pass to Settings.OpenToCategory (or InterfaceOptionsFrame_OpenToCategory)
 function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
 	local BlizOptions = AceConfigDialog.BlizOptions

@@ -1994,7 +1986,6 @@ function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
 	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)
@@ -2007,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/Titan/libs/Ace/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/Titan/libs/Ace/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
index f8d9225..e0f5962 100644
--- a/Titan/libs/Ace/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+++ b/Titan/libs/Ace/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
@@ -8,10 +8,10 @@
 -- :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 1207 2019-06-23 12:08:33Z 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", 20
+local MAJOR, MINOR = "AceConfigRegistry-3.0", 21
 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigRegistry then return end
@@ -83,6 +83,7 @@ local basekeys={
 		dialogHidden=optmethodbool,
 		dropdownHidden=optmethodbool,
 	cmdHidden=optmethodbool,
+	tooltipHyperlink=optstringfunc,
 	icon=optstringnumberfunc,
 	iconCoords=optmethodtable,
 	handler=opttable,
diff --git a/Titan/libs/Ace/AceHook-3.0/AceHook-3.0.lua b/Titan/libs/Ace/AceHook-3.0/AceHook-3.0.lua
index d91c36f..7d26d91 100644
--- a/Titan/libs/Ace/AceHook-3.0/AceHook-3.0.lua
+++ b/Titan/libs/Ace/AceHook-3.0/AceHook-3.0.lua
@@ -9,8 +9,8 @@
 -- make into AceHook.
 -- @class file
 -- @name AceHook-3.0
--- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z 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
@@ -195,7 +195,6 @@ 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
@@ -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
diff --git a/Titan/libs/Ace/AceLocale-3.0/AceLocale-3.0.lua b/Titan/libs/Ace/AceLocale-3.0/AceLocale-3.0.lua
index e133781..d69aa73 100644
--- a/Titan/libs/Ace/AceLocale-3.0/AceLocale-3.0.lua
+++ b/Titan/libs/Ace/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/Titan/libs/Ace/AceTimer-3.0/AceTimer-3.0.lua b/Titan/libs/Ace/AceTimer-3.0/AceTimer-3.0.lua
index 33b4da4..8776da2 100644
--- a/Titan/libs/Ace/AceTimer-3.0/AceTimer-3.0.lua
+++ b/Titan/libs/Ace/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 1202 2019-05-15 23:11:22Z nevcairiel $
+-- @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)
@@ -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/Titan/libs/Ace/CHANGES.txt b/Titan/libs/Ace/CHANGES.txt
index 541e851..6a71b16 100644
--- a/Titan/libs/Ace/CHANGES.txt
+++ b/Titan/libs/Ace/CHANGES.txt
@@ -1,93 +1,109 @@
 ------------------------------------------------------------------------
-r1240 | nevcairiel | 2020-10-13 07:59:32 +0000 (Tue, 13 Oct 2020) | 1 line
+r1308 | nevcairiel | 2023-07-12 10:15:09 +0000 (Wed, 12 Jul 2023) | 1 line
 Changed paths:
-   M /trunk/Ace3.toc
+   M /trunk
    M /trunk/changelog.txt

-Update changelog and TOC
+Update changelog
 ------------------------------------------------------------------------
-r1239 | nevcairiel | 2020-09-20 10:22:02 +0000 (Sun, 20 Sep 2020) | 1 line
+r1307 | funkehdude | 2023-07-12 02:24:07 +0000 (Wed, 12 Jul 2023) | 1 line
 Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+   M /trunk/Ace3.toc

-AceGUI-3.0: DropDown: Anchor all items to the dropdown frame instead of chaining anchors, fixes anchoring on WoW 9.0 with many items
+bump toc
 ------------------------------------------------------------------------
-r1238 | nevcairiel | 2020-08-28 16:18:42 +0000 (Fri, 28 Aug 2020) | 3 lines
+r1306 | nevcairiel | 2023-06-23 14:55:09 +0000 (Fri, 23 Jun 2023) | 9 lines
 Changed paths:
-   M /trunk/AceAddon-3.0/AceAddon-3.0.lua
+   M /trunk
+   M /trunk/.luacheckrc
+   M /trunk/AceDB-3.0/AceDB-3.0.lua

-AceAddon-3.0: Blacklist more Blizzard addons from triggering Ace3 load events
+AceDB-3.0: Add fallbacks for region names

-These addons can be loaded very early by UIParent, which causes issues with loading certain addons
+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.
 ------------------------------------------------------------------------
-r1237 | nevcairiel | 2020-07-17 22:50:38 +0000 (Fri, 17 Jul 2020) | 1 line
+r1305 | funkehdude | 2023-06-21 11:59:15 +0000 (Wed, 21 Jun 2023) | 1 line
 Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
-
-Use BackdropTemplate in WoW 9.0
+   M /trunk/Ace3_Wrath.toc
+
+bump wrath toc
 ------------------------------------------------------------------------
-r1236 | nevcairiel | 2020-04-16 07:36:45 +0000 (Thu, 16 Apr 2020) | 1 line
+r1304 | nevcairiel | 2023-05-19 19:50:10 +0000 (Fri, 19 May 2023) | 1 line
 Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+   M /trunk
+   M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua

-AceGUI-3.0: DropDown: Initialize the widget with an empty item list (instead of nil), this allows AddItem to be used right away (Fixes #542)
+AceDBOptions-3.0: Minor locale fixes for russian
 ------------------------------------------------------------------------
-r1235 | nevcairiel | 2020-04-15 10:27:55 +0000 (Wed, 15 Apr 2020) | 1 line
+r1303 | nevcairiel | 2023-05-16 15:05:10 +0000 (Tue, 16 May 2023) | 3 lines
 Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+   M /trunk
+   M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua
+
+AceDBOptions-3.0: Update locale strings

-Cleanup debug
+Fixes WoWAce #629
 ------------------------------------------------------------------------
-r1234 | nevcairiel | 2020-04-15 10:14:35 +0000 (Wed, 15 Apr 2020) | 1 line
+r1302 | nevcairiel | 2023-05-03 07:00:09 +0000 (Wed, 03 May 2023) | 1 line
 Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+   M /trunk
+   M /trunk/Ace3.toc

-AceGUI-3.0: TreeGroup: Remove pre-8.0 compat
+Update TOC for 10.1
 ------------------------------------------------------------------------
-r1233 | nevcairiel | 2020-04-15 10:09:47 +0000 (Wed, 15 Apr 2020) | 1 line
+r1301 | funkehdude | 2023-03-22 02:53:32 +0000 (Wed, 22 Mar 2023) | 1 line
 Changed paths:
-   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+   M /trunk/Ace3.toc

-AceGUI-3.0: Label: Refresh anchoring after changing the font (Fixes #540)
+bump toc
 ------------------------------------------------------------------------
-r1232 | nevcairiel | 2020-04-14 22:21:22 +0000 (Tue, 14 Apr 2020) | 1 line
+r1300 | funkehdude | 2023-01-28 00:06:37 +0000 (Sat, 28 Jan 2023) | 1 line
 Changed paths:
-   M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+   M /trunk/Ace3.toc

-AceConfigDialog-3.0: Prevent a dialog refresh when a multiselect control is closed during release (Fixes #539)
+bump toc
 ------------------------------------------------------------------------
-r1231 | nevcairiel | 2020-04-14 22:20:36 +0000 (Tue, 14 Apr 2020) | 1 line
+r1299 | funkehdude | 2023-01-22 03:36:39 +0000 (Sun, 22 Jan 2023) | 1 line
 Changed paths:
-   M /trunk/AceGUI-3.0/AceGUI-3.0.lua
+   M /trunk/Ace3_Wrath.toc

-AceGUI-3.0: Add a getter to allow callers to check if a widget is currently being released, which can be used as part of some callbacks to alter behavior
+bump toc
 ------------------------------------------------------------------------
-r1230 | funkydude | 2020-01-14 17:01:25 +0000 (Tue, 14 Jan 2020) | 1 line
+r1298 | nevcairiel | 2022-12-12 15:10:10 +0000 (Mon, 12 Dec 2022) | 1 line
 Changed paths:
-   M /trunk/Ace3.toc
+   M /trunk
+   M /trunk/.luacheckrc
+   M /trunk/CallbackHandler-1.0/CallbackHandler-1.0.lua

-bump toc
+Update CallbackHandler to rev 8
 ------------------------------------------------------------------------
-r1229 | funkydude | 2019-10-11 20:48:50 +0000 (Fri, 11 Oct 2019) | 1 line
+r1297 | funkehdude | 2022-11-15 01:19:09 +0000 (Tue, 15 Nov 2022) | 1 line
 Changed paths:
    M /trunk/Ace3.toc

 bump toc
 ------------------------------------------------------------------------
-r1228 | nevcairiel | 2019-09-06 08:51:17 +0000 (Fri, 06 Sep 2019) | 3 lines
+r1296 | nevcairiel | 2022-11-04 18:50:10 +0000 (Fri, 04 Nov 2022) | 4 lines
 Changed paths:
-   M /trunk/AceGUI-3.0/AceGUI-3.0.lua
+   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

-AceGUI-3.0: Avoid re-entrance into the Release function
+AceConfigDialog-3.0: Add support for displaying items on hover in GameTooltip

-This can happen if a frame is released in a callback fired in the release process, and may in some cases throw errors.
+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/Titan/libs/Ace/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Titan/libs/Ace/CallbackHandler-1.0/CallbackHandler-1.0.lua
index a8377fe..6b32193 100644
--- a/Titan/libs/Ace/CallbackHandler-1.0/CallbackHandler-1.0.lua
+++ b/Titan/libs/Ace/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -1,5 +1,5 @@
---[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]]
-local MAJOR, MINOR = "CallbackHandler-1.0", 7
+--[[ $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,26 +7,16 @@ 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)
-end

 local function Dispatch(handlers, ...)
 	local index, method = next(handlers)
 	if not method then return end
 	repeat
-		xpcall(method, errorhandler, ...)
+		securecallfunction(method, ...)
 		index, method = next(handlers, index)
 	until not method
 end
@@ -39,7 +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)
+function CallbackHandler.New(_self, target, RegisterName, UnregisterName, UnregisterAllName)

 	RegisterName = RegisterName or "RegisterCallback"
 	UnregisterName = UnregisterName or "UnregisterCallback"
@@ -67,13 +57,13 @@ function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAll

 		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/Titan/libs/Ace/LibSharedMedia-3.0/CHANGES.txt b/Titan/libs/Ace/LibSharedMedia-3.0/CHANGES.txt
index bdfc4a9..d154389 100644
--- a/Titan/libs/Ace/LibSharedMedia-3.0/CHANGES.txt
+++ b/Titan/libs/Ace/LibSharedMedia-3.0/CHANGES.txt
@@ -1,29 +1,9 @@
 ------------------------------------------------------------------------
-r115 | funkehdude | 2020-11-23 17:12:53 +0000 (Mon, 23 Nov 2020) | 1 line
+r142 | funkehdude | 2023-10-11 11:07:08 +0000 (Wed, 11 Oct 2023) | 1 line
 Changed paths:
    M /trunk/LibSharedMedia-3.0.toc
+   M /trunk/LibSharedMedia-3.0_Wrath.toc

 bump toc
 ------------------------------------------------------------------------
-r114 | elkano | 2019-09-13 16:12:43 +0000 (Fri, 13 Sep 2019) | 2 lines
-Changed paths:
-   M /trunk/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
-
-fixes registering mp3 paths
-closes #23
-------------------------------------------------------------------------
-r113 | elkano | 2019-07-14 17:20:43 +0000 (Sun, 14 Jul 2019) | 1 line
-Changed paths:
-   M /trunk/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
-
-readded pre-8.2 compatibility for classic client
-------------------------------------------------------------------------
-r112 | elkano | 2019-07-11 16:45:13 +0000 (Thu, 11 Jul 2019) | 3 lines
-Changed paths:
-   M /trunk/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
-
-- removed pre 8.2 compat code
-- BACKGROUND, BORDER, STATUSBAR and SOUND string values are meant for file paths with 8.2 limiting file access for such media to the interface folder, paths must now start with "interface" to be registered; numeric IDs for files are fine, too
-- added the solid background as option for statusbar, too
-------------------------------------------------------------------------

diff --git a/Titan/libs/Ace/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Titan/libs/Ace/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua
index a8377fe..21569f4 100644
--- a/Titan/libs/Ace/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua
+++ b/Titan/libs/Ace/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -1,5 +1,5 @@
---[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]]
-local MAJOR, MINOR = "CallbackHandler-1.0", 7
+--[[ $Id: CallbackHandler-1.0.lua 26 2022-12-12 15:09:39Z nevcairiel $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 8
 local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)

 if not CallbackHandler then return end -- No upgrade needed
@@ -7,26 +7,16 @@ 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)
-end

 local function Dispatch(handlers, ...)
 	local index, method = next(handlers)
 	if not method then return end
 	repeat
-		xpcall(method, errorhandler, ...)
+		securecallfunction(method, ...)
 		index, method = next(handlers, index)
 	until not method
 end
@@ -39,7 +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)
+function CallbackHandler.New(_self, target, RegisterName, UnregisterName, UnregisterAllName)

 	RegisterName = RegisterName or "RegisterCallback"
 	UnregisterName = UnregisterName or "UnregisterCallback"
@@ -67,13 +57,13 @@ function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAll

 		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/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0.toc b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0.toc
index 2c00d78..26614a8 100644
--- a/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0.toc
+++ b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0.toc
@@ -1,15 +1,15 @@
-## Interface: 90002
+## Interface: 100107
 ## LoadOnDemand: 1

 ## Title: Lib: SharedMedia-3.0
 ## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons.
 ## Author: Elkano
-## Version: 3.0-115
-## X-Website: http://www.wowace.com/projects/libsharedmedia-3-0/
+## Version: 3.0-142
+## X-Website: https://www.curseforge.com/wow/addons/libsharedmedia-3-0
 ## X-Category: Library

-## X-Revision: 115
-## X-Date: 2020-11-23T17:12:53Z
+## X-Revision: 142
+## X-Date: 2023-10-11T11:07:08Z

 LibStub\LibStub.lua
 CallbackHandler-1.0\CallbackHandler-1.0.lua
diff --git a/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
index c66e9cc..fb3446c 100644
--- a/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
+++ b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
@@ -1,6 +1,7 @@
+--@curseforge-project-slug: libsharedmedia-3-0@
 --[[
 Name: LibSharedMedia-3.0
-Revision: $Revision: 114 $
+Revision: $Revision: 128 $
 Author: Elkano (elkano@gmx.de)
 Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
 Website: http://www.wowace.com/projects/libsharedmedia-3-0/
diff --git a/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_TBC.toc b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_TBC.toc
new file mode 100644
index 0000000..0c503dd
--- /dev/null
+++ b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_TBC.toc
@@ -0,0 +1,18 @@
+## Interface: 20504
+## LoadOnDemand: 1
+
+## Title: Lib: SharedMedia-3.0
+## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons.
+## Author: Elkano
+## Version: 3.0-142
+## X-Website: https://www.curseforge.com/wow/addons/libsharedmedia-3-0
+## X-Category: Library
+
+## X-Revision: 142
+## X-Date: 2023-10-11T11:07:08Z
+
+LibStub\LibStub.lua
+CallbackHandler-1.0\CallbackHandler-1.0.lua
+
+LibSharedMedia-3.0\lib.xml
+
diff --git a/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_Vanilla.toc b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_Vanilla.toc
new file mode 100644
index 0000000..7dfa670
--- /dev/null
+++ b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_Vanilla.toc
@@ -0,0 +1,18 @@
+## Interface: 11404
+## LoadOnDemand: 1
+
+## Title: Lib: SharedMedia-3.0
+## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons.
+## Author: Elkano
+## Version: 3.0-142
+## X-Website: https://www.curseforge.com/wow/addons/libsharedmedia-3-0
+## X-Category: Library
+
+## X-Revision: 142
+## X-Date: 2023-10-11T11:07:08Z
+
+LibStub\LibStub.lua
+CallbackHandler-1.0\CallbackHandler-1.0.lua
+
+LibSharedMedia-3.0\lib.xml
+
diff --git a/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_Wrath.toc b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_Wrath.toc
new file mode 100644
index 0000000..4a9f887
--- /dev/null
+++ b/Titan/libs/Ace/LibSharedMedia-3.0/LibSharedMedia-3.0_Wrath.toc
@@ -0,0 +1,18 @@
+## Interface: 30403
+## LoadOnDemand: 1
+
+## Title: Lib: SharedMedia-3.0
+## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons.
+## Author: Elkano
+## Version: 3.0-142
+## X-Website: https://www.curseforge.com/wow/addons/libsharedmedia-3-0
+## X-Category: Library
+
+## X-Revision: 142
+## X-Date: 2023-10-11T11:07:08Z
+
+LibStub\LibStub.lua
+CallbackHandler-1.0\CallbackHandler-1.0.lua
+
+LibSharedMedia-3.0\lib.xml
+
diff --git a/Titan/libs/Ace/LibStub/LibStub.lua b/Titan/libs/Ace/LibStub/LibStub.lua
index 0a41ac0..d50c267 100644
--- a/Titan/libs/Ace/LibStub/LibStub.lua
+++ b/Titan/libs/Ace/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/Titan/libs/Ace/README.md b/Titan/libs/Ace/README.md
new file mode 100644
index 0000000..ea0b5a4
--- /dev/null
+++ b/Titan/libs/Ace/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/Titan/libs/Ace/changelog.txt b/Titan/libs/Ace/changelog.txt
index b00755e..97c8a31 100644
--- a/Titan/libs/Ace/changelog.txt
+++ b/Titan/libs/Ace/changelog.txt
@@ -1,3 +1,31 @@
+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.