Skip to content

Commit

Permalink
warlock p5/p6 preset
Browse files Browse the repository at this point in the history
  • Loading branch information
kayla-glick committed Dec 26, 2024
1 parent 69b4d2f commit 4f65ba3
Show file tree
Hide file tree
Showing 19 changed files with 1,941 additions and 101 deletions.
484 changes: 484 additions & 0 deletions sim/warlock/dps/TestAffliction.results

Large diffs are not rendered by default.

444 changes: 444 additions & 0 deletions sim/warlock/dps/TestDemonology.results

Large diffs are not rendered by default.

526 changes: 487 additions & 39 deletions sim/warlock/dps/TestDestruction.results

Large diffs are not rendered by default.

136 changes: 136 additions & 0 deletions sim/warlock/dps/dps_warlock_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,40 @@ func TestAffliction(t *testing.T) {
Consumes: Phase4Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Affliction Warlock", SpecOptions: DefaultAfflictionWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
},
{
Class: proto.Class_ClassWarlock,
Phase: 5,
Level: 60,
Race: proto.Race_RaceOrc,

Talents: Phase5DemoTalents,
GearSet: core.GetGearSet("../../../ui/warlock/gear_sets/p5", "affliction"),
Rotation: core.GetAplRotation("../../../ui/warlock/apls/p5", "affliction"),
Buffs: core.FullBuffsPhase5,
Consumes: Phase5Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Affliction Warlock", SpecOptions: DefaultAfflictionWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
},
{
Class: proto.Class_ClassWarlock,
Phase: 6,
Level: 60,
Race: proto.Race_RaceOrc,

Talents: Phase6DestroTalents,
GearSet: core.GetGearSet("../../../ui/warlock/gear_sets/p6", "affliction"),
Rotation: core.GetAplRotation("../../../ui/warlock/apls/p6", "affliction"),
Buffs: core.FullBuffsPhase6,
Consumes: Phase6Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Affliction Warlock", SpecOptions: DefaultAfflictionWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
Expand All @@ -80,6 +114,40 @@ func TestDemonology(t *testing.T) {
Consumes: Phase2Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Demonology Warlock", SpecOptions: DefaultDemonologyWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
},
{
Class: proto.Class_ClassWarlock,
Phase: 5,
Level: 60,
Race: proto.Race_RaceOrc,

Talents: Phase5DemoTalents,
GearSet: core.GetGearSet("../../../ui/warlock/gear_sets/p5", "demonology"),
Rotation: core.GetAplRotation("../../../ui/warlock/apls/p5", "demonology"),
Buffs: core.FullBuffsPhase5,
Consumes: Phase5Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Demonology Warlock", SpecOptions: DefaultDemonologyWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
},
{
Class: proto.Class_ClassWarlock,
Phase: 6,
Level: 60,
Race: proto.Race_RaceOrc,

Talents: Phase6DestroTalents,
GearSet: core.GetGearSet("../../../ui/warlock/gear_sets/p6", "demonology"),
Rotation: core.GetAplRotation("../../../ui/warlock/apls/p6", "demonology"),
Buffs: core.FullBuffsPhase6,
Consumes: Phase6Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Demonology Warlock", SpecOptions: DefaultDemonologyWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
Expand Down Expand Up @@ -150,6 +218,40 @@ func TestDestruction(t *testing.T) {
Consumes: Phase4Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Destruction Warlock", SpecOptions: DefaultDestroWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
},
{
Class: proto.Class_ClassWarlock,
Phase: 5,
Level: 60,
Race: proto.Race_RaceOrc,

Talents: Phase5DestroTalents,
GearSet: core.GetGearSet("../../../ui/warlock/gear_sets/p5", "destruction"),
Rotation: core.GetAplRotation("../../../ui/warlock/apls/p5", "destruction"),
Buffs: core.FullBuffsPhase5,
Consumes: Phase5Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Destruction Warlock", SpecOptions: DefaultDestroWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
},
{
Class: proto.Class_ClassWarlock,
Phase: 6,
Level: 60,
Race: proto.Race_RaceOrc,

Talents: Phase6DestroTalents,
GearSet: core.GetGearSet("../../../ui/warlock/gear_sets/p6", "destruction"),
Rotation: core.GetAplRotation("../../../ui/warlock/apls/p6", "destruction"),
Buffs: core.FullBuffsPhase6,
Consumes: Phase6Consumes,
SpecOptions: core.SpecOptionsCombo{Label: "Destruction Warlock", SpecOptions: DefaultDestroWarlock},

ItemFilter: ItemFilters,
EPReferenceStat: proto.Stat_StatSpellPower,
StatsToWeigh: Stats,
Expand All @@ -169,6 +271,14 @@ var Phase3NFRuinTalents = "25002500102-03-50502051020001"
var Phase4AffTalents = "4500253012201005--50502051020001"
var Phase4DestroTalents = "05002-035004-5050205102005151"

var Phase5AffTalents = "4500253012201005--50502051020001"
var Phase5DemoTalents = "-230205015250005-52500051020001"
var Phase5DestroTalents = "05002-23-5550205122005151"

var Phase6AffTalents = "3500243212201005-2302050152001"
var Phase6DemoTalents = "-230205015250005-52500051020001"
var Phase6DestroTalents = "05002-23-5550205122005151"

var DefaultDestroWarlock = &proto.Player_Warlock{
Warlock: &proto.Warlock{
Options: &proto.WarlockOptions{
Expand Down Expand Up @@ -245,6 +355,32 @@ var Phase4Consumes = core.ConsumesCombo{
},
}

var Phase5Consumes = core.ConsumesCombo{
Label: "P5-Consumes",
Consumes: &proto.Consumes{
DefaultPotion: proto.Potions_MajorManaPotion,
Flask: proto.Flask_FlaskOfSupremePower,
FirePowerBuff: proto.FirePowerBuff_ElixirOfGreaterFirepower,
ShadowPowerBuff: proto.ShadowPowerBuff_ElixirOfShadowPower,
Food: proto.Food_FoodTenderWolfSteak,
MainHandImbue: proto.WeaponImbue_FlametongueWeapon,
SpellPowerBuff: proto.SpellPowerBuff_GreaterArcaneElixir,
},
}

var Phase6Consumes = core.ConsumesCombo{
Label: "P6-Consumes",
Consumes: &proto.Consumes{
DefaultPotion: proto.Potions_MajorManaPotion,
Flask: proto.Flask_FlaskOfSupremePower,
FirePowerBuff: proto.FirePowerBuff_ElixirOfGreaterFirepower,
ShadowPowerBuff: proto.ShadowPowerBuff_ElixirOfShadowPower,
Food: proto.Food_FoodDarkclawBisque,
MainHandImbue: proto.WeaponImbue_FlametongueWeapon,
SpellPowerBuff: proto.SpellPowerBuff_ElixirOfTheMageLord,
},
}

var ItemFilters = core.ItemFilter{
WeaponTypes: []proto.WeaponType{
proto.WeaponType_WeaponTypeSword,
Expand Down
2 changes: 1 addition & 1 deletion ui/protection_paladin/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ export const DefaultConsumes = Consumes.create({
armorElixir: ArmorElixir.ElixirOfSuperiorDefense,
defaultPotion: Potions.GreaterStoneshieldPotion,
dragonBreathChili: true,
food: Food.FoodTenderWolfSteak,
food: Food.FoodDarkclawBisque,
flask: Flask.FlaskOfTheTitans,
firePowerBuff: FirePowerBuff.ElixirOfGreaterFirepower,
fillerExplosive: Explosive.ExplosiveDenseDynamite,
Expand Down
2 changes: 1 addition & 1 deletion ui/tank_warlock/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ export const DefaultConsumes = Consumes.create({
fillerExplosive: Explosive.ExplosiveDenseDynamite,
firePowerBuff: FirePowerBuff.ElixirOfGreaterFirepower,
flask: Flask.FlaskOfAncientKnowledge,
food: Food.FoodTenderWolfSteak,
food: Food.FoodDarkclawBisque,
healthElixir: HealthElixir.ElixirOfFortitude,
mainHandImbue: WeaponImbue.ShadowOil,
manaRegenElixir: ManaRegenElixir.MagebloodPotion,
Expand Down
3 changes: 2 additions & 1 deletion ui/warlock/apls/p4/destruction.apl.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
{"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":427713}}}}},{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":426320}}}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":440870}}}}},{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":440870}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E35"}}}}]}}]}}]}},"multidot":{"spellId":{"spellId":11668,"rank":7},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"action":{"condition":{"and":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":427713}}}}},{"or":{"vals":[{"not":{"val":{"runeIsEquipped":{"runeId":{"spellId":440870}}}}},{"and":{"vals":[{"runeIsEquipped":{"runeId":{"spellId":440870}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},{"not":{"val":{"isExecutePhase":{"threshold":"E35"}}}}]}}]}}]}},"multidot":{"spellId":{"spellId":11672,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"10%"}}}},"castSpell":{"spellId":{"spellId":11689,"rank":6}}}},
{"action":{"castSpell":{"spellId":{"spellId":412758}}}}
{"action":{"castSpell":{"spellId":{"spellId":412758}}}},
{"action":{"condition":{"const":{"val":"false"}},"castSpell":{"spellId":{"spellId":20572}}}}
]
}
34 changes: 34 additions & 0 deletions ui/warlock/apls/p5/affliction.apl.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"type": "TypeAPL",
"prepullActions": [
{"action":{"castSpell":{"spellId":{"spellId":18288}}},"doAtValue":{"const":{"val":"-5s"}}},
{"action":{"castSpell":{"spellId":{"spellId":11661,"rank":9}}},"doAtValue":{"const":{"val":"-2.5"}}},
{"action":{"castSpell":{"spellId":{"itemId":229910}}},"doAtValue":{"const":{"val":"0s"}}}
],
"priorityList": [
{"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":469211}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":469225}}}}},{"not":{"val":{"warlockPetIsActive":{}}}}]}},"castSpell":{"spellId":{"spellId":688}}}},
{"action":{"castSpell":{"spellId":{"itemId":215162}}}},
{"action":{"castSpell":{"spellId":{"itemId":228255}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"5s"}}}},{"warlockPetIsActive":{}}]}},"castSpell":{"spellId":{"itemId":230238}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"15s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"50%"}}}}]}},"castSpell":{"spellId":{"itemId":13444}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"15s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"25%"}}}}]}},"castSpell":{"spellId":{"itemId":12662}}}},
{"hide":true,"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11717,"rank":4}}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":11717,"rank":4}}}},
{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"0.5s"}}}},"castSpell":{"spellId":{"spellId":18871,"rank":6}}}},
{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3.5s"}}}},"channelSpell":{"spellId":{"spellId":11675,"rank":4},"interruptIf":{"gcdIsReady":{}}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"warlockCurrentPetMana":{}},"rhs":{"const":{"val":"800"}}}},{"cmp":{"op":"OpGt","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":11689,"rank":6}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},"multidot":{"spellId":{"spellId":426320},"maxDots":1,"maxOverlap":{"spellCastTime":{"spellId":{"spellId":426320}}}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"12s"}}}},"multidot":{"spellId":{"spellId":11672,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"12s"}}}},"multidot":{"spellId":{"spellId":427717},"maxDots":1,"maxOverlap":{"spellCastTime":{"spellId":{"spellId":427717}}}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"18s"}}}},"multidot":{"spellId":{"spellId":11713,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"action":{"castSpell":{"spellId":{"spellId":403501}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}},"multidot":{"spellId":{"spellId":11700,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"hide":true,"action":{"condition":{"auraIsActive":{"auraId":{"spellId":457558}}},"cancelAura":{"auraId":{"spellId":457558}}}},
{"hide":true,"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":426311}}},{"auraIsKnown":{"auraId":{"spellId":448686}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":448686}}},{"multidot":{"spellId":{"spellId":11672,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}]}}},
{"hide":true,"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":426311}}},{"not":{"val":{"auraIsKnown":{"auraId":{"spellId":448686}}}}}]}},"multidot":{"spellId":{"spellId":11672,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"hide":true,"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},"multidot":{"spellId":{"spellId":18881,"rank":4},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"10%"}}}},"castSpell":{"spellId":{"spellId":11689,"rank":6}}}},
{"action":{"castSpell":{"spellId":{"spellId":11661,"rank":9}}}},
{"action":{"condition":{"const":{"val":"false"}},"castSpell":{"spellId":{"spellId":20572}}}}
]
}

