-- RogueOutlaw.lua -- October 2022 -- Contributed to JoeMama. if UnitClassBase( "player" ) ~= "ROGUE" then return end local addon, ns = ... local Hekili = _G[ addon ] local class = Hekili.Class local state = Hekili.State local PTR = ns.PTR local spec = Hekili:NewSpecialization( 260 ) spec:RegisterResource( Enum.PowerType.ComboPoints ) spec:RegisterResource( Enum.PowerType.Energy, { blade_rush = { aura = "blade_rush", last = function () local app = state.buff.blade_rush.applied local t = state.query_time return app + floor( t - app ) end, interval = function() return class.auras.blade_rush.tick_time end, value = 5, }, --[[ vendetta_regen = { -- TODO: Vendetta regen? --aura = "vendetta_regen", --last = function () --local app = state.buff.vendetta_regen.applied --local t = state.query_time --return app + floor( t - app ) --end, --interval = 1, --value = 20, --}, ]] }, nil, -- No replacement model. { -- Meta function replacements. base_time_to_max = function( t ) if buff.adrenaline_rush.up then if t.current > t.max - 50 then return 0 end return state:TimeToResource( t, t.max - 50 ) end end, base_deficit = function( t ) if buff.adrenaline_rush.up then return max( 0, ( t.max - 50 ) - t.current ) end end, } ) -- Talents spec:RegisterTalents( { ace_up_your_sleeve = { 90670, 381828, 1 }, -- Between the Eyes has a 4% chance per combo point spent to grant 4 combo points. acrobatic_strikes = { 90752, 196924, 1 }, -- Increases the range of your melee attacks by 3 yds. adrenaline_rush = { 90659, 13750 , 1 }, -- Increases your Energy regeneration rate by 60%, your maximum Energy by 50, and your attack speed by 20% for 20 sec. alacrity = { 90751, 193539, 2 }, -- Your finishing moves have a 5% chance per combo point to grant 1% Haste for 15 sec, stacking up to 5 times. ambidexterity = { 90660, 381822, 1 }, -- Main Gauche has an additional 5% chance to strike while Blade Flurry is active. atrophic_poison = { 90763, 381637, 1 }, -- Coats your weapons with a Non-Lethal Poison that lasts for 1 |4hour:hrs;. Each strike has a 30% chance of poisoning the enemy, reducing their damage by 3.0% for 10 sec. audacity = { 90641, 381845, 1 }, -- Half-cost uses of Pistol Shot have a 35% chance to cause your next Ambush to be usable without Stealth. Chance to trigger this effect matches the chance for your Sinister Strike to strike an additional time. blackjack = { 90696, 379005, 1 }, -- Enemies have 30% reduced damage and healing for 6 sec after Blind or Sap's effect on them ends. blade_flurry = { 90674, 13877 , 1 }, -- Strikes up to 8 nearby targets for 529 Physical damage, and causes your single target attacks to also strike up to 7 additional nearby enemies for 50% of normal damage for 13 sec. blade_rush = { 90644, 271877, 1 }, -- Charge to your target with your blades out, dealing 1,587 Physical damage to the target and 794 to all other nearby enemies. While Blade Flurry is active, damage to non-primary targets is increased by 100%. Generates 25 Energy over 5 sec. blind = { 90684, 2094 , 1 }, -- Blinds the target, causing it to wander disoriented for 1 min. Damage will interrupt the effect. Limit 1. blinding_powder = { 90643, 256165, 1 }, -- Reduces the cooldown of Blind by 30 sec and increases its range by 5 yds. cheat_death = { 90747, 31230 , 1 }, -- Fatal attacks instead reduce you to 7% of your maximum health. For 3 sec afterward, you take 85% reduced damage. Cannot trigger more often than once per 6 min. cloak_of_shadows = { 90697, 31224 , 1 }, -- Provides a moment of magic immunity, instantly removing all harmful spell effects. The cloak lingers, causing you to resist harmful spells for 5 sec. cold_blood = { 90748, 382245, 1 }, -- Increases the critical strike chance of your next damaging ability by 100%. combat_potency = { 90646, 61329 , 1 }, -- Increases your Energy regeneration rate by 25%. combat_stamina = { 90648, 381877, 1 }, -- Stamina increased by 10%. count_the_odds = { 90655, 381982, 2 }, -- Ambush and Dispatch have a 10% chance to grant you a Roll the Bones combat enhancement buff you do not already have for 5 sec. Duration and chance doubled while Stealthed. dancing_steel = { 90669, 272026, 1 }, -- Blade Flurry strikes 3 additional enemies and its duration is increased by 3 sec. deadened_nerves = { 90743, 231719, 1 }, -- Physical damage taken reduced by 3%. deadly_precision = { 90760, 381542, 2 }, -- Increases the critical strike chance of your attacks that generate combo points by 5%. deeper_stratagem = { 90750, 193531, 1 }, -- Gain 1 additional max combo point. Your finishing moves that consume more than 5 combo points have increased effects, and your finishing moves deal 5% increased damage. deft_maneuvers = { 90672, 381878, 1 }, -- Increases the range of your melee attacks by 2 yards while Blade Flurry is active. devious_stratagem = { 90679, 394321, 1 }, -- Gain 1 additional max combo point. Your finishing moves that consume more than 5 combo points have increased effects, and your finishing moves deal 5% increased damage. dirty_tricks = { 90645, 108216, 1 }, -- Cheap Shot, Gouge, and Sap no longer cost Energy. dreadblades = { 90664, 343142, 1 }, -- Strike at an enemy, dealing 1,257 Physical damage and empowering your weapons for 10 sec, causing your Sinister Strike, Ambush, and Pistol Shot to fill your combo points, but your finishing moves consume 5% of your current health. echoing_reprimand = { 90639, 385616, 1 }, -- Deal 1,746 Arcane damage to an enemy, extracting their anima to Animacharge a combo point for 45 sec. Damaging finishing moves that consume the same number of combo points as your Animacharge function as if they consumed 7 combo points. Awards 2 combo points. elusiveness = { 90747, 79008 , 1 }, -- Evasion also reduces damage taken by 10%, and Feint also reduces non-area-of-effect damage taken by 20%. evasion = { 90764, 5277 , 1 }, -- Increases your dodge chance by 100% for 10 sec. fan_the_hammer = { 90666, 381846, 2 }, -- When Sinister Strike strikes an additional time, gain 1 additional stack of Opportunity. Max 6 stacks. Half-cost uses of Pistol Shot consume 1 additional stack of Opportunity to fire 1 additional shot. fatal_flourish = { 90662, 35551 , 1 }, -- Your off-hand attacks have a 65% chance to generate 10 Energy. feint = { 90742, 1966 , 1 }, -- Performs an evasive maneuver, reducing damage taken from area-of-effect attacks by 40% for 6 sec. find_weakness = { 90690, 91023 , 2 }, -- Your Stealth abilities reveal a flaw in your target's defenses, causing all your attacks to bypass 15% of that enemy's armor for 10 sec. fleet_footed = { 90762, 378813, 1 }, -- Movement speed increased by 15%. float_like_a_butterfly = { 90650, 354897, 1 }, -- Restless Blades now also reduces the remaining cooldown of Evasion and Feint by 0.5 sec per combo point spent. ghostly_strike = { 90677, 196937, 1 }, -- Strikes an enemy, dealing 1,058 Physical damage and causing the target to take 10% increased damage from your abilities for 10 sec. Awards 1 combo point. gouge = { 90741, 1776 , 1 }, -- Gouges the eyes of an enemy target, incapacitating for 4 sec. Damage will interrupt the effect. Must be in front of your target. Awards 1 combo point. grappling_hook = { 90682, 195457, 1 }, -- Launch a grappling hook and pull yourself to the target location. greenskins_wickers = { 90665, 386823, 1 }, -- Between the Eyes has a 20% chance per Combo Point to increase the damage of your next Pistol Shot by 200%. heavy_hitter = { 90642, 381885, 1 }, -- Attacks that generate combo points deal 10% increased damage. hidden_opportunity = { 90675, 383281, 1 }, -- Effects that grant a chance for Sinister Strike to strike an additional time also apply to Ambush. hit_and_run = { 90673, 196922, 1 }, -- Movement speed increased by 15%. improved_adrenaline_rush = { 90654, 395422, 1 }, -- Generate full combo points when you gain Adrenaline Rush, and again when it ends. improved_ambush = { 90692, 381620, 1 }, -- Ambush generates 1 additional combo point. improved_between_the_eyes = { 90671, 235484, 1 }, -- Critical strikes with Between the Eyes deal four times normal damage. improved_main_gauche = { 90668, 382746, 2 }, -- Main Gauche has an additional 5% chance to strike. improved_sprint = { 90746, 231691, 1 }, -- Reduces the cooldown of Sprint by 60 sec. improved_wound_poison = { 90637, 319066, 1 }, -- Wound Poison can now stack 2 additional times. iron_stomach = { 90744, 193546, 1 }, -- Increases the healing you receive from Crimson Vial, healing potions, and healthstones by 25%. keep_it_rolling = { 90652, 381989, 1 }, -- Increase the remaining duration of your active Roll the Bones combat enhancements by 30 sec. killing_spree = { 90664, 51690 , 1 }, -- Teleport to an enemy within 10 yards, attacking with both weapons for a total of 5,082 Physical damage over 2 sec. While Blade Flurry is active, also hits up to 4 nearby enemies for 100% damage. leeching_poison = { 90758, 280716, 1 }, -- Adds a Leeching effect to your Lethal poisons, granting you 10% Leech. lethality = { 90749, 382238, 2 }, -- Critical strike chance increased by 1%. Critical strike damage bonus of your attacks that generate combo points increased by 10%. loaded_dice = { 90656, 256170, 1 }, -- Activating Adrenaline Rush causes your next Roll the Bones to grant at least two matches. marked_for_death = { 90750, 137619, 1 }, -- Marks the target, instantly generating 5 combo points. Cooldown reset if the target dies within 1 min. master_poisoner = { 90636, 378436, 1 }, -- Increases the non-damaging effects of your weapon poisons by 20%. nightstalker = { 90693, 14062 , 2 }, -- While Stealth is active, your abilities deal 4% more damage. nimble_fingers = { 90745, 378427, 1 }, -- Energy cost of Feint and Crimson Vial reduced by 10. numbing_poison = { 90763, 5761 , 1 }, -- Coats your weapons with a Non-Lethal Poison that lasts for 1 |4hour:hrs;. Each strike has a 30% chance of poisoning the enemy, clouding their mind and slowing their attack and casting speed by 15% for 10 sec. opportunity = { 90683, 279876, 1 }, -- Sinister Strike has a 35% chance to hit an additional time, making your next Pistol Shot half cost and double damage. precise_cuts = { 90667, 381985, 1 }, -- Blade Flurry damage is increased by an additional 3% per missing target below its maximum. prey_on_the_weak = { 90755, 131511, 1 }, -- Enemies disabled by your Cheap Shot or Kidney Shot take 10% increased damage from all sources for 6 sec. quick_draw = { 90663, 196938, 1 }, -- Half-cost uses of Pistol Shot granted by Sinister Strike now generate 1 additional combo point, and deal 20% additional damage. recuperator = { 90640, 378996, 1 }, -- Slice and Dice heals you for up to 1% of your maximum health per 2 sec. resounding_clarity = { 90638, 381622, 1 }, -- Echoing Reprimand Animacharges 3 additional combo points. restless_blades = { 90658, 79096 , 1 }, -- Finishing moves reduce the remaining cooldown of many Rogue skills by 1 sec per combo point spent. Affected skills: Adrenaline Rush, Between the Eyes, Blade Flurry, Blade Rush, Dreadblades, Ghostly Strike, Grappling Hook, Keep it Rolling, Killing Spree, Marked for Death, Roll the Bones, Sepsis, Sprint, and Vanish. retractable_hook = { 90681, 256188, 1 }, -- Reduces the cooldown of Grappling Hook by 15 sec, and increases its retraction speed. reverberation = { 90638, 394332, 1 }, -- Echoing Reprimand's damage is increased by 75%. riposte = { 90661, 344363, 1 }, -- Dodging an attack will trigger Mastery: Main Gauche. This effect may only occur once every 1 sec. roll_the_bones = { 90657, 315508, 1 }, -- Roll the dice of fate, providing a random combat enhancement for 30 sec. rushed_setup = { 90754, 378803, 1 }, -- The Energy costs of Kidney Shot, Cheap Shot, Sap, and Distract are reduced by 20%. ruthlessness = { 90680, 14161 , 1 }, -- Your finishing moves have a 20% chance per combo point spent to grant a combo point. sap = { 90685, 6770 , 1 }, -- Incapacitates a target not in combat for 1 min. Only works on Humanoids, Beasts, Demons, and Dragonkin. Damage will revive the target. Limit 1. seal_fate = { 90757, 14190 , 2 }, -- When you critically strike with a melee attack that generates combo points, you have a 50% chance to gain an additional combo point per critical strike. sepsis = { 90677, 385408, 1 }, -- Infect the target's blood, dealing 5,370 Nature damage over 10 sec. If the target survives its full duration, they suffer an additional 1,970 damage and you gain 1 use of any Stealth ability for 5 sec. Cooldown reduced by 30 sec if Sepsis does not last its full duration. Awards 1 combo point. shadow_dance = { 90689, 185313, 1 }, -- Allows use of all Stealth abilities and grants all the combat benefits of Stealth for 6 sec. Effect not broken from taking damage or attacking. shadowrunner = { 90687, 378807, 1 }, -- While Stealth or Shadow Dance is active, you move 20% faster. shadowstep = { 90695, 36554 , 1 }, -- Step through the shadows to appear behind your target and gain 70% increased movement speed for 2 sec. shiv = { 90740, 5938 , 1 }, -- Attack with your off-hand, dealing 397 Physical damage, dispelling all enrage effects and applying a concentrated form of your Crippling Poison, reducing movement speed by 70% for 5 sec. Awards 1 combo point. sleight_of_hand = { 90651, 381839, 1 }, -- Roll the Bones has a 10% increased chance of granting additional matches. soothing_darkness = { 90691, 393970, 1 }, -- You are healed for 30% of your maximum health over 6 sec after gaining Vanish or Shadow Dance. subterfuge = { 90688, 108208, 1 }, -- Your abilities requiring Stealth can still be used for 3 sec after Stealth breaks. summarily_dispatched = { 90653, 381990, 2 }, -- When your Dispatch consumes 5 or more combo points, Dispatch deals 5% increased damage and costs 5 less Energy for 8 sec. Max 5 stacks. Adding a stack does not refresh the duration. swift_slasher = { 90649, 381988, 1 }, -- Slice and Dice grants an additional 2% attack speed per combo point spent. take_em_by_surprise = { 90676, 382742, 2 }, -- Haste increased by 10% while Stealthed and for 10 sec after leaving Stealth. thiefs_versatility = { 90753, 381619, 2 }, -- Versatility increased by 2%. thistle_tea = { 90756, 381623, 1 }, -- Restore 100 Energy. Mastery increased by 11.6% for 6 sec. tight_spender = { 90694, 381621, 1 }, -- Energy cost of finishing moves reduced by 10%. tricks_of_the_trade = { 90686, 57934 , 1 }, -- Redirects all threat you cause to the targeted party or raid member, beginning with your next damaging attack within the next 30 sec and lasting 6 sec. triple_threat = { 90678, 381894, 2 }, -- Sinister Strike has a 10% chance to strike with both weapons after it strikes an additional time. vigor = { 90759, 14983 , 1 }, -- Increases your maximum Energy by 50 and your Energy regeneration by 10%. virulent_poisons = { 90761, 381543, 1 }, -- Increases the damage of your weapon poisons by 10%. weaponmaster = { 90647, 200733, 1 }, -- Sinister Strike has a 5% increased chance to strike an additional time. } ) -- PvP Talents spec:RegisterPvpTalents( { boarding_party = 853 , -- 209752 control_is_king = 138 , -- 354406 dagger_in_the_dark = 5549, -- 198675 death_from_above = 3619, -- 269513 dismantle = 145 , -- 207777 drink_up_me_hearties = 139 , -- 354425 enduring_brawler = 5412, -- 354843 maneuverability = 129 , -- 197000 smoke_bomb = 3483, -- 212182 take_your_cut = 135 , -- 198265 thick_as_thieves = 1208, -- 221622 turn_the_tables = 3421, -- 198020 veil_of_midnight = 5516, -- 198952 } ) local rtb_buff_list = { "broadside", "buried_treasure", "grand_melee", "ruthless_precision", "skull_and_crossbones", "true_bearing", "rtb_buff_1", "rtb_buff_2" } -- Auras spec:RegisterAuras( { -- Talent: Energy regeneration increased by $w1%. Maximum Energy increased by $w4. Attack speed increased by $w2%. $?$w5>0[Damage increased by $w5%.][] -- https://wowhead.com/beta/spell=13750 adrenaline_rush = { id = 13750, duration = 20, max_stack = 1 }, -- Talent: Each strike has a chance of poisoning the enemy, reducing their damage by ${$392388s1*-1}.1% for $392388d. -- https://wowhead.com/beta/spell=381637 atrophic_poison = { id = 381637, duration = 3600, max_stack = 1 }, -- Talent: Damage reduced by ${$W1*-1}.1%. -- https://wowhead.com/beta/spell=392388 atrophic_poison_dot = { id = 392388, duration = 10, type = "Magic", max_stack = 1, }, alacrity = { id = 193538, duration = 15, max_stack = 5, }, audacity = { id = 386270, duration = 10, max_stack = 1, }, between_the_eyes = { id = 315341, duration = function() return 3 * effective_combo_points end, max_stack = 1, }, -- Talent: Attacks striking nearby enemies. -- https://wowhead.com/beta/spell=13877 blade_flurry = { id = 13877, duration = function () return talent.dancing_steel.enabled and 13 or 10 end, max_stack = 1, }, -- Talent: Generates $s1 Energy every sec. -- https://wowhead.com/beta/spell=271896 blade_rush = { id = 271896, duration = 5, tick_time = 1, max_stack = 1 }, -- Talent: Disoriented. -- https://wowhead.com/beta/spell=2094 blind = { id = 2094, duration = 60, mechanic = "disorient", type = "Ranged", max_stack = 1 }, -- Stunned. -- https://wowhead.com/beta/spell=1833 cheap_shot = { id = 1833, duration = 4, mechanic = "stun", max_stack = 1 }, -- Talent: Resisting all harmful spells. -- https://wowhead.com/beta/spell=31224 cloak_of_shadows = { id = 31224, duration = 5, max_stack = 1 }, -- Talent: Critical strike chance of your next damaging ability increased by $s1%. -- https://wowhead.com/beta/spell=382245 cold_blood = { id = 382245, duration = 3600, max_stack = 1 }, -- Bleeding for $w1 damage every $t1 sec. -- https://wowhead.com/beta/spell=121411 crimson_tempest = { id = 121411, duration = 2, tick_time = 2, max_stack = 1 }, -- Healing for $?a354425|a193546[${$W1}.2][$w1]% of maximum health every $t1 sec. -- https://wowhead.com/beta/spell=185311 crimson_vial = { id = 185311, duration = 4, type = "Magic", max_stack = 1 }, -- Each strike has a chance of poisoning the enemy, slowing movement speed by $3409s1% for $3409d. -- https://wowhead.com/beta/spell=3408 crippling_poison = { id = 3408, duration = 3600, max_stack = 1 }, -- Movement slowed by $s1%. -- https://wowhead.com/beta/spell=3409 crippling_poison_dot = { id = 3409, duration = 12, mechanic = "snare", type = "Magic", max_stack = 1 }, -- Movement speed slowed by $s1%. -- https://wowhead.com/beta/spell=115196 crippling_poison_snare = { id = 115196, duration = 5, mechanic = "snare", max_stack = 1 }, -- Each strike has a chance of causing the target to suffer Nature damage every $2818t1 sec for $2818d. Subsequent poison applications deal instant Nature damage. -- https://wowhead.com/beta/spell=2823 deadly_poison = { id = 2823, duration = 3600, max_stack = 1 }, -- Suffering $w1 Nature damage every $t1 seconds. -- https://wowhead.com/beta/spell=394324 deadly_poison_dot = { id = 2818, duration = 12, tick_time = 2, max_stack = 1, copy = 394324 }, -- Bleeding for $w damage every $t sec. Duplicating $@auracaster's Garrote, Rupture, and Lethal poisons applied. -- https://wowhead.com/beta/spell=360194 deathmark = { id = 360194, duration = 16, tick_time = 2, mechanic = "bleed", max_stack = 1 }, -- Talent: Sinister Strike, $?s196937[Ghostly Strike, ][]Ambush, and Pistol Shot will refill all of your combo points when used. -- https://wowhead.com/beta/spell=343142 dreadblades = { id = 343142, duration = 10, max_stack = 1 }, echoing_reprimand_2 = { id = 323558, duration = 45, max_stack = 6, }, echoing_reprimand_3 = { id = 323559, duration = 45, max_stack = 6, }, echoing_reprimand_4 = { id = 323560, duration = 45, max_stack = 6, copy = 354835, }, echoing_reprimand_5 = { id = 354838, duration = 45, max_stack = 6, }, echoing_reprimand = { alias = { "echoing_reprimand_2", "echoing_reprimand_3", "echoing_reprimand_4", "echoing_reprimand_5" }, aliasMode = "first", aliasType = "buff", meta = { stack = function () if combo_points.current > 1 and combo_points.current < 6 and buff[ "echoing_reprimand_" .. combo_points.current ].up then return combo_points.current end if buff.echoing_reprimand_2.up then return 2 end if buff.echoing_reprimand_3.up then return 3 end if buff.echoing_reprimand_4.up then return 4 end if buff.echoing_reprimand_5.up then return 5 end return 0 end } }, -- Talent: Dodge chance increased by ${$w1/2}%.$?a344363[ Dodging an attack while Evasion is active will trigger Mastery: Main Gauche.][] -- https://wowhead.com/beta/spell=5277 evasion = { id = 5277, duration = 10, max_stack = 1 }, -- Talent: Damage taken from area-of-effect attacks reduced by $s1%$?$w2!=0[ and all other damage taken reduced by $w2%. ][.] -- https://wowhead.com/beta/spell=1966 feint = { id = 1966, duration = 6, max_stack = 1 }, flagellation = { id = 384631, duration = 12, max_stack = 30, copy = { "flagellation_buff", 323654 } }, find_weakness = { id = 316220, duration = 10, max_stack = 1, }, -- Suffering $w1 damage every $t1 seconds. -- https://wowhead.com/beta/spell=360830 garrote = { id = 360830, duration = 18, tick_time = 2, mechanic = "bleed", max_stack = 1 }, -- Talent: Taking $s3% increased damage from the Rogue's abilities. -- https://wowhead.com/beta/spell=196937 ghostly_strike = { id = 196937, duration = 10, max_stack = 1 }, -- Talent: Incapacitated. -- https://wowhead.com/beta/spell=1776 gouge = { id = 1776, duration = 4, mechanic = "incapacitate", max_stack = 1 }, -- Each strike has a chance of poisoning the enemy, inflicting $315585s1 Nature damage. -- https://wowhead.com/beta/spell=315584 instant_poison = { id = 315584, duration = 3600, max_stack = 1 }, -- Suffering $w1 damage every $t1 sec. -- https://wowhead.com/beta/spell=154953 internal_bleeding = { id = 154953, duration = 6, tick_time = 1, mechanic = "bleed", max_stack = 1 }, -- Stunned. -- https://wowhead.com/beta/spell=408 kidney_shot = { id = 408, duration = function() return ( 1 + effective_combo_points ) end, mechanic = "stun", max_stack = 1 }, -- Increase the remaining duration of your active Roll the Bones combat enhancements by 30 sec. keep_it_rolling = { id = 381989, }, -- Talent: Attacking an enemy every $t1 sec. -- https://wowhead.com/beta/spell=51690 killing_spree = { id = 51690, duration = 2, tick_time = 0.4, max_stack = 1 }, -- Suffering $w4 Nature damage every $t4 sec. -- https://wowhead.com/beta/spell=385627 kingsbane = { id = 385627, duration = 14, max_stack = 1 }, -- Talent: Leech increased by $s1%. -- https://wowhead.com/beta/spell=108211 leeching_poison = { id = 108211, duration = 3600, max_stack = 1 }, -- Talent: Your next $?s5171[Slice and Dice will be $w1% more effective][Roll the Bones will grant at least two matches]. -- https://wowhead.com/beta/spell=256171 loaded_dice = { id = 256171, duration = 45, max_stack = 1, copy = 240837 }, -- Talent: Marked for Death will reset upon death. -- https://wowhead.com/beta/spell=137619 marked_for_death = { id = 137619, duration = 60, max_stack = 1 }, -- Suffering $w1 Nature damage every $t1 sec. -- https://wowhead.com/beta/spell=286581 nothing_personal = { id = 286581, duration = 20, tick_time = 2, type = "Magic", max_stack = 1 }, -- Coats your weapons with a Non-Lethal Poison that lasts for 1 |4hour:hrs;. Each strike has a 30% chance of poisoning the enemy, clouding their mind and slowing their attack and casting speed by 15% for 10 sec. numbing_poison = { id = 5761, duration = 3600, max_stack = 1, }, -- Talent: Attack and casting speed slowed by $s1%. -- https://wowhead.com/beta/spell=5760 numbing_poison_dot = { id = 5760, duration = 10, max_stack = 1 }, -- Talent: Your next Pistol Shot costs $s1% less Energy and deals $s3% increased damage. -- https://wowhead.com/beta/spell=195627 opportunity = { id = 195627, duration = 12, max_stack = 6 }, -- Movement speed reduced by $s3%. -- https://wowhead.com/beta/spell=185763 pistol_shot = { id = 185763, duration = 6, max_stack = 1 }, prey_on_the_weak = { id = 255909, duration = 6, max_stack = 1, }, -- Incapacitated. -- https://wowhead.com/beta/spell=107079 quaking_palm = { id = 107079, duration = 4, max_stack = 1 }, restless_blades = { id = 79096, }, riposte = { id = 199754, duration = 10, max_stack = 1, }, -- Bleeding for $w1 damage every $t1 sec. -- https://wowhead.com/beta/spell=360826 rupture = { id = 360826, duration = 4, tick_time = 2, mechanic = "bleed", max_stack = 1 }, -- Talent: Incapacitated.$?$w2!=0[ Damage taken increased by $w2%.][] -- https://wowhead.com/beta/spell=6770 sap = { id = 6770, duration = 60, mechanic = "sap", max_stack = 1 }, -- Talent: Suffering $w1 Nature damage every $t1 sec, and $394026s1 when the poison ends. -- https://wowhead.com/beta/spell=385408 sepsis = { id = 385408, duration = 10, tick_time = 1, max_stack = 1, copy = 328305, exsanguinated = false, meta = { vendetta_exsg = function( t ) return t.up and tracked_bleeds.sepsis.vendetta[ target.unit ] or false end, exsanguinated_rate = function( t ) return t.up and tracked_bleeds.sepsis.rate[ target.unit ] or 1 end, last_tick = function( t ) return t.up and ( tracked_bleeds.sepsis.last_tick[ target.unit ] or t.applied ) or 0 end, tick_time = function( t ) return t.up and ( haste * 2 / t.exsanguinated_rate ) or ( haste * 2 ) end, }, }, sepsis_buff = { id = 347037, duration = 5, max_stack = 1 }, -- Bleeding for $w1 every $t1 sec. -- https://wowhead.com/beta/spell=394036 serrated_bone_spike = { id = 394036, duration = 3600, tick_time = 3, max_stack = 1, copy = 324073 }, -- Talent: Access to Stealth abilities.$?$w3!=0[ Movement speed increased by $w3%.][]$?$w4!=0[ Damage increased by $w4%.][] -- https://wowhead.com/beta/spell=185422 shadow_dance = { id = 185422, duration = 6, max_stack = 1 }, -- Talent: Movement speed increased by $s2%. -- https://wowhead.com/beta/spell=36554 shadowstep = { id = 36554, duration = 2, max_stack = 1 }, shadow_blades = { id = 121471, duration = 20, max_stack = 1, }, -- Talent: $w1% increased Nature damage taken from $@auracaster.$?${$W2<0}[ Healing received reduced by $w2%.][] -- https://wowhead.com/beta/spell=319504 shiv = { id = 319504, duration = 8, max_stack = 1 }, sharpened_sabers = { id = 252285, duration = 15, max_stack = 2, }, -- Concealing allies within $115834A1 yards in shadows. -- https://wowhead.com/beta/spell=114018 shroud_of_concealment = { id = 114018, duration = 15, tick_time = 0.5, max_stack = 1 }, -- Concealed in shadows. -- https://wowhead.com/beta/spell=115834 shroud_of_concealment_buff = { id = 115834, duration = 2, max_stack = 1 }, -- Attack speed increased by $w1%. -- https://wowhead.com/beta/spell=315496 slice_and_dice = { id = 315496, duration = function () return 6 * ( 1 + effective_combo_points ) end, max_stack = 1, }, smoke_bomb = { id = 212182, duration = 5, max_stack = 1, }, soothing_darkness = { id = 393971, duration = 6, max_stack = 1, }, -- Movement speed increased by $w1%.$?s245751[ Allows you to run over water.][] -- https://wowhead.com/beta/spell=2983 sprint = { id = 2983, duration = 8, max_stack = 1, }, -- Stealthed.$?$w3!=0[ Movement speed increased by $w3%.][]$?$w4!=0[ Damage increased by $w4%.][] -- https://wowhead.com/beta/spell=1784 stealth = { id = 1784, duration = 3600, copy = 115191 }, subterfuge = { id = 115192, duration = 3, max_stack = 1, }, summarily_dispatched = { id = 386868, duration = 8, max_stack = 5, }, -- Your next combo point generator will critically strike. -- https://wowhead.com/beta/spell=227151 symbols_of_death = { id = 227151, duration = 10, max_stack = 1 }, -- Talent: Haste increased by $w1%. -- https://wowhead.com/beta/spell=385907 take_em_by_surprise = { id = 385907, duration = 3600, max_stack = 1 }, -- Talent: Mastery increased by ${$w2*$mas}.1%. -- https://wowhead.com/beta/spell=381623 thistle_tea = { id = 381623, duration = 6, type = "Magic", max_stack = 1 }, -- $s1% increased damage taken from poisons from the casting Rogue. -- https://wowhead.com/beta/spell=245389 toxic_blade = { id = 245389, duration = 9, max_stack = 1 }, -- Talent: Threat redirected from Rogue. -- https://wowhead.com/beta/spell=57934 tricks_of_the_trade = { id = 57934, duration = 30, max_stack = 1 }, -- Improved stealth.$?$w3!=0[ Movement speed increased by $w3%.][]$?$w4!=0[ Damage increased by $w4%.][] -- https://wowhead.com/beta/spell=11327 vanish = { id = 11327, duration = 3, max_stack = 1 }, -- Each strike has a chance of inflicting additional Nature damage to the victim and reducing all healing received for $8680d. -- https://wowhead.com/beta/spell=8679 wound_poison = { id = 8679, duration = 3600, max_stack = 1 }, -- Healing effects reduced by $w2%. -- https://wowhead.com/beta/spell=8680 wound_poison_debuff = { id = 8680, duration = 12, max_stack = 3, copy = 394327 }, -- Real RtB buffs. broadside = { id = 193356, duration = 30, }, buried_treasure = { id = 199600, duration = 30, }, grand_melee = { id = 193358, duration = 30, }, ruthless_precision = { id = 193357, duration = 30, }, skull_and_crossbones = { id = 199603, duration = 30, }, true_bearing = { id = 193359, duration = 30, }, -- Fake buffs for forecasting. rtb_buff_1 = { duration = 30, }, rtb_buff_2 = { duration = 30, }, -- Roll the dice of fate, providing a random combat enhancement for 30 sec. roll_the_bones = { alias = rtb_buff_list, aliasMode = "longest", -- use duration info from the buff with the longest remaining time. aliasType = "buff", duration = 30, }, lethal_poison = { alias = { "instant_poison", "wound_poison" }, aliasMode = "first", aliasType = "buff", duration = 3600 }, nonlethal_poison = { alias = { "crippling_poison", "numbing_poison", "atrophic_poison" }, aliasMode = "first", aliasType = "buff", duration = 3600 }, -- Legendaries (Shadowlands) concealed_blunderbuss = { id = 340587, duration = 8, max_stack = 1 }, deathly_shadows = { id = 341202, duration = 15, max_stack = 1, }, greenskins_wickers = { id = 340573, duration = 15, max_stack = 1, copy = 394131 }, master_assassins_mark = { id = 340094, duration = 4, max_stack = 1, copy = "master_assassin_any" }, -- Azerite snake_eyes = { id = 275863, duration = 30, max_stack = 1, }, } ) spec:RegisterStateExpr( "rtb_buffs", function () return buff.roll_the_bones.count end ) spec:RegisterStateExpr( "cp_max_spend", function () return combo_points.max end ) local stealth = { rogue = { "stealth", "vanish", "shadow_dance", "subterfuge" }, mantle = { "stealth", "vanish" }, sepsis = { "sepsis_buff" }, all = { "stealth", "vanish", "shadow_dance", "subterfuge", "shadowmeld", "sepsis_buff" } } spec:RegisterStateTable( "stealthed", setmetatable( {}, { __index = function( t, k ) if k == "rogue" then return buff.stealth.up or buff.vanish.up or buff.shadow_dance.up or buff.subterfuge.up elseif k == "rogue_remains" then return max( buff.stealth.remains, buff.vanish.remains, buff.shadow_dance.remains, buff.subterfuge.remains ) elseif k == "mantle" then return buff.stealth.up or buff.vanish.up elseif k == "mantle_remains" then return max( buff.stealth.remains, buff.vanish.remains ) elseif k == "sepsis" then return buff.sepsis_buff.up elseif k == "sepsis_remains" then return buff.sepsis_buff.remains elseif k == "all" then return buff.stealth.up or buff.vanish.up or buff.shadow_dance.up or buff.subterfuge.up or buff.shadowmeld.up or buff.sepsis_buff.up elseif k == "remains" or k == "all_remains" then return max( buff.stealth.remains, buff.vanish.remains, buff.shadow_dance.remains, buff.subterfuge.remains, buff.shadowmeld.remains, buff.sepsis_buff.remains ) end return false end } ) ) spec:RegisterUnitEvent( "UNIT_POWER_UPDATE", "player", nil, function( event, unit, resource ) if resource == "COMBO_POINTS" then Hekili:ForceUpdate( event, true ) end end ) -- Legendary from Legion, shows up in APL still. spec:RegisterGear( "mantle_of_the_master_assassin", 144236 ) spec:RegisterAura( "master_assassins_initiative", { id = 235027, duration = 3600 } ) spec:RegisterStateExpr( "mantle_duration", function () return legendary.mark_of_the_master_assassin.enabled and 4 or 0 end ) spec:RegisterStateExpr( "master_assassin_remains", function () if not legendary.mark_of_the_master_assassin.enabled then return 0 end if stealthed.mantle then return cooldown.global_cooldown.remains + 4 elseif buff.master_assassins_mark.up then return buff.master_assassins_mark.remains end return 0 end ) spec:RegisterStateExpr( "cp_gain", function () return ( this_action and class.abilities[ this_action ].cp_gain or 0 ) end ) spec:RegisterStateExpr( "effective_combo_points", function () local c = combo_points.current or 0 if not action.echoing_reprimand.known then return c end if c < 2 or c > 5 then return c end if buff[ "echoing_reprimand_" .. c ].up then return 7 end return c end ) -- We need to break stealth when we start combat from an ability. spec:RegisterHook( "runHandler", function( ability ) local a = class.abilities[ ability ] if stealthed.all and ( not a or a.startsCombat ) then if buff.stealth.up then setCooldown( "stealth", 2 ) if buff.take_em_by_surprise.up then buff.take_em_by_surprise.expires = query_time + 10 end end if legendary.mark_of_the_master_assassin.enabled and stealthed.mantle then applyBuff( "master_assassins_mark" ) end removeBuff( "stealth" ) removeBuff( "shadowmeld" ) removeBuff( "vanish" ) end if not a or a.startsCombat then removeBuff( "cold_blood" ) end end ) local restless_blades_list = { "adrenaline_rush", "between_the_eyes", "blade_flurry", "blade_rush", "dreadblades", "ghostly_strike", "grappling_hook", "keep_it_rolling", "killing_spree", "marked_for_death", "roll_the_bones", "sepsis", "sprint", "vanish" } spec:RegisterHook( "spend", function( amt, resource ) if amt > 0 and resource == "combo_points" then if amt >= 5 and talent.ruthlessness.enabled then gain( 1, "combo_points" ) end local cdr = amt * ( ( buff.true_bearing.up and 2 or 1 ) + ( talent.float_like_a_butterfly.enabled and 0.5 or 0 ) ) for _, action in ipairs( restless_blades_list ) do reduceCooldown( action, cdr ) end if legendary.obedience.enabled and buff.flagellation_buff.up then reduceCooldown( "flagellation", amt ) end end end ) local ExpireSepsis = setfenv( function () applyBuff( "sepsis_buff" ) if legendary.toxic_onslaught.enabled then applyBuff( "shadow_blades" ) applyDebuff( "target", "vendetta", 10 ) end end, state ) local ExpireAdrenalineRush = setfenv( function () gain( combo_points.max, "combo_points" ) end, state ) spec:RegisterHook( "reset_precast", function() if buff.killing_spree.up then setCooldown( "global_cooldown", max( gcd.remains, buff.killing_spree.remains ) ) end if debuff.sepsis.up then state:QueueAuraExpiration( "sepsis", ExpireSepsis, debuff.sepsis.expires ) end if buff.adrenaline_rush.up and talent.improved_adrenaline_rush.enabled then state:QueueAuraExpiration( "adrenaline_rush", ExpireAdrenalineRush, buff.adrenaline_rush.expires ) end end ) spec:RegisterCycle( function () if this_action == "marked_for_death" then if cycle_enemies == 1 or active_dot.marked_for_death >= cycle_enemies then return end -- As far as we can tell, MfD is on everything we care about, so we don't cycle. if debuff.marked_for_death.up then return "cycle" end -- If current target already has MfD, cycle. if target.time_to_die > 3 + Hekili:GetLowestTTD() and active_dot.marked_for_death == 0 then return "cycle" end -- If our target isn't lowest TTD, and we don't have to worry that the lowest TTD target is already MfD'd, cycle. end end ) -- Abilities spec:RegisterAbilities( { -- Talent: Increases your Energy regeneration rate by $s1%, your maximum Energy by $s4, and your attack speed by $s2% for $d. adrenaline_rush = { id = 13750, cast = 0, cooldown = 180, gcd = "off", talent = "adrenaline_rush", startsCombat = false, texture = 136206, toggle = "cooldowns", cp_gain = function () return talent.improved_adrenaline_rush.enabled and combo_points.max or 0 end, handler = function () applyBuff( "adrenaline_rush" ) if talent.improved_adrenaline_rush.enabled then gain( action.adrenaline_rush.cp_gain, "combo_points" ) state:QueueAuraExpiration( "adrenaline_rush", ExpireAdrenalineRush, buff.adrenaline_rush.remains ) end energy.regen = energy.regen * 1.6 energy.max = energy.max + 50 forecastResources( "energy" ) if talent.loaded_dice.enabled then applyBuff( "loaded_dice" ) elseif azerite.brigands_blitz.enabled then applyBuff( "brigands_blitz" ) end end, }, -- Ambush the target, causing $s1 Physical damage.$?s383281[ Has a $193315s3% chance to hit an additional time, making your next Pistol Shot half cost and double damage.][] |cFFFFFFFFAwards $s2 combo $lpoint:points;$?s383281[ each time it strikes][].|r ambush = { id = 8676, cast = 0, cooldown = 0, gcd = "spell", spend = function() return talent.tight_spender.enabled and 45 or 50 end, spendType = "energy", startsCombat = true, usable = function () return stealthed.all or buff.audacity.up or buff.sepsis_buff.up, "requires stealth or sepsis_buff" end, cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 2 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + talent.improved_ambush.rank + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end, handler = function () gain( action.ambush.cp_gain, "combo_points" ) if buff.sepsis_buff.up then removeBuff( "sepsis_buff" ) end if buff.audacity.up then removeBuff( "audacity" ) end end, }, -- Talent: Coats your weapons with a Non-Lethal Poison that lasts for $d. Each strike has a $h% chance of poisoning the enemy, reducing their damage by ${$392388s1*-1}.1% for $392388d. atrophic_poison = { id = 381637, cast = 1.5, cooldown = 0, gcd = "off", talent = "atrophic_poison", startsCombat = false, handler = function () applyBuff( "atrophic_poison" ) end, }, -- Finishing move that deals damage with your pistol, increasing your critical strike chance against the target by $s2%.$?a235484[ Critical strikes with this ability deal four times normal damage.][] 1 point : ${$*1} damage, 3 sec 2 points: ${$*2} damage, 6 sec 3 points: ${$*3} damage, 9 sec 4 points: ${$*4} damage, 12 sec 5 points: ${$*5} damage, 15 sec$?s193531|((s394320|s394321)&!s193531)[ 6 points: ${$*6} damage, 18 sec][]$?s193531&(s394320|s394321)[ 7 points: ${$*7} damage, 21 sec][] between_the_eyes = { id = 315341, cast = 0, cooldown = 45, gcd = "totem", school = "physical", spend = function() return talent.tight_spender.enabled and 22.5 or 25 end, spendType = "energy", startsCombat = false, texture = 135610, usable = function() return combo_points.current > 0, "requires combo points" end, handler = function () if talent.alacrity.enabled and effective_combo_points > 4 then addStack( "alacrity", 15, 1 ) end applyDebuff( "target", "between_the_eyes", 3 * effective_combo_points ) if azerite.deadshot.enabled then applyBuff( "deadshot" ) end if legendary.greenskins_wickers.enabled or talent.greenskins_wickers.enabled and effective_combo_points >= 5 then applyBuff( "greenskins_wickers" ) end removeBuff( "echoing_reprimand_" .. combo_points.current ) spend( combo_points.current, "combo_points" ) end, }, -- Talent: Strikes up to $?a272026[$331850i][${$331850i-3}] nearby targets for $331850s1 Physical damage, and causes your single target attacks to also strike up to $?a272026[${$s3+$272026s3}][$s3] additional nearby enemies for $s2% of normal damage for $d. blade_flurry = { id = 13877, cast = 0, cooldown = 30, gcd = "totem", school = "physical", spend = 15, spendType = "energy", talent = "blade_flurry", startsCombat = false, readyTime = function() return buff.blade_flurry.remains - gcd.execute end, handler = function () applyBuff( "blade_flurry" ) end, }, -- Talent: Charge to your target with your blades out, dealing ${$271881sw1*$271881s2/100} Physical damage to the target and $271881sw1 to all other nearby enemies. While Blade Flurry is active, damage to non-primary targets is increased by $s1%. |cFFFFFFFFGenerates ${$271896s1*$271896d/$271896t1} Energy over $271896d. blade_rush = { id = 271877, cast = 0, cooldown = 45, gcd = "totem", school = "physical", talent = "blade_rush", startsCombat = true, handler = function () applyBuff( "blade_rush" ) setDistance( 5 ) end, }, -- Talent: Blinds the target, causing it to wander disoriented for $d. Damage will interrupt the effect. Limit 1. blind = { id = 2094, cast = 0, cooldown = function () return talent.blinding_powder.enabled and 90 or 120 end, gcd = "spell", talent = "blind", startsCombat = true, toggle = "interrupts", handler = function () applyDebuff( "target", "blind" ) end, }, -- Stuns the target for $d. |cFFFFFFFFAwards $s2 combo $lpoint:points;.|r cheap_shot = { id = 1833, cast = 0, cooldown = 0, gcd = "spell", spend = function () if talent.dirty_tricks.enabled then return 0 end return ( talent.tight_spender.enabled and 36 or 40 ) * ( 1 + conduit.rushed_setup.mod * 0.01 ) end, spendType = "energy", startsCombat = true, cycle = function () if talent.prey_on_the_weak.enabled then return "prey_on_the_weak" end end, usable = function () if target.is_boss then return false, "cheap_shot assumed unusable in boss fights" end return stealthed.all or buff.subterfuge.up, "not stealthed" end, nodebuff = "cheap_shot", cp_gain = function () return 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) end, handler = function () applyDebuff( "target", "cheap_shot", 4 ) if buff.sepsis_buff.up then removeBuff( "sepsis_buff" ) end if talent.prey_on_the_weak.enabled then applyDebuff( "target", "prey_on_the_weak" ) end if pvptalent.control_is_king.enabled then applyBuff( "slice_and_dice" ) end gain( action.cheap_shot.cp_gain, "combo_points" ) end, }, -- Talent: Provides a moment of magic immunity, instantly removing all harmful spell effects. The cloak lingers, causing you to resist harmful spells for $d. cloak_of_shadows = { id = 31224, cast = 0, cooldown = 120, gcd = "off", talent = "cloak_of_shadows", startsCombat = false, toggle = "interrupts", buff = "dispellable_magic", handler = function () removeBuff( "dispellable_magic" ) applyBuff( "cloak_of_shadows" ) end, }, -- Talent: Increases the critical strike chance of your next damaging ability by $s1%. cold_blood = { id = 382245, cast = 0, cooldown = 45, gcd = "off", school = "physical", talent = "cold_blood", startsCombat = false, handler = function () applyBuff( "cold_blood" ) end, }, -- Drink an alchemical concoction that heals you for $?a354425&a193546[${$O1}.1][$o1]% of your maximum health over $d. crimson_vial = { id = 185311, cast = 0, cooldown = 30, gcd = "totem", school = "nature", spend = function () return 20 - ( 10 * talent.nimble_fingers.rank ) + conduit.nimble_fingers.mod end, spendType = "energy", startsCombat = false, texture = 1373904, handler = function () applyBuff( "crimson_vial" ) end, }, crippling_poison = { id = 3408, cast = 1.5, cooldown = 0, gcd = "spell", startsCombat = false, essential = true, texture = 132274, readyTime = function () return buff.nonlethal_poison.remains - 120 end, handler = function () applyBuff( "crippling_poison" ) end, }, deadly_poison = { id = 2823, cast = 0, cooldown = 0, gcd = "spell", startsCombat = false, essential = true, texture = 132290, readyTime = function () return buff.lethal_poison.remains - 120 end, handler = function () applyBuff( "deadly_poison" ) end, }, death_from_above = { id = 269513, cast = 0, cooldown = 30, gcd = "off", icd = 2, spend = function() return talent.tight_spender.enabled and 22.5 or 25 end, spendType = "energy", pvptalent = "death_from_above", startsCombat = false, usable = function() return combo_points.current > 0, "requires combo points" end, handler = function () spend( combo_points.current, "combo_points" ) end, }, dismantle = { id = 207777, cast = 0, cooldown = 45, gcd = "spell", spend = 25, spendType = "energy", pvptalent = "dismantle", startsCombat = false, handler = function () applyDebuff( "target", "dismantle" ) end, }, -- Finishing move that dispatches the enemy, dealing damage per combo point: 1 point : ${$m1*1} damage 2 points: ${$m1*2} damage 3 points: ${$m1*3} damage 4 points: ${$m1*4} damage 5 points: ${$m1*5} damage$?s193531|((s394320|s394321)&!s193531)[ 6 points: ${$m1*6} damage][]$?s193531&(s394320|s394321)[ 7 points: ${$m1*7} damage][] dispatch = { id = 2098, cast = 0, cooldown = 0, gcd = "totem", school = "physical", spend = function() return ( talent.tight_spender.enabled and 31.5 or 35 ) - 5 * ( buff.summarily_dispatched.up and buff.summarily_dispatched.stack or 0 ) end, spendType = "energy", startsCombat = true, usable = function() return combo_points.current > 0, "requires combo points" end, handler = function () if talent.alacrity.enabled and combo_points.current > 4 then addStack( "alacrity", 15, 1 ) end if talent.summarily_dispatched.enabled and combo_points.current > 5 then addStack( "summarily_dispatched", ( buff.summarily_dispatched.up and buff.summarily_dispatched.remains or nil ), 1 ) end removeBuff( "storm_of_steel" ) removeBuff( "echoing_reprimand_" .. combo_points.current ) spend( combo_points.current, "combo_points" ) end, }, -- Throws a distraction, attracting the attention of all nearby monsters for $s1 seconds. Usable while stealthed. distract = { id = 1725, cast = 0, cooldown = 30, gcd = "totem", school = "physical", spend = function () return 30 * ( talent.rushed_setup.enabled and 0.8 or 1 ) * ( 1 + conduit.rushed_setup.mod * 0.01 ) end, spendType = "energy", startsCombat = false, texture = 132289, handler = function () end, }, -- Talent: Strike at an enemy, dealing $s1 Physical damage and empowering your weapons for $d, causing your Sinister Strike,$?s196937[ Ghostly Strike,][]$?s328305[ Sepsis,][]$?s323547[ Echoing Reprimand,][]$?s328547[ Serrated Bone Spike,][] Ambush, and Pistol Shot to fill your combo points, but your finishing moves consume $343145s1% of your current health. dreadblades = { id = 343142, cast = 0, cooldown = 90, gcd = "spell", spend = 50, spendType = "energy", talent = "dreadblades", startsCombat = true, toggle = "cooldowns", cp_gain = function () return combo_points.max end, handler = function () applyDebuff( "player", "dreadblades" ) gain( action.dreadblades.cp_gain, "combo_points" ) end, }, -- Talent: Deal $s1 Arcane damage to an enemy, extracting their anima to Animacharge a combo point for $323558d. Damaging finishing moves that consume the same number of combo points as your Animacharge function as if they consumed $s2 combo points. |cFFFFFFFFAwards $s3 combo $lpoint:points;.|r echoing_reprimand = { id = function() return talent.echoing_reprimand.enabled and 385616 or 323547 end, cast = 0, cooldown = 45, gcd = "totem", school = "arcane", spend = 10, spendType = "energy", startsCombat = true, toggle = "cooldowns", cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 2 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end, handler = function () -- Can't predict the Animacharge, unless you have the talent/legendary. if legendary.resounding_clarity.enabled or talent.resounding_clarity.enabled then applyBuff( "echoing_reprimand_2", nil, 2 ) applyBuff( "echoing_reprimand_3", nil, 3 ) applyBuff( "echoing_reprimand_4", nil, 4 ) applyBuff( "echoing_reprimand_5", nil, 5 ) end gain( action.echoing_reprimand.cp_gain, "combo_points" ) end, copy = { 385616, 323547 }, }, -- Talent: Increases your dodge chance by ${$s1/2}% for $d.$?a344363[ Dodging an attack while Evasion is active will trigger Mastery: Main Gauche.][] evasion = { id = 5277, cast = 0, cooldown = 120, gcd = "off", school = "physical", talent = "evasion", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "evasion" ) end, }, -- Talent: Performs an evasive maneuver, reducing damage taken from area-of-effect attacks by $s1% $?s79008[and all other damage taken by $s2% ][]for $d. feint = { id = 1966, cast = 0, cooldown = 15, gcd = "totem", school = "physical", talent = "feint", spend = function () return talent.nimble_fingers.enabled and 25 or 35 + conduit.nimble_fingers.mod end, spendType = "energy", startsCombat = false, texture = 132294, handler = function () applyBuff( "feint" ) end, }, -- Talent: Strikes an enemy, dealing $s1 Physical damage and causing the target to take $s3% increased damage from your abilities for $d. |cFFFFFFFFAwards $s2 combo $lpoint:points;.|r ghostly_strike = { id = 196937, cast = 0, cooldown = 35, gcd = "totem", school = "physical", spend = 30, spendType = "energy", talent = "ghostly_strike", startsCombat = true, cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end, handler = function () applyDebuff( "target", "ghostly_strike" ) gain( action.ghostly_strike.cp_gain, "combo_points" ) end, }, -- Talent: Gouges the eyes of an enemy target, incapacitating for $d. Damage will interrupt the effect. Must be in front of your target. |cFFFFFFFFAwards $s2 combo $lpoint:points;.|r gouge = { id = 1776, cast = 0, cooldown = 20, gcd = "totem", school = "physical", spend = function () return talent.dirty_tricks.enabled and 0 or 25 end, spendType = "energy", talent = "gouge", startsCombat = true, cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end, handler = function () applyDebuff( "target", "gouge" ) gain( action.gouge.cp_gain, "combo_points" ) end, }, -- Talent: Launch a grappling hook and pull yourself to the target location. grappling_hook = { id = 195457, cast = 0, cooldown = function () return ( 1 - conduit.quick_decisions.mod * 0.01 ) * ( talent.retractable_hook.enabled and 45 or 60 ) end, gcd = "off", school = "physical", talent = "grappling_hook", startsCombat = false, texture = 1373906, handler = function () end, }, -- Talent: Increase the remaining duration of your active Roll the Bones combat enhancements by $s1 sec. keep_it_rolling = { id = 381989, cast = 0, cooldown = 420, gcd = "off", school = "physical", talent = "keep_it_rolling", startsCombat = false, toggle = "cooldowns", buff = "roll_the_bones", handler = function () for _, v in pairs( rtb_buff_list ) do if buff[ v ].up then buff[ v ].expires = buff[ v ].expires + 30 end end end, }, kick = { id = 1766, cast = 0, cooldown = 15, gcd = "off", school = "physical", startsCombat = true, toggle = "interrupts", debuff = "casting", readyTime = state.timeToInterrupt, handler = function () interrupt() end }, kidney_shot = { id = 408, cast = 0, cooldown = 20, gcd = "spell", spend = function () return ( talent.rushed_setup.enabled and 20 or 25 ) * ( 1 - 0.1 * talent.tight_spender.rank ) * ( 1 + conduit.rushed_setup.mod * 0.01 ) end, spendType = "energy", startsCombat = true, texture = 132298, usable = function () if target.is_boss then return false, "kidney_shot assumed unusable in boss fights" end return combo_points.current > 0, "requires combo points" end, handler = function () if talent.alacrity.enabled and combo_points.current > 4 then addStack( "alacrity", nil, 1 ) end applyDebuff( "target", "kidney_shot", 1 + combo_points.current ) if pvptalent.control_is_king.enabled then gain( 10 * combo_points.current, "energy" ) end spend( combo_points.current, "combo_points" ) end, }, -- Talent: Teleport to an enemy within 10 yards, attacking with both weapons for a total of $ Physical damage over $d. While Blade Flurry is active, also hits up to $s5 nearby enemies for $s2% damage. killing_spree = { id = 51690, cast = 0, cooldown = 120, gcd = "totem", school = "physical", talent = "killing_spree", startsCombat = true, toggle = "cooldowns", handler = function () applyBuff( "killing_spree" ) setCooldown( "global_cooldown", 2 ) end, }, marked_for_death = { id = 137619, cast = 0, cooldown = 60, gcd = "off", school = "physical", talent = "marked_for_death", startsCombat = false, texture = 236364, toggle = "cooldowns", usable = function () return combo_points.current <= settings.mfd_points, "combo_point (" .. combo_points.current .. ") > user preference (" .. settings.mfd_points .. ")" end, cp_gain = function () return 5 end, handler = function () gain( action.marked_for_death.cp_gain, "combo_points" ) end, }, -- Coats your weapons with a Non-Lethal Poison that lasts for 1 hour. Each strike has a 30% chance of poisoning the enemy, clouding their mind and slowing their attack and casting speed by 15% for 10 sec. numbing_poison = { id = 5761, cast = 1, cooldown = 0, gcd = "spell", startsCombat = false, readyTime = function () return buff.nonlethal_poison.remains - 120 end, handler = function () applyBuff( "numbing_poison" ) end, }, -- Draw a concealed pistol and fire a quick shot at an enemy, dealing ${$s1*$/$AP} Physical damage and reducing movement speed by $s3% for $d. |cFFFFFFFFAwards $s2 combo $lpoint:points;.|r pistol_shot = { id = 185763, cast = 0, cooldown = 0, gcd = "totem", school = "physical", spend = function () return 40 - ( buff.opportunity.up and 20 or 0 ) end, spendType = "energy", startsCombat = true, cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) + ( talent.quick_draw.enabled and buff.opportunity.up and 1 or 0 ) + ( buff.concealed_blunderbuss.up and 2 or 0 ) + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) ) end, handler = function () gain( action.pistol_shot.cp_gain, "combo_points" ) removeStack( "opportunity" ) removeBuff( "deadshot" ) removeBuff( "concealed_blunderbuss" ) -- Generating 2 extra combo points is purely a guess. removeBuff( "greenskins_wickers" ) removeBuff( "tornado_trigger" ) end, }, -- Talent: Roll the dice of fate, providing a random combat enhancement for $d. roll_the_bones = { id = 315508, cast = 0, cooldown = 45, gcd = "totem", school = "physical", spend = 25, spendType = "energy", talent = "roll_the_bones", startsCombat = false, handler = function () for _, name in pairs( rtb_buff_list ) do removeBuff( name ) end if azerite.snake_eyes.enabled then applyBuff( "snake_eyes", nil, 5 ) end applyBuff( "rtb_buff_1" ) if buff.loaded_dice.up then applyBuff( "rtb_buff_2" ) removeBuff( "loaded_dice" ) end if pvptalent.take_your_cut.enabled then applyBuff( "take_your_cut" ) end end, }, sap = { id = 6770, cast = 0, cooldown = 0, gcd = "totem", school = "physical", spend = function () return ( talent.dirty_tricks.enabled and 0 or 35 ) * ( 1 + conduit.rushed_setup.mod * 0.01 ) end, spendType = "energy", talent = "sap", startsCombat = false, handler = function () applyDebuff( "target", "sap" ) end, }, -- Talent: Infect the target's blood, dealing $o1 Nature damage over $d. If the target survives its full duration, they suffer an additional $328306s1 damage and you gain $s6 use of any Stealth ability for $347037d. Cooldown reduced by $s3 sec if Sepsis does not last its full duration. |cFFFFFFFFAwards $s7 combo $lpoint:points;.|r sepsis = { id = function() return talent.sepsis.enabled and 385408 or 328305 end, cast = 0, cooldown = 90, gcd = "totem", school = "nature", spend = 25, spendType = "energy", startsCombat = true, toggle = "cooldowns", cp_gain = function() return debuff.dreadblades.up and combo_points.max or ( 1 + ( talent.seal_fate.enabled and buff.cold_blood.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) ) end, handler = function () applyBuff( "sepsis_buff" ) applyDebuff( "target", "sepsis" ) debuff.sepsis.exsanguinated_rate = 1 gain( action.sepsis.cp_gain, "combo_points" ) end, copy = { 385408, 328305 } }, -- Talent: Allows use of all Stealth abilities and grants all the combat benefits of Stealth for $d$?a245687[, and increases damage by $s2%][]. Effect not broken from taking damage or attacking.$?s137035[ If you already know $@spellname185313, instead gain $394930s1 additional $Lcharge:charges; of $@spellname185313.][] shadow_dance = { id = 185313, cast = 0, charges = 1, cooldown = 60, recharge = 60, gcd = "off", talent = "shadow_dance", startsCombat = false, toggle = "cooldowns", nobuff = "shadow_dance", usable = function () return not stealthed.all, "not used in stealth" end, handler = function () applyBuff( "shadow_dance" ) if talent.shot_in_the_dark.enabled then applyBuff( "shot_in_the_dark" ) end if talent.master_of_shadows.enabled then applyBuff( "master_of_shadows" ) end if azerite.the_first_dance.enabled then gain( 2, "combo_points" ) applyBuff( "the_first_dance" ) end end, }, shadowstep = { id = 36554, cast = 0, charges = 1, cooldown = 30, recharge = 30, gcd = "off", talent = "shadowstep", startsCombat = false, texture = 132303, handler = function () applyBuff( "shadowstep" ) setDistance( 5 ) end, }, shiv = { id = 5938, cast = 0, cooldown = 25, gcd = "totem", school = "physical", spend = function () return legendary.tiny_toxic_blade.enabled and 0 or 20 end, spendType = "energy", talent = "shiv", startsCombat = true, cp_gain = function () return 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) end, handler = function () gain( action.shiv.cp_gain, "combo_point" ) removeDebuff( "target", "dispellable_enrage" ) end, }, shroud_of_concealment = { id = 114018, cast = 0, cooldown = 360, gcd = "totem", school = "physical", startsCombat = false, toggle = "interrupts", handler = function () applyBuff( "shroud_of_concealment" ) end, }, sinister_strike = { id = 193315, known = 1752, cast = 0, cooldown = 0, gcd = "spell", spend = 45, spendType = "energy", startsCombat = false, texture = 136189, cp_gain = function () return debuff.dreadblades.up and combo_points.max or ( 1 + ( buff.shadow_blades.up and 1 or 0 ) + ( buff.broadside.up and 1 or 0 ) ) end, -- 20220604 Outlaw priority spreads bleeds from the trinket. cycle = function () if buff.acquired_axe_driver.up and debuff.vicious_wound.up then return "vicious_wound" end end, handler = function () removeStack( "snake_eyes" ) gain( action.sinister_strike.cp_gain, "combo_points" ) end, copy = 1752 }, -- Finishing move that consumes combo points to increase attack speed by $s1%. Lasts longer per combo point. 1 point : 12 seconds 2 points: 18 seconds 3 points: 24 seconds 4 points: 30 seconds 5 points: 36 seconds$?s193531|((s394320|s394321)&!s193531)[ 6 points: 42 seconds][]$?s193531&(s394320|s394321)[ 7 points: 48 seconds][] slice_and_dice = { id = 315496, cast = 0, cooldown = 0, gcd = "totem", school = "physical", spend = function() return talent.tight_spender.enabled and 22.5 or 25 end, spendType = "energy", startsCombat = false, texture = 132306, usable = function() return combo_points.current > 0, "requires combo points" end, handler = function () if talent.alacrity.enabled and combo_points.current > 4 then addStack( "alacrity", 15, 1 ) end applyBuff( "slice_and_dice" ) spend( combo_points.current, "combo_points" ) end, }, smoke_bomb = { id = 212182, cast = 0, cooldown = 180, gcd = "spell", pvptalent = "smoke_bomb", startsCombat = false, toggle = "cooldowns", handler = function () applyBuff( "smoke_bomb" ) end, }, sprint = { id = 2983, cast = 0, cooldown = function () return talent.improved_sprint.enabled and 60 or 120 end, gcd = "off", startsCombat = false, texture = 132307, toggle = "interrupts", handler = function () applyBuff( "sprint" ) end, }, -- Conceals you in the shadows until cancelled, allowing you to stalk enemies without being seen. $?s14062[Movement speed while stealthed is increased by $s3% and damage dealt is increased by $s4%.]?s108209[ Abilities cost $112942s1% less while stealthed. ][]$?s31223[ Attacks from Stealth and for $31223s1 sec after deal $31665s1% more damage.][] stealth = { id = 1784, cast = 0, cooldown = 2, gcd = "off", school = "physical", startsCombat = false, texture = 132320, usable = function () if time > 0 then return false, "cannot stealth in combat" elseif buff.stealth.up then return false, "already in stealth" elseif buff.vanish.up then return false, "already vanished" end return true end, handler = function () applyBuff( "stealth" ) if talent.take_em_by_surprise.enabled then applyBuff( "take_em_by_surprise" ) end if conduit.cloaked_in_shadows.enabled then applyBuff( "cloaked_in_shadows" ) end if conduit.fade_to_nothing.enabled then applyBuff( "fade_to_nothing" ) end end, }, thistle_tea = { id = 381623, cast = 0, charges = 3, cooldown = 60, recharge = 60, icd = 1, gcd = "off", school = "physical", spend = -100, spendType = "energy", talent = "thistle_tea", startsCombat = false, toggle = "cooldowns", handler = function () applyBuff( "thistle_tea" ) end, }, tricks_of_the_trade = { id = 57934, cast = 0, cooldown = 30, gcd = "off", talent = "tricks_of_the_trade", startsCombat = false, usable = function() return group, "requires an ally" end, handler = function () applyBuff( "tricks_of_the_trade" ) end, }, -- Allows you to vanish from sight, entering stealth while in combat. For the first $11327d after vanishing, damage and harmful effects received will not break stealth. Also breaks movement impairing effects. vanish = { id = 1856, cast = 0, charges = 1, cooldown = 120, recharge = 120, gcd = "off", startsCombat = false, texture = 132331, disabled = function () return not settings.solo_vanish and not ( boss and group ), "can only vanish in a boss encounter or with a group" end, toggle = "cooldowns", handler = function () applyBuff( "vanish" ) applyBuff( "stealth" ) if conduit.cloaked_in_shadows.enabled then applyBuff( "cloaked_in_shadows" ) end if conduit.fade_to_nothing.enabled then applyBuff( "fade_to_nothing" ) end if legendary.invigorating_shadowdust.enabled then for name, cd in pairs( cooldown ) do if cd.remains > 0 then reduceCooldown( name, 20 ) end end end end, }, wound_poison = { id = 8679, cast = 1.5, cooldown = 0, gcd = "spell", startsCombat = false, essential = true, texture = 134197, readyTime = function () return buff.lethal_poison.remains - 120 end, handler = function () applyBuff( "wound_poison" ) end, }, --[[ apply_poison = { name = _G.MINIMAP_TRACKING_VENDOR_POISON, cast = 1.5, cooldown = 0, gcd = "spell", startsCombat = false, essential = true, texture = function () if buff.lethal_poison.down or level < 33 then return state.spec.assassination and level > 12 and class.abilities.deadly_poison.texture or class.abilities.instant_poison.texture end if level > 32 and buff.nonlethal_poison.down then return class.abilities.crippling_poison.texture end end, bind = function () if buff.lethal_poison.down or level < 33 then return state.spec.assassination and level > 12 and "deadly_poison" or "instant_poison" end if level > 32 and "nonlethal_poison" then return "crippling_poison" end end, usable = function () return buff.lethal_poison.down or level > 32 and buff.nonlethal_poison.down, "requires missing poison" end, handler = function () if buff.lethal_poison.down then applyBuff( state.spec.assassination and level > 12 and "deadly_poison" or "instant_poison" ) elseif level > 32 then applyBuff( "crippling_poison" ) end end, copy = "apply_poison_actual" }, ]] } ) -- Override this for rechecking. spec:RegisterAbility( "shadowmeld", { id = 58984, cast = 0, cooldown = 120, gcd = "off", usable = function () return boss and group end, handler = function () applyBuff( "shadowmeld" ) end, } ) spec:RegisterOptions( { enabled = true, aoe = 3, nameplates = true, nameplateRange = 8, damage = true, damageExpiration = 6, potion = "phantom_fire", package = "Outlaw", } ) spec:RegisterSetting( "mfd_points", 3, { name = "|T236340:0|t Marked for Death Combo Points", desc = "The addon will only recommend |T236364:0|t Marked for Death when you have the specified number of combo points or fewer.", type = "range", min = 0, max = 5, step = 1, width = "full" } ) spec:RegisterSetting( "dirty_gouge", false, { name = "Use |T132155:0|t Gouge with Dirty Tricks", desc = "If checked, the addon will recommend |T132155:0|t Gouge when Dirty Tricks is talented and you do not have " .. "enough energy to Sinister Strike. |cFFFFD100This may be problematic for positioning|r, as you'd need to be in front of your " .. "target.\n\nThis setting is unchecked by default.", type = "toggle", width = "full", } ) spec:RegisterSetting( "solo_vanish", true, { name = "Allow |T132331:0|t Vanish when Solo", desc = "If unchecked, the addon will not recommend |T132331:0|t Vanish when you are alone (to avoid resetting combat).", type = "toggle", width = "full" } ) spec:RegisterSetting( "allow_shadowmeld", nil, { name = "Allow |T132089:0|t Shadowmeld", desc = "If checked, |T132089:0|t Shadowmeld can be recommended for Night Elves when its conditions are met. Your stealth-based abilities can be used in Shadowmeld, even if your action bar does not change. " .. "Shadowmeld can only be recommended in boss fights or when you are in a group (to avoid resetting combat).", type = "toggle", width = "full", get = function () return not Hekili.DB.profile.specs[ 260 ].abilities.shadowmeld.disabled end, set = function ( _, val ) Hekili.DB.profile.specs[ 260 ].abilities.shadowmeld.disabled = not val end, } ) spec:RegisterPack( "Outlaw", 20221104.1, [[Hekili:T31EZTTrs(plQsv0KwY08HPZMTevvX2j75Cx2KBLVB)pbbcmucRab4IhswxXIF2VU7zWG5jaLSu0D1D1URJxIb90tp9JFDpnMCX0l(YfNhhwXU4VoBYSztNo5DJNmDYIfZU48Q73YU48THr3eEf8xYc3a)5VvxLgEh(Z3NMhgJVEzEDre8ORRQ2w(NF7BVkP666vJJY382YKn1PHvj5zrfHRRW))rV9IZxvNKw95Slwzo3xCEyD115fxC(5jB(iqYK4ygFCSYOlo)IZttkRkjMMToSoTc(R)vArWYcxLYIV4d8XwKSfN2lo)VXkRyHPvxV)YK17VCBEzzcmW9xomlF)L3wNMXkcPFGLX2KWkHXLT)sG7xfwncyOioDeu5IkGB7A((CwfROOEB1(lZj6KNgNFh83QGPlmnn)U9xcIHnjzxHZemy(maZ7DjixwDDy1fNdeeEus4fNFemE(CZIhdeOLLUjj6gKFMBWp5Bb2Lv1oWBdbkbpf)BP1W)OOAvWQ61RHj909xoB)Lda5X(lHPc)1XRkGT2YKy246TkpROoJToV4kgS3MfbSeloyvADwmRyvDz5yblqVbm8kyazvJxhMfa8EW1HB2WkAh0UDTty5n1PPbHzXbrfWg0Q8mwjn3JCo9jz3MCvEbOyLDvq51HGaoUUSYnTRkQzbRyGii7QgAoIpefXWYgXaxauxKalUQcwyzDHumqp7QcKp3Wsz4VBPTvKNMU)Yp8L9xE8(l)l)kOfuGB4zxHQyIjdyM07HNaILcAdhup(qJm)K9x(Lp0OmCUCXDcNsNN9XMN9HwrpTfhWTqXfvbXgOUX7EW6gOMFEW2Cq3SCmyLLeLa6YNXfqh7tdbmEkU6E(4wmrzxduvIRtQavM6Sksripo2NUIVbHBw08Ill65CvKc2MWe00bN2PW0oYy)4NYW9pqIb)VRyW6yDnU98JBaPgic)4Vd)mNcWMk8hfSSxbJIl)it0pISeUjbu43aMsUjgEx49QY9qIMb46nHMCq6V4Bs6ZxwrBd2e(1GYTmKdFJZnG3qsB6b5B3MxuvNLuDp9OxtpsiF)N1GlJG4IW70LT9yQoszhWTPVWUchfB9AgS6ULf09AXyN6NtYsWTKqqydJr1tnUlHQ851Ot1BzfRbVO0MdOfuxYDwNJVbotGHsDwkRe(91OfZhQ(j41VojcjEkSPbpOeOvkSWwbuFXX4mOUtUMyf9DY37yNSG5DV0lPuCS3eAy8kw1Dmgx0ZUNuRdJVNBw5rycETxyia)rXAlSQITbd)GbCQlzcjakx5l1tq97RclI5cP81c7ag4f6UqiwdUE)(hIM7HSAjLN1PauIuoIaYZRMNv7NkTVH170ofiK)PouPMDmpUozhNcRsW58h)eF1)ZkZR0qCkkf(tpePa9AGQn6HkectbUpxLggZcwNwxuCVsO2IWK4a2TOjxi6NdzSZGhorXot9vv8ZrYHJLwS3KqUPalQciCudNQlg(7u0caiwvYw0CsWCNGcJeGMnRbqaH2sxZIUbn6r1Nywe4IbnFy8yvL5BqdYpzydvEp4uiUnWui(s)mX7Q6hQRPa8Dqz8pyiJBvz8a7bWbeW)7biAqoMqXmOGsB6edc38(rHiwdpeikUKEztmLTCvJ4AST2(HWH83IMdtCKhedIyNJPx3e2xllYdgpEvyjlqlc(0fKYJ45GxaMcxhwefMXcQYlGOGv0uqOhmE(260sM6eJdCH6attU66QYG)rD8vBqkzm23Ro2vHxfKVgqAbbMk1hj8IGwnhiUeMV89YRQWGqGpJ7zXy0aGX)AsMXK5teVjS4g8TZlabuiOWOi98zDUqHFckz4(oWXGAMdi4kkXGvYQKS4XBbqC1PGhEm5aGj0Jalh2T5OJiyCL5PepinQB491GF7RP8PKa8mtsrxiyIcrUHgdB0HG)dwqbaDrLRfUxs2STac4ghym0wMYHezUR4LstdnaCAIDfF9ZDs4zUcmjx6PjrmkfI4emBuvcVgIuFn3nThYwjnm7lFsEqfwbWOIiROJYBySTIGlFSaT2IzOxCia82t4jE(3(DU)v6hqCje4K)c42oR8gyDRaBHid3ln)DcxrqFipYjSX6Bu4WgxLSbTCH1oJuwN3GaNZhUGy0kTFhxfCOAkwxjzSG7atty96eXyxdBud4ErAtwJeJ9lYu7WMyTCf6zGC8d1vxJY0aCBpPeT6iKQk(rmemUCAyaIrxtttsUg98fi)fmuFRYNssrILq5DjRbfraoY1Mzg3xEaJ8Q53P3OJEg2MvcCbaAH0cYZJT8mfNuUnSk6Alx8ya3(S5(OaPm3MtfDbVilZoww9gnxVQyXKPWQOtQHXcZLxQvO8GU1i2GaMlccllH)Bsw7EpmztAveJri9evHCQPYbPxXfJ8ABSmKynAtQxtGB4nTVTENKBqBUJ6jvESVcOCCFvT54Em)4XtvkKf49mibmC4jD7QUfTb)uXQ7VkznRlVO1Ob4X75ubqCdZzmjK5K8p6(iicTqZcvEDeLvJ3AT4qKheIhyxZq5X0r3dOGxMVabQj9EXyTCHAlQKvll8gWr4MGvW7wxSTiPuTiGDlnD5D0st2SmjAZUJxw1rhTycIdZ4U5mXy8)lXFQL43g2KSIjSlhzy(jUeOPOLiIMCyaBs(Vyc0oQ1PHk4aRiKZrqcMnjNZXnHWEqhLAa5E8cBUtyJ3s6i2O2kY4eEfHUKqpOAf0Krm)1b1s3fn5rPelIzBMItNvh4xjsU)YFSuq0t4j1V)Y)ZqEru4P2hIof5aG5OyBQKAmdXLqfLd3pjGXnf4sa4TP4BA0Gt2FD9NKvqPPSX9xCSoSngjH0(GiKTPYixLOO)Ya1rrc(w2D7DRTBnlxvfXrHnC8Q0S3pwhjjSR0JdlMokYsJ7jZ8o1opQdmjvxaQf24J8NmSRc0ONiOmnCH3TFNNG)(l)jrg(8e)YYRu8ijoOb6hDwTSwzWqLQc8nw8aLKXCIsYdGyb17TKMJmPJRTn6SbukmvdOlQy)NzUDOxKJoQ1LZLKph6CwKphALBE8nzuWaz5xDxP6r2AF(SfLP2kDaznsHdiLvTsAcT1FZbky7YxrY6iWdW0XlCGpTJYB1As5cn8P6cZ2deuS6AL9f5xvZSK(6NGO1zzn1(i7(myZesh0wiEYDu9skZs2Ye4dGSmAmDsZVJHvY)lF5tJ3F5)rjRbir89uKO1IOA8tyfpKdj3KxOCMsHz3JpECBPm9z0)zYGUHbVlb13i5esl55lKX(kq15tOI6GCfeFJhxCvEzPRjU)YpoFcjWmFACDdektZ7h7(XHAMi1R1gG2jvmPFdQo0PL1k(bf59Hd9xBXWJo5Cz4n83z2h90pQEiCCGu)RjItugRbPufUbEffbrbfgnfQXZ1oPNari6MZqzANWZjddunA6BM9fEqjcFgVCKIis3LtN8Dui8d)e5MUb2gQk)fiL(HZW)8oNy9hjSOiRpZLrZmn2jAdlOc6ij8UU7sJVJcFQEGJoRkJ7dpHOP65MqNSoVJiWtvzu)Xk50yw7z4BMpIYHO3LU2enZgn5dPlyMiYblZh2BaALehvLDcz6rDAQ3g)NhrE(ehImhib48QetMjwCl3Z1LKv2NvsG3OpAixYz5fBctXyixLeXnpahQcWUOvlDqO0lVj8FGk3F8tLJDdF)qkwqhEt9bmR7C)nYtYWlCtQnAyvu3Z8ctrDqc6igs3aJCw2Gz(t34Hj(6oE0Jwckx1SORZXPVGTTizd4ruleW7TftLSTLjAsiLhvalgSdzaSkGHzYnadGLkTaMfupNmTKh5VBbxN5g5ee)W(B2kLs67BiJ6tWjeecYChlCBEg3DL2gwN5uBusVnm(rApZFD2foM0pn7jt087GTZqfI7LfQGQLlY5zPoxbqIVCuSl6RKcVM0euyFLzK4F)PPisVkppofvTb1MOkFZ38jDYMTt)2C6FIZS2HTqZtW6AmFYwUbhM250VIvaQQOpoZHPDe9Rtky8d1XyuFV6OWIYwwveMgerDRH(qnJjXX0Cxr42seFglLfvvKxwbw1ras1kq1kjuPNp6DK4K4Vts4QhiImUBJyjkwxs)g2dpWdCoJYb3nBXWkGmTQUapLj5jW4Fm4PX439xpifaVVGypUnUiYSEsn49EpUIVxkPtYIlJaWKyN8uwb(LuKT2pdzD)oG46Lr)ZAIdd)kRdBhSRjeDwtye6SzDG8nBAVwfXzxdczkthen9veODcQeGrsCaKRx8nSIORtyRDLjSMrINxs1xBCo4SSOMLgCvyrbOWbjitadigQZctWRWoiAjv31yqHcWwoaStswZcExhYTwTqVVVIxuVdbzrFfragr2nSQPgyO(eVX65btip2LI0tQlrAayLaljekuzAoitvOt7IVl03uqi(7mUA64RdldqZ5XqYWbXBlDlrWs4W70g)NZ2bpPZEqtQX6CMLeu0ajnnFtFNM95nnPJdG5(7Pm5bOxjooAPJxk(QUd3QM(eZbVivAiamDxRiFNpkVmb9jVDC8PMkBFa5simKCv11g7vxd(9X8La5(nQnEXsQJHAwy6dJ0zoaqOa4Z7PwilkGCgB33vLxNClsnt7jDKznLILTEnKjYT4zRb4jb)zrqOlW8m3OrpoKsMBbofzJf9PeyD(O2ff43b4l5Py6ru9OPS3rrnYCRUFpV)QrKpH8ZTbM(Cy1EVv0aZUoVjd7o66NUEEhVUM6ewRtzOdTMpXSGi9ZVd7LLAr92130crKE7s(N6v)wANeYEkNkyUjElhh53ph2uUY)fAvCc5XVSgZm53AfpkDKp4Wm6MsELEWIiDhRPeOuNQ9UJ51yLkN0NAZIKx(h6epqWRQEx6uy2ig6yVs9re3XtmW6zuro5pxk8vFUgIfne(gYv)qmF8lgpLNL6lpVfCXlhADaFybvXcsRb(zlKRk4or8P7v1CwCD6oP7Jd7h3ULQh4hoFFZN6MSvZvR4DBRrI(uACOCc(xzRHeNPkUiFprH8lZbuPyTixxXRNpJE1nHiAz(GDGAZrE4b4V3GFtjuO1aPfSzCJUg)Jy6D1frwh5J)Ykx3EEhjvnwIu9B1(EyegKNN9P2UQ4eXhF2Djin4nV66I8n07VLe5IKEvxxoGhT4ak9bA8jtH(nskJGvj5jwfoKwtgptsoxwe8ZRa)CT0Sl82fAd6UCMt7F)VZJcYvauYXQMZt0p5hPgoggmMTA09YATJFkt0(fRPE7M7MSVcSiAwrdJ(0DAlZUOqN)7430f6Wf)SC1ucF8UKg6Vm4w1ahcdDWffY9glU5p133wOsjR65RxlSoomcxeQZyJwI8HgN6KP3tF9TEjcmhwonOk7e2SvcYatdqblgB99IskrNlOn83iIZpQqBFNKBVpIzidB35ItYH(rrIinh0cTs0QoJf7RNTa49eypSbnv)wSVlSiduXaFaFbNKKnOEIixWxj((RFf2IZ8fAZxhuyDv(g0CIm1Zat9X7)L)Te8yBN)NrRHmyUOh)QE(IIFf3rxFdRzdhg(WPFDK3zZP9qZC0PXsFuU3AzBVs6PO3MZ47mMr3v6TzA6UoW9rBNvi2qoDyuEHBk3AiBqvBl8dKIFt7P7)fh63YpuKVnnCVDWtdp2Bl(0NUN3M)XAg81DqhOm2xFwziT7RDS6rUhrQApajUj3EqN(VT94b0Qa9jN614(B2lG)z04SKTNjpTmR5m8(xmPP)z(5sA6FgFQKMF)Z(m8NEX2V(HxSzE60)GCqjMUzp7(09pfpzo1N6bnKzBxziS81EJwK)LZXXu)AIpxEoSMs7gSWqo6O1lmj6Sj)HVoMzAj9ucR0I4pD4kNBbzvC0o2hNKK((pXjlQBbas8U2NBKf1DoKUW7WpXNx9GG8ykyB3)TlzSToI)pMtl1C3BG(NeVd4qNH)37kX0dUGaAFIVge35N)RLY4FqsipHhEsKqov8PdO8HP37xwyE6D2scFNVNPCW0ZYbCGEVYmMC)N9N5SAcu8PiTw3aeF6OSNyGpbuE6Zrw(DtA1swAqyxvZuv3(ZKAnsS330KI7VKUNcHhJ34e5RtsLDRr5yzLfoE5B9DnMS)xCnAtWyNyDBwSC6KtswV0UrHoB2c30S9dTbFrVix3TZlIt30v0neUFObYBhRJ5i30dGD30w)BI3bPNrsi(PyC6CpCV2NfRFI0E5o8l4)572F5329nPKBwkLFFh2lZvF73PKssdlp8MJexahP3iPC()f5gmuL7AAjItWgGAz7DvWj0N4Xs5T24PZgm8iRJma(TwV(oRx8GJC6Yy3UJ66aLgPrypaTBOHXDMWOr72jz7LZgWzARlzYbIJ9x9cMK2uEMVgd9l8nBExXwGRZX5SLZo2EZGFCrNTCXeq85o)b52H(pVBhrn334JNbo6grIMx47nq)IoZw5YHO7SLQFawVXs69MHooGUxpuiUAlw(UDovOhjeH(Agf45UVo905lsm)0D7c(aKy5Bxs3XIORQE(oUh4ELC6clLKd9Ma8bWN8D2PiBscCxFJed88KMart9ScaZkAj8YEl(5xyy12AcPH)(BgCB7cFYeH2QRl(WZMESqd35fEOk3vOF37XzsryocHJEeV2x08w3J)MrXL9sDU(asC)F2e9oru6qQdt)64dPUJJKh8dU4yTJK3Mc0f2N6VBC)8P(iTRJpbIMME0SfPeXRl5nq6jAheo3iWUTrpB60b(Bx0D70ATKtNo1yUaotVRoXzPZUc90LZTPb2bNeUnVzfA)ow9Ejh3u)P6TBxhFUDwtdpqljV)M6mtBk32xKs)t6buAqD4OxefMKoFM3xtUloEHn3O0Vf(yNHDmN(qU1xCUV1LH0b8ltxt2RC0PyzGFPRvJtEM9wHSPjfIphnm5PZg9eYAorv(UbCe1gFVP2ZQAhnEYArtpU0HNeftTx6Mw0Hlk7wrJC4Canu4HrmhURpmIJIR)WB)WdBnbRb9ailxSB3H2tIVXUFepDj2lIijSvixk6bXbDMS4apDE4zt96I)fU3b71o2TRx3(yCHurfLYRbNQqQYokWMtNaNUCQDQLYKESBAi5JmBjqXMMsZaoQD)4jVn8CO8Q3gEUmg5mOZEhSx6jaS9aUUmBjja0vdlpHvwfdpKiIq8zElbPsJJTkahqhp3MblNmWY1oY3nv1X6sXubsvBvHgzo)g3MKKURJ3tejuvLIRKzu7MJ7YoN)qN3ZLJoBMjNPM9NthXAjNmyO30jg4cH9ely0ZTKnQxHI0mEqN8(G(l8L6qmADLbgllrfYCETh21AMVpyEFfQOtywSQgx0MVILuH)z3))LLhs8TplxIJ(L3hSqI7OWXf4OwaJtbFu(V4bAxLV8x3H2Ie1IQ44g4txA1PYPi4NVw3ruGgSCSDxsnVQEqcvdp4x2CBWH13t2s)Ww59xLgl9u5R4G9g4p82Huba(uzEIyOViouaR7)bi8yphmMoYvWOquQ8NJBSq7yCQNN4WhZbkoY04FOtChaf6OgJJAElBb4UD(qNpZs5ubBIJi0M(EgEe)TDCj1isI2vPHh1UJAQ5cGK75(dKV1(cEP5zkXSoKAXvt4saZVlqp23hHdgAdV5ux5fasNs9B)l31qq)ywM2kYEgUk)6vC4yjNKD28jVX3v73Gh1ISBDXoV8(iOK(1wTlfWJ(cUR7qbEV63e(XpmWAklw9l3pAz6X39zZAZl8)jCZ5zLJJQOrlaLvKM2GqELN2Ayd9xSEp5S5kL)HA58p74Plg1Lt7Zgo7noX5rLW13o1elF2T3yC9izg6noGZIok(rxgfnHuoD58jglXZM16V5z9UP7qqz7lBfVUkmdf7pDef8K23fDTr4uePQb3SU15A6KcNUG6idU(xR(9l(awS9FXXD27vxFQxxC9uBs7RkUZMzRK3EZP5QYbdD3QfYcJP)ZJ8VsDxLoz90oCu(kxvAidRFFUHTZXKMeH1Uf3ajnV8SlNlIj5cpNEDpeVXRFVftWVW0KLzZ4(yZKoZN4DkTD50CJRz9e5LSMfs5M7vnRCb0Uk1mFk4HiaVbM4Xi77IrR732)TxMugzCRPzlJ6H)SUCXSkSOEmaJl(SD7Caw69wL6677Ml64AfZznxDOuP2)KUMcVxNyEpXfNxQyDpjEVOVAZxS7RBmxBFFhck5WUZV8XDLNq3rwlBUkWq2PRJ73)NRHjdUCMxfmJjD2HoP2FIgoNuLghI9s(VT3Ax(CFZlnxC462r9GN7hexZ68D72nSRVvaz4c7hns4T2tBdCuxKvwHkhpIiQ76PBkio2QnDBmLD)VH2ovBtEGsZ72Ior7tYqVmk6jy5IB070IJE0IwhKU52FtOwEUzZvlc)VSzCAaF9xMlXRDCZHItxlLr4fa6e6wH4I)7d]] )