From a4a1197bfbf76362cd0e7bec36816b5a9153edc7 Mon Sep 17 00:00:00 2001 From: syrifgit <139663837+syrifgit@users.noreply.github.com> Date: Tue, 19 Nov 2024 00:06:35 -0400 Subject: [PATCH 1/9] Death Knight Runes --- State.lua | 141 +++++++++-------- TheWarWithin/DeathKnightBlood.lua | 32 ++-- TheWarWithin/DeathKnightFrost.lua | 236 ++++++++++++++--------------- TheWarWithin/DeathKnightUnholy.lua | 60 +++----- 4 files changed, 234 insertions(+), 235 deletions(-) diff --git a/State.lua b/State.lua index 817b61513..27e5d1979 100644 --- a/State.lua +++ b/State.lua @@ -1381,7 +1381,6 @@ state.raid_event.adds = setmetatable( { end } ) - -- Resource Modeling! local forecastResources @@ -1393,60 +1392,64 @@ do return b == nil or ( a.next < b.next ) end - -- Increase max forecast duration because Assassination is pooling hard this tier. local FORECAST_DURATION = 10.01 - forecastResources = function( resource ) - + forecastResources = function ( resource ) if not resource then return end + -- Initialize or wipe tables + events = events or {} + remains = remains or {} wipe( events ) wipe( remains ) - local now = state.now + state.offset -- roundDown( state.now + state.offset, 2 ) - - local timeout = FORECAST_DURATION * state.haste -- roundDown( FORECAST_DURATION * state.haste, 2 ) + local now = state.now + state.offset + local timeout = FORECAST_DURATION * state.haste if state.class.file == "DEATHKNIGHT" and state.runes then - timeout = max( timeout, 0.01 + 2 * state.runes.cooldown ) + -- Adjust timeout based on rune cooldowns and regen models for Frost DK + timeout = max( timeout, 0.01 + state.runes.cooldown * ( 6 - state.runes.current ) ) elseif state.spec.assassination then timeout = 15.01 end timeout = timeout + state.gcd.remains - local r = state[ resource ] - -- We account for haste here so that we don't compute lots of extraneous future resource gains in Bloodlust/high haste situations. + -- Initialize forecast tables remains[ resource ] = timeout + r.times = r.times or {} + r.values = r.values or {} + r.forecast = r.forecast or {} wipe( r.times ) wipe( r.values ) - r.forecast[1] = r.forecast[1] or {} - r.forecast[1].t = now - r.forecast[1].v = r.actual - r.forecast[1].e = "actual" + r.forecast[ 1 ] = r.forecast[ 1 ] or {} + r.forecast[ 1 ].t = now + r.forecast[ 1 ].v = r.actual + r.forecast[ 1 ].e = "actual" r.fcount = 1 local models = r.regenModel if models then for k, v in pairs( models ) do - if ( not v.resource or v.resource == resource ) and - ( not v.spec or state.spec[ v.spec ] ) and - ( not v.equip or state.equipped[ v.equip ] ) and - ( not v.talent or state.talent[ v.talent ].enabled ) and - ( not v.pvptalent or state.pvptalent[ v.pvptalent ].enabled ) and - ( not v.aura or state[ v.debuff and "debuff" or "buff" ][ v.aura ].remains > 0 ) and - ( not v.set_bonus or state.set_bonus[ v.set_bonus ] > 0 ) and - ( not v.setting or state.settings[ v.setting ] ) and - ( not v.swing or state.swings[ v.swing .. "_speed" ] and state.swings[ v.swing .. "_speed" ] > 0 ) and - ( not v.channel or state.buff.casting.up and state.buff.casting.v3 == 1 and state.buff.casting.v1 == class.abilities[ v.channel ].id ) then + if ( not v.resource or v.resource == resource ) and + ( not v.spec or state.spec[ v.spec ] ) and + ( not v.equip or state.equipped[ v.equip ] ) and + ( not v.talent or state.talent[ v.talent ].enabled ) and + ( not v.pvptalent or state.pvptalent[ v.pvptalent ].enabled ) and + ( not v.aura or state[ v.debuff and "debuff" or "buff" ][ v.aura ].remains > 0 ) and + ( not v.set_bonus or state.set_bonus[ v.set_bonus ] > 0 ) and + ( not v.setting or state.settings[ v.setting ] ) and + ( not v.swing or state.swings[ v.swing .. "_speed" ] and state.swings[ v.swing .. "_speed" ] > 0 ) and + ( not v.channel or state.buff.casting.up and state.buff.casting.v3 == 1 and state.buff.casting.v1 == class.abilities[ v.channel ].id ) then local l = v.last() - local i = type( v.interval ) == "number" and v.interval or ( type( v.interval ) == "function" and v.interval( now, r.actual ) or ( type( v.interval ) == "string" and state[ v.interval ] or 0 ) ) - -- local i = roundDown( type( v.interval ) == "number" and v.interval or ( type( v.interval ) == "function" and v.interval( now, r.actual ) or ( type( v.interval ) == "string" and state[ v.interval ] or 0 ) ), 2 ) + local i = type( v.interval ) == "number" and v.interval or + ( type( v.interval ) == "function" and v.interval( now, r.actual ) or + ( type( v.interval ) == "string" and state[ v.interval ] or 0 ) ) v.next = l + i v.name = k @@ -1461,36 +1464,30 @@ do sort( events, resourceModelSort ) local finish = now + timeout - local prev = now local iter = 0 local regen = r.regen > 0.001 and r.regen or 0 - while( #events > 0 and now <= finish and iter < 20 ) do - local e = events[1] - + while ( #events > 0 and now <= finish and iter < 20 ) do + local e = events[ 1 ] iter = iter + 1 if e.next > finish or not r or not r.actual then table.remove( events, 1 ) - else now = e.next local bonus = regen * ( now - prev ) - local stop = e.stop and e.stop( r.forecast[ r.fcount ].v ) local aura = e.aura and state[ e.debuff and "debuff" or "buff" ][ e.aura ].expires < now local channel = ( e.channel and state.buff.casting.expires < now ) if stop or aura or channel then table.remove( events, 1 ) - local v = max( 0, min( r.max, r.forecast[ r.fcount ].v + bonus ) ) local idx if r.forecast[ r.fcount ].t == now then - -- Reuse the last one. idx = r.fcount else idx = r.fcount + 1 @@ -1505,14 +1502,11 @@ do prev = now local val = r.fcount > 0 and r.forecast[ r.fcount ].v or r.actual - local v = max( 0, min( r.max, val + bonus ) ) v = max( 0, min( r.max, v + ( type( e.value ) == "number" and e.value or e.value( now ) ) ) ) - local idx if r.forecast[ r.fcount ].t == now then - -- Reuse the last one. idx = r.fcount else idx = r.fcount + 1 @@ -1524,19 +1518,22 @@ do r.forecast[ idx ].e = e.name or "none" r.fcount = idx - -- interval() takes the last tick and the current value to remember the next step. - local step = roundDown( type( e.interval ) == "number" and e.interval or ( type( e.interval ) == "function" and e.interval( now, v ) or ( type( e.interval ) == "string" and state[ e.interval ] or 0 ) ), 3 ) + local step = roundDown( type( e.interval ) == "number" and e.interval or + ( type( e.interval ) == "function" and e.interval( now, v ) or + ( type( e.interval ) == "string" and state[ e.interval ] or 0 ) ), 3 ) remains[ e.resource ] = finish - e.next e.next = e.next + step - if e.next > finish or step < 0 or ( e.aura and state[ e.debuff and "debuff" or "buff" ][ e.aura ].expires < e.next ) or ( e.channel and state.buff.casting.expires < e.next ) then + if e.next > finish or step < 0 or + ( e.aura and state[ e.debuff and "debuff" or "buff" ][ e.aura ].expires < e.next ) or + ( e.channel and state.buff.casting.expires < e.next ) then table.remove( events, 1 ) end end - end - if #events > 1 then sort( events, resourceModelSort ) end + if #events > 1 then sort( events, resourceModelSort ) end + end end if regen > 0 and r.forecast[ r.fcount ].v < r.max then @@ -1551,9 +1548,9 @@ do end end end + ns.forecastResources = forecastResources state.forecastResources = forecastResources - Hekili:ProfileCPU( "forecastResources", forecastResources ) end @@ -3495,39 +3492,56 @@ function state:CombinedResourceRegen( t ) return regen end - function state:TimeToResource( t, amount ) - if not amount or amount > t.max then return 3600 - elseif t.current >= amount then return 0 end + -- Handle invalid or overflow cases. + if not amount or amount > t.max then return 3600 end + if t.current >= amount then return 0 end + + local regen, lastTick, pad = t.regen, nil, 0 + local queryTime = state.query_time + local deficit = amount - t.current + + -- Handle rune-specific logic. + if t.resource == "runes" then + local totalTime = 0 - local pad, lastTick = 0, nil + -- Check `expiry` to calculate when the required runes will regenerate. + for i = 1, deficit do + if i > #t.expiry then break end + local nextRune = t.expiry[ i ] or 0 + if nextRune > queryTime then + totalTime = max( totalTime, nextRune - queryTime ) + end + end + return totalTime + end + + -- Handle tick-based resources (e.g., energy, focus). if t.resource == "energy" or t.resource == "focus" then -- Round any result requiring ticks to the next tick. lastTick = t.last_tick end - local regen, slice = t.regen, nil if regen == 0.001 then regen = 0 end + -- Handle forecasted resources with slices (e.g., energy/focus models). if t.forecast and t.fcount > 0 then - local q = state.query_time - - if t.times[ amount ] then return t.times[ amount ] - q end + if t.times[ amount ] then return t.times[ amount ] - queryTime end if regen == 0 then for i = 1, t.fcount do local v = t.forecast[ i ] if v.v >= amount then t.times[ amount ] = v.t - return max( 0, t.times[ amount ] - q ) + return max( 0, t.times[ amount ] - queryTime ) end end - t.times[ amount ] = q + 3600 - return max( 0, t.times[ amount ] - q ) + t.times[ amount ] = queryTime + 3600 + return max( 0, t.times[ amount ] - queryTime ) end for i = 1, t.fcount do - slice = t.forecast[ i ] + local slice = t.forecast[ i ] local after = t.forecast[ i + 1 ] if slice.v >= amount then @@ -3538,10 +3552,10 @@ function state:TimeToResource( t, amount ) pad = 0.1 - pad end - return max( 0, pad + t.times[ amount ] - q ) + return max( 0, pad + t.times[ amount ] - queryTime ) elseif after and after.v >= amount then - -- Our next slice will have enough resources. Check to see if we'd regen enough in-between. + -- Check if regeneration fills the deficit before the next slice. local time_diff = after.t - slice.t local deficit = amount - slice.v local regen_time = deficit / regen @@ -3556,17 +3570,17 @@ function state:TimeToResource( t, amount ) else t.times[ amount ] = after.t end - return max( 0, t.times[ amount ] - q ) + return max( 0, t.times[ amount ] - queryTime ) end end - t.times[ amount ] = q + 3600 - return max( 0, t.times[ amount ] - q ) + t.times[ amount ] = queryTime + 3600 + return max( 0, t.times[ amount ] - queryTime ) end - -- This wasn't a modeled resource, just look at regen time. - if lastTick and slice then - pad = ( slice.t - lastTick ) % 0.1 + -- Fallback for non-modeled resources. + if lastTick and regen > 0 then + pad = ( queryTime - lastTick ) % 0.1 pad = 0.1 - pad end @@ -3575,7 +3589,6 @@ function state:TimeToResource( t, amount ) end - local mt_resource = { __index = function( t, k ) diff --git a/TheWarWithin/DeathKnightBlood.lua b/TheWarWithin/DeathKnightBlood.lua index 2326a1877..44c08afb6 100644 --- a/TheWarWithin/DeathKnightBlood.lua +++ b/TheWarWithin/DeathKnightBlood.lua @@ -76,25 +76,37 @@ spec:RegisterResource( Enum.PowerType.Runes, { spend = function( amount ) local t = state.runes - + + -- Consume the specified number of runes. for i = 1, amount do t.expiry[ 1 ] = ( t.expiry[ 4 ] > 0 and t.expiry[ 4 ] or state.query_time ) + t.cooldown table.sort( t.expiry ) end - - -- TODO: Rampant Transference - state.gain( amount * 10 * ( state.buff.rune_of_hysteria.up and 1.2 or 1 ), "runic_power" ) - - if state.talent.rune_strike.enabled then state.gainChargeTime( "rune_strike", amount ) end - + + -- Handle Runic Power gain, considering Rampant Transference or Rune of Hysteria. + local rpGainMultiplier = state.buff.rune_of_hysteria.up and 1.2 or 1 + state.gain( amount * 10 * rpGainMultiplier, "runic_power" ) + + -- Handle Rune Strike cooldown reduction if applicable. + if state.talent.rune_strike.enabled then + state.gainChargeTime( "rune_strike", amount ) + end + + -- Handle Eternal Rune Weapon interactions (Dancing Rune Weapon synergy). if state.buff.dancing_rune_weapon.up and state.azerite.eternal_rune_weapon.enabled then - if state.buff.dancing_rune_weapon.expires - state.buff.dancing_rune_weapon.applied < state.buff.dancing_rune_weapon.duration + 5 then - state.buff.eternal_rune_weapon.expires = min( state.buff.dancing_rune_weapon.applied + state.buff.dancing_rune_weapon.duration + 5, state.buff.dancing_rune_weapon.expires + ( 0.5 * amount ) ) + local maxExtension = state.buff.dancing_rune_weapon.duration + 5 + if state.buff.dancing_rune_weapon.expires - state.buff.dancing_rune_weapon.applied < maxExtension then + state.buff.eternal_rune_weapon.expires = min( + state.buff.dancing_rune_weapon.applied + maxExtension, + state.buff.dancing_rune_weapon.expires + ( 0.5 * amount ) + ) end end - + + -- Invalidate the actual rune count to force recalculation. t.actual = nil end, + timeTo = function( x ) return state:TimeToResource( state.runes, x ) diff --git a/TheWarWithin/DeathKnightFrost.lua b/TheWarWithin/DeathKnightFrost.lua index 7a16d3a5e..1e7c27269 100644 --- a/TheWarWithin/DeathKnightFrost.lua +++ b/TheWarWithin/DeathKnightFrost.lua @@ -15,137 +15,110 @@ local spec = Hekili:NewSpecialization( 251 ) spec:RegisterResource( Enum.PowerType.Runes, { rune_regen = { - last = function () - return state.query_time - end, + last = function () return state.query_time end, + stop = function( x ) return x == 6 end, interval = function( time, val ) - local r = state.runes val = math.floor( val ) - if val == 6 then return -1 end - return r.expiry[ val + 1 ] - time - end, - - stop = function( x ) - return x == 6 + return state.runes.expiry[ val + 1 ] - time end, - - value = 1 + value = 1, }, empower_rune = { aura = "empower_rune_weapon", - last = function () - return state.buff.empower_rune_weapon.applied + floor( ( state.query_time - state.buff.empower_rune_weapon.applied ) / 5 ) * 5 + last = function() + local applied = state.buff.empower_rune_weapon.applied + return applied + math.floor( ( state.query_time - applied ) / 5 ) * 5 end, - stop = function ( x ) + stop = function( x ) return x == 6 end, interval = 5, - value = 1 + value = 1, }, }, setmetatable( { expiry = { 0, 0, 0, 0, 0, 0 }, cooldown = 10, regen = 0, max = 6, - forecast = {}, - fcount = 0, - times = {}, - values = {}, resource = "runes", - reset = function() + reset = function () local t = state.runes - for i = 1, 6 do local start, duration, ready = GetRuneCooldown( i ) - - start = start or 0 - duration = duration or ( 10 * state.haste ) - - t.expiry[ i ] = ready and 0 or start + duration - t.cooldown = duration + t.expiry[ i ] = ready and 0 or ( start + duration ) end - table.sort( t.expiry ) - - t.actual = nil + t.actual = nil -- Reset actual to force recalculation end, gain = function( amount ) local t = state.runes - for i = 1, amount do - t.expiry[ 7 - i ] = 0 + table.insert( t.expiry, 0 ) + end + while #t.expiry > 6 do + table.remove( t.expiry ) end table.sort( t.expiry ) - - t.actual = nil + t.actual = nil -- Reset actual to force recalculation end, spend = function( amount ) local t = state.runes - for i = 1, amount do - t.expiry[ 1 ] = ( t.expiry[ 4 ] > 0 and t.expiry[ 4 ] or state.query_time ) + t.cooldown - table.sort( t.expiry ) + local nextReady = ( t.expiry[ 4 ] > 0 and t.expiry[ 4 ] or state.query_time ) + t.cooldown + table.remove( t.expiry, 1 ) + table.insert( t.expiry, nextReady ) end - state.gain( amount * 10, "runic_power" ) + if state.this_action == "obliterate" and state.buff.exterminate.up then + state.gain( 20, "runic_power" ) + else + state.gain( amount * 10, "runic_power" ) + end if state.talent.gathering_storm.enabled and state.buff.remorseless_winter.up then state.buff.remorseless_winter.expires = state.buff.remorseless_winter.expires + ( 0.5 * amount ) end - - t.actual = nil + t.actual = nil -- Reset actual to force recalculation end, timeTo = function( x ) return state:TimeToResource( state.runes, x ) end, }, { - __index = function( t, k, v ) + __index = function( t, k ) if k == "actual" then + -- Calculate the number of runes available based on `expiry`. local amount = 0 - for i = 1, 6 do if t.expiry[ i ] <= state.query_time then amount = amount + 1 end end - return amount elseif k == "current" then - -- If this is a modeled resource, use our lookup system. + -- Use forecasted values if available, fallback to `actual`. if t.forecast and t.fcount > 0 then local q = state.query_time - local index, slice - - if t.values[ q ] then return t.values[ q ] end - + if t.values[ q ] then + return t.values[ q ] + end for i = 1, t.fcount do - local v = t.forecast[ i ] - if v.t <= q then - index = i - slice = v - else - break + local slice = t.forecast[ i ] + if slice.t <= q then + return max( 0, min( t.max, slice.v ) ) end end - - -- We have a slice. - if index and slice then - t.values[ q ] = max( 0, min( t.max, slice.v ) ) - return t.values[ q ] - end end - return t.actual elseif k == "deficit" then @@ -155,42 +128,38 @@ spec:RegisterResource( Enum.PowerType.Runes, { return t[ "time_to_" .. t.current + 1 ] elseif k == "time_to_max" then - return t.current == 6 and 0 or max( 0, t.expiry[6] - state.query_time ) - - elseif k == "add" then - return t.gain + return t.current == t.max and 0 or max( 0, t.expiry[ 6 ] - state.query_time ) else local amount = k:match( "time_to_(%d+)" ) amount = amount and tonumber( amount ) - - if amount then return state:TimeToResource( t, amount ) end + if amount then return t.timeTo( amount ) end end end -} ) ) +})) + + spec:RegisterResource( Enum.PowerType.RunicPower, { - breath = { - talent = "breath_of_sindragosa", - aura = "breath_of_sindragosa", + breath_of_sindragosa = { + aura = "breath_of_sindragosa", last = function () - return state.buff.breath_of_sindragosa.applied + floor( state.query_time - state.buff.breath_of_sindragosa.applied ) + local app = state.buff.breath_of_sindragosa.applied + local tick_interval = state.buff.breath_of_sindragosa.tick_time or 1 + return app + floor( ( state.query_time - app ) / tick_interval ) * tick_interval end, - - stop = function ( x ) return x < 16 end, - + stop = function( x ) return state.buff.breath_of_sindragosa.down or x < 17 end, interval = 1, - value = -16 + value = function () + local time_remaining = state.buff.breath_of_sindragosa.expires - state.query_time + return time_remaining < 1 and floor( time_remaining * 17 ) or -17 + end }, empower_rp = { aura = "empower_rune_weapon", - - last = function () - return state.buff.empower_rune_weapon.applied + floor( ( state.query_time - state.buff.empower_rune_weapon.applied ) / 5 ) * 5 - end, - + last = function () return state.buff.empower_rune_weapon.applied + floor( ( state.query_time - state.buff.empower_rune_weapon.applied ) / 5 ) * 5 end, interval = 5, value = 5 }, @@ -205,6 +174,7 @@ spec:RegisterResource( Enum.PowerType.RunicPower, { interval = 1, value = function () return min( 15, state.true_active_enemies * 3 ) end, }, + } ) -- Talents @@ -442,9 +412,40 @@ spec:RegisterAuras( { tick_time = 1, max_stack = 1, meta = { - remains = function( t ) - if not t.up then return 0 end - return ( runic_power.current + ( runes.current * 10 ) ) / 17 + remains = function( bos ) + if not bos.up then return 0 end + + local runic_power = runic_power.current + local runes = runes.current + local now = state.now + local regen_rate_rp = ( runic_power.regen or 0 ) + ( ( runes.regen or 0 ) * 10 ) + local gcd = state.gcd.max + local total_time = 0 + + -- Simulate BoS ticks. + while now < bos.expires and runic_power >= 17 do + -- Deduct 17 RP per tick. + runic_power = runic_power - 17 + + -- Add RP contribution from rune spending. + if runes >= 2 then + runes = runes - 2 + runic_power = runic_power + 20 -- RP from Obliterate. + elseif runes > 0 then + runic_power = runic_power + ( runes * 10 ) + runes = 0 + end + + -- Regenerate resources over 1 GCD. + runic_power = runic_power + regen_rate_rp + runes = min( 6, runes + ( runes.regen or 0 ) * gcd ) + + -- Advance time. + now = now + gcd + total_time = total_time + bos.tick_time + end + + return min( total_time, bos.expires - state.now ) end, } }, @@ -980,16 +981,11 @@ spec:RegisterAura( "chilling_rage", { max_stack = 5 } ) - - -local TriggerERW = setfenv( function() - gain( 1, "runes" ) - gain( 5, "runic_power" ) -end, state ) - +--[[ Uncomment if enduring strength buff ever becomes referenced in APL local TriggerEnduringStrengthBuff = setfenv( function() applyBuff( "enduring_strength_buff" ) end, state ) +--]] local any_dnd_set = false @@ -1034,10 +1030,11 @@ spec:RegisterHook( "reset_precast", function () class.abilityList.any_dnd = "|T136144:0|t |cff00ccff[Any]|r " .. class.abilities.death_and_decay.name any_dnd_set = true end - + --[[ Uncomment if enduring strength buff ever becomes referenced in APL if buff.pillar_of_frost.up and talent.enduring_strength.enabled then state:QueueAuraEvent( "pillar_of_frost", TriggerEnduringStrengthBuff, buff.pillar_of_frost.expires, "AURA_EXPIRATION" ) end + --]] local control_expires = action.control_undead.lastCast + 300 if talent.control_undead.enabled and control_expires > now and pet.up then @@ -1052,32 +1049,8 @@ spec:RegisterHook( "reset_precast", function () end end - if buff.empower_rune_weapon.up then - local tick, expires = buff.empower_rune_weapon.applied, buff.empower_rune_weapon.expires - for i = 1, 4 do - tick = tick + 5 - if tick > query_time and tick < expires then - state:QueueAuraEvent( "empower_rune_weapon", TriggerERW, tick, "AURA_TICK" ) - end - end - end - -end ) - - -spec:RegisterHook( "recheck", function( times ) - if buff.breath_of_sindragosa.up then - local applied = action.breath_of_sindragosa.lastCast - local tick = applied + ceil( query_time - applied ) - query_time - if tick > 0 then times[ #times + 1 ] = tick end - times[ #times + 1 ] = tick + 1 - times[ #times + 1 ] = tick + 2 - times[ #times + 1 ] = tick + 3 - if Hekili.ActiveDebug then Hekili:Debug( "Queued BoS recheck times at %.2f, %.2f, %.2f, and %.2f.", tick, tick + 1, tick + 2, tick + 3 ) end - end end ) - -- Abilities spec:RegisterAbilities( { -- Talent: Surrounds you in an Anti-Magic Shell for $d, absorbing up to $ magic damage and preventing application of harmful magical effects.$?s207188[][ Damage absorbed generates Runic Power.] @@ -1425,9 +1398,9 @@ spec:RegisterAbilities( { gain( 1, "runes" ) gain( 5, "runic_power" ) applyBuff( "empower_rune_weapon" ) - for i = 5, 20, 5 do + --[[for i = 5, 20, 5 do state:QueueAuraEvent( "empower_rune_weapon", TriggerERW, query_time + i, "AURA_TICK" ) - end + end--]] end, copy = "empowered_rune_weapon" @@ -1685,7 +1658,6 @@ spec:RegisterAbilities( { applyDebuff( "target", "frost_fever" ) active_dot.frost_fever = max ( active_dot.frost_fever, active_enemies ) -- it applies in AoE around your target end - gain( 10, "runic_power") end if buff.killing_machine.up then @@ -1969,6 +1941,30 @@ spec:RegisterOptions( { package = "Frost DK", } ) +--[[ Estimation of whether or not random RP gains can happen, in an attempt to smooth out changing recommendations +spec:RegisterStateExpr( "breath_possible_gains", function () + -- Initialize possible gains + local possible_gains = 0 + + -- Check for weapon swing before next GCD + if state.nextMH and state.nextMH > 0 and state.nextMH <= ( state.now + state.gcd.remains ) then + possible_gains = possible_gains + 5 + end + + -- Calculate next Frost Fever tick dynamically + if state.debuff.frost_fever.up then + local tick_time = state.debuff.frost_fever.tick_time or 3 -- Default tick time if unavailable + local last_tick = state.debuff.frost_fever.last_tick or state.debuff.frost_fever.applied + local next_tick = last_tick + tick_time + + -- Check if Frost Fever will tick before the next GCD ends + if next_tick <= ( state.now + state.gcd.remains ) then + possible_gains = possible_gains + ( active_dot.frost_fever * 3 ) + end + end + + return possible_gains +end )--]] spec:RegisterSetting( "bos_rp", 60, { name = strformat( "%s for %s", _G.RUNIC_POWER, Hekili:GetSpellLinkWithTexture( spec.abilities.breath_of_sindragosa.id ) ), diff --git a/TheWarWithin/DeathKnightUnholy.lua b/TheWarWithin/DeathKnightUnholy.lua index aea0abb83..6fecd8df9 100644 --- a/TheWarWithin/DeathKnightUnholy.lua +++ b/TheWarWithin/DeathKnightUnholy.lua @@ -14,12 +14,9 @@ local PTR = ns.PTR local strformat = string.format local me = Hekili:NewSpecialization( 252 ) - me:RegisterResource( Enum.PowerType.Runes, { rune_regen = { - last = function () - return state.query_time - end, + last = function () return state.query_time end, interval = function( time, val ) local r = state.runes @@ -29,10 +26,7 @@ me:RegisterResource( Enum.PowerType.Runes, { return r.expiry[ val + 1 ] - time end, - stop = function( x ) - return x == 6 - end, - + stop = function( x ) return x == 6 end, value = 1, }, }, setmetatable( { @@ -51,10 +45,8 @@ me:RegisterResource( Enum.PowerType.Runes, { for i = 1, 6 do local start, duration, ready = GetRuneCooldown( i ) - start = start or 0 duration = duration or ( 10 * state.haste ) - start = roundUp( start, 3 ) t.expiry[ i ] = ready and 0 or start + duration @@ -62,8 +54,7 @@ me:RegisterResource( Enum.PowerType.Runes, { end table.sort( t.expiry ) - - t.actual = nil + t.actual = nil -- Reset actual to force recalculation end, gain = function( amount ) @@ -73,8 +64,7 @@ me:RegisterResource( Enum.PowerType.Runes, { t.expiry[ 7 - i ] = 0 end table.sort( t.expiry ) - - t.actual = nil + t.actual = nil -- Reset actual to force recalculation end, spend = function( amount ) @@ -90,21 +80,23 @@ me:RegisterResource( Enum.PowerType.Runes, { end if amount > 0 then + -- Handle Runic Power gain state.gain( amount * 10, "runic_power" ) + -- Handle Tier 20 4-piece set bonus if state.set_bonus.tier20_4pc == 1 then state.cooldown.army_of_the_dead.expires = max( 0, state.cooldown.army_of_the_dead.expires - 1 ) end end - t.actual = nil + t.actual = nil -- Reset actual to force recalculation end, timeTo = function( x ) return state:TimeToResource( state.runes, x ) end, }, { - __index = function( t, k, v ) + __index = function( t, k ) if k == "actual" then local amount = 0 @@ -117,30 +109,19 @@ me:RegisterResource( Enum.PowerType.Runes, { return amount elseif k == "current" then - -- If this is a modeled resource, use our lookup system. + -- Use forecasted values if available, fallback to `actual` if t.forecast and t.fcount > 0 then local q = state.query_time - local index, slice - - if t.values[ q ] then return t.values[ q ] end - + if t.values[ q ] then + return t.values[ q ] + end for i = 1, t.fcount do - local v = t.forecast[ i ] - if v.t <= q then - index = i - slice = v - else - break + local slice = t.forecast[ i ] + if slice.t <= q then + return max( 0, min( t.max, slice.v ) ) end end - - -- We have a slice. - if index and slice then - t.values[ q ] = max( 0, min( t.max, slice.v ) ) - return t.values[ q ] - end end - return t.actual elseif k == "deficit" then @@ -150,20 +131,17 @@ me:RegisterResource( Enum.PowerType.Runes, { return t[ "time_to_" .. t.current + 1 ] elseif k == "time_to_max" then - return t.current == 6 and 0 or max( 0, t.expiry[6] - state.query_time ) - - - elseif k == "add" then - return t.gain + return t.current == t.max and 0 or max( 0, t.expiry[ 6 ] - state.query_time ) else local amount = k:match( "time_to_(%d+)" ) amount = amount and tonumber( amount ) - if amount then return state:TimeToResource( t, amount ) end end end -} ) ) +})) + + me:RegisterResource( Enum.PowerType.RunicPower ) From a6e39b8922f479e91e7b86f196a55d188b7e4e32 Mon Sep 17 00:00:00 2001 From: syrifgit <139663837+syrifgit@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:08:05 -0400 Subject: [PATCH 2/9] spaces --- TheWarWithin/DeathKnightFrost.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TheWarWithin/DeathKnightFrost.lua b/TheWarWithin/DeathKnightFrost.lua index 1e7c27269..67cde9260 100644 --- a/TheWarWithin/DeathKnightFrost.lua +++ b/TheWarWithin/DeathKnightFrost.lua @@ -48,7 +48,7 @@ spec:RegisterResource( Enum.PowerType.Runes, { max = 6, resource = "runes", - reset = function () + reset = function() local t = state.runes for i = 1, 6 do local start, duration, ready = GetRuneCooldown( i ) @@ -1998,4 +1998,4 @@ spec:RegisterSetting( "ams_usage", "damage", { } ) -spec:RegisterPack( "Frost DK", 20241102, [[Hekili:S3ZFZnUTo(zjZnRx79howYX72TxsMPTx70TxVx7SPVx)VyRylhRxKL8jjVzZoz8N9dGu)GKIGIYwo7279MotJxjkqaqaqaqqYRDU(pU(QfEz(x)3Ch5EMJZi3HoVZ1zSZ1xL9Wg)RVAJ3878Uf(rK3A4))tjXPz7M9F9FJV5HWyVfiesJ3MmhE7QSSnPF7PNEBq2QT3mCE86ttdwVn0llioAEI3Ym8Fp)0RV6MTbHzVp66B039xFL32SvXjxF1vbR)baWblw4ZBTF68RVcB9RDCE9iNVD3S)(gee7M9D)(VUBww8Uzj(RJ)i8Gi)0m)f7M5nh7)0D)YUFH)HJE94rdDHp9)Xp5wOHyNSB22C4CpG97M9b)LW3fNSBwquyqu5Z)Z4)8N99widSVvbgcV09DWl)UWW47bKlji6oFG)TnTeE)E8pTB2IGuVBc9x8Fc)mo65qlU3lfXLp47TXp55PaQ6LCNeChdW9Nc(e0ZXBdlAPulqk0Xz4OHtKESJbS1rKHUmjEnVPaETYlArOpdFp97JVcqu)0hIMxXvh9Ux7(nipnic5AEl(NBtZw7hLj1eNZE1UzytjXcSrJkOTnXXaZ)2PjBHbZQM8nV29niCG)(nC4nkhUJMK)3IN)oE)uVBElmUXHbhNG)ojhMNr)nm2(FScye)PhqL)jmggeD9vHbPzPmvbaBd9NM5bcwzWd(Bmvm)i2W71FpiyZegV(QLOM00uqK4oFUyDsWg(RUIbdOByabgAJZ84VbAtMFsGhOD6fcS2HEtx6dsktJxofucdthM3t7M1dhHUz7YLdt8(CCsWC)HPzGY8UzxSB2e27ZHr6kVmeQaB(MqVf(sWGbHA9Y2nxNb6SkKwf2X(Q7cczJDR9Md8iXU3D3ShFmh2(Fc(M1braFgbBj)j(MqeAOXbORgt2v97a6CahFaqHYz7MDodfHV8KYpgG7nj(E35Ni8zeJMa(Egj((rp4pWJhMeS2FkI4PIiz9(PQtwfFFyo2NMH9YK2naSDtbrvIes6xum)3q2nldUDv2uWERxayFD2LvCCuYDygsIzXt3mpB64jm(k57hj858rb4F6wHsOGh0tOroeNEljorqEbZNUj(EWcj2b9fAtYMIrHCzGtSqIHJKfWC4c)LbZdY4soJycugeo(gZdBOGrXyLe6GcgzRyAHbrls8Uno1RcLqSpVHWR8XMLTYFk05F2pA68vER3ayJC7Nd8NfX3hPh0LJRdmid(UdAG4egjIDZuCcMHURKiedQS0SxNrTfL85QGIObLUGJQ98gbEb9AaHPnK2ADvhAlLNGoxKnK37l9)ii3Mfm)oaKggEDOTKPyRuR(aQdpzFKKlP6SKTGzsE7lexzWTu2f8tmcb19brzyFVnHnB5UzVgC)zII0Rytz0hTnuBrxt0(OQ(2lzUxeAUljbG514)D1CGeMUY3lXORcGUlOgIDFWCvFf(bac7M9ZmqqByggKUD(IHR9(uXyH4GhYVpjF6yI5m4JEY6PfEhurefZ8Ejm17zC4A9NSB23uorChIjmW2seXPWcUrFCQepk1aLSVw0fBa6Wlbh9yAEf0Hbwh2)Ckvla0oQ(cw7D2n7LSFKJzSp4(hswNoD52KhKqUs9h1gbc7lEGZbego2gTko8b0QLF0TzRKid13PfdhqjqB09ol4YlykN3fHI8dr56LXG3fdx6fgIt8LSnfM5OC6gtJjLSesw(LCtkcJoghcj5CLSvIpFSz(fTrzl4xN0kwwZezxWufnuwJAPnrBbPAc1Aym8SdBm8Dk(yzspECJ86ZmkrKj4ha2adZMi4VWvZFyEzWQP4Nyzie91g8gNEnm1Zlyt3mqzkSFtaX3n77a0etEtzqV7DGMLEMyVv0EIXfugFMb3JOnC19ywHWmx5fMjB6c)5EpumMuI436nDtsaekC2dvy(THEZd8cN6T4JEr6nIOpZeFzOinIMAme0egFWjgOQngt0cRx0LKeTuHA40AvmBsnupOPJk(lxK6Qr7QxxsEkSgS9qhjdZ6IooJAyQu6fYzwsNof3khHOfNVnqer1pvBXhw0sJWtxhszGDSy6SOZZHO))C01Jz4DQFK)6a)CxDkYKHooATWSBsButuhei3bR3oOW8sJjGqkSufHb5isv5pxW4p1twH)ICREvydbdKovcCYNNhitbNRoXytdbFTZruNo1cTuBij9tnQfdA7KInM0hT9cThTLAiJnM1c6uYwcaNcd0vSceSMYiXFZXyAvjNkIsafmRVjXFE86B80MGJy4Bt9Zcwk5tpFrYgM5mCLx60TPCVWkKnZfTuDXqXRFBtCt)YfLd7Vsx1RYH0Zm4aFvRaj)rL2DBrFBo)RsyHz0SebuDU(h)Ox4wWLcq90ReiPv98RWfF8JblqC6gyUnonUBw8s26)LMbnWFDU8dx26EyQ9y8dXL5JJ482xH6pxOhgUB27HxgKHpeXgFCXeHFhXxQwywmwSMj(zBtasXb7XqCbslEYOHtgYw4KP8fHoNkM6mfxbYkXVcfr8xq3mfHY1xbFD(dU(khDrtiifQdsQ9QBEVQrI19jwI19VgsSArtrjwJdxQZjKpCroSxZcsvwJRPWlpCXyfFn9Yb1EFq6WmGXpFLFs820PzjErPRdWjz1RGWJFvtWETGl6AMlQk0lHXFn8svUOBl5IUvCr15TBPPdNPfY)et4zgXQuse(ee3eaBHMZeDrA2s011m62eFud66AeDvD(OLORGNDADptrRq2ZqLbBcP8kLauI6KAQUvVFGsaoeWVrR5NQfgvVFqzQ)hoHL8FtQbVqoIWk4HZOjcRILrqg9cc)yiBv1eLyzpBadrDgnQyzdgWIFSVfoyPJaDSIa1yTKGaDSIaD0qGUKeOSeUtPOSRUCEyPK8cV14k3Fic06EVOmxnkdtUSclWiPPMiLwmrcZ(Mxiei0kGK3S9ZFgIm6M4pDWZYT2lARxO2Ks0c0Z1o0RjZE1TIkGEerazc9YdehC2INQJuiET1Al7JBcYWgGlGqvXdvHqj3xnrwTmh0mIaXgkaSC3)s2aDxEYi2dh1Az5QyOwSKydrlMgenDHxYDr(PP64fP4IlmFQqo(1f8psbj(K0qDEr2kO5Ra(pgf2sVTHzmwaoSKo8M4uOnkXNXkA1)roq3n73yp(B3n7NX6fD925yLOIHWJfEjlgmSaxXenaHEHPse(M5qW2SuF(9cXIDvPt5At4GLuMpkZurDjb3ElkKxsBVDKLKZFpfhK4v8Qiq3g5xawoPTWpJTIsyCMR8JWGa5vxmgalsTScP1pkE7TR4FbRwA)XIqu)ale1)KfIQ2mLShuUaskq7JpqsFZrMW15nLfeoBvi40CE(SeO5ZSKM5sVErpWXlGeYWsML187HysrZPpiklVeZLWVlK7H8cnNZ2exHqmDcWlcyjqiJLvJB36bMGZ89F1UzyrhZFySx4qgJq3KXwWikgNqteeQ2VXwX)VBD82OmoLjRoJKpkFao8yqhMZQUbajhWLd)FaWoEI28I91LITckuCXLKr54FKVOROZw)AG8sXqKXpXKWpp037J85LWCJQzHX0S6EAYcZbMOvw3DWRBGucBiZETUCFFoRINiYRnvATnTeyKLQNUoGUEqSCLeAzLexvRuJ0kIPj2Zokv(hWIYz3sMEGYH67eMjiDQIvDSgxR1Ku))sxQL01Llnbzy1kYkSrBRDVwxTlc7ybfRMfMPBx1QC8we(kDe8PckLklgVX9rrPGG4wtiprhMMjG9oIsSY2k06M4i)BtylfGaagOL(ervQzPzIKv2YTkeJxSB2B2ju3JMSctAj9GRx6XJeuIz8M81FH7ugF1xkR2k113RgJHhGwrTx9c9fKzDLvQsTPvfPsnuSwXrBt9Xu1nQe3IhKglW99xsQFieZNaLyCjnv9nPSmsuMQbea2e6ffv8UCXQ8Yc82eW9Ufwur4sfnPrvdjdZIKR04g4H90frl0LYjR5ATyhDOkS9gZlMmT9E78kjRYvBnw4LSh)EC0oz7gbF6xJPbyzIV)N91zvU5StO6Iho4P0TfU6NkNBHszfDMCBFhFjRJR6aVflsZNfrNfNM7asjBjPoHUjpFNLuOF0cwMMwyAvrmGaIJ)A01uYnJu2D8aqaooUYNybub5q8R9strbhLcf3S7HveOCEHiwgfd0xP5bi4O0vSii8J(8dQbAWqNAnYqLDH8b9FufTmwDzDdM)ayHnmokvB)l8AB6zHMx1N9zTHNsD(SmfXqToUiVLXlx6hLkxKwA(cmRD1qxHCUxoeTPAaIyHJAEaY0AYBYRM(n7yJ2pxAFemQAvKmbRbQnRrK2K)c2bMQwPdwstsvZy1fglfy0EF1GyrGfGZy(ZVt30yAlril32Ix2CX3Ryp)NItWJRam)mEB2Ke7nFvTSZXYKf6kEvgyHhLYYntamaY4cZJX3hJllvvKuzR8YY)(QJfb43RaF0bUjOojLF3YeaoC3SFaqhKJJaWzskEOeKdjyGzkxmFkUj0X0bhgQuUm1dRJu1iFrFAMVLRiz1qHoVkSCjX4PJSiqBKTBYHKXIvLCPN2nrmt9)0g)5SJkcSU5gjZkgloTz)wbTxwucTNk62n7FYHfhrlB2leEEfD9YIAkEqrJCgnsRdwwYtZhQSGPk5VEUNRnKUanCqxfoydqy)4AQSm3rAyyTF53kfLkr66ji3QaD78KYmQi84wiqwNoKfcQKrK3SXz71kgAfX2Zgrcnb2kI4Cww9nE04YyTSYmLQJtD1yPLDEES)AY5rLLTMgR3ZH4YSxMTxRJRe)GmT59Slb86CO4SYHgR7QATY(EZvXvtXQgpJyzIB0kY(MLM8PZkt(NltqrcGNscqnw95r)NrSMWnooB2TwX4gYhTYdx5q38WLWRqRRkFHqaDrLNRm9mMpr63s1Rdku41fuUXvD4IYTUZjwVlGQeAnUXloXu0WknGiCyzlDgpNnQeHwE)sHQLW4EqqRheNnkpoCbMXYGK0SPERtNI1XaJ)ZnP3E7Sw1WM9GrmSbViaz8UfOgiyBWVAH6stmlCsnIXCudjTWvCIYgcRIniAHPGOhBHjkan5hOjyitALVrMWfsGJMzGBtzsklT18yKLZfEErQ4z5DioLJg6MHxjcU)GJGCjuQTEyova850W4mX)TuYHflCrCNDYLl5UEPJP0uD4vuOAfS8(nxUECRv6yv1dOVzMpDxnOQ3mLZcnKKuLC6kyWuKbQR6zfEzPqrzFPfBRwSx(ontDVUum2NFaTL)zffrclA5vGeKpAMb(FGolZPy2KBVQOWuWISylRKDywMad)rWV34fKGpl)m7tTqv4fAc1EmnhrCPeVCTt8YTXY80kXlN)cjE5AN4LAXxljE5SxIxCFaLmpWk)vxQD9kTnfvB7vcbhvdmN0ykmBZy7jnjS0R(60QXPuH1NTuiTrXI3Om1r92wCG1qoh3GNwdteTt0AjgOHY8z94t1PEcpTYlkYNnqGCQs8lTUfRYkcnhTzZc6svAevMLueZTrI9yyZ6FlXAHe7rYwhPfCRKyrXmQc6J2WO(IQAVm2j6alXUOqC)PFOwbehC63OJIDTGBEJufwlkpGg1LkMx3awlk6z25)Md)4YYKXk7qb5cq1SB)otux)FWUyCu4d4)hx4LO86JnhLbh4sIXD5CkR2Gr0)vfTaDlKTiL8pRKE2n73GhfSephPd4VVzODtmR4DfHdt5GQcqRS5AwzOv2rTvzWvRYqRnWqPmOFkIV2vg0G1gvgC(QqzqJJQuNKfkfDSKA0)da0mpCTfZR)(FcR6nq4(9ZFappQXvLppIO)ErfiGTflbb1kRI6a6PNP1mws6GUYOYBW9m9YPE379G233qc8BA6zgF3GdjfIv6k8nuPGnmqviDBI5)v508SWXn5kZSjHKEwiGBji(6U4bSrFWLTzIDPtpztshn4hQE)1kLQWS1b2B995B8HBaDs2M8rY(qcRICtbrMK7KY61eBOqhXYI(My2bWxaRaawFdJ2nwZJnr(6OVg6plk(WIDFOnSWgYDT48ceIiCqzT5y7SDFE5PABrmaQ7kZQu)lEaGMuRUuBy5gQxN4ocvAzDWXgdOlBZJm3UcZaZFHHSvYXJvmpJPRa0MecT1hHMS8zYoHapvJLkgb0Wr0LPyl7xFrCplxuJC5aj2FG9ekPfTTvABuoOzYYMt14g57wyk5KgMurKWMyVwl0632W0ZwoDLf8k6TmHfuVT8s9QOTqawHczyo9wr4WqREwVmofAN1kxvPu6yAgtU4XLf573e5AZj5(XASYmMr7ksJH30B)ssLyfWvZIdaJVzKCqBg1JAwHmV0vAOXnMZl871xfpdkN3Lhy25LZWMiCE3jiGOJHwlXM4yd1()t0dnfVX5QK84mK2ywlcYLvhxqNf1gGaWMM)mE0196i2p9gCCmTZzvkEjbyPqeZ3GuGPV5EHpSjLVk8f(hu(0PrX33OgrDhmAuXY8e5gvtA2NzrJLmixDI3Z4sgVhtAMfOgjdpxJCwqttczI0TyEwBNQtyejXlyXuiSCKMwSiDO)NW7VQCtfkVlqPKiuyEcLeXlR)XsNJpIskLLscPwVXHRZmEhV0(HlPmq0eNSjrvkUBV6VQWeVgE(52O5)A9FRMh38iHzgUX79MMz4nn)7bY25QjitHFhFKDFm7hnh(spnxninZ3BLoNoH(VOQIMhPB402VotuystVaySh8IBHU5ApZ418bzQ06zAauHusN)amdgRZO9(LYFtHoQPZyF19dAZj2r6sqqS2Xk3bNNz0bwRqlPTSxdUw0ZmlVsHeMtFBEooYlrtPPE02bQUMyLEOySFQu68vOtnPIRBrZAPxAaGvQdY6YOdqHXa1MNPgrZpn3JQd0LKUUK4jmNCT5JklE0C0Y4XScXSz63OWNrDYCCtyC8cUza5Ss)bwPOUB23vS)M0MCPcMt1E56m60qs9vvidOe5NCxETkFMfjyKcs5Bm5nBX9IccllsugfScXrX0P)ZTlUfVztrWnH2tKgbhwzVW4Px4uCtBXGg90SncTLbj(SXqgGOTI30uXnOLMhqVAbDlm05DllsIKG53X3FWh017udwmiqhAuLsxDSnMZQ)ndmr4nMbgHl7hfVHmnJOGDbZbvjgIFxvM6vdzK1OUuR23nSDtH0DbXDlgOjjUHi53nVL730Y7BpC4PHt9iIOnXD4pWnYKku7e5THPuVYHdRh3)fLQbxFnJW2GLs3FuiUsB9w78nAzlghnWJSmSJOnURlQ623paZq4ozo)KL4JWem4NwCZJda7EVe0Hoy6nw9dhSEtCsw(zt3ZLaYZXDN7)7wEnbNY2RVEBZIZlOyWxfWHY0H7(LFLTJHXR66Fioc6r2RFEHGVYfgeauCZ)s96cPbOz9D(0GMGU6w6qb6u74dvOp(lb0RoGpvGB9t(tviEwNdX3Eu5aFJEORttwPhmz53YEjH(ursPZm0sQ(8Dhv(MdXaDhZ4CMCK7MD)IgBnvtt1odnU6rwrl7kiPUPBu5beqvj1bkawn1eTZaWbIXeYghiujef2BOQDOp)apQDJ7eywPNxkOvnpYSKsL9utfOADJtfYVrpKvxFqfytDo6yj0RoYAQz8x9KXXsiw)yTr1mg55EJL9GWXGJcO1Ca5OctIPSu8EubUejX0syV3AbFbG6XKpCmHTMkuqb(gk4o1(qz654n58Yu(zlZZ73VPSDvEUs8sNbplpuSbpRFFSZHh9c2Vkw15xozWGbVWz0OcmUDW)0c4FAJWVAU7rnsIcvZB9Dcmfzj2RUJuPQMaPwkrliRiecx8pqTdkW2z(2K3ne(p8e1nhkt6jc7nhNvXjCH6Sm6p)lAjWpyxX)RmUFwd2ie0mpxtH3GhYgVW9f5609sKoPoUu4JFgXhxG3Dv)Ckv)0yinkzZtHHsKRVA8ZU2vusaE4(Isb6Us0IWZUU2YXtu3q4tsx3n1Yur((YrypQvc(K67FTMH3tlAlVZcRH51ETTqvDxyPbYAAYXe6KWTMj1t0nWD5OEuBTQENO5n8T7wV(9R)Y89kxptPe)XhpXIH5hFKc4d6zADIUudcxSEZpZDqV(Nqib84JgyXAWMITZ3fodkgJ(xBU7PhlUBL4DT8AwP2qAHY1GfkI8K21wOOqBhZwOQ9ABHAJ2q02KJj0jHRbluUM1HCj1HCnPd58vOoKlLfkhkDO6Syt6qUASq9VIC3tpwC3sXB3rDRpu1H3rXcfjAFq(qzaQnAdPzFO6yOxb3APMPcU7ZKm1H3XziKcTpOjzma1gzYnpjthd9k4wlXrDI4mnuBeBTqCUBHEZWDFTi90KuUNk0UtwZa3AjkRt09OHAJsewO71TqVz4UVMpjsczxlV9eH2DJ82Xzr2PaRWr9Hcu1CiGylqpuCLibIDd)9)3b8oD5lDjs75HoKECwiAxI0q2bzX2Li)bDaOht44)bYmOaBhBnD8tJtcuDZHYKoM(km(4u2vuGTR54pnL(34UUEVmd2Ug7PS4iTfnvnlOD)BAlO7AkGYWwhqbeGUBuUia(Hk3CmX5Zimj3b8Akq3n4nvP13b49XPOBOa7rLD0naNYTo1ThQc4j3(O22bk7itfWtSFnTf4Q7RsfOtTTlvb)KJJxatootupHyguP6oxIneRUn1SfKD8KcuDtNu8kuaFVlEfsaE4(MpPRJ)rB1OVjXFE86B8Az9OBonW4bdaU6jLONCQOeETefFmTT90KEClY0CXQePH3ORnhvW)V5o7d3P2IjtiE3RVzr0E2SaLaqmGJp7zLpsTtkAYfJg84Jw1rLGsBZQ6stie0BdAqR)PGT80ZvAKPuknzEvJinDw71sY(hZCj80KLflwyksTx9T5Oc()n3zF4o0MoDpQ2i0GJFznDQbH0A68PNT80ZvAKPuknDuwauZaDpDL1mqzvwuTGPLHSAB6yWFai(AVuiiJhmH3vnPBb(bG1W7sbrkiajJyUCZ6(o5aOGviRXeUx0GUeWha(IhYhMq3833HGT9iBq6qIlGtnDHXgl1H1YkqoqoOkdYmq3thhnduZws03Mog8haItzlrBt6wGFayTjBiKnR77KdGc0Bprtd6saFa4Rwlk1FFhc22JSTWqvdnwQdRLZ8slJBsINpKDOcUj1uEtOAxh3ni3AA7bFlyBTX(ETuZwoozh9q3UoUBmY2ObFlyBTrARwP3iP0SNtlsb0dkOaAmD)ci(idElaSTZ3AC68dh8uw(OHCq4hd1j1XFSvaXrpqCAjqAESXISu31G3ca38yJfHCE4GVTd9DYO2Hi)uFxJrUtKi3zt9jSIHBpj9MIgqVNK613CUBmSPKg8I(odN8scTr4TA(20hIMJF3lL6wKX9ALrJbpZz0ObdgCzFZ5L3W(6ufbDAebD0IGokiORecwii8v(i5PF5gjp1QrY6i4t2izocwz4JExU3cvF6tLGwyeIE3Sc(i5fERF2kVKPB2(5phcmJ4pPdSun0(oYwp3AJdVQN0sImz7indnSf9KT0wB8kL6uss5Q)RSp0(wY18MAP1dYWVfl7gfal8gsGsu0qjhZt7tQo9ao4vPa5nbrlMgenfpi8I8tvlzl1xxh8ScDzzCyy89b493GhyAcMe)EF8UZFl7M0hNqNDZqZptH3ndpoHXtz5SI2ffZQsMTrsTEXcSXl8Y8UXl1)B39lS7IfmwFIkSXlgtzXHuBnCQUJQJnI1RSJosCmd9d7GI6yFmkOD0J)PTBa84usFFj05j2Rm5h4(3MGkhk9I07AjC3BoK2HofO1IbWJ7Xgf15DvhDyHtun2DeYtb(oP8mBa3pmZhuNZFDdMFCm8T7xEptKgb5BLNQcLwV(Q0n(ZXRGCNRVAts8YGq)RV6)y3SF8JEHBbzByopVDf389PvxVnVcMbl4Jblq4EZd7MXxRFiI3LGYdIkqdY3QEf3)I8nRh8Cu3IBvK3EbRUc9WWDZEp8YGm8Hi2aGyfohCumQkIBN3fmG7NTnbijhShdX7JWINmA4eGe5KC6WY6u9Lxug7XRWd))lKdI4vXBUi1ply5RyD6fo8)ofH9faiF184OfbimVOYPzX4tOQXcJ1wrvWHhNI0Z6AP4zgWdSwkAdd1DFzOUDjd94u6oTNHsuCkTHHMNIHCgPS4xbWfLKe5IvNBmAs4M2xMVaLAF3hRw(pTVFf(TAFd6O7aX3qhNvBynUAznUeSgxcwJM0qR9L1yn6xzuTVxH14sYAmfcABynvjwPMQ4erDXQHeTloKwdFDdg62smKy5R0AjPBWWItrjv8Zve9CeqGdj)GKPhCFYo4HLMxnkewNGqL8dsMO3dlpVASMzDgcvsqOCMETr8yH3AmMOJGuc9PQOm2E5fYeJnyDvFXpI0QnFI(eTDmmARfbOY0x3zAm5E5PlYDvxoJCvZ)xLqnBaEU)a5NQYfgYERnFAAMhUXUsWJTzniOHaWlr2QKMjG)YP7A3VaE4)D)(VUB2)iV33n73yxKJqmi)C897MTE7CW58pGNz07M97CV4X4o2akQGZ74D(g8n4Pkdl7yFVG38xv6dKneCfVQ8(P)v53VjOgec(0H3eNcTavQGM4Nze9)7SCZHh4lq4a4WCEhGhxiG0ZT3wqkl8bzL1SyVUFLFeg2aewCYCwipi1fImc)O4T3UI)fBXGl(XIGA(alOM)KfuJnuQiYSPavkP13o6WiVnF9qCcC6sYBSDuhx2dMwNJbP5PmL187bh1XirFqusKLNMFxi2ZFcDIVGb9BIP8bcNeErqAEAzHOAVDRhy1iZ3hIC8FUnn)HXEHwf1il5qCQfXfqqTKApZoQ97whVnkJJ3YQAiaXX5fSDfnP(fJrCdMjkgGlhg)ay(WgsOyedT2Ovd8nIsLmA594gOoz7MSs4dqDnAFzzIV)N9ZBwb1Mk2mvtDLxpY5g5KVj)UWH(BfUdJ1(TxA4Bt9HjFrR5lkmUw5SGaoj4BLqVnGgU1SzZCjbF6WTB6j2hkM4lntxUxHldSvEF(2t71Z55tmHuB0nnI6DLuV(m4w7kuk)qt788RuGxm(Xh13qoImEGWKqf3As5Ww4AuIcQcnHdV(JFzF3xuKPRA3wsdeERWfEKONB14hfoAYVxCL5kQzxGHuQPhahkZBVy2HnFuV6mQ6SKv8Rgu9yTDUUZ6kXZLwQ8HO57E8rfnKlCPiqMc8pb()Sn0dTj5Tbc2YB(QAZSWSnJhQCvEeapkLzpk)wGgtNh(EyiRkZEyZ8YY)(0aSFqUb87vXBdX0RN5j5Vr5KxGr8Faqh00icaNjPclSMYfxk6EsOGPCnoHw)Y3r1XDZ54jF8v05EY8kv02kF)Tc2x2eaPPp(eu5ZnXo8)uPU2D)kz)93KidzSaflEbMmEc7gk5C3EwJdN7mIMAZzIMjxHyQoS7Yjrk0vpfoeMenyEqgO93Zy)AKSkOheBkSIZ4BLGSUFi90zGQVPKLkLiH6y4LJg0IrjfmtCeXk6SGbkBDwFoynZylFRgHJhFu6YI(8XJ6DIvAKvtY1g(RvG(YXaJwrjPj(((XUV1Rkxf5khf4VYsk1t(XLlVxp15todymKa5eBHIRHjVZzDlEOYLXU6krI6QxIgzwE)sjxR6BYdGcFDaouUduQ3f990(CLph5WfszXr(3MWwcmWFWO7kMox45vESq8gvOpOxFv3OF8rT(CEXeWjKgUi4R0iuwb0k)xkD4v4rsE8wPRPk4mGfOb4OYphGrW(75cZqqv8XlwKY7MDoeKeevZYlE(QSSnPF7PNE)93p8(yiOyVfdbFtonDJFy4fGj93m6uMOWRdIwUfV2VF(L5rJ9(8hC(PExIXthe2cipXX9ToNYLlED8YxZxf3lRfZkh4y4PB3aXJYl2imIx8x22zotCDF77oLldJ9MWsREP(Gi59lggn6bwLlAblTVBBhn6HLdLTGEVPiVYcWIlbb(mYKxkIkEfi3WSbcA2brFm(oqQ)tGeweiOIs8ftlH(rxir8QGLe65g8kFG2agmV2ICfwDZu001srpTXziAgZlcSa6DlOKbrWfgI0KoVwoBupjf8Lbjq0XERtNIz97C0kAtZ5zcnn7Vr5KEkiB56dmippd)bpFWsEbJRQhq6RFf(diWJPG9TlCk85xBkJrMqJt0(MkKwihc90TudMxOhZJGw6RW5VbmoEtCAApv)yq5CG18NS8(HbrbAtBcHW2YJt6pskybSFxM2Cqrj9UDZUfMaiAOKYcWuxepLG3nf)mfEnWojvtKrxNjYJJZyLHvodRipEm0gvy9XW6G)xqEzxXM69vf5geZegV0mzcR5wA24XRzloOQztAOwrN0W4SILJGroclb3xN3ywD39qJ09q2)x3DSUBBBZ9zXyacwDTb2YXDDakcOOyd7hBya7YFRRITsIwCScKC(6Nbc6Z(4HuKIxohskB3TGHcu0klrE45(vjTVdn2vLC46kg2(10)3jRGi8mdeE2l0paqNpeo1NvP5eiC3pRb()S)WLW(WDL72vXZQmaD690LT0JQ8o97cU2vtreh5)ZN8YeYeX5N8mXhTvpmRceN)v5cNX94LA(wn91U3t5MdPOMns)AizH8RdcZfxzO5nbSDeKWMrtypD5Y)7typxsWO6A8ty)gr7t2SB7b4VRe(3Zlpu)sWmn22aTWPOhp5o9kVdWGlpF7MHfCXx(0V2kInyxvT43dVAx3WDs3yDcX4jm6EmQlg8hJO5mUAoprfJw2dOStXvRDkmSSF2MnLNHJus5dJgcsdmaopAFod5FBr2m66rG7Rj48wqfiO0Xi0oeMoMPthJxuZGoM9YGoMfKoo)RmDKRX4xy)39Lqfv6RJ(pw9)yrhXuLSMPf5p41xR3T6)uwdq4EHIaQZkCxZN32NQMU9CoGnnSqiH1C1nWsEX(613dPQ2TQutXIGvfmP2xYhQ8W6xRDFXgrS6iit3Z(ba0FGfRt9oO2TPYGn)aM)qp2SxMzaCuovz2Erw7pC(Jmd58YRBEOEhhBVAB9dxZDkaHsqAEhZSjJUbHwcbzYe4bPNRzm(3cnXKM8B5JvTDmst79QWGxgJQjmqgJndf00xi2Y302XCJURR)LjpSuQNs2wzuhr0KCk1RGqnscwGoM0Eyvc5xkt8S9mNkYM78zc(b3thsoInWZfM1UIjYSDlp91L3BGyon0G(wGWFtYagmfBysLy8)ZIac86uQEreZVKrYqlCbAdDLywUpIoTkgC0OZByVimUQibCTmmlA(3rQZL2oLHkwZF7Oi3yCIrqRP36O3LKOsNNS(pwnwdpyikfJabOyEiufoHDSNc9nb7HCJt8CfLMOlbmKykEh4JeDM4dXrwSWVstYG7ClAmVKCmV2Yz6q5qQj9q3K1RxFy9wMaBz7Tv77eiPPahi4idCnvPj3uZORlsv97L2ISQ)AaKNCcyaZMgJ)BF(q7dDRU5P2daKnW01wdLmSr01XdFyCKfg28tLtalFJuvShoicpvMf4ynbhQnDq6Q5KJCgPZJOoTsxsOjTL1BwXCfgGLnB6UO6)dJKjJn3661AvdX68OQgY3A)qQYKmqou1R2Hh(CGX4oUpouM7rvGcsSVmOTWbPKhId)nUpJZL8HMooScAejJdVKmbG)v3XIY6I9FUH)pO9nkz4MZUlyZI4HJ0fd8pgtQHcZYAgQKzNBt0LuYHs1T(atv1Gni3q6iJnXSqPhwTz3gtLH6wG7xfrzszuagyVU8GzeodnuCI)4yKDdBgbieEV0AtzsldjuiejtQZxIlcF3gSJ4H3CW1qB4E9DGfVoifoH4zlixejd0axT1h6RGYddy9u3ct62omlvPCW(DLcAFm1N2GFJ39lF5tVx1uS6(sTTPzJsRIIwkbCrFkB8amoNQwi3jr(aSOSkHEd8PTDvr(iBbmr3Q)6Pn3(a70g5tb92ddDuUDf04Tr(q3u3wXXbrE)xxEl3vK26133n6mp07KTDZx5Ddq9FMKJNyhc2ExQUG3dN6Rw0ZuPfWndtR30ZYUCx(PytddnCrMIDc1aE7zdWL7JVBWKOrRMbByuhcm8d4(7DfdTyA)WSjW1BCWxdYQR3RzlHW1YGRNoRafpiP19y3zCsBztLX5WrVt4LGTJ3QIdXZIbdGJkZNqB5)taZJA91yO4z(bOhWbIrSH1YKoXitdrYrAvE6edVz43M2NvqoZwXvx(8ZrCBVlTxG6y3N3f12m34n4GFuYO0KqC4zHzgStt5Z4C)Ez5nwcPBAIOEtvt4ZO1GDAObc1h3W4GHHCT9PUYnkpUqqxHS0xmFzpIdfNsCO7XgipYIt74sPU0(8sdXhpMqlg5aG(OSTsIDVC8y3VpSBH5liroxo47LSdrFpxZgZxSM98JXagqOjMD6vNYkSe1GQkry9ldzXGxWwRe(57OmSyzIv(EEC9(vlwMJE9zflnsw2YziBNt92gkEQ(CgsQ4LIMsZaG1N5gZUqXuN06zpMPVrQKQLES2F1BbDsuLpefv0UdwRHQZim7KG1KRlMj9fIQCBO5PFipLMdyq65HTYAFvqBggP3TMngEsRxjAKNwpat7WRKLOfD8yLSggVS(qXXCLvOzhdVC5XWEh9Xte7Z(M22(4y0PNVnkrjojQFmEv6v0NSCFAx0pWhlZqVMvE3PZRIPGdXXbRxPn7m2Bm(PcvFworXH1DLdr7c5wB5W)PV5HZeI20nrcwcTjIW3JMyCYW4rdoebEroDwYyOSENpkGCN3eKEaSJILLC1o72fRkYIKPhb69eicHbhAjmB2CSI9GXGsmHv5q6NcgunE845lDxuZ0i88ZAZcR8DeGOGI5zP2jZAEk9XoeFRkOpKTBK80PADlgY4I6zEZSJR1EQYKJP4y1FQSkCKiN)9oprWT6h4oR6A9UvEOjOE6TG8bq9gOkFU5i3olEMak9hk3eEFZpiNiXV8PFUwBEsVOSPYu7QhhaOs6CqJmIn5Kq)4V0r8y5zkoVOnxB(LP2Wzy91bddaBHiLwJMeicSCM9tEYcrJ0GWzLUsJgCXMJiIQSLHAIwfq5FY)m3vvTEEZCx8GxV81GmLy5VxdzafAOvaBH53UrosTr11QmJ44E1yfwc7oMnKel7kuAnK4gI)isLRFsZZmNk6zmKmadVk6sP3x6G7gcUiXzbpjeeKgEmzdTsZ5SSFD9CneXiw9idoxz)QyyGNdr4ipZin2bjr66tdjVhohproXREaWXHUMmvpX((EfdehpgbVKrRzCMG9teKgbjoSTw3L4fRDcBq11IH3gudpzCFCp7pF8V)d]] ) \ No newline at end of file +spec:RegisterPack( "Frost DK", 20241102, [[Hekili:S3ZFZnUTo(zjZnRx79howYX72TxsMPTx70TxVx7SPVx)VyRylhRxKL8jjVzZoz8N9dGu)GKIGIYwo7279MotJxjkqaqaqaqqYRDU(pU(QfEz(x)3Ch5EMJZi3HoVZ1zSZ1xL9Wg)RVAJ3878Uf(rK3A4))tjXPz7M9F9FJV5HWyVfiesJ3MmhE7QSSnPF7PNEBq2QT3mCE86ttdwVn0llioAEI3Ym8Fp)0RV6MTbHzVp66B039xFL32SvXjxF1vbR)baWblw4ZBTF68RVcB9RDCE9iNVD3S)(gee7M9D)(VUBww8Uzj(RJ)i8Gi)0m)f7M5nh7)0D)YUFH)HJE94rdDHp9)Xp5wOHyNSB22C4CpG97M9b)LW3fNSBwquyqu5Z)Z4)8N99widSVvbgcV09DWl)UWW47bKlji6oFG)TnTeE)E8pTB2IGuVBc9x8Fc)mo65qlU3lfXLp47TXp55PaQ6LCNeChdW9Nc(e0ZXBdlAPulqk0Xz4OHtKESJbS1rKHUmjEnVPaETYlArOpdFp97JVcqu)0hIMxXvh9Ux7(nipnic5AEl(NBtZw7hLj1eNZE1UzytjXcSrJkOTnXXaZ)2PjBHbZQM8nV29niCG)(nC4nkhUJMK)3IN)oE)uVBElmUXHbhNG)ojhMNr)nm2(FScye)PhqL)jmggeD9vHbPzPmvbaBd9NM5bcwzWd(Bmvm)i2W71FpiyZegV(QLOM00uqK4oFUyDsWg(RUIbdOByabgAJZ84VbAtMFsGhOD6fcS2HEtx6dsktJxofucdthM3t7M1dhHUz7YLdt8(CCsWC)HPzGY8UzxSB2e27ZHr6kVmeQaB(MqVf(sWGbHA9Y2nxNb6SkKwf2X(Q7cczJDR9Md8iXU3D3ShFmh2(Fc(M1braFgbBj)j(MqeAOXbORgt2v97a6CahFaqHYz7MDodfHV8KYpgG7nj(E35Ni8zeJMa(Egj((rp4pWJhMeS2FkI4PIiz9(PQtwfFFyo2NMH9YK2naSDtbrvIes6xum)3q2nldUDv2uWERxayFD2LvCCuYDygsIzXt3mpB64jm(k57hj858rb4F6wHsOGh0tOroeNEljorqEbZNUj(EWcj2b9fAtYMIrHCzGtSqIHJKfWC4c)LbZdY4soJycugeo(gZdBOGrXyLe6GcgzRyAHbrls8Uno1RcLqSpVHWR8XMLTYFk05F2pA68vER3ayJC7Nd8NfX3hPh0LJRdmid(UdAG4egjIDZuCcMHURKiedQS0SxNrTfL85QGIObLUGJQ98gbEb9AaHPnK2ADvhAlLNGoxKnK37l9)ii3Mfm)oaKggEDOTKPyRuR(aQdpzFKKlP6SKTGzsE7lexzWTu2f8tmcb19brzyFVnHnB5UzVgC)zII0Rytz0hTnuBrxt0(OQ(2lzUxeAUljbG514)D1CGeMUY3lXORcGUlOgIDFWCvFf(bac7M9ZmqqByggKUD(IHR9(uXyH4GhYVpjF6yI5m4JEY6PfEhurefZ8Ejm17zC4A9NSB23uorChIjmW2seXPWcUrFCQepk1aLSVw0fBa6Wlbh9yAEf0Hbwh2)Ckvla0oQ(cw7D2n7LSFKJzSp4(hswNoD52KhKqUs9h1gbc7lEGZbego2gTko8b0QLF0TzRKid13PfdhqjqB09ol4YlykN3fHI8dr56LXG3fdx6fgIt8LSnfM5OC6gtJjLSesw(LCtkcJoghcj5CLSvIpFSz(fTrzl4xN0kwwZezxWufnuwJAPnrBbPAc1Aym8SdBm8Dk(yzspECJ86ZmkrKj4ha2adZMi4VWvZFyEzWQP4Nyzie91g8gNEnm1Zlyt3mqzkSFtaX3n77a0etEtzqV7DGMLEMyVv0EIXfugFMb3JOnC19ywHWmx5fMjB6c)5EpumMuI436nDtsaekC2dvy(THEZd8cN6T4JEr6nIOpZeFzOinIMAme0egFWjgOQngt0cRx0LKeTuHA40AvmBsnupOPJk(lxK6Qr7QxxsEkSgS9qhjdZ6IooJAyQu6fYzwsNof3khHOfNVnqer1pvBXhw0sJWtxhszGDSy6SOZZHO))C01Jz4DQFK)6a)CxDkYKHooATWSBsButuhei3bR3oOW8sJjGqkSufHb5isv5pxW4p1twH)ICREvydbdKovcCYNNhitbNRoXytdbFTZruNo1cTuBij9tnQfdA7KInM0hT9cThTLAiJnM1c6uYwcaNcd0vSceSMYiXFZXyAvjNkIsafmRVjXFE86B80MGJy4Bt9Zcwk5tpFrYgM5mCLx60TPCVWkKnZfTuDXqXRFBtCt)YfLd7Vsx1RYH0Zm4aFvRaj)rL2DBrFBo)RsyHz0SebuDU(h)Ox4wWLcq90ReiPv98RWfF8JblqC6gyUnonUBw8s26)LMbnWFDU8dx26EyQ9y8dXL5JJ482xH6pxOhgUB27HxgKHpeXgFCXeHFhXxQwywmwSMj(zBtasXb7XqCbslEYOHtgYw4KP8fHoNkM6mfxbYkXVcfr8xq3mfHY1xbFD(dU(khDrtiifQdsQ9QBEVQrI19jwI19VgsSArtrjwJdxQZjKpCroSxZcsvwJRPWlpCXyfFn9Yb1EFq6WmGXpFLFs820PzjErPRdWjz1RGWJFvtWETGl6AMlQk0lHXFn8svUOBl5IUvCr15TBPPdNPfY)et4zgXQuse(ee3eaBHMZeDrA2s011m62eFud66AeDvD(OLORGNDADptrRq2ZqLbBcP8kLauI6KAQUvVFGsaoeWVrR5NQfgvVFqzQ)hoHL8FtQbVqoIWk4HZOjcRILrqg9cc)yiBv1eLyzpBadrDgnQyzdgWIFSVfoyPJaDSIa1yTKGaDSIaD0qGUKeOSeUtPOSRUCEyPK8cV14k3Fic06EVOmxnkdtUSclWiPPMiLwmrcZ(Mxiei0kGK3S9ZFgIm6M4pDWZYT2lARxO2Ks0c0Z1o0RjZE1TIkGEerazc9YdehC2INQJuiET1Al7JBcYWgGlGqvXdvHqj3xnrwTmh0mIaXgkaSC3)s2aDxEYi2dh1Az5QyOwSKydrlMgenDHxYDr(PP64fP4IlmFQqo(1f8psbj(K0qDEr2kO5Ra(pgf2sVTHzmwaoSKo8M4uOnkXNXkA1)roq3n73yp(B3n7NX6fD925yLOIHWJfEjlgmSaxXenaHEHPse(M5qW2SuF(9cXIDvPt5At4GLuMpkZurDjb3ElkKxsBVDKLKZFpfhK4v8Qiq3g5xawoPTWpJTIsyCMR8JWGa5vxmgalsTScP1pkE7TR4FbRwA)XIqu)ale1)KfIQ2mLShuUaskq7JpqsFZrMW15nLfeoBvi40CE(SeO5ZSKM5sVErpWXlGeYWsML187HysrZPpiklVeZLWVlK7H8cnNZ2exHqmDcWlcyjqiJLvJB36bMGZ89F1UzyrhZFySx4qgJq3KXwWikgNqteeQ2VXwX)VBD82OmoLjRoJKpkFao8yqhMZQUbajhWLd)FaWoEI28I91LITckuCXLKr54FKVOROZw)AG8sXqKXpXKWpp037J85LWCJQzHX0S6EAYcZbMOvw3DWRBGucBiZETUCFFoRINiYRnvATnTeyKLQNUoGUEqSCLeAzLexvRuJ0kIPj2Zokv(hWIYz3sMEGYH67eMjiDQIvDSgxR1Ku))sxQL01Llnbzy1kYkSrBRDVwxTlc7ybfRMfMPBx1QC8we(kDe8PckLklgVX9rrPGG4wtiprhMMjG9oIsSY2k06M4i)BtylfGaagOL(ervQzPzIKv2YTkeJxSB2B2ju3JMSctAj9GRx6XJeuIz8M81FH7ugF1xkR2k113RgJHhGwrTx9c9fKzDLvQsTPvfPsnuSwXrBt9Xu1nQe3IhKglW99xsQFieZNaLyCjnv9nPSmsuMQbea2e6ffv8UCXQ8Yc82eW9Ufwur4sfnPrvdjdZIKR04g4H90frl0LYjR5ATyhDOkS9gZlMmT9E78kjRYvBnw4LSh)EC0oz7gbF6xJPbyzIV)N91zvU5StO6Iho4P0TfU6NkNBHszfDMCBFhFjRJR6aVflsZNfrNfNM7asjBjPoHUjpFNLuOF0cwMMwyAvrmGaIJ)A01uYnJu2D8aqaooUYNybub5q8R9strbhLcf3S7HveOCEHiwgfd0xP5bi4O0vSii8J(8dQbAWqNAnYqLDH8b9FufTmwDzDdM)ayHnmokvB)l8AB6zHMx1N9zTHNsD(SmfXqToUiVLXlx6hLkxKwA(cmRD1qxHCUxoeTPAaIyHJAEaY0AYBYRM(n7yJ2pxAFemQAvKmbRbQnRrK2K)c2bMQwPdwstsvZy1fglfy0EF1GyrGfGZy(ZVt30yAlril32Ix2CX3Ryp)NItWJRam)mEB2Ke7nFvTSZXYKf6kEvgyHhLYYntamaY4cZJX3hJllvvKuzR8YY)(QJfb43RaF0bUjOojLF3YeaoC3SFaqhKJJaWzskEOeKdjyGzkxmFkUj0X0bhgQuUm1dRJu1iFrFAMVLRiz1qHoVkSCjX4PJSiqBKTBYHKXIvLCPN2nrmt9)0g)5SJkcSU5gjZkgloTz)wbTxwucTNk62n7FYHfhrlB2leEEfD9YIAkEqrJCgnsRdwwYtZhQSGPk5VEUNRnKUanCqxfoydqy)4AQSm3rAyyTF53kfLkr66ji3QaD78KYmQi84wiqwNoKfcQKrK3SXz71kgAfX2Zgrcnb2kI4Cww9nE04YyTSYmLQJtD1yPLDEES)AY5rLLTMgR3ZH4YSxMTxRJRe)GmT59Slb86CO4SYHgR7QATY(EZvXvtXQgpJyzIB0kY(MLM8PZkt(NltqrcGNscqnw95r)NrSMWnooB2TwX4gYhTYdx5q38WLWRqRRkFHqaDrLNRm9mMpr63s1Rdku41fuUXvD4IYTUZjwVlGQeAnUXloXu0WknGiCyzlDgpNnQeHwE)sHQLW4EqqRheNnkpoCbMXYGK0SPERtNI1XaJ)ZnP3E7Sw1WM9GrmSbViaz8UfOgiyBWVAH6stmlCsnIXCudjTWvCIYgcRIniAHPGOhBHjkan5hOjyitALVrMWfsGJMzGBtzsklT18yKLZfEErQ4z5DioLJg6MHxjcU)GJGCjuQTEyova850W4mX)TuYHflCrCNDYLl5UEPJP0uD4vuOAfS8(nxUECRv6yv1dOVzMpDxnOQ3mLZcnKKuLC6kyWuKbQR6zfEzPqrzFPfBRwSx(ontDVUum2NFaTL)zffrclA5vGeKpAMb(FGolZPy2KBVQOWuWISylRKDywMad)rWV34fKGpl)m7tTqv4fAc1EmnhrCPeVCTt8YTXY80kXlN)cjE5AN4LAXxljE5SxIxCFaLmpWk)vxQD9kTnfvB7vcbhvdmN0ykmBZy7jnjS0R(60QXPuH1NTuiTrXI3Om1r92wCG1qoh3GNwdteTt0AjgOHY8z94t1PEcpTYlkYNnqGCQs8lTUfRYkcnhTzZc6svAevMLueZTrI9yyZ6FlXAHe7rYwhPfCRKyrXmQc6J2WO(IQAVm2j6alXUOqC)PFOwbehC63OJIDTGBEJufwlkpGg1LkMx3awlk6z25)Md)4YYKXk7qb5cq1SB)otux)FWUyCu4d4)hx4LO86JnhLbh4sIXD5CkR2Gr0)vfTaDlKTiL8pRKE2n73GhfSephPd4VVzODtmR4DfHdt5GQcqRS5AwzOv2rTvzWvRYqRnWqPmOFkIV2vg0G1gvgC(QqzqJJQuNKfkfDSKA0)da0mpCTfZR)(FcR6nq4(9ZFappQXvLppIO)ErfiGTflbb1kRI6a6PNP1mws6GUYOYBW9m9YPE379G233qc8BA6zgF3GdjfIv6k8nuPGnmqviDBI5)v508SWXn5kZSjHKEwiGBji(6U4bSrFWLTzIDPtpztshn4hQE)1kLQWS1b2B995B8HBaDs2M8rY(qcRICtbrMK7KY61eBOqhXYI(My2bWxaRaawFdJ2nwZJnr(6OVg6plk(WIDFOnSWgYDT48ceIiCqzT5y7SDFE5PABrmaQ7kZQu)lEaGMuRUuBy5gQxN4ocvAzDWXgdOlBZJm3UcZaZFHHSvYXJvmpJPRa0MecT1hHMS8zYoHapvJLkgb0Wr0LPyl7xFrCplxuJC5aj2FG9ekPfTTvABuoOzYYMt14g57wyk5KgMurKWMyVwl0632W0ZwoDLf8k6TmHfuVT8s9QOTqawHczyo9wr4WqREwVmofAN1kxvPu6yAgtU4XLf573e5AZj5(XASYmMr7ksJH30B)ssLyfWvZIdaJVzKCqBg1JAwHmV0vAOXnMZl871xfpdkN3Lhy25LZWMiCE3jiGOJHwlXM4yd1()t0dnfVX5QK84mK2ywlcYLvhxqNf1gGaWMM)mE0196i2p9gCCmTZzvkEjbyPqeZ3GuGPV5EHpSjLVk8f(hu(0PrX33OgrDhmAuXY8e5gvtA2NzrJLmixDI3Z4sgVhtAMfOgjdpxJCwqttczI0TyEwBNQtyejXlyXuiSCKMwSiDO)NW7VQCtfkVlqPKiuyEcLeXlR)XsNJpIskLLscPwVXHRZmEhV0(HlPmq0eNSjrvkUBV6VQWeVgE(52O5)A9FRMh38iHzgUX79MMz4nn)7bY25QjitHFhFKDFm7hnh(spnxninZ3BLoNoH(VOQIMhPB402VotuystVaySh8IBHU5ApZ418bzQ06zAauHusN)amdgRZO9(LYFtHoQPZyF19dAZj2r6sqqS2Xk3bNNz0bwRqlPTSxdUw0ZmlVsHeMtFBEooYlrtPPE02bQUMyLEOySFQu68vOtnPIRBrZAPxAaGvQdY6YOdqHXa1MNPgrZpn3JQd0LKUUK4jmNCT5JklE0C0Y4XScXSz63OWNrDYCCtyC8cUza5Ss)bwPOUB23vS)M0MCPcMt1E56m60qs9vvidOe5NCxETkFMfjyKcs5Bm5nBX9IccllsugfScXrX0P)ZTlUfVztrWnH2tKgbhwzVW4Px4uCtBXGg90SncTLbj(SXqgGOTI30uXnOLMhqVAbDlm05DllsIKG53X3FWh017udwmiqhAuLsxDSnMZQ)ndmr4nMbgHl7hfVHmnJOGDbZbvjgIFxvM6vdzK1OUuR23nSDtH0DbXDlgOjjUHi53nVL730Y7BpC4PHt9iIOnXD4pWnYKku7e5THPuVYHdRh3)fLQbxFnJW2GLs3FuiUsB9w78nAzlghnWJSmSJOnURlQ623paZq4ozo)KL4JWem4NwCZJda7EVe0Hoy6nw9dhSEtCsw(zt3ZLaYZXDN7)7wEnbNY2RVEBZIZlOyWxfWHY0H7(LFLTJHXR66Fioc6r2RFEHGVYfgeauCZ)s96cPbOz9D(0GMGU6w6qb6u74dvOp(lb0RoGpvGB9t(tviEwNdX3Eu5aFJEORttwPhmz53YEjH(ursPZm0sQ(8Dhv(MdXaDhZ4CMCK7MD)IgBnvtt1odnU6rwrl7kiPUPBu5beqvj1bkawn1eTZaWbIXeYghiujef2BOQDOp)apQDJ7eywPNxkOvnpYSKsL9utfOADJtfYVrpKvxFqfytDo6yj0RoYAQz8x9KXXsiw)yTr1mg55EJL9GWXGJcO1Ca5OctIPSu8EubUejX0syV3AbFbG6XKpCmHTMkuqb(gk4o1(qz654n58Yu(zlZZ73VPSDvEUs8sNbplpuSbpRFFSZHh9c2Vkw15xozWGbVWz0OcmUDW)0c4FAJWVAU7rnsIcvZB9Dcmfzj2RUJuPQMaPwkrliRiecx8pqTdkW2z(2K3ne(p8e1nhkt6jc7nhNvXjCH6Sm6p)lAjWpyxX)RmUFwd2ie0mpxtH3GhYgVW9f5609sKoPoUu4JFgXhxG3Dv)Ckv)0yinkzZtHHsKRVA8ZU2vusaE4(Isb6Us0IWZUU2YXtu3q4tsx3n1Yur((YrypQvc(K67FTMH3tlAlVZcRH51ETTqvDxyPbYAAYXe6KWTMj1t0nWD5OEuBTQENO5n8T7wV(9R)Y89kxptPe)XhpXIH5hFKc4d6zADIUudcxSEZpZDqV(Nqib84JgyXAWMITZ3fodkgJ(xBU7PhlUBL4DT8AwP2qAHY1GfkI8K21wOOqBhZwOQ9ABHAJ2q02KJj0jHRbluUM1HCj1HCnPd58vOoKlLfkhkDO6Syt6qUASq9VIC3tpwC3sXB3rDRpu1H3rXcfjAFq(qzaQnAdPzFO6yOxb3APMPcU7ZKm1H3XziKcTpOjzma1gzYnpjthd9k4wlXrDI4mnuBeBTqCUBHEZWDFTi90KuUNk0UtwZa3AjkRt09OHAJsewO71TqVz4UVMpjsczxlV9eH2DJ82Xzr2PaRWr9Hcu1CiGylqpuCLibIDd)9)3b8oD5lDjs75HoKECwiAxI0q2bzX2Li)bDaOht44)bYmOaBhBnD8tJtcuDZHYKoM(km(4u2vuGTR54pnL(34UUEVmd2Ug7PS4iTfnvnlOD)BAlO7AkGYWwhqbeGUBuUia(Hk3CmX5Zimj3b8Akq3n4nvP13b49XPOBOa7rLD0naNYTo1ThQc4j3(O22bk7itfWtSFnTf4Q7RsfOtTTlvb)KJJxatootupHyguP6oxIneRUn1SfKD8KcuDtNu8kuaFVlEfsaE4(MpPRJ)rB1OVjXFE86B8Az9OBonW4bdaU6jLONCQOeETefFmTT90KEClY0CXQePH3ORnhvW)V5o7d3P2IjtiE3RVzr0E2SaLaqmGJp7zLpsTtkAYfJg84Jw1rLGsBZQ6stie0BdAqR)PGT80ZvAKPuknzEvJinDw71sY(hZCj80KLflwyksTx9T5Oc()n3zF4o0MoDpQ2i0GJFznDQbH0A68PNT80ZvAKPuknDuwauZaDpDL1mqzvwuTGPLHSAB6yWFai(AVuiiJhmH3vnPBb(bG1W7sbrkiajJyUCZ6(o5aOGviRXeUx0GUeWha(IhYhMq3833HGT9iBq6qIlGtnDHXgl1H1YkqoqoOkdYmq3thhnduZws03Mog8haItzlrBt6wGFayTjBiKnR77KdGc0Bprtd6saFa4Rwlk1FFhc22JSTWqvdnwQdRLZ8slJBsINpKDOcUj1uEtOAxh3ni3AA7bFlyBTX(ETuZwoozh9q3UoUBmY2ObFlyBTrARwP3iP0SNtlsb0dkOaAmD)ci(idElaSTZ3AC68dh8uw(OHCq4hd1j1XFSvaXrpqCAjqAESXISu31G3ca38yJfHCE4GVTd9DYO2Hi)uFxJrUtKi3zt9jSIHBpj9MIgqVNK613CUBmSPKg8I(odN8scTr4TA(20hIMJF3lL6wKX9ALrJbpZz0ObdgCzFZ5L3W(6ufbDAebD0IGokiORecwii8v(i5PF5gjp1QrY6i4t2izocwz4JExU3cvF6tLGwyeIE3Sc(i5fERF2kVKPB2(5phcmJ4pPdSun0(oYwp3AJdVQN0sImz7indnSf9KT0wB8kL6uss5Q)RSp0(wY18MAP1dYWVfl7gfal8gsGsu0qjhZt7tQo9ao4vPa5nbrlMgenfpi8I8tvlzl1xxh8ScDzzCyy89b493GhyAcMe)EF8UZFl7M0hNqNDZqZptH3ndpoHXtz5SI2ffZQsMTrsTEXcSXl8Y8UXl1)B39lS7IfmwFIkSXlgtzXHuBnCQUJQJnI1RSJosCmd9d7GI6yFmkOD0J)PTBa84usFFj05j2Rm5h4(3MGkhk9I07AjC3BoK2HofO1IbWJ7Xgf15DvhDyHtun2DeYtb(oP8mBa3pmZhuNZFDdMFCm8T7xEptKgb5BLNQcLwV(Q0n(ZXRGCNRVAts8YGq)RV6)y3SF8JEHBbzByopVDf389PvxVnVcMbl4Jblq4EZd7MXxRFiI3LGYdIkqdY3QEf3)I8nRh8Cu3IBvK3EbRUc9WWDZEp8YGm8Hi2aGyfohCumQkIBN3fmG7NTnbijhShdX7JWINmA4eGe5KC6WY6u9Lxug7XRWd))lKdI4vXBUi1ply5RyD6fo8)ofH9faiF184OfbimVOYPzX4tOQXcJ1wrvWHhNI0Z6AP4zgWdSwkAdd1DFzOUDjd94u6oTNHsuCkTHHMNIHCgPS4xbWfLKe5IvNBmAs4M2xMVaLAF3hRw(pTVFf(TAFd6O7aX3qhNvBynUAznUeSgxcwJM0qR9L1yn6xzuTVxH14sYAmfcABynvjwPMQ4erDXQHeTloKwdFDdg62smKy5R0AjPBWWItrjv8Zve9CeqGdj)GKPhCFYo4HLMxnkewNGqL8dsMO3dlpVASMzDgcvsqOCMETr8yH3AmMOJGuc9PQOm2E5fYeJnyDvFXpI0QnFI(eTDmmARfbOY0x3zAm5E5PlYDvxoJCvZ)xLqnBaEU)a5NQYfgYERnFAAMhUXUsWJTzniOHaWlr2QKMjG)YP7A3VaE4)D)(VUB2)iV33n73yxKJqmi)C897MTE7CW58pGNz07M97CV4X4o2akQGZ74D(g8n4Pkdl7yFVG38xv6dKneCfVQ8(P)v53VjOgec(0H3eNcTavQGM4Nze9)7SCZHh4lq4a4WCEhGhxiG0ZT3wqkl8bzL1SyVUFLFeg2aewCYCwipi1fImc)O4T3UI)fBXGl(XIGA(alOM)KfuJnuQiYSPavkP13o6WiVnF9qCcC6sYBSDuhx2dMwNJbP5PmL187bh1XirFqusKLNMFxi2ZFcDIVGb9BIP8bcNeErqAEAzHOAVDRhy1iZ3hIC8FUnn)HXEHwf1il5qCQfXfqqTKApZoQ97whVnkJJ3YQAiaXX5fSDfnP(fJrCdMjkgGlhg)ay(WgsOyedT2Ovd8nIsLmA594gOoz7MSs4dqDnAFzzIV)N9ZBwb1Mk2mvtDLxpY5g5KVj)UWH(BfUdJ1(TxA4Bt9HjFrR5lkmUw5SGaoj4BLqVnGgU1SzZCjbF6WTB6j2hkM4lntxUxHldSvEF(2t71Z55tmHuB0nnI6DLuV(m4w7kuk)qt788RuGxm(Xh13qoImEGWKqf3As5Ww4AuIcQcnHdV(JFzF3xuKPRA3wsdeERWfEKONB14hfoAYVxCL5kQzxGHuQPhahkZBVy2HnFuV6mQ6SKv8Rgu9yTDUUZ6kXZLwQ8HO57E8rfnKlCPiqMc8pb()Sn0dTj5Tbc2YB(QAZSWSnJhQCvEeapkLzpk)wGgtNh(EyiRkZEyZ8YY)(0aSFqUb87vXBdX0RN5j5Vr5KxGr8Faqh00icaNjPclSMYfxk6EsOGPCnoHw)Y3r1XDZ54jF8v05EY8kv02kF)Tc2x2eaPPp(eu5ZnXo8)uPU2D)kz)93KidzSaflEbMmEc7gk5C3EwJdN7mIMAZzIMjxHyQoS7Yjrk0vpfoeMenyEqgO93Zy)AKSkOheBkSIZ4BLGSUFi90zGQVPKLkLiH6y4LJg0IrjfmtCeXk6SGbkBDwFoynZylFRgHJhFu6YI(8XJ6DIvAKvtY1g(RvG(YXaJwrjPj(((XUV1Rkxf5khf4VYsk1t(XLlVxp15todymKa5eBHIRHjVZzDlEOYLXU6krI6QxIgzwE)sjxR6BYdGcFDaouUduQ3f990(CLph5WfszXr(3MWwcmWFWO7kMox45vESq8gvOpOxFv3OF8rT(CEXeWjKgUi4R0iuwb0k)xkD4v4rsE8wPRPk4mGfOb4OYphGrW(75cZqqv8XlwKY7MDoeKeevZYlE(QSSnPF7PNE)93p8(yiOyVfdbFtonDJFy4fGj93m6uMOWRdIwUfV2VF(L5rJ9(8hC(PExIXthe2cipXX9ToNYLlED8YxZxf3lRfZkh4y4PB3aXJYl2imIx8x22zotCDF77oLldJ9MWsREP(Gi59lggn6bwLlAblTVBBhn6HLdLTGEVPiVYcWIlbb(mYKxkIkEfi3WSbcA2brFm(oqQ)tGeweiOIs8ftlH(rxir8QGLe65g8kFG2agmV2ICfwDZu001srpTXziAgZlcSa6DlOKbrWfgI0KoVwoBupjf8Lbjq0XERtNIz97C0kAtZ5zcnn7Vr5KEkiB56dmippd)bpFWsEbJRQhq6RFf(diWJPG9TlCk85xBkJrMqJt0(MkKwihc90TudMxOhZJGw6RW5VbmoEtCAApv)yq5CG18NS8(HbrbAtBcHW2YJt6pskybSFxM2Cqrj9UDZUfMaiAOKYcWuxepLG3nf)mfEnWojvtKrxNjYJJZyLHvodRipEm0gvy9XW6G)xqEzxXM69vf5geZegV0mzcR5wA24XRzloOQztAOwrN0W4SILJGroclb3xN3ywD39qJ09q2)x3DSUBBBZ9zXyacwDTb2YXDDakcOOyd7hBya7YFRRITsIwCScKC(6Nbc6Z(4HuKIxohskB3TGHcu0klrE45(vjTVdn2vLC46kg2(10)3jRGi8mdeE2l0paqNpeo1NvP5eiC3pRb()S)WLW(WDL72vXZQmaD690LT0JQ8o97cU2vtreh5)ZN8YeYeX5N8mXhTvpmRceN)v5cNX94LA(wn91U3t5MdPOMns)AizH8RdcZfxzO5nbSDeKWMrtypD5Y)7typxsWO6A8ty)gr7t2SB7b4VRe(3Zlpu)sWmn22aTWPOhp5o9kVdWGlpF7MHfCXx(0V2kInyxvT43dVAx3WDs3yDcX4jm6EmQlg8hJO5mUAoprfJw2dOStXvRDkmSSF2MnLNHJus5dJgcsdmaopAFod5FBr2m66rG7Rj48wqfiO0Xi0oeMoMPthJxuZGoM9YGoMfKoo)RmDKRX4xy)39Lqfv6RJ(pw9)yrhXuLSMPf5p41xR3T6)uwdq4EHIaQZkCxZN32NQMU9CoGnnSqiH1C1nWsEX(613dPQ2TQutXIGvfmP2xYhQ8W6xRDFXgrS6iit3Z(ba0FGfRt9oO2TPYGn)aM)qp2SxMzaCuovz2Erw7pC(Jmd58YRBEOEhhBVAB9dxZDkaHsqAEhZSjJUbHwcbzYe4bPNRzm(3cnXKM8B5JvTDmst79QWGxgJQjmqgJndf00xi2Y302XCJURR)LjpSuQNs2wzuhr0KCk1RGqnscwGoM0Eyvc5xkt8S9mNkYM78zc(b3thsoInWZfM1UIjYSDlp91L3BGyon0G(wGWFtYagmfBysLy8)ZIac86uQEreZVKrYqlCbAdDLywUpIoTkgC0OZByVimUQibCTmmlA(3rQZL2oLHkwZF7Oi3yCIrqRP36O3LKOsNNS(pwnwdpyikfJabOyEiufoHDSNc9nb7HCJt8CfLMOlbmKykEh4JeDM4dXrwSWVstYG7ClAmVKCmV2Yz6q5qQj9q3K1RxFy9wMaBz7Tv77eiPPahi4idCnvPj3uZORlsv97L2ISQ)AaKNCcyaZMgJ)BF(q7dDRU5P2daKnW01wdLmSr01XdFyCKfg28tLtalFJuvShoicpvMf4ynbhQnDq6Q5KJCgPZJOoTsxsOjTL1BwXCfgGLnB6UO6)dJKjJn3661AvdX68OQgY3A)qQYKmqou1R2Hh(CGX4oUpouM7rvGcsSVmOTWbPKhId)nUpJZL8HMooScAejJdVKmbG)v3XIY6I9FUH)pO9nkz4MZUlyZI4HJ0fd8pgtQHcZYAgQKzNBt0LuYHs1T(atv1Gni3q6iJnXSqPhwTz3gtLH6wG7xfrzszuagyVU8GzeodnuCI)4yKDdBgbieEV0AtzsldjuiejtQZxIlcF3gSJ4H3CW1qB4E9DGfVoifoH4zlixejd0axT1h6RGYddy9u3ct62omlvPCW(DLcAFm1N2GFJ39lF5tVx1uS6(sTTPzJsRIIwkbCrFkB8amoNQwi3jr(aSOSkHEd8PTDvr(iBbmr3Q)6Pn3(a70g5tb92ddDuUDf04Tr(q3u3wXXbrE)xxEl3vK26133n6mp07KTDZx5Ddq9FMKJNyhc2ExQUG3dN6Rw0ZuPfWndtR30ZYUCx(PytddnCrMIDc1aE7zdWL7JVBWKOrRMbByuhcm8d4(7DfdTyA)WSjW1BCWxdYQR3RzlHW1YGRNoRafpiP19y3zCsBztLX5WrVt4LGTJ3QIdXZIbdGJkZNqB5)taZJA91yO4z(bOhWbIrSH1YKoXitdrYrAvE6edVz43M2NvqoZwXvx(8ZrCBVlTxG6y3N3f12m34n4GFuYO0KqC4zHzgStt5Z4C)Ez5nwcPBAIOEtvt4ZO1GDAObc1h3W4GHHCT9PUYnkpUqqxHS0xmFzpIdfNsCO7XgipYIt74sPU0(8sdXhpMqlg5aG(OSTsIDVC8y3VpSBH5liroxo47LSdrFpxZgZxSM98JXagqOjMD6vNYkSe1GQkry9ldzXGxWwRe(57OmSyzIv(EEC9(vlwMJE9zflnsw2YziBNt92gkEQ(CgsQ4LIMsZaG1N5gZUqXuN06zpMPVrQKQLES2F1BbDsuLpefv0UdwRHQZim7KG1KRlMj9fIQCBO5PFipLMdyq65HTYAFvqBggP3TMngEsRxjAKNwpat7WRKLOfD8yLSggVS(qXXCLvOzhdVC5XWEh9Xte7Z(M22(4y0PNVnkrjojQFmEv6v0NSCFAx0pWhlZqVMvE3PZRIPGdXXbRxPn7m2Bm(PcvFworXH1DLdr7c5wB5W)PV5HZeI20nrcwcTjIW3JMyCYW4rdoebEroDwYyOSENpkGCN3eKEaSJILLC1o72fRkYIKPhb69eicHbhAjmB2CSI9GXGsmHv5q6NcgunE845lDxuZ0i88ZAZcR8DeGOGI5zP2jZAEk9XoeFRkOpKTBK80PADlgY4I6zEZSJR1EQYKJP4y1FQSkCKiN)9oprWT6h4oR6A9UvEOjOE6TG8bq9gOkFU5i3olEMak9hk3eEFZpiNiXV8PFUwBEsVOSPYu7QhhaOs6CqJmIn5Kq)4V0r8y5zkoVOnxB(LP2Wzy91bddaBHiLwJMeicSCM9tEYcrJ0GWzLUsJgCXMJiIQSLHAIwfq5FY)m3vvTEEZCx8GxV81GmLy5VxdzafAOvaBH53UrosTr11QmJ44E1yfwc7oMnKel7kuAnK4gI)isLRFsZZmNk6zmKmadVk6sP3x6G7gcUiXzbpjeeKgEmzdTsZ5SSFD9CneXiw9idoxz)QyyGNdr4ipZin2bjr66tdjVhohproXREaWXHUMmvpX((EfdehpgbVKrRzCMG9teKgbjoSTw3L4fRDcBq11IH3gudpzCFCp7pF8V)d]] ) From 1b6ae0251972f28c50f2b53756af3b6cbef89da8 Mon Sep 17 00:00:00 2001 From: syrifgit <139663837+syrifgit@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:02:49 -0400 Subject: [PATCH 3/9] Update DeathKnightFrost.lua --- TheWarWithin/DeathKnightFrost.lua | 112 ++++++++++++++++++------------ 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/TheWarWithin/DeathKnightFrost.lua b/TheWarWithin/DeathKnightFrost.lua index 67cde9260..44a9cc5cb 100644 --- a/TheWarWithin/DeathKnightFrost.lua +++ b/TheWarWithin/DeathKnightFrost.lua @@ -19,7 +19,7 @@ spec:RegisterResource( Enum.PowerType.Runes, { stop = function( x ) return x == 6 end, interval = function( time, val ) - val = math.floor( val ) + val = floor( val ) if val == 6 then return -1 end return state.runes.expiry[ val + 1 ] - time end, @@ -31,7 +31,7 @@ spec:RegisterResource( Enum.PowerType.Runes, { last = function() local applied = state.buff.empower_rune_weapon.applied - return applied + math.floor( ( state.query_time - applied ) / 5 ) * 5 + return applied + floor( ( state.query_time - applied ) / 5 ) * 5 end, stop = function( x ) @@ -138,23 +138,27 @@ spec:RegisterResource( Enum.PowerType.Runes, { end })) - +spec:RegisterStateExpr("breath_ticks_left", function() + if not buff.breath_of_sindragosa.up then + return 0 + end + return floor( runic_power.current / 17 ) + ( runic_power.current % 17 + ( runes.current % 2 * 17 ) / gcd.max ) / 17 +end) spec:RegisterResource( Enum.PowerType.RunicPower, { breath_of_sindragosa = { aura = "breath_of_sindragosa", - last = function () - local app = state.buff.breath_of_sindragosa.applied - local tick_interval = state.buff.breath_of_sindragosa.tick_time or 1 - return app + floor( ( state.query_time - app ) / tick_interval ) * tick_interval + stop = function( x ) + return state.buff.breath_of_sindragosa.down or x < 17 or breath_ticks_left == 0 end, - stop = function( x ) return state.buff.breath_of_sindragosa.down or x < 17 end, interval = 1, - value = function () - local time_remaining = state.buff.breath_of_sindragosa.expires - state.query_time - return time_remaining < 1 and floor( time_remaining * 17 ) or -17 - end + value = -17, + + last = function() + local app = state.buff.breath_of_sindragosa.applied + return app + floor( (state.query_time - app) ) + end, }, empower_rp = { @@ -408,47 +412,59 @@ spec:RegisterAuras( { -- https://wowhead.com/beta/spell=152279 breath_of_sindragosa = { id = 152279, - duration = 10, + duration = 3600, + tick_time = 1, + max_stack = 1, + --[[alias = { "breath_of_sindragosa", " breath_of_sindragosa_real" }, + aliasMode = "first", + aliasType = "buff",--]] + }, + --[[breath_of_sindragosa = { + id = 152279, + duration = function () return floor( runic_power.current / 17 ) end, tick_time = 1, max_stack = 1, meta = { - remains = function( bos ) - if not bos.up then return 0 end - - local runic_power = runic_power.current - local runes = runes.current - local now = state.now - local regen_rate_rp = ( runic_power.regen or 0 ) + ( ( runes.regen or 0 ) * 10 ) - local gcd = state.gcd.max - local total_time = 0 - - -- Simulate BoS ticks. - while now < bos.expires and runic_power >= 17 do - -- Deduct 17 RP per tick. - runic_power = runic_power - 17 - - -- Add RP contribution from rune spending. + expires = function(t) + local query_time = state.query_time + local rp = state.runic_power.current + local runes = state.runes.current + local regen_rate = (state.runic_power.regen or 0) + ((state.runes.regen or 0) * 10) + local tick_cost = 17 + local duration_remaining = t.expires - query_time + + Hekili:Print("Step-by-Step Debug for Expires:") + Hekili:Print(" 1. Original Expires:", t.expires) + Hekili:Print(" 2. Current Query Time:", query_time) + + -- Simulate resource usage to determine adjusted expiration time + while duration_remaining > 0 and rp >= tick_cost do + -- Deduct RP for this tick + rp = rp - tick_cost + + -- Add RP from rune usage if available if runes >= 2 then runes = runes - 2 - runic_power = runic_power + 20 -- RP from Obliterate. - elseif runes > 0 then - runic_power = runic_power + ( runes * 10 ) - runes = 0 + rp = rp + 20 -- Assume 20 RP per Obliterate or similar effect end - - -- Regenerate resources over 1 GCD. - runic_power = runic_power + regen_rate_rp - runes = min( 6, runes + ( runes.regen or 0 ) * gcd ) - - -- Advance time. - now = now + gcd - total_time = total_time + bos.tick_time + + -- Regenerate RP over tick time + rp = rp + regen_rate + runes = math.min(6, runes + (state.runes.regen or 0) * t.tick_time) + + -- Advance by one tick + duration_remaining = duration_remaining - t.tick_time end - - return min( total_time, bos.expires - state.now ) + + -- Adjust expires dynamically + local adjusted_expires = query_time + duration_remaining + Hekili:Print(" 3. Adjusted Expires Based on Resources:", adjusted_expires) + + return adjusted_expires end, } - }, + + },--]] -- Talent: Movement slowed $w1% $?$w5!=0[and Haste reduced $w5% ][]by frozen chains. -- https://wowhead.com/beta/spell=45524 chains_of_ice = { @@ -1976,6 +1992,14 @@ spec:RegisterSetting( "bos_rp", 60, { width = "full" } ) +spec:RegisterStateExpr("breath_ticks_left", function() + if not buff.breath_of_sindragosa.up then + return 0 + end + return floor( runic_power.current / 17 ) + ( runic_power.current % 17 + ( runes.current % 2 * 17 ) / gcd.max ) / 17 +end) + + spec:RegisterSetting( "ams_usage", "damage", { name = strformat( "%s Requirements", Hekili:GetSpellLinkWithTexture( spec.abilities.antimagic_shell.id ) ), desc = strformat( "The default priority uses |W%s|w to generate |W%s|w regardless of whether there is incoming magic damage. " From c0ecde93ebda10ab7045b8b2c2f4a1d5a5a4b47b Mon Sep 17 00:00:00 2001 From: syrifgit <139663837+syrifgit@users.noreply.github.com> Date: Thu, 21 Nov 2024 20:11:13 -0400 Subject: [PATCH 4/9] Review notes Implemented review notes, also added new pack string which adds my state expression to the breath entry point to mitigate against fall out of breath early --- State.lua | 8 +- TheWarWithin/DeathKnightFrost.lua | 79 +++---------------- TheWarWithin/Priorities/DeathKnightFrost.simc | 2 +- 3 files changed, 15 insertions(+), 74 deletions(-) diff --git a/State.lua b/State.lua index 1bf9dae06..53f6b3782 100644 --- a/State.lua +++ b/State.lua @@ -1399,8 +1399,6 @@ do if not resource then return end -- Initialize or wipe tables - events = events or {} - remains = remains or {} wipe( events ) wipe( remains ) @@ -1409,7 +1407,7 @@ do if state.class.file == "DEATHKNIGHT" and state.runes then -- Adjust timeout based on rune cooldowns and regen models for Frost DK - timeout = max( timeout, 0.01 + state.runes.cooldown * ( 6 - state.runes.current ) ) + timeout = max( timeout, 0.01 + state.runes.expiry[ 6 ] - state.query_time ) elseif state.spec.assassination then timeout = 15.01 end @@ -1419,9 +1417,7 @@ do -- Initialize forecast tables remains[ resource ] = timeout - r.times = r.times or {} - r.values = r.values or {} - r.forecast = r.forecast or {} + wipe( r.times ) wipe( r.values ) diff --git a/TheWarWithin/DeathKnightFrost.lua b/TheWarWithin/DeathKnightFrost.lua index 44a9cc5cb..211235485 100644 --- a/TheWarWithin/DeathKnightFrost.lua +++ b/TheWarWithin/DeathKnightFrost.lua @@ -47,12 +47,16 @@ spec:RegisterResource( Enum.PowerType.Runes, { regen = 0, max = 6, resource = "runes", + times = {}, + values = {}, + forecast = {}, reset = function() local t = state.runes for i = 1, 6 do local start, duration, ready = GetRuneCooldown( i ) t.expiry[ i ] = ready and 0 or ( start + duration ) + t.cooldown = duration end table.sort( t.expiry ) t.actual = nil -- Reset actual to force recalculation @@ -62,10 +66,11 @@ spec:RegisterResource( Enum.PowerType.Runes, { local t = state.runes for i = 1, amount do table.insert( t.expiry, 0 ) + t.expiry[ 7 ] = nil end - while #t.expiry > 6 do + --[[while #t.expiry > 6 do table.remove( t.expiry ) - end + end--]] table.sort( t.expiry ) t.actual = nil -- Reset actual to force recalculation end, @@ -138,12 +143,12 @@ spec:RegisterResource( Enum.PowerType.Runes, { end })) -spec:RegisterStateExpr("breath_ticks_left", function() +spec:RegisterStateExpr( "breath_ticks_left", function() if not buff.breath_of_sindragosa.up then return 0 end - return floor( runic_power.current / 17 ) + ( runic_power.current % 17 + ( runes.current % 2 * 17 ) / gcd.max ) / 17 -end) + return floor( runic_power.current / 17 ) + ( runic_power.current % 17 + ( floor( runes.current / 2 ) * 20 ) / gcd.max ) / 17 +end ) spec:RegisterResource( Enum.PowerType.RunicPower, { @@ -157,7 +162,7 @@ spec:RegisterResource( Enum.PowerType.RunicPower, { last = function() local app = state.buff.breath_of_sindragosa.applied - return app + floor( (state.query_time - app) ) + return app + floor( state.query_time - app ) end, }, @@ -415,56 +420,7 @@ spec:RegisterAuras( { duration = 3600, tick_time = 1, max_stack = 1, - --[[alias = { "breath_of_sindragosa", " breath_of_sindragosa_real" }, - aliasMode = "first", - aliasType = "buff",--]] }, - --[[breath_of_sindragosa = { - id = 152279, - duration = function () return floor( runic_power.current / 17 ) end, - tick_time = 1, - max_stack = 1, - meta = { - expires = function(t) - local query_time = state.query_time - local rp = state.runic_power.current - local runes = state.runes.current - local regen_rate = (state.runic_power.regen or 0) + ((state.runes.regen or 0) * 10) - local tick_cost = 17 - local duration_remaining = t.expires - query_time - - Hekili:Print("Step-by-Step Debug for Expires:") - Hekili:Print(" 1. Original Expires:", t.expires) - Hekili:Print(" 2. Current Query Time:", query_time) - - -- Simulate resource usage to determine adjusted expiration time - while duration_remaining > 0 and rp >= tick_cost do - -- Deduct RP for this tick - rp = rp - tick_cost - - -- Add RP from rune usage if available - if runes >= 2 then - runes = runes - 2 - rp = rp + 20 -- Assume 20 RP per Obliterate or similar effect - end - - -- Regenerate RP over tick time - rp = rp + regen_rate - runes = math.min(6, runes + (state.runes.regen or 0) * t.tick_time) - - -- Advance by one tick - duration_remaining = duration_remaining - t.tick_time - end - - -- Adjust expires dynamically - local adjusted_expires = query_time + duration_remaining - Hekili:Print(" 3. Adjusted Expires Based on Resources:", adjusted_expires) - - return adjusted_expires - end, - } - - },--]] -- Talent: Movement slowed $w1% $?$w5!=0[and Haste reduced $w5% ][]by frozen chains. -- https://wowhead.com/beta/spell=45524 chains_of_ice = { @@ -1414,9 +1370,6 @@ spec:RegisterAbilities( { gain( 1, "runes" ) gain( 5, "runic_power" ) applyBuff( "empower_rune_weapon" ) - --[[for i = 5, 20, 5 do - state:QueueAuraEvent( "empower_rune_weapon", TriggerERW, query_time + i, "AURA_TICK" ) - end--]] end, copy = "empowered_rune_weapon" @@ -1992,14 +1945,6 @@ spec:RegisterSetting( "bos_rp", 60, { width = "full" } ) -spec:RegisterStateExpr("breath_ticks_left", function() - if not buff.breath_of_sindragosa.up then - return 0 - end - return floor( runic_power.current / 17 ) + ( runic_power.current % 17 + ( runes.current % 2 * 17 ) / gcd.max ) / 17 -end) - - spec:RegisterSetting( "ams_usage", "damage", { name = strformat( "%s Requirements", Hekili:GetSpellLinkWithTexture( spec.abilities.antimagic_shell.id ) ), desc = strformat( "The default priority uses |W%s|w to generate |W%s|w regardless of whether there is incoming magic damage. " @@ -2022,4 +1967,4 @@ spec:RegisterSetting( "ams_usage", "damage", { } ) -spec:RegisterPack( "Frost DK", 20241102, [[Hekili:S3ZFZnUTo(zjZnRx79howYX72TxsMPTx70TxVx7SPVx)VyRylhRxKL8jjVzZoz8N9dGu)GKIGIYwo7279MotJxjkqaqaqaqqYRDU(pU(QfEz(x)3Ch5EMJZi3HoVZ1zSZ1xL9Wg)RVAJ3878Uf(rK3A4))tjXPz7M9F9FJV5HWyVfiesJ3MmhE7QSSnPF7PNEBq2QT3mCE86ttdwVn0llioAEI3Ym8Fp)0RV6MTbHzVp66B039xFL32SvXjxF1vbR)baWblw4ZBTF68RVcB9RDCE9iNVD3S)(gee7M9D)(VUBww8Uzj(RJ)i8Gi)0m)f7M5nh7)0D)YUFH)HJE94rdDHp9)Xp5wOHyNSB22C4CpG97M9b)LW3fNSBwquyqu5Z)Z4)8N99widSVvbgcV09DWl)UWW47bKlji6oFG)TnTeE)E8pTB2IGuVBc9x8Fc)mo65qlU3lfXLp47TXp55PaQ6LCNeChdW9Nc(e0ZXBdlAPulqk0Xz4OHtKESJbS1rKHUmjEnVPaETYlArOpdFp97JVcqu)0hIMxXvh9Ux7(nipnic5AEl(NBtZw7hLj1eNZE1UzytjXcSrJkOTnXXaZ)2PjBHbZQM8nV29niCG)(nC4nkhUJMK)3IN)oE)uVBElmUXHbhNG)ojhMNr)nm2(FScye)PhqL)jmggeD9vHbPzPmvbaBd9NM5bcwzWd(Bmvm)i2W71FpiyZegV(QLOM00uqK4oFUyDsWg(RUIbdOByabgAJZ84VbAtMFsGhOD6fcS2HEtx6dsktJxofucdthM3t7M1dhHUz7YLdt8(CCsWC)HPzGY8UzxSB2e27ZHr6kVmeQaB(MqVf(sWGbHA9Y2nxNb6SkKwf2X(Q7cczJDR9Md8iXU3D3ShFmh2(Fc(M1braFgbBj)j(MqeAOXbORgt2v97a6CahFaqHYz7MDodfHV8KYpgG7nj(E35Ni8zeJMa(Egj((rp4pWJhMeS2FkI4PIiz9(PQtwfFFyo2NMH9YK2naSDtbrvIes6xum)3q2nldUDv2uWERxayFD2LvCCuYDygsIzXt3mpB64jm(k57hj858rb4F6wHsOGh0tOroeNEljorqEbZNUj(EWcj2b9fAtYMIrHCzGtSqIHJKfWC4c)LbZdY4soJycugeo(gZdBOGrXyLe6GcgzRyAHbrls8Uno1RcLqSpVHWR8XMLTYFk05F2pA68vER3ayJC7Nd8NfX3hPh0LJRdmid(UdAG4egjIDZuCcMHURKiedQS0SxNrTfL85QGIObLUGJQ98gbEb9AaHPnK2ADvhAlLNGoxKnK37l9)ii3Mfm)oaKggEDOTKPyRuR(aQdpzFKKlP6SKTGzsE7lexzWTu2f8tmcb19brzyFVnHnB5UzVgC)zII0Rytz0hTnuBrxt0(OQ(2lzUxeAUljbG514)D1CGeMUY3lXORcGUlOgIDFWCvFf(bac7M9ZmqqByggKUD(IHR9(uXyH4GhYVpjF6yI5m4JEY6PfEhurefZ8Ejm17zC4A9NSB23uorChIjmW2seXPWcUrFCQepk1aLSVw0fBa6Wlbh9yAEf0Hbwh2)Ckvla0oQ(cw7D2n7LSFKJzSp4(hswNoD52KhKqUs9h1gbc7lEGZbego2gTko8b0QLF0TzRKid13PfdhqjqB09ol4YlykN3fHI8dr56LXG3fdx6fgIt8LSnfM5OC6gtJjLSesw(LCtkcJoghcj5CLSvIpFSz(fTrzl4xN0kwwZezxWufnuwJAPnrBbPAc1Aym8SdBm8Dk(yzspECJ86ZmkrKj4ha2adZMi4VWvZFyEzWQP4Nyzie91g8gNEnm1Zlyt3mqzkSFtaX3n77a0etEtzqV7DGMLEMyVv0EIXfugFMb3JOnC19ywHWmx5fMjB6c)5EpumMuI436nDtsaekC2dvy(THEZd8cN6T4JEr6nIOpZeFzOinIMAme0egFWjgOQngt0cRx0LKeTuHA40AvmBsnupOPJk(lxK6Qr7QxxsEkSgS9qhjdZ6IooJAyQu6fYzwsNof3khHOfNVnqer1pvBXhw0sJWtxhszGDSy6SOZZHO))C01Jz4DQFK)6a)CxDkYKHooATWSBsButuhei3bR3oOW8sJjGqkSufHb5isv5pxW4p1twH)ICREvydbdKovcCYNNhitbNRoXytdbFTZruNo1cTuBij9tnQfdA7KInM0hT9cThTLAiJnM1c6uYwcaNcd0vSceSMYiXFZXyAvjNkIsafmRVjXFE86B80MGJy4Bt9Zcwk5tpFrYgM5mCLx60TPCVWkKnZfTuDXqXRFBtCt)YfLd7Vsx1RYH0Zm4aFvRaj)rL2DBrFBo)RsyHz0SebuDU(h)Ox4wWLcq90ReiPv98RWfF8JblqC6gyUnonUBw8s26)LMbnWFDU8dx26EyQ9y8dXL5JJ482xH6pxOhgUB27HxgKHpeXgFCXeHFhXxQwywmwSMj(zBtasXb7XqCbslEYOHtgYw4KP8fHoNkM6mfxbYkXVcfr8xq3mfHY1xbFD(dU(khDrtiifQdsQ9QBEVQrI19jwI19VgsSArtrjwJdxQZjKpCroSxZcsvwJRPWlpCXyfFn9Yb1EFq6WmGXpFLFs820PzjErPRdWjz1RGWJFvtWETGl6AMlQk0lHXFn8svUOBl5IUvCr15TBPPdNPfY)et4zgXQuse(ee3eaBHMZeDrA2s011m62eFud66AeDvD(OLORGNDADptrRq2ZqLbBcP8kLauI6KAQUvVFGsaoeWVrR5NQfgvVFqzQ)hoHL8FtQbVqoIWk4HZOjcRILrqg9cc)yiBv1eLyzpBadrDgnQyzdgWIFSVfoyPJaDSIa1yTKGaDSIaD0qGUKeOSeUtPOSRUCEyPK8cV14k3Fic06EVOmxnkdtUSclWiPPMiLwmrcZ(Mxiei0kGK3S9ZFgIm6M4pDWZYT2lARxO2Ks0c0Z1o0RjZE1TIkGEerazc9YdehC2INQJuiET1Al7JBcYWgGlGqvXdvHqj3xnrwTmh0mIaXgkaSC3)s2aDxEYi2dh1Az5QyOwSKydrlMgenDHxYDr(PP64fP4IlmFQqo(1f8psbj(K0qDEr2kO5Ra(pgf2sVTHzmwaoSKo8M4uOnkXNXkA1)roq3n73yp(B3n7NX6fD925yLOIHWJfEjlgmSaxXenaHEHPse(M5qW2SuF(9cXIDvPt5At4GLuMpkZurDjb3ElkKxsBVDKLKZFpfhK4v8Qiq3g5xawoPTWpJTIsyCMR8JWGa5vxmgalsTScP1pkE7TR4FbRwA)XIqu)ale1)KfIQ2mLShuUaskq7JpqsFZrMW15nLfeoBvi40CE(SeO5ZSKM5sVErpWXlGeYWsML187HysrZPpiklVeZLWVlK7H8cnNZ2exHqmDcWlcyjqiJLvJB36bMGZ89F1UzyrhZFySx4qgJq3KXwWikgNqteeQ2VXwX)VBD82OmoLjRoJKpkFao8yqhMZQUbajhWLd)FaWoEI28I91LITckuCXLKr54FKVOROZw)AG8sXqKXpXKWpp037J85LWCJQzHX0S6EAYcZbMOvw3DWRBGucBiZETUCFFoRINiYRnvATnTeyKLQNUoGUEqSCLeAzLexvRuJ0kIPj2Zokv(hWIYz3sMEGYH67eMjiDQIvDSgxR1Ku))sxQL01Llnbzy1kYkSrBRDVwxTlc7ybfRMfMPBx1QC8we(kDe8PckLklgVX9rrPGG4wtiprhMMjG9oIsSY2k06M4i)BtylfGaagOL(ervQzPzIKv2YTkeJxSB2B2ju3JMSctAj9GRx6XJeuIz8M81FH7ugF1xkR2k113RgJHhGwrTx9c9fKzDLvQsTPvfPsnuSwXrBt9Xu1nQe3IhKglW99xsQFieZNaLyCjnv9nPSmsuMQbea2e6ffv8UCXQ8Yc82eW9Ufwur4sfnPrvdjdZIKR04g4H90frl0LYjR5ATyhDOkS9gZlMmT9E78kjRYvBnw4LSh)EC0oz7gbF6xJPbyzIV)N91zvU5StO6Iho4P0TfU6NkNBHszfDMCBFhFjRJR6aVflsZNfrNfNM7asjBjPoHUjpFNLuOF0cwMMwyAvrmGaIJ)A01uYnJu2D8aqaooUYNybub5q8R9strbhLcf3S7HveOCEHiwgfd0xP5bi4O0vSii8J(8dQbAWqNAnYqLDH8b9FufTmwDzDdM)ayHnmokvB)l8AB6zHMx1N9zTHNsD(SmfXqToUiVLXlx6hLkxKwA(cmRD1qxHCUxoeTPAaIyHJAEaY0AYBYRM(n7yJ2pxAFemQAvKmbRbQnRrK2K)c2bMQwPdwstsvZy1fglfy0EF1GyrGfGZy(ZVt30yAlril32Ix2CX3Ryp)NItWJRam)mEB2Ke7nFvTSZXYKf6kEvgyHhLYYntamaY4cZJX3hJllvvKuzR8YY)(QJfb43RaF0bUjOojLF3YeaoC3SFaqhKJJaWzskEOeKdjyGzkxmFkUj0X0bhgQuUm1dRJu1iFrFAMVLRiz1qHoVkSCjX4PJSiqBKTBYHKXIvLCPN2nrmt9)0g)5SJkcSU5gjZkgloTz)wbTxwucTNk62n7FYHfhrlB2leEEfD9YIAkEqrJCgnsRdwwYtZhQSGPk5VEUNRnKUanCqxfoydqy)4AQSm3rAyyTF53kfLkr66ji3QaD78KYmQi84wiqwNoKfcQKrK3SXz71kgAfX2Zgrcnb2kI4Cww9nE04YyTSYmLQJtD1yPLDEES)AY5rLLTMgR3ZH4YSxMTxRJRe)GmT59Slb86CO4SYHgR7QATY(EZvXvtXQgpJyzIB0kY(MLM8PZkt(NltqrcGNscqnw95r)NrSMWnooB2TwX4gYhTYdx5q38WLWRqRRkFHqaDrLNRm9mMpr63s1Rdku41fuUXvD4IYTUZjwVlGQeAnUXloXu0WknGiCyzlDgpNnQeHwE)sHQLW4EqqRheNnkpoCbMXYGK0SPERtNI1XaJ)ZnP3E7Sw1WM9GrmSbViaz8UfOgiyBWVAH6stmlCsnIXCudjTWvCIYgcRIniAHPGOhBHjkan5hOjyitALVrMWfsGJMzGBtzsklT18yKLZfEErQ4z5DioLJg6MHxjcU)GJGCjuQTEyova850W4mX)TuYHflCrCNDYLl5UEPJP0uD4vuOAfS8(nxUECRv6yv1dOVzMpDxnOQ3mLZcnKKuLC6kyWuKbQR6zfEzPqrzFPfBRwSx(ontDVUum2NFaTL)zffrclA5vGeKpAMb(FGolZPy2KBVQOWuWISylRKDywMad)rWV34fKGpl)m7tTqv4fAc1EmnhrCPeVCTt8YTXY80kXlN)cjE5AN4LAXxljE5SxIxCFaLmpWk)vxQD9kTnfvB7vcbhvdmN0ykmBZy7jnjS0R(60QXPuH1NTuiTrXI3Om1r92wCG1qoh3GNwdteTt0AjgOHY8z94t1PEcpTYlkYNnqGCQs8lTUfRYkcnhTzZc6svAevMLueZTrI9yyZ6FlXAHe7rYwhPfCRKyrXmQc6J2WO(IQAVm2j6alXUOqC)PFOwbehC63OJIDTGBEJufwlkpGg1LkMx3awlk6z25)Md)4YYKXk7qb5cq1SB)otux)FWUyCu4d4)hx4LO86JnhLbh4sIXD5CkR2Gr0)vfTaDlKTiL8pRKE2n73GhfSephPd4VVzODtmR4DfHdt5GQcqRS5AwzOv2rTvzWvRYqRnWqPmOFkIV2vg0G1gvgC(QqzqJJQuNKfkfDSKA0)da0mpCTfZR)(FcR6nq4(9ZFappQXvLppIO)ErfiGTflbb1kRI6a6PNP1mws6GUYOYBW9m9YPE379G233qc8BA6zgF3GdjfIv6k8nuPGnmqviDBI5)v508SWXn5kZSjHKEwiGBji(6U4bSrFWLTzIDPtpztshn4hQE)1kLQWS1b2B995B8HBaDs2M8rY(qcRICtbrMK7KY61eBOqhXYI(My2bWxaRaawFdJ2nwZJnr(6OVg6plk(WIDFOnSWgYDT48ceIiCqzT5y7SDFE5PABrmaQ7kZQu)lEaGMuRUuBy5gQxN4ocvAzDWXgdOlBZJm3UcZaZFHHSvYXJvmpJPRa0MecT1hHMS8zYoHapvJLkgb0Wr0LPyl7xFrCplxuJC5aj2FG9ekPfTTvABuoOzYYMt14g57wyk5KgMurKWMyVwl0632W0ZwoDLf8k6TmHfuVT8s9QOTqawHczyo9wr4WqREwVmofAN1kxvPu6yAgtU4XLf573e5AZj5(XASYmMr7ksJH30B)ssLyfWvZIdaJVzKCqBg1JAwHmV0vAOXnMZl871xfpdkN3Lhy25LZWMiCE3jiGOJHwlXM4yd1()t0dnfVX5QK84mK2ywlcYLvhxqNf1gGaWMM)mE0196i2p9gCCmTZzvkEjbyPqeZ3GuGPV5EHpSjLVk8f(hu(0PrX33OgrDhmAuXY8e5gvtA2NzrJLmixDI3Z4sgVhtAMfOgjdpxJCwqttczI0TyEwBNQtyejXlyXuiSCKMwSiDO)NW7VQCtfkVlqPKiuyEcLeXlR)XsNJpIskLLscPwVXHRZmEhV0(HlPmq0eNSjrvkUBV6VQWeVgE(52O5)A9FRMh38iHzgUX79MMz4nn)7bY25QjitHFhFKDFm7hnh(spnxninZ3BLoNoH(VOQIMhPB402VotuystVaySh8IBHU5ApZ418bzQ06zAauHusN)amdgRZO9(LYFtHoQPZyF19dAZj2r6sqqS2Xk3bNNz0bwRqlPTSxdUw0ZmlVsHeMtFBEooYlrtPPE02bQUMyLEOySFQu68vOtnPIRBrZAPxAaGvQdY6YOdqHXa1MNPgrZpn3JQd0LKUUK4jmNCT5JklE0C0Y4XScXSz63OWNrDYCCtyC8cUza5Ss)bwPOUB23vS)M0MCPcMt1E56m60qs9vvidOe5NCxETkFMfjyKcs5Bm5nBX9IccllsugfScXrX0P)ZTlUfVztrWnH2tKgbhwzVW4Px4uCtBXGg90SncTLbj(SXqgGOTI30uXnOLMhqVAbDlm05DllsIKG53X3FWh017udwmiqhAuLsxDSnMZQ)ndmr4nMbgHl7hfVHmnJOGDbZbvjgIFxvM6vdzK1OUuR23nSDtH0DbXDlgOjjUHi53nVL730Y7BpC4PHt9iIOnXD4pWnYKku7e5THPuVYHdRh3)fLQbxFnJW2GLs3FuiUsB9w78nAzlghnWJSmSJOnURlQ623paZq4ozo)KL4JWem4NwCZJda7EVe0Hoy6nw9dhSEtCsw(zt3ZLaYZXDN7)7wEnbNY2RVEBZIZlOyWxfWHY0H7(LFLTJHXR66Fioc6r2RFEHGVYfgeauCZ)s96cPbOz9D(0GMGU6w6qb6u74dvOp(lb0RoGpvGB9t(tviEwNdX3Eu5aFJEORttwPhmz53YEjH(ursPZm0sQ(8Dhv(MdXaDhZ4CMCK7MD)IgBnvtt1odnU6rwrl7kiPUPBu5beqvj1bkawn1eTZaWbIXeYghiujef2BOQDOp)apQDJ7eywPNxkOvnpYSKsL9utfOADJtfYVrpKvxFqfytDo6yj0RoYAQz8x9KXXsiw)yTr1mg55EJL9GWXGJcO1Ca5OctIPSu8EubUejX0syV3AbFbG6XKpCmHTMkuqb(gk4o1(qz654n58Yu(zlZZ73VPSDvEUs8sNbplpuSbpRFFSZHh9c2Vkw15xozWGbVWz0OcmUDW)0c4FAJWVAU7rnsIcvZB9Dcmfzj2RUJuPQMaPwkrliRiecx8pqTdkW2z(2K3ne(p8e1nhkt6jc7nhNvXjCH6Sm6p)lAjWpyxX)RmUFwd2ie0mpxtH3GhYgVW9f5609sKoPoUu4JFgXhxG3Dv)Ckv)0yinkzZtHHsKRVA8ZU2vusaE4(Isb6Us0IWZUU2YXtu3q4tsx3n1Yur((YrypQvc(K67FTMH3tlAlVZcRH51ETTqvDxyPbYAAYXe6KWTMj1t0nWD5OEuBTQENO5n8T7wV(9R)Y89kxptPe)XhpXIH5hFKc4d6zADIUudcxSEZpZDqV(Nqib84JgyXAWMITZ3fodkgJ(xBU7PhlUBL4DT8AwP2qAHY1GfkI8K21wOOqBhZwOQ9ABHAJ2q02KJj0jHRbluUM1HCj1HCnPd58vOoKlLfkhkDO6Syt6qUASq9VIC3tpwC3sXB3rDRpu1H3rXcfjAFq(qzaQnAdPzFO6yOxb3APMPcU7ZKm1H3XziKcTpOjzma1gzYnpjthd9k4wlXrDI4mnuBeBTqCUBHEZWDFTi90KuUNk0UtwZa3AjkRt09OHAJsewO71TqVz4UVMpjsczxlV9eH2DJ82Xzr2PaRWr9Hcu1CiGylqpuCLibIDd)9)3b8oD5lDjs75HoKECwiAxI0q2bzX2Li)bDaOht44)bYmOaBhBnD8tJtcuDZHYKoM(km(4u2vuGTR54pnL(34UUEVmd2Ug7PS4iTfnvnlOD)BAlO7AkGYWwhqbeGUBuUia(Hk3CmX5Zimj3b8Akq3n4nvP13b49XPOBOa7rLD0naNYTo1ThQc4j3(O22bk7itfWtSFnTf4Q7RsfOtTTlvb)KJJxatootupHyguP6oxIneRUn1SfKD8KcuDtNu8kuaFVlEfsaE4(MpPRJ)rB1OVjXFE86B8Az9OBonW4bdaU6jLONCQOeETefFmTT90KEClY0CXQePH3ORnhvW)V5o7d3P2IjtiE3RVzr0E2SaLaqmGJp7zLpsTtkAYfJg84Jw1rLGsBZQ6stie0BdAqR)PGT80ZvAKPuknzEvJinDw71sY(hZCj80KLflwyksTx9T5Oc()n3zF4o0MoDpQ2i0GJFznDQbH0A68PNT80ZvAKPuknDuwauZaDpDL1mqzvwuTGPLHSAB6yWFai(AVuiiJhmH3vnPBb(bG1W7sbrkiajJyUCZ6(o5aOGviRXeUx0GUeWha(IhYhMq3833HGT9iBq6qIlGtnDHXgl1H1YkqoqoOkdYmq3thhnduZws03Mog8haItzlrBt6wGFayTjBiKnR77KdGc0Bprtd6saFa4Rwlk1FFhc22JSTWqvdnwQdRLZ8slJBsINpKDOcUj1uEtOAxh3ni3AA7bFlyBTX(ETuZwoozh9q3UoUBmY2ObFlyBTrARwP3iP0SNtlsb0dkOaAmD)ci(idElaSTZ3AC68dh8uw(OHCq4hd1j1XFSvaXrpqCAjqAESXISu31G3ca38yJfHCE4GVTd9DYO2Hi)uFxJrUtKi3zt9jSIHBpj9MIgqVNK613CUBmSPKg8I(odN8scTr4TA(20hIMJF3lL6wKX9ALrJbpZz0ObdgCzFZ5L3W(6ufbDAebD0IGokiORecwii8v(i5PF5gjp1QrY6i4t2izocwz4JExU3cvF6tLGwyeIE3Sc(i5fERF2kVKPB2(5phcmJ4pPdSun0(oYwp3AJdVQN0sImz7indnSf9KT0wB8kL6uss5Q)RSp0(wY18MAP1dYWVfl7gfal8gsGsu0qjhZt7tQo9ao4vPa5nbrlMgenfpi8I8tvlzl1xxh8ScDzzCyy89b493GhyAcMe)EF8UZFl7M0hNqNDZqZptH3ndpoHXtz5SI2ffZQsMTrsTEXcSXl8Y8UXl1)B39lS7IfmwFIkSXlgtzXHuBnCQUJQJnI1RSJosCmd9d7GI6yFmkOD0J)PTBa84usFFj05j2Rm5h4(3MGkhk9I07AjC3BoK2HofO1IbWJ7Xgf15DvhDyHtun2DeYtb(oP8mBa3pmZhuNZFDdMFCm8T7xEptKgb5BLNQcLwV(Q0n(ZXRGCNRVAts8YGq)RV6)y3SF8JEHBbzByopVDf389PvxVnVcMbl4Jblq4EZd7MXxRFiI3LGYdIkqdY3QEf3)I8nRh8Cu3IBvK3EbRUc9WWDZEp8YGm8Hi2aGyfohCumQkIBN3fmG7NTnbijhShdX7JWINmA4eGe5KC6WY6u9Lxug7XRWd))lKdI4vXBUi1ply5RyD6fo8)ofH9faiF184OfbimVOYPzX4tOQXcJ1wrvWHhNI0Z6AP4zgWdSwkAdd1DFzOUDjd94u6oTNHsuCkTHHMNIHCgPS4xbWfLKe5IvNBmAs4M2xMVaLAF3hRw(pTVFf(TAFd6O7aX3qhNvBynUAznUeSgxcwJM0qR9L1yn6xzuTVxH14sYAmfcABynvjwPMQ4erDXQHeTloKwdFDdg62smKy5R0AjPBWWItrjv8Zve9CeqGdj)GKPhCFYo4HLMxnkewNGqL8dsMO3dlpVASMzDgcvsqOCMETr8yH3AmMOJGuc9PQOm2E5fYeJnyDvFXpI0QnFI(eTDmmARfbOY0x3zAm5E5PlYDvxoJCvZ)xLqnBaEU)a5NQYfgYERnFAAMhUXUsWJTzniOHaWlr2QKMjG)YP7A3VaE4)D)(VUB2)iV33n73yxKJqmi)C897MTE7CW58pGNz07M97CV4X4o2akQGZ74D(g8n4Pkdl7yFVG38xv6dKneCfVQ8(P)v53VjOgec(0H3eNcTavQGM4Nze9)7SCZHh4lq4a4WCEhGhxiG0ZT3wqkl8bzL1SyVUFLFeg2aewCYCwipi1fImc)O4T3UI)fBXGl(XIGA(alOM)KfuJnuQiYSPavkP13o6WiVnF9qCcC6sYBSDuhx2dMwNJbP5PmL187bh1XirFqusKLNMFxi2ZFcDIVGb9BIP8bcNeErqAEAzHOAVDRhy1iZ3hIC8FUnn)HXEHwf1il5qCQfXfqqTKApZoQ97whVnkJJ3YQAiaXX5fSDfnP(fJrCdMjkgGlhg)ay(WgsOyedT2Ovd8nIsLmA594gOoz7MSs4dqDnAFzzIV)N9ZBwb1Mk2mvtDLxpY5g5KVj)UWH(BfUdJ1(TxA4Bt9HjFrR5lkmUw5SGaoj4BLqVnGgU1SzZCjbF6WTB6j2hkM4lntxUxHldSvEF(2t71Z55tmHuB0nnI6DLuV(m4w7kuk)qt788RuGxm(Xh13qoImEGWKqf3As5Ww4AuIcQcnHdV(JFzF3xuKPRA3wsdeERWfEKONB14hfoAYVxCL5kQzxGHuQPhahkZBVy2HnFuV6mQ6SKv8Rgu9yTDUUZ6kXZLwQ8HO57E8rfnKlCPiqMc8pb()Sn0dTj5Tbc2YB(QAZSWSnJhQCvEeapkLzpk)wGgtNh(EyiRkZEyZ8YY)(0aSFqUb87vXBdX0RN5j5Vr5KxGr8Faqh00icaNjPclSMYfxk6EsOGPCnoHw)Y3r1XDZ54jF8v05EY8kv02kF)Tc2x2eaPPp(eu5ZnXo8)uPU2D)kz)93KidzSaflEbMmEc7gk5C3EwJdN7mIMAZzIMjxHyQoS7Yjrk0vpfoeMenyEqgO93Zy)AKSkOheBkSIZ4BLGSUFi90zGQVPKLkLiH6y4LJg0IrjfmtCeXk6SGbkBDwFoynZylFRgHJhFu6YI(8XJ6DIvAKvtY1g(RvG(YXaJwrjPj(((XUV1Rkxf5khf4VYsk1t(XLlVxp15todymKa5eBHIRHjVZzDlEOYLXU6krI6QxIgzwE)sjxR6BYdGcFDaouUduQ3f990(CLph5WfszXr(3MWwcmWFWO7kMox45vESq8gvOpOxFv3OF8rT(CEXeWjKgUi4R0iuwb0k)xkD4v4rsE8wPRPk4mGfOb4OYphGrW(75cZqqv8XlwKY7MDoeKeevZYlE(QSSnPF7PNE)93p8(yiOyVfdbFtonDJFy4fGj93m6uMOWRdIwUfV2VF(L5rJ9(8hC(PExIXthe2cipXX9ToNYLlED8YxZxf3lRfZkh4y4PB3aXJYl2imIx8x22zotCDF77oLldJ9MWsREP(Gi59lggn6bwLlAblTVBBhn6HLdLTGEVPiVYcWIlbb(mYKxkIkEfi3WSbcA2brFm(oqQ)tGeweiOIs8ftlH(rxir8QGLe65g8kFG2agmV2ICfwDZu001srpTXziAgZlcSa6DlOKbrWfgI0KoVwoBupjf8Lbjq0XERtNIz97C0kAtZ5zcnn7Vr5KEkiB56dmippd)bpFWsEbJRQhq6RFf(diWJPG9TlCk85xBkJrMqJt0(MkKwihc90TudMxOhZJGw6RW5VbmoEtCAApv)yq5CG18NS8(HbrbAtBcHW2YJt6pskybSFxM2Cqrj9UDZUfMaiAOKYcWuxepLG3nf)mfEnWojvtKrxNjYJJZyLHvodRipEm0gvy9XW6G)xqEzxXM69vf5geZegV0mzcR5wA24XRzloOQztAOwrN0W4SILJGroclb3xN3ywD39qJ09q2)x3DSUBBBZ9zXyacwDTb2YXDDakcOOyd7hBya7YFRRITsIwCScKC(6Nbc6Z(4HuKIxohskB3TGHcu0klrE45(vjTVdn2vLC46kg2(10)3jRGi8mdeE2l0paqNpeo1NvP5eiC3pRb()S)WLW(WDL72vXZQmaD690LT0JQ8o97cU2vtreh5)ZN8YeYeX5N8mXhTvpmRceN)v5cNX94LA(wn91U3t5MdPOMns)AizH8RdcZfxzO5nbSDeKWMrtypD5Y)7typxsWO6A8ty)gr7t2SB7b4VRe(3Zlpu)sWmn22aTWPOhp5o9kVdWGlpF7MHfCXx(0V2kInyxvT43dVAx3WDs3yDcX4jm6EmQlg8hJO5mUAoprfJw2dOStXvRDkmSSF2MnLNHJus5dJgcsdmaopAFod5FBr2m66rG7Rj48wqfiO0Xi0oeMoMPthJxuZGoM9YGoMfKoo)RmDKRX4xy)39Lqfv6RJ(pw9)yrhXuLSMPf5p41xR3T6)uwdq4EHIaQZkCxZN32NQMU9CoGnnSqiH1C1nWsEX(613dPQ2TQutXIGvfmP2xYhQ8W6xRDFXgrS6iit3Z(ba0FGfRt9oO2TPYGn)aM)qp2SxMzaCuovz2Erw7pC(Jmd58YRBEOEhhBVAB9dxZDkaHsqAEhZSjJUbHwcbzYe4bPNRzm(3cnXKM8B5JvTDmst79QWGxgJQjmqgJndf00xi2Y302XCJURR)LjpSuQNs2wzuhr0KCk1RGqnscwGoM0Eyvc5xkt8S9mNkYM78zc(b3thsoInWZfM1UIjYSDlp91L3BGyon0G(wGWFtYagmfBysLy8)ZIac86uQEreZVKrYqlCbAdDLywUpIoTkgC0OZByVimUQibCTmmlA(3rQZL2oLHkwZF7Oi3yCIrqRP36O3LKOsNNS(pwnwdpyikfJabOyEiufoHDSNc9nb7HCJt8CfLMOlbmKykEh4JeDM4dXrwSWVstYG7ClAmVKCmV2Yz6q5qQj9q3K1RxFy9wMaBz7Tv77eiPPahi4idCnvPj3uZORlsv97L2ISQ)AaKNCcyaZMgJ)BF(q7dDRU5P2daKnW01wdLmSr01XdFyCKfg28tLtalFJuvShoicpvMf4ynbhQnDq6Q5KJCgPZJOoTsxsOjTL1BwXCfgGLnB6UO6)dJKjJn3661AvdX68OQgY3A)qQYKmqou1R2Hh(CGX4oUpouM7rvGcsSVmOTWbPKhId)nUpJZL8HMooScAejJdVKmbG)v3XIY6I9FUH)pO9nkz4MZUlyZI4HJ0fd8pgtQHcZYAgQKzNBt0LuYHs1T(atv1Gni3q6iJnXSqPhwTz3gtLH6wG7xfrzszuagyVU8GzeodnuCI)4yKDdBgbieEV0AtzsldjuiejtQZxIlcF3gSJ4H3CW1qB4E9DGfVoifoH4zlixejd0axT1h6RGYddy9u3ct62omlvPCW(DLcAFm1N2GFJ39lF5tVx1uS6(sTTPzJsRIIwkbCrFkB8amoNQwi3jr(aSOSkHEd8PTDvr(iBbmr3Q)6Pn3(a70g5tb92ddDuUDf04Tr(q3u3wXXbrE)xxEl3vK26133n6mp07KTDZx5Ddq9FMKJNyhc2ExQUG3dN6Rw0ZuPfWndtR30ZYUCx(PytddnCrMIDc1aE7zdWL7JVBWKOrRMbByuhcm8d4(7DfdTyA)WSjW1BCWxdYQR3RzlHW1YGRNoRafpiP19y3zCsBztLX5WrVt4LGTJ3QIdXZIbdGJkZNqB5)taZJA91yO4z(bOhWbIrSH1YKoXitdrYrAvE6edVz43M2NvqoZwXvx(8ZrCBVlTxG6y3N3f12m34n4GFuYO0KqC4zHzgStt5Z4C)Ez5nwcPBAIOEtvt4ZO1GDAObc1h3W4GHHCT9PUYnkpUqqxHS0xmFzpIdfNsCO7XgipYIt74sPU0(8sdXhpMqlg5aG(OSTsIDVC8y3VpSBH5liroxo47LSdrFpxZgZxSM98JXagqOjMD6vNYkSe1GQkry9ldzXGxWwRe(57OmSyzIv(EEC9(vlwMJE9zflnsw2YziBNt92gkEQ(CgsQ4LIMsZaG1N5gZUqXuN06zpMPVrQKQLES2F1BbDsuLpefv0UdwRHQZim7KG1KRlMj9fIQCBO5PFipLMdyq65HTYAFvqBggP3TMngEsRxjAKNwpat7WRKLOfD8yLSggVS(qXXCLvOzhdVC5XWEh9Xte7Z(M22(4y0PNVnkrjojQFmEv6v0NSCFAx0pWhlZqVMvE3PZRIPGdXXbRxPn7m2Bm(PcvFworXH1DLdr7c5wB5W)PV5HZeI20nrcwcTjIW3JMyCYW4rdoebEroDwYyOSENpkGCN3eKEaSJILLC1o72fRkYIKPhb69eicHbhAjmB2CSI9GXGsmHv5q6NcgunE845lDxuZ0i88ZAZcR8DeGOGI5zP2jZAEk9XoeFRkOpKTBK80PADlgY4I6zEZSJR1EQYKJP4y1FQSkCKiN)9oprWT6h4oR6A9UvEOjOE6TG8bq9gOkFU5i3olEMak9hk3eEFZpiNiXV8PFUwBEsVOSPYu7QhhaOs6CqJmIn5Kq)4V0r8y5zkoVOnxB(LP2Wzy91bddaBHiLwJMeicSCM9tEYcrJ0GWzLUsJgCXMJiIQSLHAIwfq5FY)m3vvTEEZCx8GxV81GmLy5VxdzafAOvaBH53UrosTr11QmJ44E1yfwc7oMnKel7kuAnK4gI)isLRFsZZmNk6zmKmadVk6sP3x6G7gcUiXzbpjeeKgEmzdTsZ5SSFD9CneXiw9idoxz)QyyGNdr4ipZin2bjr66tdjVhohproXREaWXHUMmvpX((EfdehpgbVKrRzCMG9teKgbjoSTw3L4fRDcBq11IH3gudpzCFCp7pF8V)d]] ) +spec:RegisterPack( "Frost DK", 20241121, [[Hekili:S3t)ZnUTo(3sUBwVX7howYX7h9sYmT9ANU9671oBAF93ITITSTERSKpj5nB2jJ)B)ai1hKueuu2Yz3EV30zA8krbcacacacsEJZn)(nxp3lZ)M)U7q3ZDCCDg4oC4Bg(MBUo7(n(3C9gVzFWBj8JiV1W))htItZ2n9)()bFZ9HXEZriKgVnzg82vzzBs)MZoBzq2QT3oyw86ZsdwVn0llioAwI3Im8Fp7SBU(2TbHzVl6MBR19oVD8Bh)6BU2BB2Q4KBU(6G1Fpa5G5Z95n3pD2nxJn)LooV015B2n9DR3e6V2pcqSRZaOTB6p8Pnj(PPqVUB6)XTj(EzRMKfm7dPtc9xK9FSBAw8UPR8d3SBk0WpY(05jXB2eeTC304TW)mEXUP8VC30WaKOHwU2lBBIF497(5D)CbkmerH)yZCwh)T)2VWbo024pcpiYpnZF(UPEZqEqA1ho8LJgoWf(0)MFYsOHiDUB62C4Cxa2VV3Fb8DXj7Mgefgev(8)m(p)jFV5Ya7BuGHWlDFl8YVnmm(oa5scI(GpqoBtlH3Vf)Ja9hK6DBO)8)l4NXrpfAXDEPiU8EFVn(jpnfqvVKpib3raC)XGpb9C82WIwk1cKcDCgmCWyPh7yaBDezOlsIxZBkGxR8IMh6ZW3Z(U4Rbe1p9(OzvC1HV9LUVb5PbrixZB()CBAgkzi1eNZFXUPytjXcSrdlOTnXXaZF5KKTWGzvtEZlDFfch4VVHdVH5WD448)w883Y7N6DZRHXnom44e83X5W8C6VHX2)9vaJ4p9aQ8pHXWGOBUgLstzQJa2g6pjZdeSYGh83zQ5(rSH3B(oq3IjmEZ1lqT5jPGiXh85AwjbB4V6AgmGUHbeyOnoZJ)gOnz(jbEGfcVqG1oWBYcFqszs8IjGHGW0b590UP9WrOB3UyXGeVphNemZFqAgyqz30l3nDm795WiDLxgcvGnFBO3CFjyWGqTEz7MBYa7gkKwf2X(QpeeYg7w7nd4rIDV7UPp8qoS9)e8nRdIa(mc2s(t8THi0qduqxnISRoTdOZ(C8bafkNTB6fmue(Ytk)yaUOfPp4Ni8zeJMa(Eoj((rp4pWJhKeS2FcI4PIiz9(PQtwfFxyo2NMH9Y42naSDtbrvIes6xum)xr2nlcwUkBcABoaSVo9Qkook5oidjXS4jBMLnz0ygFL89df(C(Oa8pDRqjuWd6j0ihItVMeNiiVGzt2eFhyHe7GtfAtYMIrHCzGtSqIHJKfWCWC)fbZcY4sodzcugeoEJ5HnuWOySscDYNmf1cdIMN4Tmo1RcLqSpVHWR8XMLTYFc05F2pAYSvER3ayJC7Nb8N5X3fPh0LJR9nid(2dAG4egjIDZeCcMbURKiedQS0SxNHTfL85QGIObLUGJQ98gbEb9AaHPnK2ADvhAlLNGoxKnG37lapVsgG(LbG0WWRdTLmfBLA1hqD4X7JKCjvNLSfmtYBFH4kdULYUGRQriOUlikd77TjSzl3n9LG7pJvKEfBkJ(OTHAl6AI2hw13EjZ8IqZDjjamVb)VRNbKWKv(EjgDva0Db1qS7dMP6RW3dqy30FIbcAdZWG0YzZhS27tfJfIdEi)(K8PJjMZGp6jRNw4DqfrumZ7vWuVNZHR1FYUPVPCI4oetyGTLiItHfCJ(4ujEuQbkzFTOl2a0Hxco6X08kOddSoS)5uQwaODu9zS27SB6Zz)ihZyFWD3NSoDYITj3lHCL6pQnce2NFpNdimCSnAvC49Ovl)OLzRKid13Pfd7tjqB09ol4YZzkNFicf5hGY1lIbVlgSWlmeN4lzBkmZr50nMgtkzjKS8R4MuegDmoesY5kzReF(iZ8lAJYwWVoPvSSMjYUGPkAOSg1sBI2cs1eQ1Wy45h2y4Bv8XYKE8Og51NBuIitWpaSbgMnrWFHRND)SYGvtXpXYqiovBWBC61WuppJnDtFLPW(vbeF30Vfqtm5nLb9U3bAw6zI9wr7jgxqz8zgCpI2Wv3JzfcZCLxyMSjZ9N5DFXysjIV0BYMKaiu4S7RW8LHEZc8cN4n)JEr6nIOpZeFzOinIMAme0egFWjgOQngt0cRx0LKeTuHA40AvmBsnupOPJk(lxK6Qr7QxxsEkSgS9qhjdZ6IooJAyQu6fYzwsNof3khHOfNV1xer1pvBXhw0sJWtxhszGDKy6SOZZHO))C01Jz4DIFK)6a)CxDkYKHooATWSBsButuhei3bR32VW8sJjGqkSufHb5isv5pxY4p1twH)8CREvydbdKovcCYNNhitbNRoXytdbFTZruNo1cTuBij9tnQfdA7KInM0hT9cThTLAiJmM1c6uYwcaNcd0vSceSMYiXF3XyAvjNkIsafmRVjXFw86B90MGJy4Bt9Zcwi5tpFrYgK5myLx6KTPCVWkKnZfTuDXqXRFBtCZPLlkh2FLUQxLdPNyWb(Qwbs(dlT72I(2C(xLWcZOzjcO6C9p8rVWTGlfG6PxjqsR65xGl(4hdMJ40TWCBCAKVeSmQeAG)6C5hUS1DWu7X4hIlZxXY0ITVc1FQqpmy303bVmidFiIn(4Ijc)oIVuTWSySynt8Z2MaKId2JH4cKw8KHdgpGTWjt4leEovmXzcUcKvIFfkI4VGUzccLBUg(68hCZ1o6IMqqkuhKu7v38EvJeR7JSeR7FnKy1IMIsSghUuNtiF4ICyVMfKQSgxtHxE4IXk(A6L9R9(G0bzaJF2k)K4TPtYs8IsxhGtYQxbHh)QMG9Abx01mxuvOxcJ)A4LQCr3wYfDR4IQZB3sthotkK)jMWZmIvPKi8jiUja2cnNX6I0SLORRz0Tj(Og011i6Q68rlrxbp706EMIwHSNHkd2es5vkbOe1j1uDREFFLaCiGFJwZptlmQEF)Yu)pyml5)MudEMCeHvWdNrtewflJGm6fe(Xq2QQjkXYEwFgI6mCyXYg0Nf)4Pw4GLoc0XkcuJ1scc0Xkc0rdb6ssGYs4oLIYU6Y5HLsYZ9wJRC)HiqR79IYC1Omm5YkSaJKMAIuAXejm7BEHqGqRasEZ2p)ziYOBJ)0bpl3AVOTEHAtkrlqpx7qVMm7v3kQa6rebKj0lpqCWzlEQosH41wRTSpUnidBaUacvfpufcLCx1ez1YCqZiceBOaWYD)lzd0D5jJypCuRLLRIHAXsInenFsq0K5EjFiYpnvhVifxCHzteYXVUG)rkiXNKgQZlYwbnFfW)XOWw4TnmJXcWHL0b3gNcTrj(mwrR(pYb6UP)k7XFZUP)ewVOR3odRevmeESWlzXGHf4kMObi0lmvIW3mdc2ML6ZVtiwSRlDkxBchSKY8rzMkQljy5suiVK2E9qljN)ifhK4v8Qiq3g5xawoPn3pJTIsyCMR8JWGa5v4mgalsTScP1pkE7Yv8VGvlT)qriQVNfI6FYcrvBMs2dkxajfO9rhiPV5it468MYccNTkeCAopFwc085wsZCPxVO754fqczyjZYA(DqmPO507fLLxG5s43eY9qEXUZzBIRqiMob4fbSeiKXYQXYTEGj4mF)xSBkw0X8hg7foGXi0nzSfmIIXj0ebHQ9RSv8)BxhVnkVW2LvNrYhLpahEmOdZzv3cGKd4YH)3dyhprBEX(6sXwbfkU4sYOC8pWx0v0zRFjqEPyiY4Nys4Nf679r(8syUr1SWyAwDpnzH5at0kR7o41nqkHnKzVwxUVVGvXte51MkT2MwcmYs1txhqxpiwUscTSsIRQvQHAfX0e7zhLk)dyr5SBjtpq5q9DcZeKovXQowJR1AsQ)FPl1s66YLMGmSAfzf2OT1UxRR2fHDSGIvZcZ0TRAvoElcFLoc(ubLsLfJ34(OOuqqCRjKNOdtZeWEhrjwzBfADBCK)Ye2sbiaG(APpruLAwAMizLTCRcX4z7M(QDc19OjRWKwsp46LE0qbLygVjF9x4oLXx9LYQTsD99QXy4bOvu7vptFbzwxzLQuBAvrQudfRvC02uFmvDJkXn)EPXcCF)LK6hcX8jqjgxstvFtklJeLPAabGnHErrfVlxSkVSaxMaU3n3IkcxQOjnQAizywKCLg3apSNmpAUUuoznxRf7OdvHTxzEXKPT3BNxjzvUARXcVK943HJ2jB3i4t)Amnals89)SVoRYnNDcvx8WbpLUTWv)u5ClukROZKB774RyDCvh4nFEA(Si6S40Chqkzlj1j0n557SKc9JMZY00CtRkIbeqC8xJUMsUzKYUJhacWXXv(elGkihIFTxAkk4OuO4MDpSIaLZleXYOyG(knpabhLUIfbHF0NVxnqdg6uRrgQSlKpO)JQOLrQlRBWS7blSHXrPA7FHxBtpl08Q(8uwB4PuNpltrmuRJlYBz8If(rPYfPLMVaZAxn0viN7LdrBQgGiw4OMhGmTM8M8Q50MDSr7NlTpcgwTksMGvF1M1isBYFb7atvR0blPjPQzS6sJLcmAVVAqSiWcWzm)zFq30yAlril32Ix1CX3Ryp)hJtWJmbm)mEB2Ke7nBvTSZXYKf6kEvgyHhLYYntamaY4cZIX3hJllvvKuzR8YY)(QJMb43RaF0bUjOojLF3Yeaoy30VhqhKJJaWzCkEOeKdjyGzcxmFc)OsyMxyOs5YupSosvJ8f9Pz(wUIKvdf68QWYLeJNoYIaTr2UjhsgjwvYLEA3eXmX)tB8NXoQiW6MBOmRyK40MN2kO98IsO9mr3Uz)toS4iAzZEMWZRORNxutX9lAKZWHADWYsEA(qLfmvj)1Z9CTH0fOHd6QWbBac7hxtLL5ouddR9l)wPOujsxpb5wfOBNNuMHfHh3cbY60HSqqLmI8MnoBVwXqRi2E2isOjWwreNZYQVXJgvgRLvMPuDCQRglTSZZJ9xtopQSS10y9EoexM9YS9ADCL4hKPnVNDjGxNdfNxo0yDxvRv23BUkUAkw14zeltCJwr23S0KpDwzY)Czcksa8msaQXQpp6)mI1eUXXzZU1kg3q(OvE4kh6MhUeEfADv5lecOlQ8CLPNX8js)wQETFHcVUGYnUQdxwU1DoX6DbuLqRXnEXjMIgwPbeHdlBPZ45SrLi0I7wiuTeg3dcA9G48H5XHlWmweKKMnXBD6eSogy8FUj92BN1Qg2ShmIHn4fbiJ3sGAGGTb)QfQlnXSWj1igZrnK0cxXjkBiSk2GOfMaIESfMOa0KFGMGHmPv(kzcxiboAMbUnLjPS0wZJrwox4ffPINL3H4uoAOBgELi4(DocYLqP26H5ubWNtdJZe)3sjhwSWfXD2jxUK76LoMst1HxrHQvWYpT5Y1JBTshRQEa9nZ8P7Q(v9MPCwOHKKQKtxbdMImqDvpRWllfkk7lTyB1I9Y3PzQ71LIX(8dOT8pROisyrlVcKG8rZmW)d0zzofZMC7fffMcwKfBzLSdZYey4pc(9gVGe8z5NzFQfQcVqtO2JP5iIlL4LRDIxUnwMNwjE58xiXlx7eVul(AjXlN9s8I7dOK5bw5V6sTRxPTPOABVsi4OAG5KgtHzBgBpPjHLE1xNwnoLkS(SLcPnkw8kLPoQ32IdSgY546)4AyIODIwlXanuMpRhFQo1t4PvErr(SbcKtvIFP1TyvwrO5OnBwqxQsJOYSKIyUnsShdBw)BjwlKyps26iTGBLelkMrvqF0gg1xuv7LXorhyj2ffI7p9d1kG4GZPn6Oyxl4M3ivH1IYdOrDPI51nG1IIEMD(V5WpUQmzSYouqUaun72VZy11)hSlghfEp()XfEjkV(yZrz8aKog3LZPSAdgr)xu0c0Tq2IuY)Ss6z30FfEuWc8CKoG)(MH2TXSI3veomLdQkaTYMRzLHwzh1wLbxTkdT2adLYG(Pi(AxzqdwBuzW5RcLbnoQsDswOu0XsQr)naOzE4AlMx)9)iw1BGW97MDpEEuJRkFEer)rrfiGTflbb1kRI6a6PNP1mws6GUYOYBWDm9YjE35DV233qc8BA6zgF3GdjfIv6k8nuPGnmqviDBI5)v508SWXn5kZSjHKEwiGBji(6U4bSrFWLTzIDPtpztshn4hQE)1kLQWS1b2B995B8HBbDs2M8rY(qcRICtbrMKpiL1RX2qHoILf9TXSdGVawbaS(wgTBSMhBI81rFn0Fwu8Hf7(qByHnK7AX5fier4GYAZX2z7(IYt12Iyau3vMvP(x8aanPwDP2WYnuVoXDeQ0Y6GJngqx2MhzUDfMbM)cdzRKJhRyEgrxbOnjeARpcnz5ZKDcbEQglvmcOHJOltXwEA9fX98CrnYLdKy)b2tOKw02wPTrz)MjlBovJBKVBHPKtAysfrcBS9ATqRFDdtpB50vwWRO3Yewq92Yl1RI2cbyfkKH50BfHddT6z9Y4uODwRCvLsPJPzm5IhxvKVFtKRnNK7hRXkZygTRingEtV9ljvIvaxnloamEZq5G2mQh1SczEPR0qJBmNx43RVkE6xoVlpWSlkNHnr48UtqarhdTwInXXgQ9)NOhAkEJZvj5XziTXSMhKlRoQGolQnabGnj)z8OR71rSF6n44iANZQu8scWsHiMVbPatFZ8cVFtkFv4l8pO8PtIIVRrnI6oy0OIL5jYnQM0SpZIglzqU6eVNXLmEpM0mlqnsgEUg5SGMMeYePBX8S2ovNWisIxW8jS7En2U8yG)NW7VQCtfkVlqPKiuyEcLeXZR)XsNJpIskLLscPwVXHRZnEhV0(HlPmq0eNSjrvkUBV6VQWeVgE(f2O5)s9FRMh38iHzgUX79MMz4nn)7bY25QjitHFhFKDxm7hnh(spnxninZ3BLoNoH(VOQIMhPB402VotuystVaySh8IBUU5Ap3418bzQ06zAauHusNDpmdgRZO9(LYFtHoQPZyF19dAZj2r6sqqS2Xk3bNNB0bwRqlPTSxdUw0ZmlVsHeMtFBEooYlrtPPE02bQUMyLEOySFQu6SvOtnPIRBrZAPxzaGvQdY6YOdqHXa1MNPgrZpn3JQd0LKUUK4jmNCT5JklE0C0Y4XScXSz63OWNtDYCCByC8CUza5Ss)EwPOUB63wS)M0MCPcMt1E56C60qs9vvidOe5N8H8Av(ClsWifKY3yYB2I7ffewwKOmkyfIJIPt(NBNVeVztrWnM2tKgbhwzVW4Px4eCtBXGg90SncTfbj(SXqgGOTI30uXnOLMhqVAbDlm05TKfjrcEP)YWLd66DQblgeOdnQsPRoYgZz1)M(Mi8gZaJWL9JI3qMMruWUG5GQedXVRkt9QHmYAuxQv77g2UPq6UK4Ufd0Ke3qK87M3Y9BA59Tho80WPEKX1Co)Lv3S18vlg3()aRktQkUtK3JMsOehom0z)xXQg8l2e1yhwkD5sH4kTPDTtgPLTyCOcppZWoI2YVUqUBF)amdHlS58JDIpcZ(GFA(vJ(qa)VZlb92dM7JvCXbR3eNKLFW19ujG8uCR7()ULxWWPSncS32S48QngCKb82mDWUF(xyBNy8EW(7JJGEK96NwOvOCBcbaf3zWuVUqAaA2PoFQFtqxD)EOaDQTdIk0h9La6vN(NkWT(XcQkepVZH4RpQCG3Oh660Kv6bttlyzVKqFKjP0zgAjvF(2JkFZHyGUJzCoJpYDZUFwJTMQ5WANHgx9iROLDfKu30nQ8acOQKxbfaRM3I2za4aXyczJdeQeIc7nu1o0NFAi1UXDcmR0Tmf0QM7AwsPYUXPcuT(4Pc5xPhYQlEOcSPoKDSe6vNNn1m(RES5yjeRFM3OAgJ8qXXYEq4mYrb0Ao9CuHjXuwkEpQaxImCAjS3BTGVaq9yYhoMWwt5lOaFdvJNAFOm9C8MCEzk)GN5PNEAtPcR8qN45o9FsECA9FYPNIDo8ONX(vXss)8X973)zodhwGXTd(Nva)ZAe(vZDpSrsuOuFRVnHPilXE1DOkv1ei1sjAbzfHq4I)bQDqb2oZ3M8UHW)HhPU5qzspsyV54Sko(luNLr)HJrlb(b7k(FLX9ZBWgHGM5fAQkh8e44zUplxNUxI0X4XvcF8ti(4c8UR6NZO6NgdPrjvFkmuIebwJF21UIscWd3xukq3vIweE211woEK6gcFs66UPwMkY30ocBGTsWNuFZT1m8ECrB5TDynmV2RTfQQBrlnqwttoMqNeU1mPEIUbURg2JAFx17enVHVx46D6P1Fz(gPRNPuI)WdNyXW8dpqb8(9mTisxPbHlwm6N42V3PNqib8WdgyXAWMI963Lo9lgJ(xBU7zhlUBL4DT8AwP2qAHY1GfkI8K21wOOqBhZwOQ9ABHAJ2q02KJj0jHRbluUM1HCj1HCnPd58vOoKlLfkhkDO6Syt6qUASq9VIC3ZowC3sXB3HDRpu1H3rXcfjAFq(qzaQnAdPzFO6yOxb3APMPcU7ZKm1H3XziKcTpOjzma1gzYnpjthd9k4wlXrDI4mnuBeBTqCUBHEZWDFTi94KuUhl0UtwZa3AjkRt09OHAJsewO71TqVz4UVMpjsczxlV9iH2DJ82Xzr2PaRW5aIcu1CcHylqpuCLibIDd)9)3b8oD5lDjs75HoKECwiAxI0q2bzX2Li)bDaOhr44)bYmOaBhBnD0JJtcuDZHYKoM(km64u2vuGTR54poL(3OUUEVmd2Ug7PS4iT)nvnlODZDAlO7AkGYWwhqbeGUBuUia(Hk3CmX5Zjmj3b8Akq3n4nvP13b49XPOBOa7rLD0naNYTo19oQc4j3BP22bkBxtfWtSzoTf4QB6sfOtTNmvb)4JJxaJpotupMyguP6oxIneRUh2SfKD8KcuDtNu8kuaFVlEfsaE4(MpURJ)rB1OVjXFw86B9Az9OBonW4PgaU6jLONCQOeETefFmTT94KEClY0CXQePH3ORnhvW)V5o7d3P2IjtiE37uZIO9SzbkbGyahFYtkFKANu0Klh2)HhSQJkbL2Mv1LMqiO363Gw)JbB5XNR0itPuAY8QgrA6S2RLK9pM5s4XjllwSWuKAV6BZrf8)BUZ(WDOnD6EuTrObh)YA6udcP105JpB5XNR0itPuA6OSaOMb6E6kRzGYQSOAbtldz120XG)aq81EPqqg3BcVRAs3c8daRH3LcIuqasgXC5M19DYbqbRqwJjCVObDjGpa8fpKpmHU5VVdbB7r2G0be3oNA6cJnwQdRLvGCGCqvgKzGUNooAgOMTKOVnDm4paeNYwI2M0Ta)aWAt2qiBw33jhafO3EIMg0La(aWxTwuQ)(oeSThzBHHQgASuhwlN5Lwg3KepBa7ehCtQP8Mq1UoUBqU1K2d(wW2AJ99APMTCCYo6HUDDC3yKTrd(wW2AJ0wTsVrsPzpNwKcOhuqb0y6(fq8rg8wayBNV1405ho4PS8rd5GWpgQtQJ)yRaIJEG40sG08yJfzPURbVfaU5Xglc58WbFBh67KrTdr(P(UgJCNirUZMoLWkgU9K0BkQp9EsQ3PMZDJHnLu)NDQZGXpNqBeERMVn9(Oz439CPUfzCVuz0O)tCgoSF)(xDQ58YByFDQIGonIGoArqhfe0vcblee(kFK8SVCJKNz1izDe8rBKmhbRm8rVl3BHQp9PsqlmcrVBwbFK8cx6NTYlzYMTF(ZHaZi(t6alvdTVJS1ZT24WR6jTKit2osZqdBrpzlT1gVsPoLKuUxal7dTVLCnVPwA9Gm8BXYUrbWcVHeOefnuYX80(KQtpGdEvkqEBq08jbrtWdcVi)u1s2s911bpRqxwehggFxaE5o4bMMGjXVZhVy93YUM9Xj0zxB08Zu4DtXJty8uwoRODrXSQKzBKuRNphB8CVmVB9s9)MD)m7IAbJ1NOcB8IXuwCi1wdNQ7O6yJy9k7OJehZq)WoOOo2hJcAh94FA7gapoL03xcDEI9kt(PX)Yeu5qPxKExlH7EZH0o0PaTwmaECp2OOoVR6OdlCIQXUJqEkW3jLNzd4(Hz(G6C(RBW8JJHVD)87yI0iiFT8uvO06nxVjjErqO)nx)FUB6p8rVWTGanmrN3UI7c)0Ql8MxatBf8XG5iWU9(Dt5lWpeM7cqJb7FOb57pVIBKr(o0dEoQqXnfYBVGPwHEyWUPVdEzqg(qeBaqScN4nkg1)W9W7CgW9Z2Ma0Hd2JH4nuyXtgoymqxC6mDqzXP(8lld44f4j()LYro8I4nxM6NfS4fSo9sh(FNGW(saKVywC08aeMxw5PSyqjufwHXcQOkIWJtL5zDbu8ed4bwafTHH6UVmu3UKHECQxN2ZqjQiL2WqZZRqoJuw8Ra4IssICXQdlgnzzt7lZxvsTV7JvR5N23Vc)wTVb9UTV4BOdUQnSgxTSgxcwJlbRrtUN1(YASg9lhQ23RWACjznMI7SnSMQSPutvCSOUy1qI2vesRHVUbdDBjgsSMvATK0nyyXrNKk(5kIEociWHKuqYCcUpPe8WYTRgfcRZkOssbjZU7HLCxnwZSoTGkzfuo9U2iEm3Bngi0rqkH(OuugBV6szIXgSUQV4NlA1MprF21oggT1IauP3R7mnMCN80f5(NlNgUQ5)RYIMnap3FG8Js5cdzV2MpnnZd3nxj4z1Sge0qu3LiBvMYeWF5CCT7Nbp8)2F7x2n9FK377M(RSR2riWJFk(UDtxVDg4C(7Xdk6Dt)nUx8yWgBafvW5D8wGd(g8OKHLsSVtWB(Rl9bYgcUIxvEJ1)I8l1eudcbF6GBJtHwGkvqt8ZmI()blHC4P8ceoaomN3b4zeci9SCzbPm3hKvwZc46Uv(ryydqSWjZyH8GuxiYi8JI3UCf)l2Ibx8dfb18Ewqn)jlOgBOurKztbQusRVE4HrEB(6H4e40LK3i7OoUShmTohdsZZtkR53boQJrIEVOKil5m)MqSN)i6eFbd6xfZZdeoj8IG08CXcr1UCRhy1iZ3hIC8FUnn)HXEHwf1ilJqCQfXfqqTKAp3oQ9BxhVnkJJ3YQAiaXX55STcnP(fJrClM(jgGlhgFpy(WgsOyedT2Ovd8vIsLmA5D4UMoz7MSs4dqDnAFzrIV)N9ZBwb1Mk2mvtDLxyY5g5KV((U0H(BfUvJ1(Txz4Bt9HjFrR5ZlmUw5SGaoj4BLqV1NgU1SzZCjbF6GTB6j2hkM4lntxUbHldSvEZ92t7f25fJnHuB0nnI6fKuVtzWT29Mu(jL2f53JapB0dpOVHCezuFHjHkUQKYHTWDNefufAchENo65N6(SI0Bv7ksQVWBfULJe9CRg)OWrt(nLRmxrn7cmKsn9a4qzE7ftjS5Z3vNHvhGSIFv)QhRTZ1DaxjEy0sLpenF3dpOOHCPlfbYuG)rW)NTHEOnjVnqWwEZwvBMfMTz8KKRYJa4rPm7r53l0y68W3ddzvz2dBMxw(3NgG9dYnGFVkEBiMt9mpj)nkN8cmI)9a6GMgra4movy10uUTsr3tcfmLRXj0634oQoUBohp5JVIo3tMxPI2w57VvW(QMain9XNGkFUj2j(Nk11Ulvj7V0MeziJeOyXBTKrJzxljx42ZAC4cNH0uBot0m5ket1HDbojsHU6PWbWKObZcYaT)Eg7xJKvb9GytHvCgFReK19dPNoduNAkzPsjsOogE1W(TyusbZehrSIolyGYwN1NdwZm2Y3Qr44HhKU(OVy0WENyLgz1KCTH)AfOVAeWOvusAIVVFS7LEv5Qix5Oa)vwhPEYpUCn96PoFY5aJHeiNyluCnm5DoRB(9vUm2v3dsu33s0iZI7wi5A1PM8aOWxhGdL7aL6TtFpTpx5ZroCHuwCK)Ye2sGb(dg9HIPZfEELhleVrf697DQQB0p8GwFoVCm4esdxn8vAekl7zL)lLo8k8ijpER01ufC6Zc0aCu5NcWiy)TCHziOk(4fls5DtVacscIQzXLpDvw2M0V5SZU7U7gCxmeuS38bGVjNLUXpm8sWK(RgEgtu4Lbrl2I313p9Q8OXEx(dU4mVRW4PdcBbKh74(ANZ4YfVmEXl5lD7v1IzLdCm80TBG4r5vyegXl(lB7mNXUUV(TNXLHXEtyPvVsFqK8(fdJg9aRYfTGf23TTJg9WAGYwqV3uKxzvxXLGaFgzYlfrfVcKBy2abn7GOpg)bqQ)tGeweiOIs8ftlH(rxir8IGfe65g8kVV2agmV2ICfwDZu00DrrpTXziAgZlcSa6TeuYGi4cdrAsNxlNpSNKc(IGei6yV1PtWS(DbAfTP58mHMM93OCspfKTC9b6NNNHFNNpyjVGXv1di91Va)be4XeW(2Lof(8RnLXitOXjAFvfslKdHE6wQbZl0J5rql9v4IxbghVnonTNQFmOCoWA(twE)WGOaTPnHqyB5Xj97jfSa2VltBoOOK(HDtxctaenqszbyQZJNqW7MGFMcVgyNKQjYORZy5XXPSAVkNHvKhpgAJkS(yyDW)liVwRyt9(IICdIzcJxpMmH1ClnB84fQfhu1SjnqROtAyCwXYrWihHLG7iDnz9)1DhR7222CFwcgGGvxBGTCCx)aueqrXg2p(2gW62FJRITsIwCScKCwNbc6Z(4HuKIxohskB3TGHcu0klrE45(vPNoUpcnNUp(muF8XSRk5W1vmS9RP)powbr4zgi8SxOF1FoDiCQVLsZiq4UFld8)T(HlH9H7k3UTINvza607PlBPhv5D63fCTRMIioY)No5LZiteNFYZz(OT6HzvG48Vkx4mUhVuZ3QPV29EkxVpf1Sr6xdjlKFDqyU4sdnVjGTJGe2mAc7Xlx(FFc7PscgvxJFc73iAFYMTB2d)DLW)EE5H6xcMPX2gOfof94j3Px5DagC55B3mSGZ)YN(LwrSbBRQf)E4v76gUt6gRtigpHr3drDXG)yenNXLZ4jQy0YEaLDcUATJHHL9Z2SP8mCKskFy0qqAGbW5r7Zzi)BlYMsxpcCFnbN3cQabLogH2HW0XmD6y8IAg0XSxg0XSG0XzFLPJCng)e7)UReQOsFD0)HQ)KfDetvYkMwKFJxFTE3Q)DznaH7fkcOoRWDnFEtFQA62X5aw3WcHewZL3al557QxDpKQA3QsnblcwvWKAF(EOYdRFT29fBeXQJGmDp7haq)bwSo1BHA3Mkd28dy(d9yZozMbWr5uLz7fzT)W5pYmKZlVU5H6TCS9Yn1pCn3PaekbP5DmZMm6geAjeKjtGhKEUMX4Fl0etAYVLpw12XinT3RcdErmQMWazm2muqtFHylFtBhZn6UU(3G8WsPEkzBLrDertYPuVcc1ijyb6ys7HvjKFHmXZ2dAQiBUZMk4hCpDi5i2apxyw7kMiZMn80xxEVbI54qd6Bbc)njdyWuSHjvIX)pnciWRtP6frm)cgjdTWfOn0vIz5(i60QyWrJoVH9IW4QIeW1IWSO5FhPoxA7ugQyn)TdICJXjgbTMERJExsIkDEY6)y1yn8GHOumceGIzHqv4e2XEk03eShYnoXtvuAIUeWqIP4DGps0zIpehzXC)knjdUZTOX8sYX8AlNPdLdPM0dDtwVE1(vBycSLT3wTRtGKMaCGGJmW1uLMCDnJUopv1VxAlYY(RbqEYrGbmBAm(V959Tp0T8MNA3dq2atxBnuYWgrxhp81WrwyyZVpobS8nsvXE4Gi8uzAGJ1z4qTPdsxoJCKZiDEe1Pv6scDwBz96LmxHbyz96UZR(lyomzS5wxVwRAiwNhv1q(w7hsvMKbYHQE1o8WNcmg3X9XHYCpQcuqI9LbTfoiL8qC4VX9zCUKp00HHvqJizC4LKZa4F5DSOSoF3NB4)dAFJsgU5S7c2SiE4iDXa)JXKAOWSSMHkz25whDjLCOuDR2ZuvnydYnKoYytmlu6(LR3U2uzOUf4(vruMugfGb2Rk3BgHZqdfN4pogz3WMracH3lT2uM0YqcfcrYK6853IW3Tb7iE4nhCn0gUxDhyXRdsHtiE2cYfrYanWvB919kO8Wawp1TWKUTdZcvkhSFbPG2ht9Pn4x5D)Yx(07vnfRUVuBAAwR0QOOLsax0NYgpaJZPQfYDsKpalkRsO3aFAtxvKpYgat0T8pEA9TpWoTr(uqV9WqhLBwcnEBKp0n1TvCCqK3)1L3YDfPTE19DJoZd9ozB38vE3au)Nj54j2HGT3LQl49WP(Q59mvAbCZW06n9SSl3LF)10WqdxKPyNqnG3E2aC5(W7gmjA0QzWgg1Had)aU)ExYqlM2pmBcC9gh81GS6QDA2siCTm46PZkqXdsADp2DgN0w2uzCoC07eEjy74TQ4q8SyWa4OY8j0w()iW8OwFngkEMFa6bCGyeByTmPtmY0qKCKwLNCMH3m8Bt7BjiNzR4YlE(5iUT3L2lqDO7Z7IABMz8gCWpkzuAsio8SWmd2PP8zCUFVS8glH0nnruVPQj8z0AWoo0aH6JByCWWqU2(ux5ALhxiORqw6lMTOhXHItjo09ydKhz(XDCPuxAFEPH4dhtOfJCaqFu2wjXUxmES7)lSBH5Zjroxm47LSdrFpxZgZxSMD8JXagqOjMD6vNYkSe1GQkry9ldzXG3Qwlf(57OmSyrIv(EEC1ULZxKJE9Pflmsw2IPiBNt92gkEQ(CgsQ4LIMsZaG1N5gZUqXeN06zpMPVrQKQLES2F1BbDsuLpefv0UfwRHQZim7KG1KRZNk9fIQCBO5PFipLMdyq6PHTYAFvqBggP3TMngEsRxjAKNwpat7WRKLOfD8yLSggVH(qXXCLvOzhdVC5XWEh9Xte7ZUM22(4y0PNVnkrjojQFmEv6v0NSCFAx0pWhkZqVMvE3PZRIPGdXXbRxPn7m2Bm(PcvFworXH1DLdr7c5wB5W)XV5HZeI20nrcwcTjIW3JMyC0W4bdoebEroDwYyOSErpkGCNx)JEaSdILLC1o52fRkYIKPhb69eicHbhAjmB2CSI9GXGsmHv5q6NcgunE845lCxuZ0i88ZAZcR8DeGOGI5zP2jZAwk9XoeFRkOpKTBK80PADlgY4I6zEZSJR1EQYKJP4y1FQSkCGiN)9oprWT6h4oP6A9UvEOjOE6nN8bq9gOkFM5i3onEMak9hk3eEFZ3lNiXV8P)FT28KEEztLP2vpoaqL05GgzeBYrH(XFPJ4XYZeCErBU28lsTHZW6Rdgga2crkTgnjqey5u7N8OfIgPbHtkDLgn4Inhrevzlc1eTkGY)K)zURQA98MzU4bVE5RbzkXYpwdzafAOvaBH53UrosTr11QmJ44E1yfwc7oMnKel7kuAnK4gI)isLRFsZZmNk6zmKmadVk6sP3x6G7gcUiXzbpkeeKgEmzdTsZ5SSFD9CneXiw9idoxz)QyyGNdr4ipZin2bjr66tdjVhohproXREaWXHUoBIEI999kgioEmcEjJwZ4eb7hjincsCyBTUlXlw7e2GQRfdVnOgEY4U6JDpwT6QFoBXSR2X(Zv)n]] ) diff --git a/TheWarWithin/Priorities/DeathKnightFrost.simc b/TheWarWithin/Priorities/DeathKnightFrost.simc index d5904abe3..c0dc6103d 100644 --- a/TheWarWithin/Priorities/DeathKnightFrost.simc +++ b/TheWarWithin/Priorities/DeathKnightFrost.simc @@ -100,7 +100,7 @@ actions+=/bag_of_tricks,if=!talent.obliteration&buff.pillar_of_frost.up&(buff.un actions+=/call_action_list,name=cold_heart,if=talent.cold_heart&(!buff.killing_machine.up|talent.breath_of_sindragosa)&((debuff.razorice.stack=5|!death_knight.runeforge.razorice&!talent.glacial_advance&!talent.avalanche&!talent.arctic_assault)|boss&fight_remains<=gcd) -actions+=/run_action_list,name=breath,strict=1,if=buff.breath_of_sindragosa.up +actions+=/run_action_list,name=breath,strict=1,if=buff.breath_of_sindragosa.up|breath_ticks_left>0 actions+=/run_action_list,name=obliteration,if=talent.obliteration&buff.pillar_of_frost.up&!buff.breath_of_sindragosa.up actions+=/call_action_list,name=aoe,strict=1,if=active_enemies>=2 actions+=/call_action_list,name=single_target,strict=1,if=active_enemies=1 From d7cf7ae610595b0cd6f3066017f5b524075d56c1 Mon Sep 17 00:00:00 2001 From: Hekili Date: Wed, 20 Nov 2024 00:00:02 -1000 Subject: [PATCH 5/9] Math. --- UI.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UI.lua b/UI.lua index 0fa9241cc..894c56520 100644 --- a/UI.lua +++ b/UI.lua @@ -2310,7 +2310,7 @@ do if Hekili.DB.profile.enabled and not Hekili.Pause then self.refreshRate = self.refreshRate or 0.5 - self.combatRate = self.combatRate or 0.25 + self.combatRate = self.combatRate or 0.2 local thread = self.activeThread @@ -2335,10 +2335,10 @@ do Hekili.maxFrameTime = 16.67 else local rate = GetFramerate() - local spf = 1000 / ( rate > 0 and rate or 60 ) + local spf = 1000 / ( rate > 0 and rate or 100 ) if HekiliEngine.threadUpdates then - Hekili.maxFrameTime = min( spf, HekiliEngine.threadUpdates.meanFrameTime ) + Hekili.maxFrameTime = 0.95 * min( 10, spf, HekiliEngine.threadUpdates.meanFrameTime / HekiliEngine.threadUpdates.meanFrames ) --[[ local mode = Hekili:GetActiveSpecOption( "updateMode" ) or "auto" From 4a7d5fc02873cff78b5c7e4516e14fe1b5c7e19e Mon Sep 17 00:00:00 2001 From: Hekili Date: Wed, 20 Nov 2024 10:40:50 -1000 Subject: [PATCH 6/9] Fix Envenom stacks --- TheWarWithin/RogueAssassination.lua | 13 ++++++++++--- UI.lua | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/TheWarWithin/RogueAssassination.lua b/TheWarWithin/RogueAssassination.lua index 82b427541..7acb24150 100644 --- a/TheWarWithin/RogueAssassination.lua +++ b/TheWarWithin/RogueAssassination.lua @@ -409,6 +409,8 @@ local death_events = { local envenom1 = 0 local envenom2 = 0 +local last = 0 + spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName ) if sourceGUID == state.GUID then if removal_events[ subtype ] then @@ -420,8 +422,13 @@ spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _ if spellID == 32645 and destGUID == state.GUID and application_events[ subtype ] then local now = GetTime() - last = last or now + if now - last < 0.5 then + last = now + return + end + + last = now local buff = UA_GetPlayerAuraBySpellID( 32645 ) if not buff then @@ -437,10 +444,10 @@ spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _ end local exp = buff.expirationTime or 0 - envenom2 = min( exp, envenom1 ) + envenom2 = envenom1 > now and min( envenom1, exp ) or 0 envenom1 = exp - --[[ print( format( "Updated Envenom at %.2f, %.2f (%.2f), [1] %.2f (%.2f), [2] %.2f (%.2f)", now, exp, exp - now, + --[[ print( format( "%20s - Updated Envenom at %.2f, %.2f (%.2f), [1] %.2f (%.2f), [2] %.2f (%.2f)", subtype, now, exp, exp - now, envenom1, envenom1 - now, envenom2, envenom2 - now ) ) ]] return diff --git a/UI.lua b/UI.lua index 894c56520..a0c371222 100644 --- a/UI.lua +++ b/UI.lua @@ -2338,7 +2338,7 @@ do local spf = 1000 / ( rate > 0 and rate or 100 ) if HekiliEngine.threadUpdates then - Hekili.maxFrameTime = 0.95 * min( 10, spf, HekiliEngine.threadUpdates.meanFrameTime / HekiliEngine.threadUpdates.meanFrames ) + Hekili.maxFrameTime = 0.9 * max( 7, min( 16.667, spf, HekiliEngine.threadUpdates.meanFrameTime / HekiliEngine.threadUpdates.meanFrames ) ) --[[ local mode = Hekili:GetActiveSpecOption( "updateMode" ) or "auto" From 0db5b6bf3f329c14bf5073a9a4f08aabf9cf6a5e Mon Sep 17 00:00:00 2001 From: Hekili Date: Fri, 22 Nov 2024 11:55:45 -1000 Subject: [PATCH 7/9] Tweak refresh --- UI.lua | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/UI.lua b/UI.lua index a0c371222..111fb7d9c 100644 --- a/UI.lua +++ b/UI.lua @@ -2338,36 +2338,9 @@ do local spf = 1000 / ( rate > 0 and rate or 100 ) if HekiliEngine.threadUpdates then - Hekili.maxFrameTime = 0.9 * max( 7, min( 16.667, spf, HekiliEngine.threadUpdates.meanFrameTime / HekiliEngine.threadUpdates.meanFrames ) ) - - --[[ local mode = Hekili:GetActiveSpecOption( "updateMode" ) or "auto" - - if mode == "auto" then - -- Adjust throttle to 90% of frame time vs. time spent in thread; constrained to range of 60 to ~144 FPS. - Hekili.maxFrameTime = max( 7, min( 16.67, 0.9 * HekiliEngine.threadUpdates.meanClockTime / HekiliEngine.threadUpdates.meanFrames ) ) - elseif mode == "percent" then - local percent = Hekili:GetActiveSpecOption( "updatePercent" ) or 0.9 - -- Adjust throttle to X% of current frame rate, constrained to range of 30 to 200 FPS. - Hekili.maxFrameTime = max( 5, min( 33.33, spf * percent ) ) - elseif mode == "scaled" then - local lowFrame = 1000 / ( Hekili:GetActiveSpecOption( "lowFPS" ) or 30 ) - local lowPercent = Hekili:GetActiveSpecOption( "lowPercent" ) or 0.5 - local highFrame = 1000 / ( Hekili:GetActiveSpecOption( "highFPS" ) or 200 ) - local highPercent = Hekili:GetActiveSpecOption( "highPercent" ) or 0.9 - - -- Adjust throttle to X percent of current frame rate, scaled linearly from lowFPS to highFPS. - if rate < lowFrame then spf = lowPercent * lowFrame - elseif rate > highFrame then spf = highPercent * highFrame - else spf = lowPercent + ( rate - lowFrame ) * ( highPercent - lowPercent ) / ( highFrame - lowFrame ) end - spf = min( 33.33 * ercent, min( ) ) - - - local maxPercent = Hekili:GetActiveSpecOption( "maxPercent" ) or 0.9 - local minPercent = Hekili:GetActiveSpecOption( "minPercent" ) or 0.5 - - ... ]] + Hekili.maxFrameTime = 0.9 * max( 7, min( 16.667, spf, HekiliEngine.threadUpdates.meanWorkTime / math.ceil( HekiliEngine.threadUpdates.meanFrames ) ) ) else - Hekili.maxFrameTime = max( 7, min( 16.67, 0.9 * spf ) ) + Hekili.maxFrameTime = 0.9 * max( 7, min( 16.667, spf ) ) end end @@ -2382,6 +2355,7 @@ do self.activeThreadFrames = self.activeThreadFrames + 1 Hekili.activeFrameStart = debugprofilestop() + -- if HekiliEngine.threadUpdates then print( 1000 * elapsed, Hekili.maxFrameTime, HekiliEngine.threadUpdates.meanWorkTime, HekiliEngine.threadUpdates.meanFrames ) end local ok, err = coroutine.resume( thread ) if not ok then From e38342711f697f5eef73b2f6ba4374afebe66984 Mon Sep 17 00:00:00 2001 From: Hekili Date: Fri, 22 Nov 2024 12:14:59 -1000 Subject: [PATCH 8/9] Blood, Frost Mage, Protection Paladin, Destruction --- TheWarWithin/DeathKnightBlood.lua | 2 +- TheWarWithin/MageFrost.lua | 2 +- TheWarWithin/PaladinProtection.lua | 2 +- TheWarWithin/Priorities/DeathKnightBlood.simc | 60 ++++++++------- TheWarWithin/Priorities/MageFrost.simc | 73 ++++++++----------- .../Priorities/PaladinProtection.simc | 25 +++---- .../Priorities/WarlockDestruction.simc | 2 +- TheWarWithin/WarlockDestruction.lua | 2 +- 8 files changed, 79 insertions(+), 89 deletions(-) diff --git a/TheWarWithin/DeathKnightBlood.lua b/TheWarWithin/DeathKnightBlood.lua index 44c08afb6..0acd174f9 100644 --- a/TheWarWithin/DeathKnightBlood.lua +++ b/TheWarWithin/DeathKnightBlood.lua @@ -2386,4 +2386,4 @@ spec:RegisterSetting( "vb_damage", 50, { width = "full", } ) -spec:RegisterPack( "Blood", 20241102, [[Hekili:LZvBtUjos4FltDv5yNmXNbNjBYwJ9hs2BRkPUBRRYKBZ3miBKhtfm4fWzYS1u8B)A9cGqOwGFzsYE3x2DILO7wpDR(nHyHZIpU4MasoDXV5oX9footChp51UoVy6IBYVFhDXn7iR(m5w4pIjBH)7BIsscy)69rjKa2tNLSpDfmYnHB3hrYdtIFBkzD(IBwUpmk)DXlwAMdoWJUJUc(5RMS4MnHbbuXCPzRwCdBUp3X55tC)5c)pqZYtsPf(V7n)6Lf()(BG)Zh(yX7lEVyAtEU7RHP54mEY4Rk8bj5Tf(73X4AH)ZyppzhnTWpznmyY(Om1hDYlHh9FrsttUlLghu4)3l8)hFnNMUnmMtGG9PHX3w4)lF4tvp3Kx)C3xz)5uM6e2u)DY2DHPHRk85yyJXV6N5sDLqxn2ReSX4y)0ZDFbm2h3aY4NiWY7tH5BcJxCtuywEgx1qIJi3hd)5VXv00yYYiAWI3S4MKDWWuqlrwXuzlU5lK0q2OS)kApLpAoSUZghqj5B8YYtd)m1BxssKhzBY(4C(Z4jmlAmNG9B3voNCq)EWS2DckT3Ls9Ozz04vT4Z0dMpooQ8zzsm1lBtinkWlLUoLMTXtmrG4V4Gj(WcFxhU5hyMhf5LtsVLMNnEdLKMlxof(pTWpNerJZf)(Yuk5Z00XsoXh3TWFKQCQsaV0DEbP3XKWR0KWvPHGXyiHTrC96XRsi3UpkzhGL3poLULegNv4F9Sc)BxfmEl5R1lfvaNr5xYOC5GPKWma6PWMFfUbZ6NSZ)as8kWCYlDpGY3bBitIhVFxnD3LW))aHEfkHwbgFbj3fBKyaYfCFn9wY2K5TEF69mA(6ZdnPPz00pdZIrtNjOeLrdaCl8NQlq5KD8NvF)y9ZEb4XjjFSy67IaTgDCE4QpZ9b9Wdf(dnmHAfk4gCsH)GcFoQ)fPthp(SbaNBl1uKwMegXLj9nQ9YcA(mUf6tRSJ4mhKXlKIq5U1K1E5BOcbX7p2tPXCXHTI6AEny20MmBKo)mSKR4H2ynO7l1OBnmrwMW9Pd)dVOWTl5GLU3gdwuyC76wlIs1foe3AtQMUt3)KMUZaOiqnRWY1TuTkOIQBiUiG7aYU2PCXlC7qIdaVlRi3lmwRhwX984SCiReayk8VIpHo2eRGJQBoqqBnTJcKdsalrKT8L7l)(TCHvhqYDj3brkcORdxfMl3Bm5XaoCndh5jBxcWrSq73H7))V15HbvahVWJY1swe7XknE629sTHGIHcxtwMKY4(KtvTLHf0T00CwJyD6zq4Gh)fXhu9UHHhK5PvxuU4rST7huy5uzjegVokKZdgKKLWQbOYwPt9dBBCTmUkjodW8YKFCXtmOhoYrsYRfgjtJWOFe2ITYoXqUM1MfHGLDo1deV0K0gwcCD3iC7b3os1WKPF3OVaigwLrTc0wNqDT3U6bLgBmoCH9NwysINFMPbByRoXI1jEkfTvUQPo30MGtk90bmQi4LANgkS9U5)KbPS(lSXH6nLvNecfmFpuFFznR(3WdibdalNBt4l58KcF6xbbGowvKRkFmJ8LsxgzYNUkgNYV2i2yJbmwScBrINWXfgcIQIyCyiZBfbkYlJtl8O5xyjETCFKq9KgUndSjZwba2TuflYtk4IPywT2zvjv81cEO4YAlktKPHH7q8mpUwXLaAzYwsnHz4RSyv5GUtwL122QMRWxw4rmps)ym5PzeYzyHivB1aUxn8OCIccbCWbF))0oIozYaSpzlEizdIKS70oIkDSI25mrwKetNIhQHnFW3enMUnKc0HrgoBfTQb2CSfIUL4TBvU30R47cUY04bHcDRSW8SK9rWodwlhRLXNXFwfJBLzXftl1tUHXU6SLLoDwVpIraXOEmzPHhs8c9ZLwUlzT1e4(F16o4l7Dt7o8oc(TUPDDu2E)BAgESqzVOM1W3JWGq2mQtT)Ehul04mUSTCNPw91OTC6oH)FXuFS06Xdo1hlTI0wnfZ0kNWCmyWt(vwkle33mZrQW7yMhKhWN1ZuP14DuTJ0jQ36uHWqIKXngFLTwII7v2QaIvGaAzFw6FhAuQHDeOQkDlHykkwAFuMsT1pcbYS3gWUuR7aPX0oEbiygBRZr1vKDCvLCD2hDuRIkoHkShBpj0mWS2frRaMqdYwLAjFPodjqGKKM1Yi6QJE06Z6uPwhB5)FcOwZsbS08mm8QMug7MpEM7x0HDq3B1vF0f9OluhBY0hsYYOUrRnEqkfq0GkuWSzodD1NN(1b(sd9ELsexxeaP2(zH)OdQRk9OR3i9ZTvhx(oOuX0yDCYWhRO9nO4n7TL5VUTYWsU02Yt5uR8t2dft5GOTV1ANm(rOxlwAwIviS0WEdDBcyrKfMPyyOTLZC(LnBFFt81sFsKDasKCHenOvzE5Y5F3jupVdGUwW06UeVO)1K9r5v17xzBgcB9bJF6Fs1ndo46NZ5oEHmkDgVHK5ThkLKb3vMUwh)B9GJAnoynSnKDAgSKL52p7tPqDYjB5NYqMwDJFu8KzQf6lPMNdNjzhxBiQej3oGrtJ)TEqDy0ThWyB8YTgVqExRcxBgXQ6YezlH5pusWDPHjWUV71cAuT7rJXI6HuwdrFr63q1(G)JSvBlYuQVfQqpAug7fmR(vAZutAkxnRVpLeX8VXoD1aWTZwwKci)fTeBzoI4qQC(15Akqau6u2Khd8wk)S3gZOKC1)TDyZrb2gQ6k3SwOSUvnlffFTs3RLhcxtRTY5XJT1yp4)wWGW)K9MAY5nVIOiEQajWdSN1Chj5a6N8fw0N6)D(gc4x9wE1LvwG6XN1al3Uah3JaCCB5nQBWXPn40ql6AQjB15Keg7TbY7tB1q)J9H72rdgJzo1Az1YMOZfYiuA4AKgMSuQwS1lelT)ZKDDxg1wk4OwxiAeSPzjLczdO6x2WI0lRGNtARIr)uv4RUTIJXglAZYVlZ(FGGVJzZKn38iB1A1l1s4lCfDjKqlKNvsAEy((aJTG(DYzv4)RLtRQr0pH9(VNteL4KbYaKqiL9s6u60JWEoyIS6IIFcmWgcZN2ViWRc)pWta9tCedCdM2(ns3F)Ug9XoNexvrvy8kwL(36jDHDLS0TWLR9kLarv69rXZNGX3nv7DfUps0xwEScuBLKuOus7q)nTOvhIR66dJlSdyXGEwOk(iz3JJ29YwQ2lfkCJ2xhHshkS4iHyBVceOWV9(JVHMMaruPYQilpvZByL(SI9On0jEI)2JDhje3uc1ZOS8HT3hBybFMyA5f0GxF2oOK(KTljTRqtulN8TWRwOwYFo2jTcvPYMO4g2mX91Jb(FhjngKkiJu(nejC7oawl8xZmeEISwWNa6sw4(uMB2SewJei7H00j5SFakKgwvzJlE))mKzDXUkoVnjg4gF4Nu65SzDvanzNl2t08RQm8qNVoQNeLByaGkn(28niuwFoNzYFcc(wsgyYCVn5UEkNxIFcsnZAIKhgbjMAtYBoTZptoHvWgg0yt2lNW5KWNG8YCTytCLJFgj7HlSDvtVbg1JhPbZNIWCx7(xAn8bqu7oampNZm5pbbhZfGXPCEj(ji1226JoTZptoHvGz3agMW5KWNG8A0rq7XpJK9Wf2E4SqNr94rAW8xGZ8OVezIbIFUxeXXmrCmsKxIkj6LPAqQmmLhrI3dYYu4LphI9GYWnK1Fcfn7uwnoLhrI3dYAfiAnCdz9vNvz9rL4Ds2JZqRNY8Xr8kY(ADYI2)PkY2zhQ0f9w84Ke9hvI3dYEc7UDM8naTBZKtY6(XL69HUhLxeEn(RtIIsUJ39gY(uswH)DuwJLGOXbSU5aeJnnrBfk8znIG17L8Y5fNWBqaVdr1ZoiGn5asozjjJ(ZfVVW)5f(SG)SVffVJ3xbg9FrtkZ6BWIBi7Z3KKY)6G8wwloswhYo1oXeZE2S)UYPpx8()wHF5zQw8(65u2f2lzDnzMelkBf7L8tyBwt8Rm)JhEyyZbAKr(dpyyqzEVghtjRsJJZZFZ4im4AK6iDL8s3RFxJRFxS1VHksQLN259BCmJRF98xnoI26V7K3Wx)ihI2Lj7MXpLyjG4Ez9jXoZ5YvjXbHmco7cSZTyGI0bjTnxXMI9VF4b0tdqrwziFyoDRqwXocTldxpZ2j6Y3kC2pAtJYj7umkxPom5Qn(ixMdg21bzoZrvfR797HhUOPLr5eg1PG5AwWC7TG5QU3ZIG50xbR6qh5swNNzQIiQHQ2eSrgEmx9hRnq3nEYv046z(wwZnZNHvOXOF4HkrXY50n3DcSWoc7ed7aLOr3RyxJRy3VhR4dWae3NZiUlIFuo2qv4V954WGE55knO9zknFw9Hio4c7Acrui9drAuZGfQJ2fRRoTWEXzJhrLIM4hTd2tfxkpqYUqKQd3RxislDrhivd5r9CXKX2vonTlfhM2mUVkZh4wN0tEaBni1fy0QIAn(925FG8YQkZ7OZBgzpzd6lNSKpVSN0XWBjQKcdDDEg(1C8PwUIJp1Dek3f3jrgqBX6b9PRUyImcWEMRN5Go567Qyh0JDFdzeSdF1KG7Xju1LmSVeQ0PWPDXcrfivZlMiHFRdhWveA34qd)Omy01ZkFpKTY6Y7qiFlLGynUYH9wWf1hy4AyWfKhEiT9lc91tVQdno7nYUmjBtxWLbdXUbHx7(uoBB)AKpFMZ4RWn8vED6TYz0BLggHvUHDmcZMv9fcCMdKyHPRb41xjDf3(6)nAq7l(38Hix5VNzzj3eRBdPvGT971xBiH)o5FT7iOKXlWWlO2wJ6ObOIbQL2CUohFDg08kYWxSOR2rdUqB(vJaRgHtrTXTSBP(MJuTxP5nVBWqdBqGeop(vR(L6YM1mUVzLjZDrC(2puDNFQdY0cph0YJe3KA(vd6v(6ZCMyWdrPAS3iN9noYBPMvFGZNY0vdU4yILAy625f3U47mSJY(Qlg2rXEt7rMnDYPlwn3FEHX7KMS8YwY11vf3HMSNrb3DI01UHBF21ZM2x)1ir4a)QTVHzvjf0R4F9o2VPy71vPBi11gPdmVEQQeUXhXUtcke2t63vSRvSMnLbXC8KtuxrLz4oN11m2FuFBWUglXN5wbh1syKv(8iw9sV4aY3wWYE0oPBY1vDqooDtJh9AGQz8HLDRjkyQQM6rpWYRQFWJVsifACWfbHjhQv4nfFAL7pTLeyRHkbyhzoqw6xKcdnL1dEOYz8yLdgkcmB9ZuQ0xD3FIsHas8eZkPkwVvm)TIB(SxQLwhgywP3mtORfPCyzTJy4Q7CZ8IqgmeH36PMQSgut)adHgGKyWOtpXelaY0NIGinYz5mkZNA2mDvBGrhBhA2K)1AlIUFBn6lgGPT6A3dtpOMJI5uuqIloOlCqybmZOlt99Fg3OXSRg2H63iaP1EdBBINnTSlWM)uTQCOjikQR6JkYQ)fJHCLT2XufZ2t7CGC506dElOkgzeUS7mSYCYoqny4q8VgTLBIv)o2oQ(WQm8eJqR1U9avgeiPOPFilTbDwAiN7EGIBm8y2(tnU2)oFQlUn6GewRGa7tby26dk7r61t4Y0Ov6p2vVIRTp4nWhFDJ4BP5fVzS6JV1TkbjJJdMZNAEfMKOU6EnsZRp6wuJM1ROe)5SxfeRn4GFN6w8Fd]] ) \ No newline at end of file +spec:RegisterPack( "Blood", 20241122, [[Hekili:DZvBVTnos4FlbhGRDBQxl5600f2(dT7TaT4UfhA6T9BwI2IowOYsELKtAoeOF7hFtsuuCiLFjP9oGfDDmPMz4mdN5zgk6fol(YIBcq54f)H7i334446o0H9Pf3K)Wo8IB2Hw9n0TKpeJ2s(33hLKeq)2hIsqb0NolzF6kYi3eUDFekpmj(dPO15lUz5(WO8pgVyzBo4m5A3Rjp6o8kYxpz0IB2egeG5ZfNTAXn05(AhNx76(Rf(es)Hc)97OKP4tfFQCWr0b)molpjfx4)X3)7xw4)NVN8pF(l1tB0RDFhzAoodhnCIcT8Ff95r7WPf(jRjdMSpkt(rhDf5r)NO00K7tXXbf()sH)F)7540THXmceSpnm(2c)F7ZFT65g9Ux7ET5NtAQJOt9prB3fMgUQWNPGBm(eUgOLcy01C2ODS3(A33qg7lBiY4xrKL3xdZ3egV4MOWS8mMDdfhHEiM8X)G5fGJrlJWblE)IBs2rggtmHOvu75IBUdLgshL(PO9y2O5K1D2WamkFJxwEA43WE7ssI8qBt2hNZEgpUptJ5eSF7UY5Ktm(hmRDhbs7DPypCwgoEvl(m(G5ZBLzZYKySx2MqCuGxkEDkoBJhFEeA)MdM29l8DDyEFKTarrE5O0BX5zd3GrP5IvtH)ll8Zrr44C(3VmfJ(goDOGtSXDl8hilNYeWlDNxq69ujCIIeUknK4lgIOBsxVE4Qe0T7Js2ruLpmmfVffgNv4pDwH)TRcgUf996LIS(Ms5RaPCLlsg6oS3sQBTqdw43RWNXy5VD4(DadCasel6rA4o(q)7mIw83OJt2LiuQHKT5pqczvUtZ)gHmfsyWTjSnZ5jf(4Vt2qIhsxJVfCnErP4w7EqwgkYwM3keXHjJsQRnrQGKCXcFxeXGGhMhU6Bmb6Xhl87Rzc1AgsaUr1QVau8kYd6LUNix3tcWLeZuVdQfnoDwMegrLR3z2brp9Qj2Ue2)NqiNrGuAhoxlHOe5omt4HMsdpGX18DvsCgzFEfZvdKvZ8(LAgM3ckoWlaVc9axRi53jziZYjP(k8Nx4pHnHvKOBbj3hBwcNtKq3js6zcfPjO2Yeq1WD1ciHyHRirqVNMlIseNrxdVTZrnEwNmySLb9RyRkNAYlh2GrE1qATD5BRivL2QXyu0siOW41rHSh3lzTxwcnZzJicM4xlXNfvQC0uuygjFaMaxrsaOt7TYtdTmHLCMkcrHBxQoz4TUeFRlSSXdEv0z3pjheczwhUkmN7OmE0b7EwZr9H(NZYS8snrBZt2UK4ohZ1ZwcBaq8zkuNjnskXYu4ehH8nLPo(R9ymxxsdgABEny24MmBGk)GmAvmYQg9kfoiTvO9JYG9ahMSuQUtaju4xx6g1nZ80A)IMbwk8lbJmSlqNQDumOSl9uBgBwnKLlCW5YCFLHkRt8Xnuq7nMkTAarOzyZdXpCKKzwMdn1KnmPBRG1ZwwWH0)XUS6XCWn6U0Wj)4w9W5H4P19WX4THycPOP0ysfhSlrzSf7LN4TBvU34jSv9eDJheYtxjW)qk3mIOjO1SvlMVI9SssP0SyIjC(mBHT7Bmq50wHYeq10AzOAZklRgO6172cjYtoz5Jjk70gBWyXVgyyBMLeT6cRu5dyklCF2)jkirc4vD9i15uQhuKGJYHlm)08WYWyG1nyJewJGbe4cxMsBJBdKmaHVHlj4in8ufuliG6dvlxzlSBamCLvBOBWQtel8yxVpIULHpQhD3xJcUmu8GlmmGULTsX6PGQFmCUYUGLDmCEhqizDbpwhxAMkhymCUJts0oNqf1d9lx4XTK29lsm2)xRjsx15M7C4noQphH9ZwZDoQCB6QDFsNQAcouQf3kuWdQrqwVpLvDiC40dIM40mCknBXcJTAHh1GgBZrvGYr7wu2oKYr2t0dKhDBMAfHWXL()NEFzOLkhCZVm09dtqSMPGUsFgwsWTjWPdn0VekOcosXmpc42V1cXrJbbr(bLC0qRumYzrwAV1PC6IIeTfA4eqwbd9Z6IuhMlWmYowGtX5ehc5(OSgE3GnCWrV2ubjVdCOcWco6BPMJk4V6K7bpv1KyUHsgny9H7ukxjO3SwxEPlVkIkC5w78mO3O(DjYc7b0Mjdymn0QP(v2b9YWGYAHvHtjpdHIaa2LAGLgT20qVC4DoP(C)KQLYsP7hRwtP8C7nexv6g88kGWPeGmO1KQvhBn3qIlS4OApmO8JUOlTv4iXV3D85Id9XS)pq1hUnW7zP93huf0YEcJB1PxZTDvjaqaPaJVjAIdCO)dWzuARmqT9WXLF2mQqwmBht3rkANV6fLf9ghvGHI4)X2M0tR)NgAUGbaCNHEUWBDGo8zn33ogoE4pjDQAmCquJQWsh7n4TjepISWmjhdLTC6HWt9)b1VWyPfnDIJ(rOnWvqdDz83EblZTOORfSwn0QXPBkj2nS8So0SgTpkFrzZzQCHdjrii7rW)hSAuELfT9MDKZIptqg7mCdkZJwRm1Qu5HBC8N7bh0ACItZ2qAp2PG(zUz7tXbe74wwVVZKB)I4X8CyultPE7VWhLvO7H3ZOkrY1IAu34p3dQQgDpk1ORqnMd(cufUwVgRQLGOTiAytbb3LgMq2K(q9BkM4tE4OmYF6OK0PA3NIeXl4tAXfDNiUJSJd7lPQHwKXPEHPgeHl3RFiffrdcspi1asSPT00jeqovRw4z0eFmnEgtLlMFfK1829PRkTmxmjAJSOKC5)UH)8)IRnd)p0xYrMIMvavelXCsCH)EAdMepmrNLChnxq9FNVbrIYDlRyuX(fZAFhjTFF5mk6TYL13R4jkfYxeLV8ONA6nxopAk2ClVIxgDu6QO62k2JDr1PLOQAfDvSIU0fJXxYm8FTpC3oCWqiFSwRQwgiRRJbG0Wvln0z2Aa5km2BdbwB5IT(lYn9QRzZfZqviQNyPUzj4jFQDeImhZzL(5KCC1g8Psb32xP9o(CJnX2MB)prQVJzZKPy3DERMH2JNJIRQIjmEfT66B9eriMikxkC5AVYGR8kJ7IELnHQZXNbaCOYB3z4k8scSBcmVK08W89bApEGpkMvH)VxoTQdj4f0xP(CeFjKr4ib2kM(cbvkVi6ZrMiT6T4xqgydIgR)34cEH)NzWK)kt0jPhsB)sU7VFh)mgGBcuxuI3T8y1HT1sQ6XMAzMWcxqvxewcs(Juy1yWpGfcJS0t3sJBa3s9f0UNgJ)LTS8xY9h06(v6taxv4gCAcjhlwuSz5rqFdTcPv0hTXQ2J)zp69EGF7hKpq5Yho34PNqmtNjMwEPly1NTJu5FY2LO6k0k5(s1Q)eV9DSNJES4KIzPJkUsnJiXMUhLgtKjcml2D(iC7oIoTWFnvr)crLGVG4)rZ)Nsd7MLq72aApbKokN(fKQTjRPSHfF6FesTE0lxZhsIj8In8lkJK2SQkcnPhz4luIZknCFNVpOJeL5mtuP44BZ3aqz15CMj)ji4BrzehMhmj31t58s8tqQP(sO8WicqvtsEZPD(zYjSc2qvnMK9YjCoj8jiV0alMexX4NrYE4cRTk61WOo8iny(yaM7Ao(sRHpaIAoaG(5CMj)ji4qHa0oLZlXpbP20wFWPD(zYjSc0hgqZeoNe(eKxTbcAp(zKShUW2HGfQmQdpsdM)gyMhDxKogW)6oreh9eXrlrUcusulBvJuPzkpHeVdKLAWlFoa)bPHBiRVfuBAvw1oLNqI3bYAur0A4gY61Nvz9jL4wj7X5O1rz(4iEfzFNkzb7hvfzT2XkvrVfpojr)jL4DGSNWUBNrpdA72m5K8UFAPExO7rffHvJ)6KOOK7z9BbTpfLv4FpM24gs24aAhOieJonENek8PTHG2VO8Y5fNWAqaRdm1ZoiGo5auoAjkd)RfFQW)1f(0K)0FDj(iRVcu6)MMuM23Gf3G2NVjjL9JbYhOn4izDi9m74tm7vZ(fPZEU4t)Tc)YJnT4t1ZPSRSxs7zYmHUOS1SxYosVzn1FL4pE8X(nhObI8hFuZGcCVAhtcvP2Xz430ocvDnqEeBGxSV(D1U(DHw)AQiPwEAJ7x7yAx)Q4x1oIY63o4n41pWHQDzYUzSZiwOqCVS(SEN5C5QK4GqkbNDb05y0ts6iG2Ml5tr)7hFe80bKK1YlhaxwHotTldxpZ051Y2kC2pXvTYj9mmkxPou5QT(rSm7132bBoZr2eRg97XhVOPNr5egyvWC1lyUDwWCL37zqWC6QGvDKJmjZ6HOkjIkAvtc2anpMR6J1wrBxFYm0W2z2ww9habvxbMJ(XhRefdNB3C3rKf2r4NOzhOqByFf7QDf7(JyfFaoGWXCgWcr8ZYP2jR(BF2tuvV4SW61(CWMpR(up7DHzlbplK6bFnOzYc5rTX6QZkStCw7XQjzj(z7GZK1lLh4Nnns1bs2jnslBHfnvd5r(uXe52LolTl5hL2mwSk9h3Mv6joETgK6ciAvrTgFFB8haVrRcChwVeRDKnGVbZc(CvhPJMxLubf67o5vW3i1xA42O(s3bGCNF9rPkAdEpGpD9TmfCk13uuktSe(ff8amHQUEONkHkVQOu6qFSPZCaNCz2PS6WgN2TYeKtYoGujd(sO2JzQuUaQA(sr6QPZkFDMnY6YR6jBthNynUzODwW5vqO52CWeKhFmT97t90XtSyUOVH0LWW1Dpz6bDvpN6(scxpvQ3(vzF(m6RXoezLEJ(Tk1AV5Eqew6wiwPRBFVh7bAdM7yuDOqE6SQVtMZCiOI0DtmNorKhPTKmOx77E58(a36YxnboqvtdvFqnAFZxTY2AC2ToyQ7as9UxazoifMR1dOTxxPyaBay(JWRt(UPQlbeBXcUAh07cL5xncz1WJORmUHnY13nMkxRMxVWE91S3LGw(4xTnzzFn8CW5NPQ3vot7qHt9jnzwiZZ3E8QRsvDA5wgXETIqZ8JNpPxNQWzMZOEWEvDwZzE3Q4Y)zmNW8XuBvVlog0hAMUzEzjvWZIAhK9v33UJI962JmB8OtxSAUd9cTx1prb5TKRPvLddcpwRG7osKprZL6B6SXDnjbqsBsW82xCVkqsWexkNENXcPdRtDFn0a2Vb8O51tvMWn(f(7KufC)j1RG3ujVzDqQMdJ7rEfvcVEoTpJ0puFj7McbeCUrLthwSY1fkkN8vpDLe2joa8BZyzJVhzNC2kU8T2jHP6kDoh1vwZy19aMRh48xxfSK8uwsLcxTxnLUhT5MwtWrBnuPK5iagPpxQwd2b2dG6huPkhliVT8RdnjWUwvICw5(a5fhCQ5LDN0f)NgHMDgDTUNrncObvApw0rhyo3Oka7W5Tiea)6q27aORU(9upkm6W650aLtFtW(GKld26tdeK7eBLuO1sDOGqNXivpXA34pwYcuq2)HsMSkzL80ZOgvqoJkHRukDcEZaNtT)9iTtA7PuZI82j9aDasD2ZMAH7qqdOOBL8ZnK2F0YzVlmAaRCJoGfITUkb0uPJU1rwWIaeVPpmqf2wwsw3dgoFprK3w)CatCohOvI1g6U9USYdUbiME)(W)w9wgLt(x53b1hBQMNyaypmApq9zOEsrl1N)5hy5vqG0evwnN(ol0X6kbbq1LiNakwTfEPfAXZrBo0dN6hzhoCNWU6Dl(Vd]] ) \ No newline at end of file diff --git a/TheWarWithin/MageFrost.lua b/TheWarWithin/MageFrost.lua index 008bddac8..4b03465c9 100644 --- a/TheWarWithin/MageFrost.lua +++ b/TheWarWithin/MageFrost.lua @@ -1679,4 +1679,4 @@ spec:RegisterSetting( "prevent_hardcasts", false, { width = "full" } ) ]] -spec:RegisterPack( "Frost Mage", 20241117, [[Hekili:T31EVnoos(plblGg7jD72soopwe7d4gGfyBC78pzb2)ZkkY0j6ABjFsYP7mWWF2psQx8rvuusoDpZGbdWKosufjRx)QQ4JSYD1)E1dRdYjR(vVPEx566EZe3PU3EL7QhYFBpz1d7dc)sWZ0)rCWo6))FKMKLF6X)f)r7dEBBsWAgnYsoKgsF0l557Z(7F6tphL)YHNMeMS7tzr7oSnipkjomnyto73d)0QhE6q028)z8QNKhatNT6HGd5VKKU6HhI29lusgTEnPODKSWvpWA3hDD)40zF40J0F6EZF)0JSME6Xd7zK60Np95Ign9JtVM1OPF0ZT8N3H14P39rVROV8xs2rOZWhYts3j(YPmkW(5Tf)0ZdLs3k(Y9PrjPr5VP3SBkgn)7xiNE8)eKs)FuMwu8Qh2gLLNX4QHBjbVs83SH(l)kxwrIdEAlz9Q)B6lPuLKgfqLdPKx9FoC9e3jB2EinL2xhpY656hhMet8t24hMSDnL)gYKgukWMQ(zSz6QCQaaTdE6WMntIcFZ)vsuC2Kd7p9OZPhhD6r(lwtcYFjZp8LOTBNKLtvyo949NE82IrbAtwWBcLoxC6XIr0KnmTRNs2Mpjk2FZ2ONFHkjgZBKYqiLSlG(ZtpUSIk5bBjX5Y9u1KPEgx3bS57m057i(KtKTw9DACw(B2eLs8lET0OnIkaZkMVSHkDgpJ3cfA882GWOGT(z7J(cP4TJmtdSUGY2NZFB4lbPptY83Kwm1d2Yz4E0UxGBWvwySIRqzffm6O4N9)Aum9zLSwo1CBivAWBm9lo3GrW5M1L2qjiJwvFI4eWRs56IAHQi1ReQf8PWeQgDYxJLBsT2Xyjr)VrI9tsFIn(UgD8v2Lmlfsg16ioyFtx6i0JcwpsQJUtLBxthd1mt83IwWMauNaKyYUisLkGOrSGPnDMDtBwXYAmlQ0ygjoK5kgC7CgtgDmQBxY(Cj2UKUnB8Dl64dIJLNEG4dW2KupeLeWAhITaKKJhUshgDL(IgoLCZz69tB4AzVeTjNXW3N8vskJTDx3fRgecUtBX(S2RgzhFiSJXrk97JOoG4L1fh3c2vqzVCrBUi7OwzZWlkK4VnioSGtWr90h5cJywRuXkQT(c2U1V4x8zW2fG3(fblTl5vcJXTI9FpqFCqcHf2Z6odN7iIiiBRXyfLASYyrn6SJ7bKpiaufaJqFMTFBb3x26R2EQD)BRj8os61LZnN(JdBgIDSqSjKVfsYYeu(aringSGzErjEUnEwGTiQzgTG2bgvqLmBSb0qC4)rw47ccZRaarUDfsZnSO6AE4LfF8sl6NX2PSx1rwjuqnPUWyeLvDZFsHSmRizcMQL4(oRrFykkd847mbB0IQLXrJ54HBjQSZniicy3T2G1PgPrpG6O4C(zzMr5SooBO4N1ageSwGGgkjGfbWdyvb7aO2DnqsPwK9llkExpfSz5i5XbN3Ksi)g75IaOftZgWcmfhrnakziMr3Ah)2I(XI8mXGMWDOyu6OhdOEfdAP(f31E9lURYi1y9lqcm(ArJrX4YKnhVrSzpTn63(TG01kTXICQmcEFUs84D0HERzSO7bflIFCFsgv2H0NDTYgLnPHYI)w5ryCYRbnjB0MBAxvBPE4NM(4FVuBrK6y1U7NrgZGO2c(P0aMnj3JxTM4zj()2aYWqPC6CPDW9E(9n4kCFYMcUspABr8s3Reejz7FBxqg)7)k5jvHIASvxRyUuHEa4hfCq)xPbasxtGc4aosMu0qOBPOrvvLUTqRTPubDeh4oR8YQc70dVSSOHBZnBBorARAYxnSyI7RgPKsZCfsHMHEFc5DuLoocYJQ5Auws(lK0DrH0xtvdvSy1OfqUv0giaIBQ(j4GdDQtaIZZgV(DBz5oBH1Axq2DFz5WrxmYm1DTczkPOj3O)qh6bRFZkBnVP1LpcJuAUOXlblELkSklpP5SelrEsBOwOqjeIJwkpQQejjB2WPEbfaCgH3PIH(IJRCE62Ip1MGE4QK1Jl8KGSeO(ktOPTMBJPvJ5cSWybExbEmIDxBluJHm9uY1PxXB2s6F4idMeOcUd1saqcRsI7jz4aZCT3KQjxrCuc8AaY6hzlFr1Q80GxjB9ZJ21RYbQLcPnmvWPgUpBOuCUQtEU0GHTiidKeRX912gUHdCYA3GhkJ7nwfFPQhVEeFz9VzmcZQwnznLomnaTA)qd6i(lwLSonE2TjeO1vL)86qI0ecYtEJQF9rC4HloW1q3fehmzFyoNFmdFpxiq8G0Wak5jFB)2Km2t0YcLRqUnitvEFJkBPWyuUr4OGDqi2AD7Sqiwam1Iu0aUX5xmAah4mjhvQ(gMGSW3zlsYCE9ZOrg8uqJ1PsNZ8TUDljuTdK2xc7Istts9J2X33LsTtfvjHIVNrYB(2xdOSNNyzx8AW2dK6Cnrwy0cVRJKKCmaP4CP2urKTrHFXNo9HEjAP5B8DZIVop5q4lsjOXC73ssKoY1MHS3p7LGC60PbcGoXl9xkU1la87ynlddSrQNOP6d4VP9(GLPWp368(sQc8mXgckgfhsSOdO8yQju4kJ5BaASikVyA5mCPgMSgymLghsjRHcKcmsajhx1P8IN9HkrUxUIPIb0MZ2WWBcoSv30lm5aNLTNWINr3StORTcpoCDgKPOw5DmOmJWDYYtJczUBAgjPhIrhiLLAYsS1ooCM1RHtwMz43(nw8aFZ99Au2SlRnAE0l(wbEt)gqfCoCBbRgq)XXx(iJUZh4aDmOqWOrTcObEqzTao0J(TqvepcU2K89Qt5QB5v)ZUUOGoTSPlTE9ah6QamYYnmOnPSJ7qVQ(g(PKawiNoYv9aUIOEEcLuqUUT9yR5z3s7ZhAQvJrzF0mGTKxZW(pB7fmJAZDC7DzQa5MQv)TWr2yWx0qwMnafLF8lEgl0kJ(ImWGDRwRJKScDDffD2MUFE1jBlA3Es6gAEy(bzHK410z6B(zK0d7eyb4TXOpnY)3HO97jRvwy7kTDdJV5tvwZcKvp3RgRLIn0)UB2ub)KvfxVUl5MzLjvW879cjn5qMFEAqC2UigADdRcRbg9QAy)b452bz5thOPdXmq)sCYxP9YZIlTM(7m6M1uhc7pxsWCNfCD3PZfiKGqlLSpjnxCldoZtyfmnP6xsXAvbe5bKRor6CNGmxwBsWZV8Zn753GU3CZCtPTqHYNZQ4t1u2KPYLfMkl1iGa(X(e(pbaoyN)00O9fn7FfeFGDQ6cFji(zcRg1j7OHLrt2EX0pC6XV(su4l0FND4oZI2r7Idze2KlV8HbRxNqJyjmioojxkCsE18PmKPtWZYXdkCLUJcr7fMf(UGVXlPGNO3(YgxJ3u9g68WNs3DzkE7LGeEABscnvJd0bgeMqDZOknK0VqbJuBMu(68LCoZ))9W6N5idkTv(i8qdgM37QTsQUEmCmAmY0WeyyrYnnxmdSEehm2(jQphdN)yen85zla)JC9UX9ybUWZCEPDl5mYkDp0nTwRHM3TtLdMFzBsc4JNE86EVFXAB9bAFBh9J94226YSC(2E0SxkRnkmP5lRD5EyPN7J6Zw2qgwrO2QM0i5YjtNvSXdBP7LA2aYQIkcCNPuwQE0nEE6BxK6DsrllGApoTpiPH9DBRItF1R0Hm7ReUOo(AqktFHgja)sSGMEenCvQsAcnUYFQUSQ)etNMghAkJRMLWIUj4qEYUGC2dkIFkBYPp))eftFLh)o4iM2B8x)taAmucMNa)QkXhTjJC)24AQohMQIAUkufAt0Qs1RHPQOZmfQc5NtLQ3Ir1AhGAevBpBAjn798)0NbK4cvmTBYCx4rNCXnvgFWv(uDEJOnjTOzkegCb1uP7SVV0T3YPcQE17g)fHYdMpGq3b6faHQdYYcHMduIH4zzqsmqB2ILO7SyUoq3EiuDGICeh)9MQyo(6kmhIH(a5H3CMNTgP6GmBqOzVnBqvU7QG57QY9GyHF3rnvotfkKg5exyP)YbQIIyMpqPgIxyPiZvilyjj0KCimyXTzScDH2GYAKfHlm8XlcHpdQAUN7yObDeuUrG6MNaex0NHj97x8yVFcQ3Jismcf8(r5MTbdGML8(JXskwVJuuiO2ovXs6nqVH4C069OJo)uB77ypvFNKtI7dinUG(weYsQ(7mzfsM5NbU6DVdug07A9EC(S4FDW5oAi06EA1Jns7RMec9gOMeoE1qS6F)qbr5cdYQ)pIyRiuEWwciy2n7JBfIQVbVTKIkB8BnMqa02cVfVkv1FUBovqlXtpdNSmk1ZDwHGZ46vD(SmLhCu)O1HUNZzZSYb68dJSslUJMEjWc)8DGWN(8)Kl3zKZ1T6y2F6r(9(n99SfupztuZfcq2KAi2lx8j1do0Ppd1kXJmeClQobkFGTEplekE)h4NiLfqEACUyKGSUa10PQHvWEoaYnNghI1qoJpEe0nPZfa(7TCoSzJ8OxMY2qeHZltjPCN(ZGu7sVz)metcUxQoGlFiAZc5fzE5cphnpW1mbfVNhpQ(Xxb3F8wZgM6D49lMX0cl)kABfpqmspxzbcl4qHRZeBKYrzOOnfLE7df7d9fUSXaSSgF2yI0zzsK(c7O9SwPD9Iw2JrUNdax2U(RptNfETlPenQTOd((yCpcW62QUzSvtyBKDwriRekc2rtk055MtnBseHXGi8OJHnSYYRCgTh8E854X9q3Hp1(kKAQPToZs35oWtOXaZNMEInBgn6I9WxcphpwrtLIbp2r6BKc)G(r17QLXq9UOJtROc8mOXzO25VWzeY(f5(7oEe5vlUZ5IIUzsnXBUFCg7aV3rwElKInOkuTmZ48MYyb0UKe(QxYngv98ME84iJxRnlDNckMk2dsSbBTGWrFt81mEveFytqOUQAJ0j3zxaCLWizi1kD5cYbtzNlq2jvqDP8ELJ1TTEJYS09kR0WBSRLV2yCUG)AL70eLNgvC1TP3pstvbRjH952I5oJQzEIQt170TJhXyrGIf(NXndq(SsdyL74LApCIt1sdALzF31)47bRgET(w664rWlULLcxAlOSHEXeAXqrnCLRqnff8hJasybMhKBjTqMUXKImuNaIvxvPavS4SSHJf3vKytGUJB44IE)l1i1WkU)wuWNLlC9gdmzT0hm6UvgGI1QDiADlM2jYjfjbCdACJbfQjkU65hdhuBQ5ovu)TvrQa8kd(5H3x1uywaYyP33U4XfOxSY)w)uwq6nnmx90CV1K2cKOYAFf08zPTV6CTu0o8J6hqeK1ImMQwswMJ0UO)EV5M7lKZMfRJqokFuLD9Uz(uHW(09Mq9yqDT3fcoBAPxoTtcivP5V93QkCv1KADIpYmXppi7lFGnPlPurgvY9Ml1DxHnCy6B7ZPzoqFk1IOSpQA2)fVj0(HAJYvWIjFJ2BH8k09mHQ06VoQ6FQ8vKu6yk3NDtbTjH2cAGrrzSn1CTh67hv6pq2ELgUaj8qoHJAFPBvvFe3ssJnlJ1p2H46r3752l9izrkN(aeXdfVX9oq1a3PZl)eKJM4YfZ8gx6)fWOG(1TDmeX8QFNgxT405Hm3MnhBUr9MsJjvSXlNXgy42lx66Tu6dy68S)YxEgp2FQtUg)NmcE)0j6LuYt9BQh4g0NkpJF)S2hxFw(GSNJIFn5lSBhlQakMI5WiEHIg3MGAEU5qwLWG1XYpU4mB1j6s97tnhPgDu7KSd72v4dSi0ETxvsFzA3CUd1EdP6OgQ(gLtxOMqjQ8afQ(c5ZqOeGsvveVulr(9QhzqPajLUrJbjxFlKbESKlU99OqgsJ5A16rJ2dCAevJLwSAuo6b4WkK7y8e2Qqr0(gisD)Ch9)uzUqm2AXjIO)Etr54Ik7ec(foUQYHLxtQcIDQGdlO)eGHmS7ukqGflCQXAgrFnEYbQHXndEmArGTzDmYwvnx2NHWHmeD(g4R0FoGI9LDv5th3nXR6xdIBj2O79Moe2Sbxp1wMnQWyLzcrSatCRs5WXq5F7GsqlEwrmISpDIQ10XcV)ArnbRKAB2voONgCN298Iv2l4Xq7j9l9D2vyIbuCyXEZq9HRp52wvzy5Pq9FYeaFFFYW3X0zZgky8LTqZpEnYO)35yaVtf344XgXp4HLgHBzjqVvoxSRSwJAk0QWEhbp4lS48w4otyHxTGuEab7yFrGW9i3cFarl1ANSvpJhh(B(8R9y2av7gswQoAcFv9fDSGIgr4krg9JyowaFzVQaUh8us5IjMpZkVFJxot3GcMkfy1SlVy0jdxalYxf2Xa9f(czH)hJ1jcPhOBWF)8AYjThBOrq9(GckpOna9aVqs4Zs51qhAorZCboQqyRp(eYy(aaz8C)8XOdrDeSrdgctc96s3PTbGHTTrOYBewgOgi06Smgea73nb1dlSWKvwGv218Lq7lBrdbfCODNywYY93arESyvv1mnvbLuCd(xWs)4HLoxvtRIunWoW1fchEzek(sPRAL9HGnifwxOg4LJ2ui2vu)D3LrxQrg2YfCV7v6l2qXFeib6mOCYQEhaA2FwGk0NS6UmL3ipOAZE4(NnfhfMxzqreGZ1owsf(UX0cZFZjKvrLFufsPU)LcfSsK7ZVkPDGc5QjxnT13s1S48vkI(hcN(a6D31Z5lRDbHe6cT0EA43Qtqjt0UBoQjFum2WsVU20XOXg7wCLeU6xV(k(L91Q)))]] ) \ No newline at end of file +spec:RegisterPack( "Frost Mage", 20241122, [[Hekili:T3Z2UnooY(TeSaASN0TBjz7ojlI9b4SahGTXUZlzboVzffz6ocTTKxj50Dgy4V9LK6gVuffLS9m9dlgGjDePkwvX6olQSYB1)A1tRdliR(nFx)zEE((t88DNnB(QNkEFpz1t7dJ(w4xP)JKWD0)))xwAEXPN)N8hTp89TPHRzWip9qwe9rVwuSp)V(Pp914Ixp8YKO0DFkpE3HTHfXPjrzHBky)E0Nw90lhI3w83tw9cmcmD1tHhkEnnB1tpfV7VrHC861KYPtYJw9eB6F0Z7JUt)WPNP)07UYF67)xp9m7vo98H9miF6lN(s5KD)O7NztY9J(Ev)8bSj7(Wh9Nrh8VLUJqj4NksZ2joOldcSFEF5pXxw37fhCFwCAwCX76t7UsS5F9k50Z))Hz0)hLhgNS6PTX5f5mMC0ws4BKGnBO)YVX36ijHVSLSE1)lDqkujzXH0TLmYBbFnA9eVjB2EilJUwhpYw5MhhLMqcs3eeLUDnLphX2COqGrQb5mkDvbD)aDbE5WMntIJEp4nsCs(Kd7p9SZPNhD6z(aRjHfVMhe9A82TtYlOYpNE(XtpFFjwGoLf8PqHZnNEUeJMSHjS9s62IjXjbB2g)1xP7eJ5tsbfYi7cP)80ZlRHsr4wssH8kvtmnuCZcWO3PO07ioXjYwRFpnolFKnXzKGYHLW2y6gyEj9YqvkfpLpdfy81THrXHBdY3h)ns5OJmddSLGY2NZhn61WSVsYd2Kvs6HB5mCF6YlWn4clmwXmuwrjJoo5RbFpoH(SkwlhAETGkl8DM8fNBWa4CZYsBOaKbR6xrKa8RfUUPztve61BQL8POuQeD63tKNsJ0XyPT(FNKeKM9cd)(mk(vTKmnfsov7ijCF7s6iSIcApsIJEUYZRDHHMMj(B5myea1iajHSlMulciQelOAtPS76slwwIzrTeZiruMlyW1ZzmzuCuxVK96sSDjzBg(Dpk(bXXkYoqcayBsIhI7eWshIZaeKJpFHom4k9gTCk5PZK7DB5A5VgVPGXW3N(DsgJT9q)3wnSj452H(zJvnYookSJXrQS7JioOyLTXMiF9WDEbBpOAPUPl7K9u0SfhJJibBdtIkzhCxF6ojeWy2SuDy0OcgUDBq5VeW8Dx6bpOmaQDPVryCVvS)7PWusqEUz35wBbcYYIJQRlbrFiNxvaWctBaQiqoBf86d4U2I4cy238KDuPAJdpsLFs5Dl5wz)jIdIh7ZMmc53zpNJSRj12dOeBL1DhCLsrLikyidp2cxBxNMyyWd5q1dAtusY0kULgR8txXQKgUIJX2TGCJpVXbFAIum6tkI3rnuetTpXr3pxgIl9HNE(JWVX2qQ8(HCM4Zs(lqNhJy2f(dzREjPVf2eceq0rYg9WdNWOeSU5x9i27i)Hh6o)HhQDsym)bKW)VxK(ftfsMb8G40EzB8V)7HzRv9mG7ofWZpC4mByyBBab3wo2sWyhGIVvpKHUC6kfZWzgjiKeoIAMa9ukmsjNW1VxVvIhpGPOk96i51lDagybsGBx1Obei7zEZSkOevZEdiOe6J7DjggqveElK(d6JNWiJ89H7KScOin2i80TH3rDA7Lp4lzHmRcC)snc08ri)iIKNlkPHKMm(UlvoAyK3iBOqdKNwmlQfKWCTggpe2aUh9(AxPsZ3OPftQ94(8nLyqzeya7xDe3L3mHPKV)9DuxUmi)DYlQgOuRhcE9gmHgAwTKZHrUKg4EQhHKMoBD6ku0XDh28fjR8Rqc5AG0KZs8YsywVUwPHQW1r(X1fGZOWULQ8w5KuYZeE9d6001L23joswghvNU8uDtnaxES8W7YN3zLljvMBgG15EKr5frtAUcOK9oiOMpKKThvRGICsdQwyIZtlELKTloIomvFrXiJgSaePUrkAYXgQWRrF12ViaX(BJhW(DujxSuDAnoCzpQeC)SgzM6UeGuLuKKfYPTnXGU018DlHZiCqP5FzmAmS4ERTQ6is0SelrMOnewguHuWDWlJv1BjPB2WHEjeamgHVOI1ja3Z4LzzlFvB8vWfjBWlCpAww2)zgtE(CQq(nyrudmwzGdi6DNrk8cBoQkg2Mu)4bNZTPnubZHAPKj5RsI7jP4aZCTxLQnhBCVe4H(WwhznFrXQISW3iBdkRv3aQGaURfCMkiPzF9qzLICwVSCP5g2IGmGTU4HBRTl)goWfv9o8qz8UZQ4lvT4nG4lB(nJrywpRjRPWjKxSxU7P2Lmm59aAGhjFZCKyvgdOX0UnLaDux8N3ewK2gHmdWOi4q2s8X3sWLs3fMeozFubNNmf)SWfaEywuif8KFSFBAo7jfQL5MluYkvUcjFNkBPuHuEs4Ec75gzNhMRfBKY5kHStAW)XLFR0G)Gl0EP3uR2mLRCkYUzbVOM0ieEjSvlvzXz2y3ULePUashx8U4SS0SG4D8wKtAEQExsP(5ZjfTVBDI3S)12dKMCoZ3VT0(UCoFos7zmxsjfqJMVno6BbuchAq0dSP16nlc7I0drVkB1VJCifxcY(G8xdlOKWfb)4CQkdT11OaYsv3mywS))ANKYTurXPIteCdreR4hyxrkvziYSznqXEr6NjVY80OW6eDVsHXHmYAOqJa9T3YpetIf3ZRkqEuULJedrTG1EMBcpSvxjkk9aNLTNWIqrxbsyPTYdB06CiLkTc2yq(eH7KxKfhXmC0IjzhsqrKQIhzPNYEIothe6KNBwQBy4Ip4ipoiSSTxwnk6ni(wPNJHHqLCUopMBSyA75IwEuBgJLOloWqwtorwisZ970(KYAZq3(z9zbAxNxiAYPUkid8ew5RtVphnRocnbSe9iYuMbmVwH2JENUDfuWAK3IC22LrnCRlgZ1Qnxacg1OM(iZT2aROE(GhjNYXCSXYtbZUoX4g0dP0GgGPZnu98SU895bUPKUQr0qoow2G)b0qh4PizQWsa7oc2ivotwdL4RRqL7Se74v7FbNZFpFNFMuiM6bfJ16sDvwWbFID3GDwGDw4P)K6NwwmHaUYAWQD7jzBOjWfeMhrswtrW3dYjzh2bOMaQ6wF0mP55CgHI6lRVTNxFxPmSAgI5TGQTe9kjl9qEqrwys(UywEtIii5FFiE)EYALMoaXKcR3sCvowfKgAW3QP57lRNlBcsgIT98ovwQ349uxbVT1(UAqkUcrv6wimnGaeQ5ZVCGM9gtL4BjPFNoglB9ULbyKVxpKbawfdHdiZxKWhdlgSBrPTHhA8xHdhp35casavYi7tZke7M4P(cEWmPUubXMnEK9PUmI(GWwTcpYyqqgO2PZTYpnOKjROv1KMjDLBlvPwQbabd57t5)ei0i1yezx7XS49Lp8FgMCGDjUIEnKABN5coLAzMv1HfUF40ZF)14OxP)o7UeMhVJUKhYjmITO6HHRxNsJujkmjjTqYvh)GkOmi3j4P75Bo0kdsIvTGm3rNVO7IQj3eat9iu8oGc3D5kElu6d3001bBoWytY(u64y7mUXBsHQA3hqls4E28cviLK9nQPXwV0n7Q0844OTkgl5RK5bLMEh1RmZjO8ulQtLBa5UzmWiRZAdn0RUZo4INHLXBV5viXIoB5JlEu26VxRuxjoQEeD)GeDOGuD2JogGWs((1W6SYEfGy3cF23PK9n40UUJQx7ufTRbt)5odsyg(zK(dDgij1GNXhA7jAAJVRoTeu9GV7zU7e7NO5it5)AtgzO4pkw6zvUxdQc8s5Erh6nk(WERQpLdE3T6PVhMXWwQ3B(31aAkr0qjPYSP0y((LMAa)lmcJgJygll38uM5QWdfP7clypOmgN8jN(Y)ioHoKp)ZYqcD14d)lazNtbyrk8q1PttNYiVFmUbQZHHQOvcfOc1aYQq9ZWqv8mwvGk0XVQc17XGAJJBnGQ1YOwcZbt)N(cWoE5zt0VTBVRclebQNPqeIO5zIRxhb(7UWqfCdNFah9B)(sJxgH6zPYGaZlVktFzH)HQYCwSqeykFuxkGf(CWSuPrPPZvanslPRc7zxfruepqN5UgIhiPylualyN(PTZHWGf7dtf4c1bNAGfHlC(4lcGVaIAExAV8GgcQ6RI(zjy6vJOr0bUaq(6TrHSpDbGmIRGlaKrIl7SGmO8vt7VDrKWK6qkf0dS7PuPBe422PBaAuYTaNLqS5G2uXs1dGZs4DMEbW1yBAdp9DBTo0ZEOoCPOo4cT98NgxqVDaTeQ)KTxD9SbIa5ZwRcX2ABtgQau9Up0siQ0vIAmHqOEwSdlu11BOFgOqyLd25CLp)lDm2GuCtdA1ps2Z9QiUJb2bOvE6l)DoHYadRCLLLy60Z8V1L0XzhCr6M42lCz(Kg)t3U4tQnK9PVanlXwXgEg1vP7dScATOUuDFG3CWlG0RC0824OsSoaCuhat1hpcArWbWkPvRHnuOqBjxrKEU)kiACR)0FfIbaVk19r8hI3Sq(adxUW3rZwIZnW2boEu9LNbVE8zZqt9f8XftzIxvVfDUI9DS0ZvkTzjhkADU4KuAKYY5uMs(hk77YfEmCaEReNAmb68CjqFJDWEANWUPCRdaZ9Da4Y2TEdHCw43j05vwQBkXg4yfgkiunPuaGlB1ENxeqbrl9ogURYlN5mAp4xdGJh3d9LaOrXrAQMU3)l9M7atqJbON2vIrnJgDZE4RY)XJ1WuPIjJDKEhPmZPVutNcogA1fTIyfuGPGwldAhORZiKJI6XhoEezOfp4Ct5YmPb4T3Y(XoWN(1Y7nBJwqeQzpZiDtzSasxsB(QxvEJIE(UhpoY4LJFPNl42uzZdZq2Mnch9R(El(QS9HrGqlvDlKkVy3a0lZsksDcx(g5zdzNBqoooOLu(ywzlBN3l9LEZSscVvVw(YN7CdFyLBgTYtJl)s1OVosKQG2KqJnSyUZOgMNO4uZvk)4rmwe42c)14QbiVwLcSYnfVXcNiPwPqRq99x(JFuQT8A9tU94rWR)9sHR(nkByqmHouu0I6avvuWEmItcl85bzwsl(H7mjidTiGbNvNaOQV488Z3xCF9eBYP74woUO1)kjsnFfpEpQZNLl88h)ZnXUC(1NCT0LdAVtaaXgTmeLSfU9bC46Fpo3PfNr9KGJeOTqNEYsZDQItb5Bh7JF2H9lFeAwnFVyx(5pw3KMq7dnFtQahS1XeusWOrkD5JkduLP9BTL(O1XEcmKbp36eJNl1LOyhzDRN7s85dHOw64ThoBvfvKKjrUVovHja4VdcNTYrPJHG6TYvNTAUMeoHKmS2zt0A28R7j5Y5HFnpasbPrmHjzNMN7ijR8O)CZRfs)ZZwiKlxHI04JZDfszq30SNVXH99D64AF8inPbAGfwIntDR84OD5oOcz)fzoX60aeYpOim)BCNdsa3J6NP0Ysu277lOzOsFkn(6kOwpT)h(uOqMA5GlmLq(bf(r86C(vcvMoyDC9)u5TizuSOiG99SytkDg0aWJZz9axJ(9JJQSsPWUeBo3B9Ql1My)Hm2SOG(nlbxC7rFVbjUjV5XHpaq8rD079a10U(B45oV6vqULjlxm1FCLxbaDh6B31nkbZxZdAC1YlGbcTnDogTPBOF5ugIHR8CRN)sPxGjIZ(tP1f8MCOsCT2kza8r3j61XZx9DAqCdYtvri8RAVCZ11GsB)L6Y63a5K3s)g7B4cDdkHA6Nb8sbnUobv9CZH86nd2cl)4YEJUxWL6FJQosv6O6j5h2TR0uzzkKAdvbFzy3E1s0gHuF7omzN3frs8rMWIIAHM2ilnmocOoG89crYdvDrEVvR0sAxfePO9L(sDccUHwAn8W9xC)1O0As4CJcWOr7bURjQj8iwFuh94Uy1zFmEjeQ93O9oqGIgeM(FwUwiM(JiHi6zWuSpEO7Dcf2foaTk0YVnBoXfvW0g0Nvze0Ux5Pcw(AxJvXKomgNW1WrKiHJweVDEpd4wvYL9AiCidzxiqVYLf0vSyWDDqakV64(T9Q(2GE4eN0J(UNdB2GPNgnZwryScFISTad8RvUlqcbDyzfrjY(8tQpYnlS(RfFfSqkA9x6U6isqO7S2Wl1Ht32UXkLlaoi9HuP8i)6hT0JtL4swWhSTgPJSZqPjacuxkzErO23AECd4LNcueZqe1JhATterDlSZaznNJWgQGYLPGjIiQLU0TYmYzwaoSq3wm6(BN10hi1DFcc9C22rVr7sZzTHCSA8izq0AZO1pJhPD1hQtgrP9D9KkZc(wX1FAofK)icFeprFjM4e4Gd6ux8HjjLpLMCkR6lY5YP6HnbdLsVXSYgJsmCHH)lF96Zx59cJfU81FJw3Y66Ea5YqZzb3X1idhvbFaLtTf(aAfpyyDSeWebmAoAaoy1dZOjKtdXAypzCv8mbSo26yzKo3eVuEZ0lzx5FOJG2VKIjbBra)ZzKoW0dfboQcOJGCCxjp2J8OgCkucVOo1j50et4wUxnqvb9rfsmk1BrylGylQUypD7BVGnGd(gtFw7CN3WFwyS0CCx1q5pR8AAw)lw4)1q8QyLsq3q(JpYJLlVHpDjoiV5sxaKx10N1ruA3UTk4TpIvXcZvdTlvswDBf)AL3LGuyBMh68KEN3X96lrxgk7Vrrablk7eG6(ZZQhwAnn2WmA1J9XsJeT63(8m(3NJv)N)]] ) \ No newline at end of file diff --git a/TheWarWithin/PaladinProtection.lua b/TheWarWithin/PaladinProtection.lua index 47ae70436..5b95a0331 100644 --- a/TheWarWithin/PaladinProtection.lua +++ b/TheWarWithin/PaladinProtection.lua @@ -1932,4 +1932,4 @@ spec:RegisterOptions( { } ) -spec:RegisterPack( "Protection Paladin", 20271021, [[Hekili:vVX2UTno2VLGbWJn2uxl54K2Iy)WoVmtWIbd20f7BwMrI2MtKL8skLuVWWF77HK6cjfPKCsA2oaf1jMhEUXZvYtw6T8RlVpcLHx(7(t8VYBIV3ypVP34)5L3NDypE597rHpI2a)qcAh8))bnndhMrstoT6pqXOischMdXPOioUyP50qaUTzz7zF5JFCdjBB(dJdt39rgzxEmIV1qkADg)3d)4Y7FiNeN9BjlFWjJGYZ2MsxE)9KD)cGzsuewcoMfU8Eo4FWBYh88U80k4tFVVCA1)AphxNwTMMU70k(gpD3P7eGo5ZFyYNaq(NywwkfGzhjJSbjfjuHOftyzA7Whqo)ZRk(KJbbAxLljvfWFsYj((DWg38b)PaiFDlS()grH)duvCTjN2mUUmmnnok95e(V87ItkCc6HyC0Y)oSiLKHPeeOY3JJJdYq0n4m24yYMTzSG)mpAZoCs2PvlMdmZPvhpEA1fNwrrKOa8tWkJrrrSX4VXPMCzZ1iGIyXPv3mZ(Y57HJgH(IZZAuDzgCmYz4Y1rW22qs2e8mfLTvvqaiN6u0EiF96X67vJS7tfFc44kN4y4Pv2qdfVdrsaj)wWQPqcbqZi7WcP2BYPvJG)vtSDPCrliDDWM4u6bovN1Zdf2wcooIV1ST4akxzHtZzYdNP1KiI8ejbhKLghZr)1NPIrkfLMnULyorNut1hqm(pWzpX5iN03CwKUc1GI7t1iEnHIFionnAjhNG)6AuECwL1Cjyaq5pInmk8nyGsGdrGEv(lbCpfP)sGm6uThJfZQEHH6Gb2SQ6fkYOKKhHtDBgi9cbSmuseIwO12tXq0Zhqn1Br4Ne2)bOCkYM6ZL3Pf3VkhvAisybsPnH8kvidttyyisU830GZuQtbxwgoREVpHatjyv(pfNdF4PAHvOahN5nElIfuEOEA1aW)uFnqvbrJsoeeTNjwFOikxfu(wGI7JOGMk3LOCArwaUxPckSaXOQaQgKQewHmQBqeWoKegWItZS5B3ToY3QoYVfDKnPVPoYMMuthzvdSOlLOfvK3zPIY08gBnfi4W8iensiDI4toc4oUshb6GTPXhc2N(mMogImrcjqYs4GFIKVfOPiE8(C6(ugweHvjHGdIyl6vnRUfJIHiM7dZePEEoDtG8REDSv1AatLWdml85dwtXny7NtPrAzXCN)ndfZt3VMKGIdeHLgxaN0qtrTtsGOuCchH2b1lgmtMniIv8fcGUqiHYmi0iE2uqeXjrGSQjeBYHLjirkjusiHdjNsmDWk0dYZb9LKvgyk6ABO9Yg6HSTjf94pssNt82EPkcMKrEcifSdGKX99W9hnfGrvMTwb1FffpDI2EzAgXz8MPuoa6qau1WwWDMjJZwvYILOSL7QagpJARlttnUriCrylVYWATvX6ArSkT6tVAsvgKUjIV9u)vjLOyu0HQ0rU4KrQ5SAJIWrc)hyk6KwkyTag)ZtV5)EO38SxoW7MEZxA9TfTBhMw3(rRP6lvjWkmgNrGTfHaMfspf(OWVDsDLhY8xCqYzpcoJrsyRsIvW4Nr3Ak(rM8D7593VbQQoWNtFHYFwF5YAcIpGfC1bA7PTBqRR6vrlUtg2aHEkbRA7KWfVptTtIA9OTBh4AvqD0cZnQWi4hCuGeTgq(j7ewxxOVLpR11dnNHGGVq1qusJMw9MO1FMs38AWLP0Jxh11kSmk6FBtojcYNG1QbBOsd)16yTR3Wx5WYWMnq4Ix6gxhmqsxkokn)HSA6vHMYvkpQ1UJPIDBETcAEDdQdPyYsf1S2ZMLplNq30ZL(ITf9iwyEajuHyFmLoCUTYp4cNq34szCCg5nEM9y6a70Aeh3rb0pklnUd2lVb3uQ(XADq)MqgqcJQ5wzZiTFgwAw9kJ7KG)wwaIUdjVktGYmuiy7f8mgTpnrXIvQ(vxSs1p06QQA4R1KflP4g07BvZ8sdfDZvkbTELq1H2o)BreOCDVVpKh)mI(ihU6ZY150dQERs4R71uOhMc0(qymUKI8qtTwe9fDsYcTxzibNWPgsRVsT(DNkoxWuMs3DDCjMLjkqmg4tZdSwWT9KbUTun60YP7unLPK(XGlnsDwM877kZ53xMZm1Bv(2E6mfULZnmTSvRZbUKILlfiV8FUJ8giG3o03S7p45oHTAJDvPRlC70lEu76t5i1V)Le55oOFZiMcF8chpzKSs9WC9ClnIu516JQ8YEmjXZQyVejof7rWrBhiD8qjVbwPt7LRS37qeN28w9((hlXVDhsZ4fUIolE8wkzVC1Fdmo4TqeJ5Pk4mXLNw9v8U9X8hgLTnnpgsnSNssb5H8F5pAlK0ndjUQZtRUNx2fSt(tP(RYcVGWjqNRH8sq5qiKpM8DD5zz4wJ)kix8eF)cuEja0yJeBTx7TOotZOpA7x1bxpoMHNVFRn7wWgKKDPqnVgfspWHFgVLVzNDRTtvQQtx6JWXKNWunfGJo78Dx9D7XMAlsK)0E3GN)vNFhE(Z6FlE(DeRXX9VlluTSmOgUHALIpSlJp9csLY4AEts2RtVT7(3xR15gEP6IU7OlVklMoQXWQgTfrAQB3sJ6DvshB8UNC0O9wRUFTtr78GOY4RWhELB8MaviCpytNiU897fJ4bz3(uky1VofO9px9OU)m4bJ)p5ek)uLLYR)aLNLUdjctbPQHZd24t39pG0Kad)fiCvAcqnXY)C5L2P)WAaoZsvwnRXYd9(2OEIu13f0bInaPxiV5tt2a5wbPxi3Y7rAH1TbZ3v03jIT8qRw0kVy((LI(EG4wn)ASSg3E97psFLMDUq(BIdJBo)LD49Dg9DI4xQZsp57xk67bIFrHupDNLO9f7IDEb796(OsCnBTDovcGMU8TdXvO0V7Jh7O0caA86BhIfho)M4CHJPB0h2tUANpRvPRj8rU5N(PYLzJRYv)3M)rELe8InyqHnzK1Kq5vbFxxWJI(ZYRn(oBWPnkx2bXCWoTcKEzm2HrTug7qu(iExYVI95fQ06xY7sXajn37sY652Dxg4oK4GHx4oy8XJT4xVyElbRgD84f2ZC8AerFvr03Ui2ukueXMYFTiArkw0I4RkHgdg3DvYi3KtmnLQFJ57NiL5YDZ6guLjKUtylJ11nKLpbMc7xj1SMg88JIwh15fZ9bvK97K64XM9jV4Mzn)AOxnRmJ(9sAhg5uBW5thVJG1DzmwX8Tp02(l6R7wpGRhYVPYfEtgnYoovUwTMQnh3bWI5tTJmZ3XZTaE8yLvRdMF(0j6blvjej5P0hXb4VbDRXh4morKMkIw2cijRZzVanC1yi7AJfC3IpPAkwB0dOWHoteEqoirdk7v15ChoyyZr7B(KJhvVZ46r6BKdorRDxo9Rh0NBRhMWZJwfFV1gTDXhAtVKup4AwbhuQIAoNvlQMpWbxuy13yYQk4U2MQkDbRAIQk(6QPPYLS4e1QNVwyELbe7)NSF5y7X52MdZxBA)FqeadA(xdTU6u0z4h6ntnqszEoNjcnE8CfNjh3)3GHvXzBoob36xibUEt(r86tSoGhfBuB4oKzv7yKogn4cRKS86pTPlSi1UXHPS5ESmU1dyxhWOLHYIMZBmKBvBamU13kV3s6GADB532CIlu4IoM2I5tCPARgChR6wTBqNZwA39(CTrHamhK6lJPNakZWY3xQyUUGVAKdEqpQbqTUff2UQupTh5t2Or)QHzQmnChJabuQZG68J3o1kZyCx4CE4Ioqoi89Dqhg0p5zUDEZXZAu5dz7D(6hfVDQRZvRmI(tX8(tFJ3Q5TGb8plgOnt2IhAxebT5GgC78IHmWUGLw3KELuzDWcMpRdteJowoJWeQpp3GcPzU9iIgDCm8C6dd6J5S0TV7UeVxM(VBM4qpyNw9dXJU37qVD8IO9Xh6cJNK36MQllqyh3YZVpWIP88RGki61HaeAhsT35JM(Q9B7HT754p1htuRW0OV1IA0S0Y5GHD9o58BaP9kKRkcX(RJp3vjigME9We5fEgEg6d7mQ2n9kAaPUIg7Pe0V43AqmkT0ET5dRd6qmN1)ftQBri1XFfdJ6TFXS24mDDV6FxcZN1nt0gMBPMEnYC1lK98kADXLkSFNhgjZBcAZ3hOjmUC)BJWoIc0Clodg0euLIguThlVczaICgoGKH3XUu8xou5TllkVAO7)wJM7nW6DOYBQrV)U5xnbSmBdv(AVyH(Jkv2QzdYmIFB9Ur6OZry97sy9F7ewpT3U4nsyfZXE4YF)6RfdlZY)3p]] ) \ No newline at end of file +spec:RegisterPack( "Protection Paladin", 20271122, [[Hekili:vVrxVTnoYFlbfWRnUuxl58r7I48WTVSn4qXIZ9W9MLzKOT1gzjVIsn1hm8V9Bgs9bjfPKSt6h7dToXC4WzgoFZjlCw85fZdiz0fFYDI7vooUUJDCN8bNRwmpB)o6I57i(prwd)qmzl8))rAsg1plmj(4Y)GerccJry2hLqcqCXsYt9b42KLTJ9RV7DRdZ2K)4y)KTVJfUnpIGB1pLSkd)D)3Ty(J5HrzFmEXJMje3fZj5zBssxmFE42FdWCyqavaoL5Vyoc(BDM8whNlpUe(0L)PZBDD)1Jl)p7qCEC5Q0KThxIi44dhFGVLjF4TtEpaY)MYYssby2gMfUMiynsblgfYYu2HlGC8ZRk(eXahTlZfhvfWVxqrDsg3(w3PaiFEdS()LKc)hiYqPkE2m(9dDfjpkd(XpXVVee3I5P0hZFcK10yYJr0Gf)ZfzG0dHO(BQa2Nef5j(fpeZc87jUvRzDeftphu4NKefK8CmdXWvNdgYsdJFIMXrW1NdcyzK4asAaGayHDPuqR7rst5wa9ljCmqYtjMeFLagfUEtgZ7pZdwVLgNPb6uzqjP(KyQhOjL2eYRKH0pjMrblaXVPaNoxNSdykAw9E)cjnexf)POC4dhaFPHzu4RReGJZCgVHW8kVroUCWXLARbIQSXK49Eb7y81hEC5fsq5AaQdhuqtj6hhKNwy1C)mfuyaIrc008OkHLZJQkeES9X(ESOe8A9t3CYYixJYi3wKrM4(MYitssfzKrjW9DjeniICojruMSXyPUVKeRwyW2rbZPms6AWSBSM2U460TIAsjHbE0VaRmMeeWgt)k6FsSS(AHcg92RnVC(o72y62GeyBRdJx79miG2yYe0iR9y(QvJv3RYXUlP0BNUVQACa33MqtkDljmg487G4mfCiaAw4wkNRDMWVehvFyBtqwZlzL36OK09Mm1TDPW2esJcWTMTH6LIclAsotC5mvYNw4xc5(FIImzL0LGrWfvAJw5y8qNuFQpsyChPa5XVhXJ(2t6ORqni4EFnIxfcb3Issk8LxfAWG6C5wkGXr7gS0DW4gMkhxcCJtPLDBYLviV5PifUAsLLA3hIRzxSvI7ukjyFLHMnkzKSVH2orqZd)bMKmPLedkGX90KBUFpKBoMD7(DtU5k0(QYROvNPzKi0bxH)S15HbKyF64cyl5KkANUNYTQ3NQ4qPWFlNx2q2ULMwzC5Xz3swQwWio3uAqs(Jz1NxfAkxbyd)N09QxSBDd5A0ioQlSqsRsPuf)QTMGM2UBtRSoNRAjS)g0PitHfwLdNhKPhFjpHpyupBTFW4TKVcBAVFeT0DkE)1DydJmPTlj2gYtuUZ5nuu5Jjfk)oUkSS6ztOB471IIHZ4RnBubKtTyZGeU14BB2TgIz45gqWCGa5216AgaQcYzp5bMaEiu6AgTR2xtz1Sv7H)mruosYByhmgAGJegspLQ1q9yVmAYEmtvdTYyWE7e1cNKQA0v7EQjKEHGEz1D3mjA2MfwPrFnvBjLatXEBZAQV5zar85eOq6Nh9mj9jeUAUBvE6EzVlc43KeT3BxYZ0uUs6uZMIV3Qq)Iops00P(22oCYUG7lxRMDfpQcnfY2NVbKW)q7(q4QP0apcJbUdqTVcQTNeWDLIrRb2mz03qHWzYppKz5zjixo1zpA6Rf152xQZpnNrcaXidc()eLtE)qco50r0PIm9R8Qvy4H(UT0KbeP2Jcet)AMhjDlru0hGhgXhYzW7zkzxsSuMgIiyYlwf9AOXvLdsDt7xe8v7z9h6LxX90uYbc1(RLlHS2(WunKo3idRCDuAWzVWM2JUx7IQ56ncjzWtJJDFKdLdk(YmuMwLLSvwPFECS7y8hf120XJRD3IVIeP7PqKg8)4ARuxj)pgCG4Q72613R60EPk42HNSxxcXWTSDNEVwNVB7xG2AJTUvo)Pmsd3jw9JGtxmf3ik65ajIlpU8Z0T7IWNhGTjjpcsMzxAycWpH)p8Pla3JzW)GnDC5Cupd2j(Gc)Uqtd0aH6K9XI8qi48ht86gyEry76(DGVWu1(nOaoaOXA(36iLAKzTN)8fOR96asQ69ArQCT7MDyfzegVnbQQuRu1bwAej22HI6A65nBrwSvzMRY9b0OWVqt7tnfU29D3mUlpowrASTfDZ9dYrS007vdAnDI5aHQ2QA7r5Xs0vR1GTdFnGegvkv7wqzkfLjU3WmuPCQHDP8PM6GGhxHTHWCTwsjo8Csk)2VQRStvFthDRuvw3U3LxIgZu7LgBxI2glz3SuRcnP0h1Enlen3QOuy9nSYuEmXoAyw8tC3rdQcqA0CCC1d0muUQYXb0vH(HzLxTvXzlsHBxE6UeMqFt6oVLQNTRldbSJG8q35NXLupNS2t8vVmYsk1aJMjTQQ2ICLR6TkmMe5X7DPILISypm2pzlEWbKTeOeLRff8hWk(Is)Fv95nnaFidGfPXGpbvMyDoSCiH3erqtpeHepjMkyfYbX9G6sIhLrN1v2aY62n86bVToH80ptCNv8ICQDFbCIKbov8yWoGJmQVxU)SjakPFKFT7R6VHmM2HI8N9CB08W4i5moIS3ljgIVhhWwu8aVqWegUioSm36mbQuyoK1qmxVzoFusc3Uljfq2QeW7(Vunme)cKJe9VYdtrVbSeSJeK8SKTeEIG(WHSMYgF8H)fWRqiHFfsimjgon(Y)s5JWO(G0aoZsKwnRXYdD(6OEIu53t3cI1aPxiV5t63a5gbPxi3W74BG0nbZ3u03jInmGcgKkNnDFUOVhiUv1VglRqT389hPVq1oBi)vXGXoLFExEFJrFNi(Cnw6jDFUOVhi(SCPE8bdE7l2f70C2709vf)XOA7EQeafz5RhIRqPB3xpMrPbauO1xpeZVC(i)EbX0nQdvkk2XzumzvioQAV5nLlZgxfR(Fm7Dy(byEjmiXKSqOWcXll)qxWtc(ZYxH(btWPmcKMbrFCWmcKAHIMHrUyrZquougxIJjWScrA9KzCjFq(M5Cz4QzMnxgy3L4GHxy3z8HdTyxF)SwCwn6WHlmh54LWIUYSORzwSjxiXIn5)Aw0axCFlSVmhQnqPpuXJOkhFkKL)g9zarWZsJxDNWwEsSUbT0xx3qwogpsKFfxZAQWJxfToGK3pZferMhlYdhA2jY7V96MFnuZGrIr9fWmdJOSdKoff504n1mUlTHre3(qt7VOZz35au9q8TlV3zYOrMXP0RM1uSzPJl3pBQzKPpls2zWdhQ0ATq8ZMor1zP8bfg)LKNOE0Vc1GH9kbpeHQcVtoEHXRYzNHeUA4fTTXcQ7(3lRkwBFaOWImJ7Equj8GoBz2GHn7k1SjhoyUBuJSqjknEcp)6kvVRUpyN2zv89g76Ln6qP8BHCWwBUgukIA2OG7RAT1GlgAP1afuxBTfqLXQAjqXxx1oaB8IvulF)AG4L6WXpsYVSJni12SpuTj9)jHb0oZ)Ei1LBdKMDOZ1YoskJZznqO2iMjzmz5fwgmSYpBZPt8o3coW2KRncZpX4qQwSrLbuvevTJXsD0GlmEKLDo3KSOkUUYBMlYQSy4D4NDZH25UzfdSJr8AqAAN20Lz2NE07CaXGfyuI8z4gXzmeZwzorVZ1iTxVxEAaYdE5SRRVgsSmdOJg0XlZDQNPtHy5rJd559toRdSLyP1kMLFBZH6usu3XaDoBIn9YQj3(uvm7xMutfjd0XWzcjCnOok9DtnsmAV5jsdx0bYZ3nOVJG5G(XpZmtBwE(6klUMpKmqA96eVBAXfxlz4jripQ8K7F)pFT3K)1GaCpjc4BLVu5wfuXvgh4XzxBwfrzyjquOmMfZuMpriUKWbR2inc17y47l9KEJnj1GEumICbug1S1k3tcgPASonlxtXpg01ejEQgGdFPkGthznKyVTc)bqegmfFXuH7jtf2Shp1BXxkLB2V93a3L99U4LEqqAtV54YFkgiVEB0FgPiP739cTX1RpjY1YO5nWqZWMDfKGzVUeG0bG8Q6CGQoR4bYJCxp0Dpf7P(OIAeMgDCPWxGHMLmyyxZqh27U2RTRkQL5jNBMTywAQE9qf5mVdpb5Hzcv5nk4LoxNfS50iuFYIAqkB2masoJ6fMr3YUK)3mAzFO5Pan0(FLPZCgySBRywhQvSn7QjqCG2qLRYBBO(8tLfp24ygH913oshDkmRBxmR7RhZ6O8khVsml)Vco)fF6MB4JvZI))d]] ) \ No newline at end of file diff --git a/TheWarWithin/Priorities/DeathKnightBlood.simc b/TheWarWithin/Priorities/DeathKnightBlood.simc index f84acafec..f3d7b5b5f 100644 --- a/TheWarWithin/Priorities/DeathKnightBlood.simc +++ b/TheWarWithin/Priorities/DeathKnightBlood.simc @@ -20,22 +20,26 @@ actions+=/run_action_list,name=sanlayn,strict=1,if=!hero_tree.deathbringer actions.deathbringer+=/variable,name=death_strike_dump_amount,value=settings.death_strike_pool_amount actions.deathbringer+=/variable,name=bone_shield_refresh_value,value=6 -actions.deathbringer+=/variable,name=heart_strike_rp_drw,value=(21+spell_targets.heart_strike*talent.heartbreaker.enabled*2) +actions.deathbringer+=/variable,name=heart_strike_rp_drw,value=(25+spell_targets.heart_strike*talent.heartbreaker.enabled*2) actions.deathbringer+=/potion,if=buff.dancing_rune_weapon.up -actions.deathbringer+=/blood_tap,if=rune<=1 actions.deathbringer+=/raise_dead actions.deathbringer+=/blood_fury,if=cooldown.dancing_rune_weapon.ready actions.deathbringer+=/berserking,if=cooldown.dancing_rune_weapon.ready +actions.deathbringer+=/blood_tap,if=rune<=1 +actions.deathbringer+=/use_items # Use Death Strike if your Blood Shield is going to expire. actions.deathbringer+=/death_strike,if=settings.save_blood_shield&buff.blood_shield.up&buff.blood_shield.remains<=gcd.max actions.deathbringer+=/deaths_caress,if=!buff.bone_shield.up actions.deathbringer+=/death_strike,if=buff.coagulopathy.remains<=gcd|runic_power.deficit<35 -actions.deathbringer+=/blood_boil,if=dot.reapers_mark.ticking&(dot.reapers_mark.remains<2*gcd|charges_fractional>=1.5) +actions.deathbringer+=/blood_boil,if=dot.reapers_mark.ticking&dot.reapers_mark.remains<2*gcd +actions.deathbringer+=/blood_boil,if=dot.reapers_mark.ticking&charges_fractional>=1.5 actions.deathbringer+=/consumption,if=dot.reapers_mark.ticking&dot.blood_plague.ticking +actions.deathbringer+=/soul_reaper,if=buff.reaper_of_souls.up&buff.coagulopathy.remains>1*gcd actions.deathbringer+=/soul_reaper,if=active_enemies=1&(target.time_to_pct_35<5|buff.reaper_of_souls.up)&target.time_to_die>(dot.soul_reaper.remains+5) actions.deathbringer+=/blood_boil,if=(dot.reapers_mark.ticking&(pet.dancing_rune_weapon.active&dot.blood_plague.stack<2))|!dot.blood_plague.ticking|(charges_fractional>=1&dot.reapers_mark.ticking&buff.coagulopathy.remains>2*gcd) actions.deathbringer+=/death_and_decay,if=((dot.reapers_mark.ticking)&!death_and_decay.ticking)|!buff.death_and_decay.up actions.deathbringer+=/marrowrend,if=buff.exterminate.up&(runic_power.deficit>20&buff.coagulopathy.remains>2*gcd) +actions.deathbringer+=/marrowrend,if=(buff.exterminate.up)&(runic_power.deficit>20&buff.coagulopathy.remains>2*gcd) actions.deathbringer+=/abomination_limb,if=dot.reapers_mark.ticking actions.deathbringer+=/reapers_mark,if=!dot.reapers_mark.ticking&dot.blood_plague.ticking actions.deathbringer+=/bonestorm,if=buff.death_and_decay.up&buff.bone_shield.stack>5&cooldown.dancing_rune_weapon.remains>=10&(dot.reapers_mark.ticking) @@ -50,38 +54,40 @@ actions.deathbringer+=/consumption actions.deathbringer+=/death_strike,if=runic_power.deficit<=variable.heart_strike_rp_drw|runic_power>=variable.death_strike_dump_amount actions.deathbringer+=/blood_boil,if=charges_fractional>=1.5&buff.hemostasis.stack<5&cooldown.reapers_mark.remains>5 actions.deathbringer+=/heart_strike,if=rune>=1|rune.time_to_2=variable.heart_strike_rp_drw +actions.deathbringer+=/blood_boil actions.sanlayn+=/variable,name=death_strike_dump_amount,value=settings.death_strike_pool_amount actions.sanlayn+=/variable,name=death_strike_pre_essence_dump_amount,value=20 -actions.sanlayn+=/variable,name=bone_shield_refresh_value,value=11 +actions.sanlayn+=/variable,name=bone_shield_refresh_value,value=7 actions.sanlayn+=/variable,name=heart_strike_rp_drw,value=(21+spell_targets.heart_strike*talent.heartbreaker.enabled*2) actions.sanlayn+=/death_strike,if=buff.coagulopathy.remains<=gcd -actions.sanlayn+=/raise_dead -actions.sanlayn+=/potion,if=buff.dancing_rune_weapon.up -actions.sanlayn+=/blood_fury,if=cooldown.dancing_rune_weapon.ready -actions.sanlayn+=/berserking,if=cooldown.dancing_rune_weapon.ready -actions.sanlayn+=/blood_tap,if=rune<3 -actions.sanlayn+=/blood_boil,if=!dot.blood_plague.ticking|(dot.blood_plague.remains<10&buff.vampiric_blood.up) -actions.sanlayn+=/abomination_limb,if=buff.coagulopathy.remains>=2*gcd&(!buff.essence_of_the_blood_queen.up|buff.essence_of_the_blood_queen.remains>=3*gcd)&(!buff.vampiric_blood.up|buff.vampiric_blood.remains>=6*gcd) -actions.sanlayn+=/blood_boil,if=cooldown.vampiric_blood.remains<3*gcd&buff.coagulopathy.remains>=gcd -actions.sanlayn+=/heart_strike,if=buff.vampiric_blood.up&(buff.vampiric_blood.remains<2*gcd) -actions.sanlayn+=/bonestorm,if=(!buff.vampiric_blood.up&buff.death_and_decay.up)&buff.bone_shield.stack>5&cooldown.dancing_rune_weapon.remains>=10&buff.coagulopathy.remains>3*gcd -actions.sanlayn+=/tombstone,if=(!buff.vampiric_blood.up&buff.death_and_decay.up)&buff.bone_shield.stack>5&runic_power.deficit>=30&cooldown.dancing_rune_weapon.remains>=10&buff.coagulopathy.remains>2*gcd -actions.sanlayn+=/dancing_rune_weapon,if=buff.coagulopathy.remains>=2*gcd&(!buff.essence_of_the_blood_queen.up|buff.essence_of_the_blood_queen.remains>=3*gcd)&(!buff.vampiric_blood.up|buff.vampiric_blood.remains>=6*gcd) -actions.sanlayn+=/death_strike,if=!buff.vampiric_strike.up&cooldown.vampiric_blood.remains<=30&runic_power>variable.death_strike_pre_essence_dump_amount&buff.essence_of_the_blood_queen.stack>=3 -actions.sanlayn+=/heart_strike,if=(buff.vampiric_blood.up)&(buff.coagulopathy.remains>2*gcd) -actions.sanlayn+=/consumption,if=buff.vampiric_blood.remains<=3|buff.infliction_of_sorrow.up|cooldown.vampiric_blood.remains>5 -actions.sanlayn+=/death_strike,if=buff.vampiric_blood.up&(buff.coagulopathy.remains<2*gcd|(runic_power.deficit<=variable.heart_strike_rp_drw&buff.incite_terror.stack>=3)) -actions.sanlayn+=/heart_strike,if=buff.vampiric_strike.up|buff.infliction_of_sorrow.up&((talent.consumption.enabled&buff.consumption.up)|!talent.consumption.enabled)&dot.blood_plague.ticking&dot.blood_plague.remains>20 -actions.sanlayn+=/vampiric_blood,if=buff.coagulopathy.up # Use Death Strike if your Blood Shield is going to expire. actions.sanlayn+=/death_strike,if=settings.save_blood_shield&buff.blood_shield.up&buff.blood_shield.remains<=gcd.max actions.sanlayn+=/deaths_caress,if=!buff.bone_shield.up -actions.sanlayn+=/death_and_decay,if=!buff.death_and_decay.up|(buff.crimson_scourge.up&(!buff.vampiric_blood.up|buff.vampiric_blood.remains>3*gcd)) + +actions.sanlayn+=/blood_boil,if=!dot.blood_plague.ticking|(dot.blood_plague.remains<10&buff.dancing_rune_weapon.up) +actions.sanlayn+=/potion,if=buff.dancing_rune_weapon.up +actions.sanlayn+=/consumption,if=pet.dancing_rune_weapon.active&pet.dancing_rune_weapon.remains<=3 +actions.sanlayn+=/bonestorm,if=(buff.death_and_decay.up)&buff.bone_shield.stack>5&cooldown.dancing_rune_weapon.remains>=25 +actions.sanlayn+=/death_strike,if=runic_power>=108 +actions.sanlayn+=/heart_strike,if=buff.dancing_rune_weapon.up&rune>1 +actions.sanlayn+=/death_and_decay,if=!buff.death_and_decay.up +actions.sanlayn+=/heart_strike,if=buff.infliction_of_sorrow.up&buff.death_and_decay.up +actions.sanlayn+=/raise_dead +actions.sanlayn+=/abomination_limb +actions.sanlayn+=/tombstone,if=(!buff.dancing_rune_weapon.up&buff.death_and_decay.up)&buff.bone_shield.stack>5&runic_power.deficit>=30&cooldown.dancing_rune_weapon.remains>=25&buff.coagulopathy.remains>2*gcd +actions.sanlayn+=/dancing_rune_weapon,if=buff.coagulopathy.remains>=2*gcd&(!buff.essence_of_the_blood_queen.up|buff.essence_of_the_blood_queen.remains>=3*gcd)&(!buff.dancing_rune_weapon.up|buff.dancing_rune_weapon.remains>=6*gcd) +actions.sanlayn+=/death_strike,if=!buff.vampiric_strike.up&cooldown.dancing_rune_weapon.remains<=30&runic_power>variable.death_strike_pre_essence_dump_amount&buff.essence_of_the_blood_queen.stack>=3 + actions.sanlayn+=/marrowrend,if=!dot.bonestorm.ticking&(buff.bone_shield.stack20|buff.bone_shield.remains<=3) +actions.sanlayn+=/marrowrend,if=!dot.bonestorm.ticking&(buff.bone_shield.stack20&!cooldown.dancing_rune_weapon.up|buff.bone_shield.remains<=3) +actions.sanlayn+=/soul_reaper,if=active_enemies=1&target.time_to_pct_35<5&target.time_to_die>(dot.soul_reaper.remains+5) +actions.sanlayn+=/death_strike,if=buff.dancing_rune_weapon.up&(buff.coagulopathy.remains<2*gcd|(runic_power.deficit<=variable.heart_strike_rp_drw&buff.incite_terror.stack>=3)) +actions.sanlayn+=/heart_strike,if=buff.vampiric_strike.up|buff.infliction_of_sorrow.up&((talent.consumption.enabled&buff.consumption.up)|!talent.consumption.enabled)&dot.blood_plague.ticking&dot.blood_plague.remains>20 +actions.sanlayn+=/dancing_rune_weapon,if=buff.coagulopathy.up actions.sanlayn+=/death_strike,if=runic_power.deficit<=variable.heart_strike_rp_drw|runic_power>=variable.death_strike_dump_amount +actions.sanlayn+=/blood_boil,if=charges>=2|(full_recharge_time<=gcd.max) +actions.sanlayn+=/consumption,if=cooldown.dancing_rune_weapon.remains>20 actions.sanlayn+=/heart_strike,if=rune>1 -actions.sanlayn+=/bonestorm,if=buff.death_and_decay.up&buff.bone_shield.stack>5&cooldown.dancing_rune_weapon.remains>=10 -actions.sanlayn+=/tombstone,if=buff.death_and_decay.up&buff.bone_shield.stack>5&runic_power.deficit>=30&cooldown.dancing_rune_weapon.remains>=10 -actions.sanlayn+=/soul_reaper,if=active_enemies=1&target.time_to_pct_35<5&target.time_to_die>(dot.soul_reaper.remains+5) -actions.sanlayn+=/blood_boil,if=charges>=2|(full_recharge_time<=gcd.max) \ No newline at end of file +actions.sanlayn+=/bonestorm,if=buff.death_and_decay.up&buff.bone_shield.stack>5&cooldown.dancing_rune_weapon.remains>=25 +actions.sanlayn+=/tombstone,if=buff.death_and_decay.up&buff.bone_shield.stack>5&runic_power.deficit>=30&cooldown.dancing_rune_weapon.remains>=25 \ No newline at end of file diff --git a/TheWarWithin/Priorities/MageFrost.simc b/TheWarWithin/Priorities/MageFrost.simc index ec4ffcf28..fa663864a 100644 --- a/TheWarWithin/Priorities/MageFrost.simc +++ b/TheWarWithin/Priorities/MageFrost.simc @@ -1,7 +1,6 @@ actions.precombat+=/arcane_intellect actions.precombat+=/mirror_image -actions.precombat+=/variable,name=st_aoebuild,value=talent.splinterstorm&!(talent.cold_front&talent.slick_ice&talent.deaths_chill&talent.frozen_touch)|talent.frostfire_bolt&!talent.deep_shatter -actions.precombat+=/variable,name=st_ff,value=talent.frostfire_bolt +actions.precombat+=/variable,name=boltspam,value=talent.splinterstorm&talent.cold_front&talent.slick_ice&talent.deaths_chill&talent.frozen_touch|talent.frostfire_bolt&talent.deep_shatter&talent.slick_ice&talent.deaths_chill actions.precombat+=/variable,name=time_to_coc,value=10*talent.frostfire_bolt+23*talent.splinterstorm actions.precombat+=/blizzard,if=active_enemies>=2&talent.ice_caller&!talent.fractured_frost|active_enemies>=4 actions.precombat+=/frostbolt,if=active_enemies<=3 @@ -12,9 +11,8 @@ actions+=/run_action_list,name=aoe_ff,strict=1,if=talent.frostfire_bolt&active_e actions+=/run_action_list,name=aoe_ss,strict=1,if=!talent.frostfire_bolt&active_enemies>=3 actions+=/run_action_list,name=cleave_ff,strict=1,if=talent.frostfire_bolt&active_enemies>=2&active_enemies<=3 actions+=/run_action_list,name=cleave_ss,strict=1,if=!talent.frostfire_bolt&active_enemies=2 -actions+=/call_action_list,name=st_aoebuild,strict=1,if=!talent.frostfire_bolt&!(talent.cold_front&talent.slick_ice&talent.deaths_chill&talent.frozen_touch)|talent.frostfire_bolt&!(talent.deep_shatter&talent.slick_ice&talent.deaths_chill) -actions+=/call_action_list,name=st_ff,strict=1,if=talent.frostfire_bolt -actions+=/call_action_list,name=st_ss,strict=1,if=!talent.frostfire_bolt +actions+=/run_action_list,name=st_ff,strict=1,if=talent.frostfire_bolt +actions+=/run_action_list,name=st_ss,strict=1,if=!talent.frostfire_bolt actions.aoe_ff+=/cone_of_cold,if=talent.coldest_snap&cooldown.frozen_orb.remains>4&(prev_gcd.1.comet_storm|prev_gcd.1.frozen_orb&!talent.comet_storm|cooldown.comet_storm.remains>15&!talent.frostfire_bolt) actions.aoe_ff+=/frozen_orb,if=((!prev_gcd.1.cone_of_cold|!talent.isothermic_core)&(!prev_gcd.1.glacial_spike|!freezable)) @@ -45,14 +43,14 @@ actions.aoe_ss+=/frostbolt,if=talent.deaths_chill&buff.icy_veins.remains>8&(buff actions.aoe_ss+=/comet_storm actions.aoe_ss+=/blizzard actions.aoe_ss+=/shifting_power,if=cooldown.icy_veins.remains>10&(fight_remains+10>cooldown.icy_veins.remains) -actions.aoe_ss+=/glacial_spike,if=buff.icicles.react=5&(cooldown.flurry.up|remaining_winters_chill|active_enemies<5&freezable&cooldown.ice_nova.ready&!buff.fingers_of_frost.up) +actions.aoe_ss+=/glacial_spike,if=buff.icicles.stack=5&(cooldown.flurry.up|remaining_winters_chill|active_enemies<5&freezable&cooldown.ice_nova.ready&!buff.fingers_of_frost.up) actions.aoe_ss+=/ice_lance,if=buff.fingers_of_frost.up&!prev_gcd.1.glacial_spike|remaining_winters_chill actions.aoe_ss+=/flurry,if=remaining_winters_chill=0 actions.aoe_ss+=/frostbolt actions.aoe_ss+=/call_action_list,name=movement actions.cds+=/use_item,name=imperfect_ascendancy_serum,if=buff.icy_veins.remains>19|boss&fight_remains<25 -actions.cds+=/use_item,name=treacherous_transmitter,if=equipped.spymasters_web&(boss&fight_remains<50|cooldown.icy_veins.remains<12)|!equipped.spymasters_web&(boss&fight_remains<30|prev_off_gcd.icy_veins) +actions.cds+=/use_item,name=treacherous_transmitter,if=equipped.spymasters_web&(fight_remains<50|cooldown.icy_veins.remains<12|cooldown.icy_veins.remains<22&cooldown.shifting_power.remains<10)|!equipped.spymasters_web&(fight_remains<30|prev_off_gcd.icy_veins) #actions.cds+=/do_treacherous_transmitter_task,if=fight_remains<18|(buff.cryptic_instructions.remains=32)&(buff.icy_veins.remains>15|equipped.treacherous_transmitter&buff.icy_veins.remains>9) @@ -64,8 +62,7 @@ actions.cds+=/use_items ## actions.cds+=/invoke_external_buff,name=power_infusion,if=buff.power_infusion.down ## actions.cds+=/invoke_external_buff,name=blessing_of_summer,if=buff.blessing_of_summer.down actions.cds+=/blood_fury -actions.cds+=/berserking -actions.cds+=/lights_judgment +actions.cds+=/berserking,if=buff.icy_veins.remains>10&buff.icy_veins.remains<15|fight_remains<15 actions.cds+=/fireblood actions.cds+=/ancestral_call @@ -84,17 +81,16 @@ actions.cleave_ff+=/frostbolt actions.cleave_ff+=/call_action_list,name=movement actions.cleave_ss+=/comet_storm,if=prev_gcd.1.flurry&(buff.icy_veins.down) +actions.cleave_ss+=/freeze,if=freezable&prev_gcd.1.glacial_spike actions.cleave_ss+=/flurry,if=remaining_winters_chill=0&debuff.winters_chill.down&(prev_gcd.1.frostbolt|prev_gcd.1.glacial_spike) -actions.cleave_ss+=/flurry,if=prev_gcd.1.glacial_spike -actions.cleave_ss+=/freeze,if=freezable&debuff.frozen.down&(!talent.glacial_spike|prev_gcd.1.glacial_spike) -actions.cleave_ss+=/ice_nova,if=freezable&!prev.1.freeze&(prev_gcd.1.glacial_spike) -actions.cleave_ss+=/frozen_orb -actions.cleave_ss+=/shifting_power,if=cooldown.icy_veins.true_remains>10&cooldown.flurry.true_remains&(boss&fight_remains>cooldown.icy_veins.true_remains-6) -actions.cleave_ss+=/cone_of_cold,if=talent.coldest_snap&cooldown.comet_storm.remains>10&cooldown.frozen_orb.remains>10&remaining_winters_chill=0&active_enemies>=3 -actions.cleave_ss+=/glacial_spike,if=buff.icicles.stack=5&(cooldown.flurry.up|remaining_winters_chill|freezable&cooldown.freeze.ready) +actions.cleave_ss+=/flurry,cycle_targets=1,if=prev_gcd.1.glacial_spike +actions.cleave_ss+=/ice_nova,if=freezable&!prev_off_gcd.freeze&prev_gcd.1.glacial_spike&remaining_winters_chill=0&debuff.winters_chill.down +actions.cleave_ss+=/frozen_orb,if=(cooldown.icy_veins.remains>22|buff.icy_veins.up) +actions.cleave_ss+=/shifting_power,if=cooldown.icy_veins.remains>10&!cooldown.flurry.ready&(buff.icy_veins.down|buff.icy_veins.remains>10)&(fight_remains+10>cooldown.icy_veins.remains) +actions.cleave_ss+=/glacial_spike,if=buff.icicles.stack=5&(cooldown.flurry.ready|remaining_winters_chill|freezable&cooldown.ice_nova.ready&!buff.fingers_of_frost.up) actions.cleave_ss+=/ray_of_frost,if=remaining_winters_chill&buff.icy_veins.down -actions.cleave_ss+=/frostbolt,if=talent.deaths_chill&(!talent.freezing_rain&buff.icy_veins.remains>8&buff.deaths_chill.stack<=13|talent.freezing_rain&buff.icy_veins.remains>22) -actions.cleave_ss+=/ice_lance,if=buff.fingers_of_frost.up&!prev_gcd.1.glacial_spike +actions.cleave_ss+=/frostbolt,if=talent.deaths_chill&buff.icy_veins.remains>8&buff.deaths_chill.stack<=(8+4*talent.slick_ice) +actions.cleave_ss+=/ice_lance,if=buff.fingers_of_frost.up&!prev_gcd.1.glacial_spike|!variable.boltspam&remaining_winters_chill actions.cleave_ss+=/frostbolt actions.cleave_ss+=/call_action_list,name=movement @@ -106,16 +102,6 @@ actions.movement+=/arcane_explosion,if=mana.pct>30&active_enemies>=2 actions.movement+=/fire_blast actions.movement+=/ice_lance -actions.st_aoebuild+=/comet_storm,if=prev_gcd.1.flurry&(buff.icy_veins.down|talent.frostfire_bolt) -actions.st_aoebuild+=/flurry,if=(buff.icicles.stack<5|talent.splinterstorm)&(remaining_winters_chill=0&debuff.winters_chill.down&(prev_gcd.1.frostbolt|prev_gcd.1.frostfire_bolt|prev_gcd.1.glacial_spike)|buff.excess_frost.up) -actions.st_aoebuild+=/frozen_orb,if=(talent.splinterstorm|(!talent.ray_of_frost|buff.fingers_of_frost.down&cooldown.ray_of_frost.remains&buff.icicles.stack<5)) -actions.st_aoebuild+=/shifting_power,if=(cooldown.icy_veins.true_remains>10&cooldown.flurry.true_remains&(fight_remains+10>cooldown.icy_veins.true_remains)|talent.frostfire_bolt)&(talent.splinterstorm|(buff.icy_veins.down|!talent.deaths_chill)&cooldown.frozen_orb.true_remains>10&(!talent.comet_storm|cooldown.comet_storm.true_remains>10)&(!talent.ray_of_frost|cooldown.ray_of_frost.true_remains>10)&buff.icicles.stack<5) -actions.st_aoebuild+=/glacial_spike,if=buff.icicles.stacks=5&(cooldown.flurry.up|remaining_winters_chill) -actions.st_aoebuild+=/ray_of_frost,if=remaining_winters_chill&talent.frostfire_bolt|remaining_winters_chill=1 -actions.st_aoebuild+=/ice_lance,if=buff.fingers_of_frost.up&!prev_gcd.1.glacial_spike|remaining_winters_chill -actions.st_aoebuild+=/frostbolt -actions.st_aoebuild+=/call_action_list,name=movement - actions.movement+=/any_blink,if=movement.distance>10 actions.movement+=/ice_floes,if=buff.ice_floes.down actions.movement+=/ice_nova @@ -124,24 +110,27 @@ actions.movement+=/arcane_explosion,if=mana.pct>30&active_enemies>=2 actions.movement+=/fire_blast actions.movement+=/ice_lance -actions.st_ff+=/comet_storm,if=prev_gcd.1.flurry|prev_gcd.1.cone_of_cold -actions.st_ff+=/flurry,if=buff.icicles.stacks<5&remaining_winters_chill=0&(debuff.winters_chill.down|buff.brain_freeze.up|buff.excess_frost.up) -actions.st_ff+=/cone_of_cold,if=talent.coldest_snap&prev_gcd.1.comet_storm&active_enemies>=3 -actions.st_ff+=/glacial_spike,if=buff.icicles.stacks=5&(cooldown.flurry.up|remaining_winters_chill) -actions.st_ff+=/ray_of_frost,if=remaining_winters_chill&(buff.icy_veins.remains<14|buff.spymasters_web.up) -actions.st_ff+=/frozen_orb -actions.st_ff+=/shifting_power,if=(buff.icy_veins.down|!talent.deaths_chill)&cooldown.frozen_orb.true_remains>10&(!talent.comet_storm|cooldown.comet_storm.true_remains>10)&(!talent.ray_of_frost|cooldown.ray_of_frost.true_remains>10) -actions.st_ff+=/ice_lance,if=buff.excess_fire.up&remaining_winters_chill=2|remaining_winters_chill=0&debuff.winters_chill.down&buff.fingers_of_frost.up +actions.st_ff+=/comet_storm,if=prev_gcd.1.flurry +actions.st_ff+=/flurry,if=variable.boltspam&(buff.icicles.stack<5&remaining_winters_chill=0&(debuff.winters_chill.down|buff.brain_freeze.up|buff.excess_frost.up)) +actions.st_ff+=/flurry,if=!variable.boltspam&(buff.icicles.stack<5&(remaining_winters_chill=0&debuff.winters_chill.down&(prev_gcd.1.frostfire_bolt|prev_gcd.1.glacial_spike)|buff.excess_frost.up)) +actions.st_ff+=/glacial_spike,if=buff.icicles.stack=5&(cooldown.flurry.ready|remaining_winters_chill) +actions.st_ff+=/ray_of_frost,if=remaining_winters_chill&(!variable.boltspam|buff.icy_veins.remains<14|buff.spymasters_web.up) +actions.st_ff+=/frozen_orb,if=variable.boltspam|buff.fingers_of_frost.down +actions.st_ff+=/shifting_power,if=(buff.icy_veins.down|!talent.deaths_chill)&cooldown.frozen_orb.remains>10&(!talent.comet_storm|cooldown.comet_storm.remains>10)&(!talent.ray_of_frost|cooldown.ray_of_frost.remains>10) +actions.st_ff+=/ice_lance,if=variable.boltspam&(buff.excess_fire.up&remaining_winters_chill=2|remaining_winters_chill=0&debuff.winters_chill.down&buff.fingers_of_frost.up) +actions.st_ff+=/ice_lance,if=!variable.boltspam&(buff.fingers_of_frost.up&!prev_gcd.1.glacial_spike|remaining_winters_chill) actions.st_ff+=/frostbolt actions.st_ff+=/call_action_list,name=movement actions.st_ss+=/comet_storm,if=prev_gcd.1.flurry&buff.icy_veins.down actions.st_ss+=/flurry,if=remaining_winters_chill=0&debuff.winters_chill.down&(prev_gcd.1.frostbolt|prev_gcd.1.glacial_spike) -actions.st_ss+=/frozen_orb,if=cooldown_react&(cooldown.icy_veins.remains>22|buff.icy_veins.up) -actions.st_ss+=/shifting_power,if=cooldown.icy_veins.true_remains>10&cooldown.flurry.remains&(fight_remains+10>cooldown.icy_veins.true_remains) -actions.st_ss+=/glacial_spike,if=buff.icicles.stacks=5&(cooldown.flurry.up|remaining_winters_chill) -actions.st_ss+=/ray_of_frost,if=remaining_winters_chill&buff.icy_veins.down -actions.st_ss+=/frostbolt,if=buff.icy_veins.remains>8&buff.deaths_chill.stack<8 -actions.st_ss+=/ice_lance,if=remaining_winters_chill=2|remaining_winters_chill&cooldown.flurry.up +actions.st_ss+=/frozen_orb,if=(cooldown.icy_veins.remains>22|buff.icy_veins.up) +actions.st_ss+=/glacial_spike,if=buff.icicles.stack=5&(cooldown.flurry.ready|remaining_winters_chill|cooldown.flurry.remains0) +actions.st_ss+=/ray_of_frost,if=variable.boltspam&remaining_winters_chill&buff.icy_veins.down +actions.st_ss+=/ray_of_frost,if=!variable.boltspam&remaining_winters_chill=1 +actions.st_ss+=/shifting_power,if=cooldown.icy_veins.remains>10&!cooldown.flurry.ready&(variable.boltspam|buff.icy_veins.down|buff.icy_veins.remains>10)&(fight_remains+10>cooldown.icy_veins.remains) +actions.st_ss+=/frostbolt,if=variable.boltspam&buff.icy_veins.remains>8&buff.deaths_chill.stack<8 +actions.st_ss+=/ice_lance,if=variable.boltspam&(remaining_winters_chill=2|remaining_winters_chill&cooldown.flurry.ready) +actions.st_ss+=/ice_lance,if=!variable.boltspam&(buff.fingers_of_frost.up&!prev_gcd.1.glacial_spike|remaining_winters_chill) actions.st_ss+=/frostbolt actions.st_ss+=/call_action_list,name=movement \ No newline at end of file diff --git a/TheWarWithin/Priorities/PaladinProtection.simc b/TheWarWithin/Priorities/PaladinProtection.simc index f8aac45b1..c15901c0f 100644 --- a/TheWarWithin/Priorities/PaladinProtection.simc +++ b/TheWarWithin/Priorities/PaladinProtection.simc @@ -8,8 +8,8 @@ actions.precombat+=/variable,name=trinket_sync_slot,value=1,if=trinket.1.has_coo actions.precombat+=/variable,name=trinket_sync_slot,value=2,if=trinket.2.has_cooldown&trinket.2.has_stat.any_dps&(!trinket.1.has_stat.any_dps|trinket.2.cooldown.duration>trinket.1.cooldown.duration)|!trinket.1.has_cooldown actions+=/rebuke -actions+=/call_action_list,name=cooldowns actions+=/call_action_list,name=mitigation +actions+=/call_action_list,name=cooldowns actions+=/call_action_list,name=trinkets actions+=/call_action_list,name=standard @@ -31,9 +31,11 @@ actions.mitigation+=/ardent_defender,if=tanking&incoming_damage_5s>goak_damage&! actions.mitigation+=/lay_on_hands,if=health.pct<15 actions.standard+=/call_action_list,name=hammer_of_light,if=talent.lights_guidance.enabled&(cooldown.eye_of_tyr.remains<2|buff.hammer_of_light_ready.up)&(!talent.redoubt.enabled|buff.redoubt.stack>=2|!talent.bastion_of_light.enabled)&!buff.hammer_of_light_free.up +actions.standard+=/judgment,cycle_targets=1,if=charges>=2|full_recharge_time<=gcd.max actions.standard+=/hammer_of_light,if=buff.hammer_of_light_free.remains<2|buff.shake_the_heavens.duration<1|!buff.shake_the_heavens.up|cooldown.eye_of_tyr.remains<1.5|fight_remains<2 +actions.standard+=/eye_of_tyr,if=(hpg_to_2dawn=5|!talent.of_dusk_and_dawn.enabled)&talent.lights_guidance.enabled +actions.standard+=/eye_of_tyr,if=(hpg_to_2dawn=1|buff.blessing_of_dawn.stack>0)&talent.lights_guidance.enabled actions.standard+=/shield_of_the_righteous,if=(!talent.righteous_protector.enabled|cooldown.righteous_protector_icd.remains=0)&!buff.hammer_of_light_ready.up -actions.standard+=/holy_armaments,if=next_armament=sacred_weapon&(!buff.sacred_weapon.up|(buff.sacred_weapon.remains<6&!buff.avenging_wrath.up&cooldown.avenging_wrath.remains<=30)) actions.standard+=/judgment,cycle_targets=1,if=spell_targets.shield_of_the_righteous>3&buff.bulwark_of_righteous_fury.stack>=3&holy_power<3 actions.standard+=/avengers_shield,if=!buff.bulwark_of_righteous_fury.up&talent.bulwark_of_righteous_fury.enabled&spell_targets.shield_of_the_righteous>=3 actions.standard+=/hammer_of_the_righteous,if=buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3&!buff.avenging_wrath.up @@ -41,9 +43,13 @@ actions.standard+=/blessed_hammer,if=buff.blessed_assurance.up&spell_targets.shi actions.standard+=/crusader_strike,if=buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<2&!buff.avenging_wrath.up actions.standard+=/judgment,cycle_targets=1,if=charges>=2|full_recharge_time<=gcd.max actions.standard+=/consecration,if=buff.divine_guidance.stack=5 +actions.standard+=/holy_armaments,if=next_armament=sacred_weapon&(!buff.sacred_weapon.up|(buff.sacred_weapon.remains<6&!buff.avenging_wrath.up&cooldown.avenging_wrath.remains<=30)) actions.standard+=/hammer_of_wrath -actions.standard+=/holy_armaments,if=next_armament=holy_bulwark&charges=2 -actions.standard+=/divine_toll,if=(!raid_event.adds.exists|raid_event.adds.in>10) +actions.standard+=/divine_toll +actions.standard+=/avengers_shield,if=!buff.shake_the_heavens.up&talent.shake_the_heavens.enabled +actions.standard+=/hammer_of_the_righteous,if=(buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3)|buff.shake_the_heavens.up +actions.standard+=/blessed_hammer,if=(buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3)|buff.shake_the_heavens.up +actions.standard+=/crusader_strike,if=(buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<2)|buff.shake_the_heavens.up actions.standard+=/judgment,cycle_targets=1 actions.standard+=/hammer_of_the_righteous,if=buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3 actions.standard+=/blessed_hammer,if=buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3 @@ -63,16 +69,5 @@ actions.standard+=/word_of_glory,if=buff.shining_light_free.up actions.standard+=/arcane_torrent,if=holy_power<5 actions.standard+=/consecration -actions.hammer_of_light+=/hammer_of_light,if=(buff.blessing_of_dawn.stack>0|!talent.of_dusk_and_dawn.enabled)|spell_targets.shield_of_the_righteous>=5 -actions.hammer_of_light+=/eye_of_tyr,if=hpg_to_2dawn=5|!talent.of_dusk_and_dawn.enabled -actions.hammer_of_light+=/shield_of_the_righteous,if=hpg_to_2dawn=4 -actions.hammer_of_light+=/eye_of_tyr,if=hpg_to_2dawn=1|buff.blessing_of_dawn.stack>0 -actions.hammer_of_light+=/hammer_of_wrath -actions.hammer_of_light+=/judgment -actions.hammer_of_light+=/blessed_hammer -actions.hammer_of_light+=/hammer_of_the_righteous -actions.hammer_of_light+=/crusader_strike -actions.hammer_of_light+=/divine_toll - actions.trinkets+=/use_items,slots=trinket1,if=(variable.trinket_sync_slot=1&(buff.avenging_wrath.up|fight_remains<=40)|(variable.trinket_sync_slot=2&(!trinket.2.cooldown.ready|!buff.avenging_wrath.up))|!variable.trinket_sync_slot) actions.trinkets+=/use_items,slots=trinket2,if=(variable.trinket_sync_slot=2&(buff.avenging_wrath.up|fight_remains<=40)|(variable.trinket_sync_slot=1&(!trinket.1.cooldown.ready|!buff.avenging_wrath.up))|!variable.trinket_sync_slot) diff --git a/TheWarWithin/Priorities/WarlockDestruction.simc b/TheWarWithin/Priorities/WarlockDestruction.simc index 9b7782643..3de460206 100644 --- a/TheWarWithin/Priorities/WarlockDestruction.simc +++ b/TheWarWithin/Priorities/WarlockDestruction.simc @@ -134,7 +134,7 @@ actions.havoc+=/wither,cycle_targets=1,if=(((dot.wither.refreshable&variable.hav actions.havoc+=/shadowburn,if=(cooldown.shadowburn.full_recharge_time<=gcd.max*3|debuff.eradication.remains<=gcd.max&talent.eradication&!action.chaos_bolt.in_flight&!talent.diabolic_ritual)&(talent.conflagration_of_chaos|talent.blistering_atrophy) actions.havoc+=/shadowburn,if=havoc_remains<=gcd.max*3 actions.havoc+=/chaos_bolt,if=cast_time=3-talent.wither +actions.havoc+=/rain_of_fire,if=active_enemies>=3 actions.havoc+=/channel_demonfire,if=soul_shard<4.5 actions.havoc+=/conflagrate,if=!talent.backdraft actions.havoc+=/dimensional_rift,if=soul_shard<4.7&(charges>2|boss&fight_remains Date: Fri, 22 Nov 2024 12:15:07 -1000 Subject: [PATCH 9/9] Tweak refresh --- UI.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI.lua b/UI.lua index 111fb7d9c..cfdd14a85 100644 --- a/UI.lua +++ b/UI.lua @@ -34,7 +34,7 @@ local GetSpellCooldown = function(spellID) return 0, 0, false, 0 end -local format, insert = string.format, table.insert +local floor, format, insert = math.floor, string.format, table.insert local HasVehicleActionBar, HasOverrideActionBar, IsInPetBattle, UnitHasVehicleUI, UnitOnTaxi = HasVehicleActionBar, HasOverrideActionBar, C_PetBattles.IsInBattle, UnitHasVehicleUI, UnitOnTaxi local Tooltip = ns.Tooltip @@ -2338,7 +2338,7 @@ do local spf = 1000 / ( rate > 0 and rate or 100 ) if HekiliEngine.threadUpdates then - Hekili.maxFrameTime = 0.9 * max( 7, min( 16.667, spf, HekiliEngine.threadUpdates.meanWorkTime / math.ceil( HekiliEngine.threadUpdates.meanFrames ) ) ) + Hekili.maxFrameTime = 0.9 * max( 7, min( 16.667, spf, 1.1 * HekiliEngine.threadUpdates.meanWorkTime / floor( HekiliEngine.threadUpdates.meanFrames ) ) ) else Hekili.maxFrameTime = 0.9 * max( 7, min( 16.667, spf ) ) end