30 changes: 30 additions & 0 deletions ui/warlock/apls/p5/demonology.apl.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"type": "TypeAPL",
"prepullActions": [
{"action":{"castSpell":{"spellId":{"spellId":11661,"rank":9}}},"doAtValue":{"const":{"val":"-2.5s"}}}
],
"priorityList": [
{"action":{"castSpell":{"spellId":{"itemId":231284}}}},
{"action":{"castSpell":{"spellId":{"itemId":230238}}}},
{"action":{"castSpell":{"spellId":{"itemId":215162}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"15s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"50%"}}}},{"isExecutePhase":{"threshold":"E35"}}]}},"castSpell":{"spellId":{"itemId":13444}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"15s"}}}},{"cmp":{"op":"OpLe","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"25%"}}}},{"isExecutePhase":{"threshold":"E35"}}]}},"castSpell":{"spellId":{"itemId":12662}}}},
{"hide":true,"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":11717,"rank":4}}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10s"}}}}]}},"castSpell":{"spellId":{"spellId":11717,"rank":4}}}},
{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"1.5"}}}},"castSpell":{"spellId":{"spellId":18871,"rank":6}}}},
{"hide":true,"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3.5"}}}},"castSpell":{"spellId":{"spellId":17923,"rank":6}}}},
{"action":{"condition":{"cmp":{"op":"OpLe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"3.5"}}}},"channelSpell":{"spellId":{"spellId":11675,"rank":4},"interruptIf":{"gcdIsReady":{}}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"warlockCurrentPetMana":{}},"rhs":{"const":{"val":"800"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10"}}}}]}},"castSpell":{"spellId":{"spellId":11689,"rank":6}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"6s"}}}},"multidot":{"spellId":{"spellId":426320},"maxDots":1,"maxOverlap":{"spellCastTime":{"spellId":{"spellId":426320}}}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"12s"}}}},"multidot":{"spellId":{"spellId":11672,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"18s"}}}},"multidot":{"spellId":{"spellId":11713,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"action":{"castSpell":{"spellId":{"spellId":403501}}}},
{"hide":true,"action":{"condition":{"auraIsActive":{"auraId":{"spellId":457558}}},"cancelAura":{"auraId":{"spellId":457558}}}},
{"hide":true,"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":426311}}},{"auraIsKnown":{"auraId":{"spellId":448686}}}]}},"strictSequence":{"actions":[{"castSpell":{"spellId":{"spellId":448686}}},{"castSpell":{"spellId":{"spellId":11672,"rank":6}}}]}}},
{"hide":true,"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":426311}}},{"not":{"val":{"auraIsKnown":{"auraId":{"spellId":448686}}}}}]}},"multidot":{"spellId":{"spellId":11672,"rank":6},"maxDots":1,"maxOverlap":{"const":{"val":"0ms"}}}}},
{"hide":true,"action":{"condition":{"and":{"vals":[{"isExecutePhase":{"threshold":"E35"}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":440873}}},"rhs":{"const":{"val":"2.5s"}}}}]}},"castSpell":{"spellId":{"spellId":11661,"rank":9}}}},
{"hide":true,"action":{"condition":{"and":{"vals":[{"isExecutePhase":{"threshold":"E35"}},{"auraIsActive":{"auraId":{"spellId":440873}}}]}},"castSpell":{"spellId":{"spellId":17924,"rank":2}}}},
{"action":{"condition":{"cmp":{"op":"OpLt","lhs":{"currentManaPercent":{}},"rhs":{"const":{"val":"10%"}}}},"castSpell":{"spellId":{"spellId":11689,"rank":6}}}},
{"action":{"castSpell":{"spellId":{"spellId":11661,"rank":9}}}}
]
}

Loading

0 comments on commit 4f65ba3

Please sign in to comment.