Borderlands 3 Skill Planner
\ No newline at end of file
+Borderlands 3 Skill Planner
\ No newline at end of file
diff --git a/bundle.1b1eeefb.js b/bundle.1b1eeefb.js
deleted file mode 100644
index 76c0d7e..0000000
--- a/bundle.1b1eeefb.js
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(e){function t(a){if(n[a])return n[a].exports;var r=n[a]={i:a,l:!1,exports:{}};return e[a].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,a){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:a})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(t.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)t.d(a,r,function(t){return e[t]}.bind(null,r));return a},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/",t(t.s=0)}({"/Yqc":function(e,t){function n(){return"serviceWorker"in navigator&&("https:"===window.location.protocol||"localhost"===window.location.hostname||0===window.location.hostname.indexOf("127."))}t.install=function(e){if(e||(e={}),n()){var t=navigator.serviceWorker.register("/sw.js",{}),a=function(e){function t(){switch(s.state){case"redundant":r("onUpdateFailed"),s.onstatechange=null;break;case"installing":a||r("onUpdating");break;case"installed":i||r("onUpdateReady");break;case"activated":r("onUpdated"),s.onstatechange=null}}function n(){switch(s.state){case"redundant":s.onstatechange=null;break;case"installing":case"installed":break;case"activated":r("onInstalled"),s.onstatechange=null}}var a,i,o,s=e.installing||e.waiting;s&&!s.onstatechange&&(e.active?(t(),o=t):(n(),o=n),a=!0,e.waiting&&(i=!0),s.onstatechange=o)},r=function(t){"function"==typeof e[t]&&e[t]({source:"ServiceWorker"})};t.then(function(e){e&&(a(e),e.onupdatefound=function(){a(e)})}).catch(function(e){return r("onError"),Promise.reject(e)})}},t.applyUpdate=function(e,t){n()&&navigator.serviceWorker.getRegistration().then(function(n){n&&n.waiting?(n.waiting.postMessage({action:"skipWaiting"}),e&&e()):t&&t()})},t.update=function(){n()&&navigator.serviceWorker.getRegistration().then(function(e){if(e)return e.update()})}},0:function(e,t,n){e.exports=n("QfWi")},"31cR":function(e){e.exports={skill:"_3JH8h",enabled:"_1mLSi",usable:"_1xemn",augment:"_3VkFk",actionSkill:"-z8wv",chevron:"_2t_-G",diamond:"_2ej0d",image:"_8ejWg",ranks:"_3DD7O",skillTitle:"_394yV",description:"_1S9-f",effect:"oiyDq"}},"9fQE":function(e,t,n){"use strict";(function(e){function a(t){var n=t.path;return e("nav",null,[{name:"Zane",path:"/operative"},{name:"Amara",path:"/siren"},{name:"FL4K",path:"/beastmaster"},{name:"Moze",path:"/gunner"}].map(function(t){return n===t.path?null:e(r.a,{href:t.path},t.name)}))}n.d(t,"a",function(){return a});var r=n("Y3FI")}).call(this,n("gDde").h)},"Et/u":function(e,t,n){"use strict";function a(e,t){return Math.round(e*t*10)/10}function r(e,t,n){return Math.floor(e*n)}var i=n("LMbI");t.a={Brawl:{0:{Phaseslam:{text:"Amara leaps into the air and Slams the ground, dealing damage to all nearby enemies and knocking them up.",effect:function(e){return"Damage: "+r(e,0,98)+" (increases with character level), Cooldown: 35 Seconds"},type:i.a.ACTION_SKILL,ranks:0}},1:{"Root to Rise":{ranks:5,text:"Amara gains inceased Maximum Health.",effect:function(e){return"Maximum Health: +"+a(e,8)+"%"}},"Personal Space":{ranks:3,text:"Amara's weapon shots deal Bonus Damage based on the distance to her target. The closer the target, the greater the bonus.",effect:function(e){return"Bonus Damage: Up to +"+a(e,18)+"% of damage dealt"}},Clarity:{ranks:5,text:"Amara constantly regenerates health. The lower her health, the more powerful the regeneration. After using an Action Skill, this bonus is doubled for a few seconds.",effect:function(e){return"Health Regeneration: Up to +"+a(e,1)+"% of Missing Health per second, Duration: 5 seconds"}}},2:{"Arms Deal":{ranks:5,text:"Amara deals increased Splash Damage and takes reduced Splash Damage.",effect:function(e){return"Splash Damage: +"+a(e,4)+"%, Splash Damage Reduction +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%"}},Samsara:{ranks:3,text:"Whenever Amara deals damage to an enemy with her Action Skill, she adds a stack of Samsara. For every stack of Samsara, Amara gains increased Gun Damage and Health Regeneration for a few seconds. Stacks decay after a few seconds.",effect:function(e){return"Gun Damage: +"+a(e,1.7)+"% per stack, Health Regeneration: +"+a(e,1.7)+"% of Missing Health per second per stack, Maximum Samara Stacks: 5, Duration: 20 seconds"}},"Helping Hand(s)":{ranks:5,text:"For a few seconds after using her Action Skill, Amara's arms remain active and grant her Damage Reduction.",effect:function(e){return"Damage Reduction: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%, Duration: 15 seconds"}},"Blight Tiger":{ranks:0,text:"Converts Amara's Action Skill to Corrosive Damage.",effect:function(){return"Converts to Corrossive Damage"},type:i.a.AUGMENT_DIAMOND}},3:{Fracture:{ranks:0,text:"Amara summons a line of fists that erupt from the ground, dealing damage to enemies in front of Amara.",effect:function(e){return"Damage: "+r(e,0,88)+" (increases with character level), Cooldown: 28 sec"},type:i.a.AUGMENT_ACTION_SKILL},Mindfulness:{ranks:3,text:"Whenenever Amara takes damage, she gains a stack of Mindfulness. For every stack of Mindfulness, Amara gains improved Shield Regeneration Delay and Movement Speed. Stacks decay after a few seconds.",effect:function(e){return"Shield Regeneration Delay: -"+function(e){switch(e){case 1:return 9;case 2:return 17;case 3:return 23;default:return 0}}(e)+"% per Mindfulness stack, Movement Speed: +"+a(e,1.4)+"% per Mindfulness stack, Maximum Mindfulness Stacks: 25, Duration: 5 seconds"}},"Find Your Center":{ranks:1,text:"Amara gains increased Melee Damage. Additionally, for a few seconds after using her Action Skill, Amara gains increased Melee Range.",effect:function(){return"Melee Damage: +100%, Melee Range: +75%, Duration: 20 seconds"}},Vigor:{ranks:3,text:"Kill Skill. Killing an enemy with Amara's Action Skill grants all allies increased Movement Speed for a few seconds.",effect:function(e){return"Team Movement Speed: +"+a(e,3.333)+"%, Duration: 8 seconds"}},Revelation:{ranks:0,text:"Amara's Action Skill now creates a Nova when it damages enemies, dealing damage to all nearby enemies.",effect:function(e){return"Nova Damage: "+r(e,0,41)+" (increases with character level), Action Skill Damage: -15%"},type:i.a.AUGMENT_CHEVRON}},4:{Downfall:{ranks:0,text:"Amara leaps into the air and shoots an Elemental Beam below her, followed by a Slam.",effect:function(e){return"Beam Damage: "+r(e,0,14)+" per second (increases with character level), Slam Damage: "+r(e,0,95)+" (increases with character level), Cooldown: 47 seconds"},type:i.a.AUGMENT_ACTION_SKILL},"One With Nature":{ranks:5,text:"Amara gains increased Maximum Health and Elemental Damage Resistance to her Action Skill Element.",effect:function(e){return"Maximum Health: +"+a(e,5)+"%, Elemental Damage Reduction: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%"}}},5:{"Do Unto Others":{ranks:1,text:"Whenever an emey damages Amara, she automatically throws an energy orb back at them, dealing Action Skill Elemental Damage. This skill has a short cooldown.",effect:function(){return"Cooldown: 8 seconds"}},"Jab Cross":{ranks:5,text:"Whenever Amara deals melee damage to an enemy, she gains increased Action Skill Damage and increased Gun Damage for a few seconds.",effect:function(e){return"Gun Damage: +"+a(e,3)+"%, Action Skill Damage: +"+a(e,15)+"%, Duration: 10 seconds"}},"Guardian Angel":{ranks:1,text:"When Amara enters Fight For Your Life, she immediately gains a Second Wind, restores her health, and creates an Action Skill Elemental Nova that may knock back nearby enemies. This skill has a long cooldown.",effect:function(){return"Maximum Health Restored: 50% of Maximum Health, Cooldown: 120 seconds"}},Glamour:{ranks:0,text:"Enemies damaged by Amara's Action Skill become confused and temporarily attack their allies. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are confused as well.",effect:function(){return"Confuse Duration: 8 seconds, Action Skill Cooldown: +20%, Action Skill Damage: -10%"},type:i.a.AUGMENT_CHEVRON}},6:{Blitz:{ranks:1,text:"Melee Override. Press [Melee key] while aiming at an enemy to make Amara dash a short distance forward and perform a special melee strike, dealing Elemental Melee Damage. If a Blitz melee attack kills an enemy, Blitz's cooldown is immediately reset.",effect:function(){return"Melee Damage: +100%, Cooldown: 8 seconds"}}}},"Mystical Assault":{0:{Phasecast:{text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path.",effect:function(e){return"Damage: "+r(e,0,92)+", Cooldown: 28 Seconds"},type:i.a.ACTION_SKILL,ranks:0}},1:{"Do Harm":{ranks:5,text:"Killing an enemy grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Action Skill Damage is temporarily increased.",effect:function(e){return"Maximum Rush Stacks: 10, Action Skill Damage: +"+a(e,.9)+"% per Rush stack consumed, Duration: 20 seconds"}},"Fast Hand(s)":{ranks:3,text:"Amara's Reload Speed, Weapon Swap Speed, and Mode Switch Speed are improved.",effect:function(e){return"Reload Speed: +"+function(e){switch(e){case 1:return 7;case 2:return 14;case 3:return 19;default:return 0}}(e)+"%, Weapon Swap Speed: +"+function(e){switch(e){case 1:return 16;case 2:return 28;case 3:return 36;default:return 0}}(e)+"%, Mode Switch Speed: +"+function(e){switch(e){case 1:return 16;case 2:return 28;case 3:return 36;default:return 0}}(e)+"%"}},"Violent Tapestry":{ranks:5,text:"Applying a Status Effect grants Amara a stack of Rush. For every stack of Rush consumed, Amara's Status Effect Chance is temporarily increased.",effect:function(e){return"Maximum Rush Stacks: 10, Status Effect Chance: +"+a(e,.6)+"% per Rush stack consumed, Duration: 20 seconds"}}},2:{Alacrity:{ranks:5,text:"Amara gains increased Reload Speed for every stack of Rush. After consuming Rush stacks, this bonus is increased for a few seconds.",effect:function(e){return"Reload Speed: +"+a(e,.4)+"% per Rush stack, Reload Speed: +"+function(e){switch(e){case 1:return.6;case 2:return 1.2;case 3:return 1.8;case 4:return 2.3;case 5:return 2.9;default:return 0}}(e)+"% per Rush stack consumed, Duration: 8 seconds"}},Transcend:{ranks:3,text:"Amara gains increased Accuracy and Critical Hit Damage for a few seconds after activating her Action Skill.",effect:function(e){return"Accuracy: +"+function(e){switch(e){case 1:return 17;case 2:return 29;case 3:return 38;default:return 0}}(e)+"%, Critical Hit Damage: +"+a(e,9)+"%, Duration: 12 seconds"}},Restless:{ranks:5,text:"Amara gains increased Action Skill Cooldown Rate.",effect:function(e){return"Action Skill Cooldown Rate: +"+a(e,5)+"%"}},"Soul Sap":{ranks:0,text:"A portion of all damage dealt by Amara's Action Skill is returned to her or a nearby ally as health.",effect:function(){return"Life Steal: 30% of Action Skill damage dealt"},type:i.a.AUGMENT_CHEVRON}},3:{Deliverance:{ranks:0,text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Whenever Amara's Astral Projection damages an enemy or object, it releases homing Elemental Projectiles that trigger her Action Skill Elemental Effect on enemies.",effect:function(e){return"Damage: "+r(e,0,86)+" (increases with character level), Elemental Projectiles: 3 per enemy or object hit, Cooldown: 28 seconds"},type:i.a.AUGMENT_ACTION_SKILL},Ascendant:{ranks:1,text:"All Action Skill Augments gain increased effects.",effect:function(){return"Soul Sap Life Steal: +20%, Allure Radius: +100%, Glamour Duration: +50%, Stillness of Mind: Breaks 0.75 seconds after being damaged, Revelation Damage: +25%"}},"Stillness of Mind":{ranks:0,text:"Enemies damaged by Amara's Action Skill become phaselocked until they are damaged or the duration ends. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are also phaselocked.",effect:function(){return"Phaselock Duration: 6 seconds, Action Skill Damage: -25%, Action Skill Cooldown: +15%"},type:i.a.AUGMENT_CHEVRON}},4:{Reverberation:{ranks:0,text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Astra Projection deals increased damage for every enemy it hits.",effect:function(e){return"Damage: "+r(e,0,88)+" (increases with character level), Damage Bonus: +50% per enemy hit, Cooldown: 30 seconds"},type:i.a.AUGMENT_ACTION_SKILL},"From Rest":{ranks:3,text:"Amara gains improved Fire Rate and Charge Time.",effect:function(e){return"Fire Rate: +"+a(e,4)+"%, Charge Time: +"+function(e){switch(e){case 1:return 21;case 2:return 34;case 3:return 44;default:return 0}}(e)+"%"}},"Laid Bare":{ranks:3,text:"Enemies take increased damage from all sources for a few seconds after being damaged by Amara's Action Skill.",effect:function(e){return"Damage Increase: +"+a(e,8.333)+"%, Duration: 8 seconds"}},Wrath:{ranks:3,text:"Amara gains increased Gun Damage. This effect is increased after she activates her action skill for a few seconds.",effect:function(e){return"Gun Damage: +"+function(e){switch(e){case 1:return 6.7;case 2:return 13.3;case 3:return 20;default:return 0}}(e)+"%, Gun Damage: +"+function(e){switch(e){case 1:return 6.7;case 2:return 13.3;case 3:return 20;default:return 0}}(e)+"% after Action Skill use, Duration: 8 seconds"}}},5:{Remnant:{ranks:3,text:"When Amara kills an enemy with a Gun or Action Skill, she creates a homing projectile that seeks out a new enemy dealing her Action Skill Elemental Damage. Any Overkill Damage is added to the projectile's damage.",effect:function(e){return"Remnant Base Damage: "+r(e,0,9)+" (increases with character level)"}},Awakening:{ranks:3,text:"Amara's Rush stacks gain increased effectiveness.",effect:function(e){return"Rush Stack Effectiveness: +"+a(e,10)+"%"}},Tandava:{ranks:0,text:"Amara sends forward an Astral Projection of herself. When it hits a target, it explodes, damaging all nearby enemies.",effect:function(e){return"Damage: "+r(e,0,91)+" (increases with character level), Cooldown: 35 seconds"},type:i.a.AUGMENT_ACTION_SKILL}},6:{Avatar:{ranks:1,text:"Amara's Action Skill can be activated while it's cooling down. This skill may only be used once per completed cooldown. Additionally, increases Amara's Maximum Rush Stacks. Additionally, if Amara's Action Skill kills an enemy, it refunds half of her Rush stacks.",effect:function(){return"Maximum Rush Stacks: +10"}}}},"Fist of the Elements":{0:{Phasegrasp:{text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Some enemies are immune to being Grasped and instantly take damage instead.",effect:function(e){return"Skill Duration: 7 sec, Cooldown: 16 seconds, Grasp Immune Damage: "+r(e,0,28)+" (increases with character level)"},type:i.a.ACTION_SKILL,ranks:0}},1:{Anima:{ranks:5,text:"Amara's Status Effects deal increased damage over time and have increased duration. Her Action Skill Status Effect deals further increased damage.",effect:function(e){return"Action Skill Status Effect Damage: +"+a(e,8)+"%, Status Effect Damage: +"+a(e,4)+"%, Status Effect Duration: +"+a(e,20)+"%"}},"Steady Hands":{ranks:3,text:"Amara gains increased Weapon Handling and Accuracy.",effect:function(e){return"Handling: +"+function(e){switch(e){case 1:return 14;case 2:return 24;case 3:return 32;default:return 0}}(e)+"%, Accuracy: +"+function(e){switch(e){case 1:return 13;case 2:return 23;case 3:return 31;default:return 0}}(e)+"%"}},Infusion:{ranks:5,text:"Convert a portion of damage dealt by Amara's weapons into her Action Skill Element.",effect:function(e){return"Converted Damage: "+a(e,8)+"%"}}},2:{Tempest:{ranks:5,text:"Amara deals increased Elemental Damage. Shock Damage is further increased.",effect:function(e){return"Elemental Damage: +"+a(e,6)+"%, Shock Damage: +"+a(e,2)+"%"}},"Illuminated Fist":{ranks:1,text:"Amara gains increased Melee Damage and her Melee Damage is converted to Action Skill Element.",effect:function(){return"Melee Damage: +75%"}},Wildfire:{ranks:5,text:"Whenever Amara applies a Status Effect to an enemy, it has a chance to spread to a nearby enemy.",effect:function(e){return"Spread Chance: +"+a(e,8)+"%"}},Soulfire:{ranks:0,text:"Converts Amara's Action Skill to Incendiary Damage.",effect:function(){return"Converts to Incendiary Damage"},type:i.a.AUGMENT_DIAMOND}},3:{"The Eternal Fist":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Whenever the Grasped enemy is killed, a new fist seeks out and Grasps a new target.",effect:function(e){return"Bonus Targets: Up to +4, Duration: 7 seconds, Cooldown: 20 seconds, Grasp Immune Damage: "+r(e,0,28)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL},Dread:{ranks:1,text:"Amara's Gun Damage is increased for a few seconds after an enemy is Grasped. Whenever any player kills a Grasped enemy, their current weapon is instantly reloaded.",effect:function(){return"Gun Damage: +15%, Duration: 8 seconds"}},Allure:{ranks:0,text:"Amara's Action Skill creates a singularity that pull in enemies.",effect:function(){return"Action Skill Damage: -20%, Duration: 2.5 seconds"},type:i.a.AUGMENT_CHEVRON}},4:{Indiscriminate:{ranks:3,text:"Amara's bullets that damage enemies have a chance to ricochet and deal decreased damage to other nearby enemies. Richochet Chance and Damage are increased if target is affected by Phasegrasp or Stillness of Mind.",effect:function(e){return"Ricochet Chance: +"+a(e,10)+"%, Ricochet Damage: -50%, Action Skill Ricochet Chance: +"+a(e,20)+"%, Action Skill Ricochet Damage: -25%"}},"Deep Well":{ranks:1,text:"Amara gains increased Magazine Size with elemental weapons.",effect:function(){return"Magazine Size: +20%"}},Catharsis:{ranks:3,text:"Whenever Amara riggers an elemental effect on an enemy, when that enemy that dies the enemy explodes, dealing her attuned element damage along with any other element that is currently inflicted upon that enemy. This skill has a short cooldown.",effect:function(e){return"Damage: "+r(e,0,4)+" (increases with character level), Cooldown: 8 seconds"}},"Ties That Bind":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Enemies near the Grasped target are linked, and any damage dealt to a linked target is shared between all other linked targets.",effect:function(e){return"Link Damage: 35% of damage dealt, Duration: 7 seconds, Cooldown: 18 seconds, Grasp Immune Damage: "+r(e,0,34)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL}},5:{"Fist Over Matter":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. After Grasping the targeted enemy, large fists appear and constantly smash the area, dealing damage to nearby enemies.",effect:function(e){return"Damage "+r(e,0,35)+" (increases with character level), Duration: 7 seconds, Cooldown: 28 seconds, Grasp Immune Damage "+r(e,0,39)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL},Sustainment:{ranks:5,text:"Amara gains Life Steal whenever she deals Elemental Damage with her weapon.",effect:function(e){return"Life Steal: +"+a(e,4)+"% of damage dealt"}},Conflux:{ranks:5,text:"Whenever Amara applies a Status Effect to an enemy, she gains a chance to randomly Electrocute, Ignite, or Melt that enemy.",effect:function(e){return"Extra Effect Chance: +"+a(e,7)+"%"}}},6:{"Forceful Expression":{ranks:1,text:"Amara's guns deal Bonus Elemental Damage based on her Action Skill Element.",effect:function(){return"Bonus Elemental Damage: +18% of damage dealt"}}}}}},Fl18:function(e,t,n){"use strict";(function(e){var a=n("laFY"),r=n.n(a),i=e("span",null,e("a",{href:"https://borderlands.com/"},"Official Borderlands website")," - ",e("a",{href:"https://github.com/seigler/bl3skills.com"},"Source Code")," - ",e("a",{href:"https://github.com/seigler/bl3skills.com/labels/bug"},e("img",{alt:"GitHub issues: bugs",src:"https://img.shields.io/github/issues-raw/seigler/bl3skills.com/bug"}))," ",e("a",{href:"https://github.com/seigler/bl3skills.com/labels/enhancement"},e("img",{alt:"GitHub issues: enhancements",src:"https://img.shields.io/github/issues-raw/seigler/bl3skills.com/enhancement"}))," ",e("img",{alt:"GitHub contributors",src:"https://img.shields.io/github/contributors/seigler/bl3skills.com"}));t.a=function(){return e("footer",{class:r.a.footer},i)}}).call(this,n("gDde").h)},G9Up:function(e,t,n){"use strict";(function(e){var a=n("Y3FI"),r=n("NZ6x"),i=n("cY+X"),o=n("rFP/"),s=n("x3c/"),c=n("cQx2"),l=e(a.b,null,e(r.a,{path:"/"}),e(i.a,{path:"/operative"}),e(o.a,{path:"/siren"}),e(s.a,{path:"/beastmaster"}),e(c.a,{path:"/gunner"}));t.a=function(){return l}}).call(this,n("gDde").h)},J3pd:function(e,t,n){"use strict";(function(e){function a(){return(a=Object.assign||function(e){for(var t=1;t=5*s-5,level:Object(d.a)(n.state),image:"../../assets/hunters/"+g+"/"+r+s+l+".png",onChange:y(c,r,t,s)}))}))})))}),S=Object(d.a)(this.state);return e("div",null,e("div",{class:h.a.header},e("h1",{class:h.a.title},c,e("div",{class:h.a.subtitle},"the ",g)),e("div",{class:h.a.sidepanel},e("div",{class:h.a.level+" "+(S>50?S>61?h.a.overlevelB:h.a.overlevelA:"")},"Level ",S),e("div",{class:h.a.reset},e("a",{onClick:function(){Object(l.b)(k),n.setState({invested:[0,0,0],skills:k||{}})}},"Reset"))),e(s.a,{path:p})),e("main",null,e("div",{class:h.a.VaultHunter,onContextMenu:r},e("div",{class:h.a.trees},v))),m)},n}(i.Component)}).call(this,n("gDde").h)},LMbI:function(e,t){"use strict";t.a={ACTION_SKILL:1,AUGMENT_CHEVRON:2,AUGMENT_DIAMOND:3,AUGMENT_ACTION_SKILL:4}},MKmk:function(e){e.exports={VaultHunter:"_2zgqJ",header:"_1Jomm",title:"_17kLY",subtitle:"_3J3hw",sidepanel:"_2UO55",level:"xH9ts",reset:"K9CBr",overlevelA:"_1LE8c",overlevelB:"_1vOfn",trees:"_3ek45",tier:"_3Ch4X",treeName:"_1WAM2",tree:"gRWZY",skills:"_2Su0b",green:"-Pl7G",blue:"_1nm1I",red:"_3T1pZ"}},NZ6x:function(e,t,n){"use strict";(function(e){var a=n("Y3FI"),r=n("Fl18"),i=n("odKX"),o=n.n(i),s=e(r.a,null);t.a=function(){return e("div",null,e("div",{class:o.a.splash},e("div",{class:o.a.wrapper},e("h1",null,e("div",{class:o.a.disclaimer},"(Unofficial)"),"Borderlands 3 skill calculator"),[{name:"Zane",job:"the Operative",path:"/operative"},{name:"Amara",job:"the Siren",path:"/siren"},{name:"FL4K",job:"the Beastmaster",path:"/beastmaster"},{name:"Moze",job:"the Gunner",path:"/gunner"}].map(function(t){return e(a.a,{class:o.a.link,href:t.path},e("div",{class:o.a.name},t.name,e("div",{class:o.a.job},t.job)))}))),s)}}).call(this,n("gDde").h)},QfWi:function(e,t,n){"use strict";n.r(t);var a=n("gDde"),r=n("G9Up"),i=(n("pyAK"),document.querySelector("#app"));Object(a.render)(Object(a.h)(r.a,null),i,i.firstElementChild);n("/Yqc").install()},Y3FI:function(e,t,n){"use strict";function a(e,t){for(var n in t)e[n]=t[n];return e}function r(e,t){return e.rankt.rank?-1:e.index-t.index}function i(e,t){return e.index=t,e.rank=function(e){return e.attributes.default?0:(t=e.attributes.path,o(t).map(s).join(""));var t}(e),e.attributes}function o(e){return e.replace(/(^\/+|\/+$)/g,"").split("/")}function s(e){return":"==e.charAt(0)?1+"*+?".indexOf(e.charAt(e.length-1))||4:5}function c(){var e;return""+((e=k&&k.location?k.location:k&&k.getCurrentLocation?k.getCurrentLocation():"undefined"!=typeof location?location:S).pathname||"")+(e.search||"")}function l(e,t){return void 0===t&&(t=!1),"string"!=typeof e&&e.url&&(t=e.replace,e=e.url),function(e){for(var t=y.length;t--;)if(y[t].canRoute(e))return!0;return!1}(e)&&function(e,t){void 0===t&&(t="push"),k&&k[t]?k[t](e):"undefined"!=typeof history&&history[t+"State"]&&history[t+"State"](null,null,e)}(e,t?"replace":"push"),u(e)}function u(e){for(var t=!1,n=0;n0},t.prototype.routeTo=function(e){return this._didRoute=!1,this.setState({url:e}),this.updating?this.canRoute(e):(this.forceUpdate(),this._didRoute)},t.prototype.componentWillMount=function(){y.push(this),this.updating=!0},t.prototype.componentDidMount=function(){var e=this;k&&(this.unlisten=k.listen(function(t){e.routeTo(""+(t.pathname||"")+(t.search||""))})),this.updating=!1},t.prototype.componentWillUnmount=function(){"function"==typeof this.unlisten&&this.unlisten(),y.splice(y.indexOf(this),1)},t.prototype.componentWillUpdate=function(){this.updating=!0},t.prototype.componentDidUpdate=function(){this.updating=!1},t.prototype.getMatchingChildren=function(e,t,n){return e.filter(i).sort(r).map(function(e){var r=function(e,t,n){var a,r=/(?:\?([^#]*))?(#.*)?$/,i=e.match(r),s={};if(i&&i[1])for(var c=i[1].split("&"),l=0;l2;)_.push(arguments[i]);for(t&&null!=t.children&&(_.length||_.push(t.children),delete t.children);_.length;)if((a=_.pop())&&void 0!==a.pop)for(i=a.length;i--;)_.push(a[i]);else"boolean"==typeof a&&(a=null),(r="function"!=typeof e)&&(null==a?a="":"number"==typeof a?a+="":"string"!=typeof a&&(r=!1)),r&&n?o[o.length-1]+=a:o===R?o=[a]:o.push(a),n=r;var s=new C;return s.nodeName=e,s.children=o,s.attributes=null==t?void 0:t,s.key=null==t?void 0:t.key,void 0!==M.vnode&&M.vnode(s),s}function n(e,t){for(var n in t)e[n]=t[n];return e}function a(e,t){null!=e&&("function"==typeof e?e(t):e.current=t)}function r(e){!e.__d&&(e.__d=!0)&&1==T.push(e)&&(M.debounceRendering||N)(i)}function i(){for(var e;e=T.pop();)e.__d&&A(e)}function o(e,t,n){return"string"==typeof t||"number"==typeof t?void 0!==e.splitText:"string"==typeof t.nodeName?!e._componentConstructor&&s(e,t.nodeName):n||e._componentConstructor===t.nodeName}function s(e,t){return e.__n===t||e.nodeName.toLowerCase()===t.toLowerCase()}function c(e){var t=n({},e.attributes);t.children=e.children;var a=e.nodeName.defaultProps;if(void 0!==a)for(var r in a)void 0===t[r]&&(t[r]=a[r]);return t}function l(e){var t=e.parentNode;t&&t.removeChild(e)}function u(e,t,n,r,i){if("className"===t&&(t="class"),"key"===t);else if("ref"===t)a(n,null),a(r,e);else if("class"!==t||i)if("style"===t){if(r&&"string"!=typeof r&&"string"!=typeof n||(e.style.cssText=r||""),r&&"object"==typeof r){if("string"!=typeof n)for(var o in n)o in r||(e.style[o]="");for(var o in r)e.style[o]="number"==typeof r[o]&&!1===E.test(o)?r[o]+"px":r[o]}}else if("dangerouslySetInnerHTML"===t)r&&(e.innerHTML=r.__html||"");else if("o"==t[0]&&"n"==t[1]){var s=t!==(t=t.replace(/Capture$/,""));t=t.toLowerCase().substring(2),r?n||e.addEventListener(t,d,s):e.removeEventListener(t,d,s),(e.__l||(e.__l={}))[t]=r}else if("list"!==t&&"type"!==t&&!i&&t in e){try{e[t]=null==r?"":r}catch(e){}null!=r&&!1!==r||"spellcheck"==t||e.removeAttribute(t)}else{var c=i&&t!==(t=t.replace(/^xlink:?/,""));null==r||!1===r?c?e.removeAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase()):e.removeAttribute(t):"function"!=typeof r&&(c?e.setAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase(),r):e.setAttribute(t,r))}else e.className=r||""}function d(e){return this.__l[e.type](M.event&&M.event(e)||e)}function f(){for(var e;e=F.shift();)M.afterMount&&M.afterMount(e),e.componentDidMount&&e.componentDidMount()}function h(e,t,n,a,r,i){L++||(G=null!=r&&void 0!==r.ownerSVGElement,H=null!=e&&!("__preactattr_"in e));var o=m(e,t,n,a,i);return r&&o.parentNode!==r&&r.appendChild(o),--L||(H=!1,i||f()),o}function m(e,t,n,a,r){var i=e,o=G;if(null!=t&&"boolean"!=typeof t||(t=""),"string"==typeof t||"number"==typeof t)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=t&&(e.nodeValue=t):(i=document.createTextNode(t),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),p(e,!0))),i.__preactattr_=!0,i;var c=t.nodeName;if("function"==typeof c)return w(e,t,n,a);if(G="svg"===c||"foreignObject"!==c&&G,c+="",(!e||!s(e,c))&&(i=function(e,t){var n=t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);return n.__n=e,n}(c,G),e)){for(;e.firstChild;)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),p(e,!0)}var l=i.firstChild,u=i.__preactattr_,d=t.children;if(null==u){u=i.__preactattr_={};for(var f=i.attributes,h=f.length;h--;)u[f[h].name]=f[h].value}return!H&&d&&1===d.length&&"string"==typeof d[0]&&null!=l&&void 0!==l.splitText&&null==l.nextSibling?l.nodeValue!=d[0]&&(l.nodeValue=d[0]):(d&&d.length||null!=l)&&g(i,d,n,a,H||null!=u.dangerouslySetInnerHTML),y(i,t.attributes,u),G=o,i}function g(e,t,n,a,r){var i,s,c,u,d,f=e.childNodes,h=[],g={},k=0,y=0,v=f.length,S=0,D=t?t.length:0;if(0!==v)for(var A=0;A2?[].slice.call(arguments,2):e.children)},createRef:function(){return{}},Component:b,render:function(e,t,n){return h(n,e,{},!1,t,!1)},rerender:i,options:M}}()},gqmc:function(e,t,n){"use strict";function a(e){for(var t=0,n=[0,0,0],a=0,r=0,i=Object.values(e);rh.ranks)return!1;u+=h.invested||0}if(u>0&&o+5<5*s)return!1;o+=u,s+=1}n[a]=o,t+=o,a+=1}return!(t>69)&&n}function r(e){for(var t=1;t0)?s.a.usable:""].join(" "),onClick:n,onContextMenu:n},e("div",{class:s.a.image},e("img",{src:b,alt:a(o)})),w&&h>0&&e("div",{class:s.a.ranks},g,"/",h),e("div",{class:s.a.description},e("h3",{class:s.a.skillTitle},o),d,g>0&&e("div",{class:s.a.effect},"Current Effect:",c,v(g,k)),null!==D&&e("div",{class:s.a.effect},v(1,k)),null==D&&g\n {\n pages.map(page => (\n path === page.path ? null : {page.name}\n ))\n }\n \n );\n}\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\nfunction flat (rank, level, unit) {\n return Math.floor(rank * unit);\n}\n\n// Arms Deal Splash Damage Reduction\nfunction getArmsDealSplashDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Helping Hand(s) Damage Reduction\nfunction getHelpingHandsDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Mindfulness Shield Regeneration Delay\nfunction getMindfulnessShieldRegenerationDelay(rank) {\n switch (rank) {\n case 1:\n return 9;\n case 2:\n return 17;\n case 3:\n return 23;\n default:\n return 0;\n }\n}\n\n// One With Nature Elemental Damage Reduction\nfunction getOneWithNatureElementalDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Reload Speed\nfunction getFastHandsReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 7;\n case 2:\n return 14;\n case 3:\n return 19;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Weapon Swap Speed\nfunction getFastHandsWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 28;\n case 3:\n return 36;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Mode Switch Speed\nfunction getFastHandsModeSwitchSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 28;\n case 3:\n return 36;\n default:\n return 0;\n }\n}\n\n// Alacrity Reload Speed After Action Skill\nfunction getAlacrityReloadSpeedAfterActionSkill(rank) {\n switch (rank) {\n case 1:\n return 0.6;\n case 2:\n return 1.2;\n case 3:\n return 1.8;\n case 4:\n return 2.3;\n case 5:\n return 2.9;\n default:\n return 0;\n }\n}\n\n// Transcend Accuracy\nfunction getTranscendAccuracy(rank) {\n switch (rank) {\n case 1:\n return 17;\n case 2:\n return 29;\n case 3:\n return 38;\n default:\n return 0;\n }\n}\n\n// From Rest Charge Time\nfunction getFromRestChargeTime(rank) {\n switch (rank) {\n case 1:\n return 21;\n case 2:\n return 34;\n case 3:\n return 44;\n default:\n return 0;\n }\n}\n\n// Wrath Gun Damage\nfunction getWrathGunDamage(rank) {\n switch (rank) {\n case 1:\n return 6.7;\n case 2:\n return 13.3;\n case 3:\n return 20;\n default:\n return 0;\n }\n}\n\n// Wrath Gun Damage After Action Skill\nfunction getWrathGunDamageAfterActionSkill(rank) {\n switch (rank) {\n case 1:\n return 6.7;\n case 2:\n return 13.3;\n case 3:\n return 20;\n default:\n return 0;\n }\n}\n\n// Steady Hands Handling\nfunction getSteadyHandsHandling(rank) {\n switch (rank) {\n case 1:\n return 14;\n case 2:\n return 24;\n case 3:\n return 32;\n default:\n return 0;\n }\n}\n\n// Steady Hands Accuracy\nfunction getSteadyHandsAccuracy(rank) {\n switch (rank) {\n case 1:\n return 13;\n case 2:\n return 23;\n case 3:\n return 31;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Brawl\": {\n \"0\": {\n \"Phaseslam\": {\n text: \"Amara leaps into the air and Slams the ground, dealing damage to all nearby enemies and knocking them up.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 98)} (increases with character level), Cooldown: 35 Seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Root to Rise\": {\n ranks: 5,\n text: \"Amara gains inceased Maximum Health.\",\n effect: (rank, level) => `Maximum Health: +${percent(rank, 8)}%`,\n },\n \"Personal Space\": {\n ranks: 3,\n text: \"Amara's weapon shots deal Bonus Damage based on the distance to her target. The closer the target, the greater the bonus.\",\n effect: (rank, level) => `Bonus Damage: Up to +${percent(rank, 18)}% of damage dealt`,\n },\n \"Clarity\": {\n ranks: 5,\n text: \"Amara constantly regenerates health. The lower her health, the more powerful the regeneration. After using an Action Skill, this bonus is doubled for a few seconds.\",\n effect: (rank, level) => `Health Regeneration: Up to +${percent(rank, 1)}% of Missing Health per second, Duration: 5 seconds`,\n },\n },\n \"2\": {\n \"Arms Deal\": {\n ranks: 5,\n text: \"Amara deals increased Splash Damage and takes reduced Splash Damage.\",\n effect: (rank, level) => `Splash Damage: +${percent(rank, 4)}%, Splash Damage Reduction +${getArmsDealSplashDamageReduction(rank)}%`,\n },\n \"Samsara\": {\n ranks: 3,\n text: \"Whenever Amara deals damage to an enemy with her Action Skill, she adds a stack of Samsara. For every stack of Samsara, Amara gains increased Gun Damage and Health Regeneration for a few seconds. Stacks decay after a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${percent(rank, 1.7)}% per stack, Health Regeneration: +${percent(rank, 1.7)}% of Missing Health per second per stack, Maximum Samara Stacks: 5, Duration: 20 seconds`,\n },\n \"Helping Hand(s)\": {\n ranks: 5,\n text: \"For a few seconds after using her Action Skill, Amara's arms remain active and grant her Damage Reduction.\",\n effect: (rank, level) => `Damage Reduction: +${getHelpingHandsDamageReduction(rank)}%, Duration: 15 seconds`,\n },\n \"Blight Tiger\": {\n ranks: 0,\n text: \"Converts Amara's Action Skill to Corrosive Damage.\",\n effect: (rank, level) => `Converts to Corrossive Damage`,\n type: SKILLS.AUGMENT_DIAMOND,\n },\n },\n \"3\": {\n \"Fracture\": {\n ranks: 0,\n text: \"Amara summons a line of fists that erupt from the ground, dealing damage to enemies in front of Amara.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 88)} (increases with character level), Cooldown: 28 sec`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Mindfulness\": {\n ranks: 3,\n text: \"Whenenever Amara takes damage, she gains a stack of Mindfulness. For every stack of Mindfulness, Amara gains improved Shield Regeneration Delay and Movement Speed. Stacks decay after a few seconds.\",\n effect: (rank, level) => `Shield Regeneration Delay: -${getMindfulnessShieldRegenerationDelay(rank)}% per Mindfulness stack, Movement Speed: +${percent(rank, 1.4)}% per Mindfulness stack, Maximum Mindfulness Stacks: 25, Duration: 5 seconds`,\n },\n \"Find Your Center\": {\n ranks: 1,\n text: \"Amara gains increased Melee Damage. Additionally, for a few seconds after using her Action Skill, Amara gains increased Melee Range.\",\n effect: (rank, level) => `Melee Damage: +100%, Melee Range: +75%, Duration: 20 seconds`,\n },\n \"Vigor\": {\n ranks: 3,\n text: \"Kill Skill. Killing an enemy with Amara's Action Skill grants all allies increased Movement Speed for a few seconds.\",\n effect: (rank, level) => `Team Movement Speed: +${percent(rank, 3.333)}%, Duration: 8 seconds`,\n },\n \"Revelation\": {\n ranks: 0,\n text: \"Amara's Action Skill now creates a Nova when it damages enemies, dealing damage to all nearby enemies.\",\n effect: (rank, level) => `Nova Damage: ${flat(rank, level, 41)} (increases with character level), Action Skill Damage: -15%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Downfall\": {\n ranks: 0,\n text: \"Amara leaps into the air and shoots an Elemental Beam below her, followed by a Slam.\",\n effect: (rank, level) => `Beam Damage: ${flat(rank, level, 14)} per second (increases with character level), Slam Damage: ${flat(rank, level, 95)} (increases with character level), Cooldown: 47 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"One With Nature\": {\n ranks: 5,\n text: \"Amara gains increased Maximum Health and Elemental Damage Resistance to her Action Skill Element.\",\n effect: (rank, level) => `Maximum Health: +${percent(rank, 5)}%, Elemental Damage Reduction: +${getOneWithNatureElementalDamageReduction(rank)}%`,\n },\n },\n \"5\": {\n \"Do Unto Others\": {\n ranks: 1,\n text: \"Whenever an emey damages Amara, she automatically throws an energy orb back at them, dealing Action Skill Elemental Damage. This skill has a short cooldown.\",\n effect: (rank, level) => `Cooldown: 8 seconds`,\n },\n \"Jab Cross\": {\n ranks: 5,\n text: \"Whenever Amara deals melee damage to an enemy, she gains increased Action Skill Damage and increased Gun Damage for a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%, Action Skill Damage: +${percent(rank, 15)}%, Duration: 10 seconds`,\n },\n \"Guardian Angel\": {\n ranks: 1,\n text: \"When Amara enters Fight For Your Life, she immediately gains a Second Wind, restores her health, and creates an Action Skill Elemental Nova that may knock back nearby enemies. This skill has a long cooldown.\",\n effect: (rank, level) => `Maximum Health Restored: 50% of Maximum Health, Cooldown: 120 seconds`,\n },\n \"Glamour\": {\n ranks: 0,\n text: \"Enemies damaged by Amara's Action Skill become confused and temporarily attack their allies. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are confused as well.\",\n effect: (rank, level) => `Confuse Duration: 8 seconds, Action Skill Cooldown: +20%, Action Skill Damage: -10%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"6\": {\n \"Blitz\": {\n ranks: 1,\n text: \"Melee Override. Press [Melee key] while aiming at an enemy to make Amara dash a short distance forward and perform a special melee strike, dealing Elemental Melee Damage. If a Blitz melee attack kills an enemy, Blitz's cooldown is immediately reset.\",\n effect: (rank, level) => `Melee Damage: +100%, Cooldown: 8 seconds`,\n },\n },\n },\n \"Mystical Assault\": {\n \"0\": {\n \"Phasecast\": {\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 92)}, Cooldown: 28 Seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Do Harm\": {\n ranks: 5,\n text: \"Killing an enemy grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Action Skill Damage is temporarily increased.\",\n effect: (rank, level) => `Maximum Rush Stacks: 10, Action Skill Damage: +${percent(rank, 0.9)}% per Rush stack consumed, Duration: 20 seconds`,\n },\n \"Fast Hand(s)\": {\n ranks: 3,\n text: \"Amara's Reload Speed, Weapon Swap Speed, and Mode Switch Speed are improved.\",\n effect: (rank, level) => `Reload Speed: +${getFastHandsReloadSpeed(rank)}%, Weapon Swap Speed: +${getFastHandsWeaponSwapSpeed(rank)}%, Mode Switch Speed: +${getFastHandsModeSwitchSpeed(rank)}%`,\n },\n \"Violent Tapestry\": {\n ranks: 5,\n text: \"Applying a Status Effect grants Amara a stack of Rush. For every stack of Rush consumed, Amara's Status Effect Chance is temporarily increased.\",\n effect: (rank, level) => `Maximum Rush Stacks: 10, Status Effect Chance: +${percent(rank, 0.6)}% per Rush stack consumed, Duration: 20 seconds`,\n },\n },\n \"2\": {\n \"Alacrity\": {\n ranks: 5,\n text: \"Amara gains increased Reload Speed for every stack of Rush. After consuming Rush stacks, this bonus is increased for a few seconds.\",\n effect: (rank, level) => `Reload Speed: +${percent(rank, 0.4)}% per Rush stack, Reload Speed: +${getAlacrityReloadSpeedAfterActionSkill(rank)}% per Rush stack consumed, Duration: 8 seconds`,\n },\n \"Transcend\": {\n ranks: 3,\n text: \"Amara gains increased Accuracy and Critical Hit Damage for a few seconds after activating her Action Skill.\",\n effect: (rank, level) => `Accuracy: +${getTranscendAccuracy(rank)}%, Critical Hit Damage: +${percent(rank, 9)}%, Duration: 12 seconds`,\n },\n \"Restless\": {\n ranks: 5,\n text: \"Amara gains increased Action Skill Cooldown Rate.\",\n effect: (rank, level) => `Action Skill Cooldown Rate: +${percent(rank, 5)}%`,\n },\n \"Soul Sap\": {\n ranks: 0,\n text: \"A portion of all damage dealt by Amara's Action Skill is returned to her or a nearby ally as health.\",\n effect: (rank, level) => `Life Steal: 30% of Action Skill damage dealt`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"3\": {\n \"Deliverance\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Whenever Amara's Astral Projection damages an enemy or object, it releases homing Elemental Projectiles that trigger her Action Skill Elemental Effect on enemies.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 86)} (increases with character level), Elemental Projectiles: 3 per enemy or object hit, Cooldown: 28 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Ascendant\": {\n ranks: 1,\n text: \"All Action Skill Augments gain increased effects.\",\n effect: (rank, level) => `Soul Sap Life Steal: +20%, Allure Radius: +100%, Glamour Duration: +50%, Stillness of Mind: Breaks 0.75 seconds after being damaged, Revelation Damage: +25%`,\n },\n \"Stillness of Mind\": {\n ranks: 0,\n text: \"Enemies damaged by Amara's Action Skill become phaselocked until they are damaged or the duration ends. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are also phaselocked.\",\n effect: (rank, level) => `Phaselock Duration: 6 seconds, Action Skill Damage: -25%, Action Skill Cooldown: +15%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Reverberation\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Astra Projection deals increased damage for every enemy it hits.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 88)} (increases with character level), Damage Bonus: +50% per enemy hit, Cooldown: 30 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"From Rest\": {\n ranks: 3,\n text: \"Amara gains improved Fire Rate and Charge Time.\",\n effect: (rank, level) => `Fire Rate: +${percent(rank, 4)}%, Charge Time: +${getFromRestChargeTime(rank)}%`,\n },\n \"Laid Bare\": {\n ranks: 3,\n text: \"Enemies take increased damage from all sources for a few seconds after being damaged by Amara's Action Skill.\",\n effect: (rank, level) => `Damage Increase: +${percent(rank, 8.333)}%, Duration: 8 seconds`,\n },\n \"Wrath\": {\n ranks: 3,\n text: \"Amara gains increased Gun Damage. This effect is increased after she activates her action skill for a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${getWrathGunDamage(rank)}%, Gun Damage: +${getWrathGunDamageAfterActionSkill(rank)}% after Action Skill use, Duration: 8 seconds`,\n },\n },\n \"5\": {\n \"Remnant\": {\n ranks: 3,\n text: \"When Amara kills an enemy with a Gun or Action Skill, she creates a homing projectile that seeks out a new enemy dealing her Action Skill Elemental Damage. Any Overkill Damage is added to the projectile's damage.\",\n effect: (rank, level) => `Remnant Base Damage: ${flat(rank, level, 9)} (increases with character level)`,\n },\n \"Awakening\": {\n ranks: 3,\n text: \"Amara's Rush stacks gain increased effectiveness.\",\n effect: (rank, level) => `Rush Stack Effectiveness: +${percent(rank, 10)}%`,\n },\n \"Tandava\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself. When it hits a target, it explodes, damaging all nearby enemies.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 91)} (increases with character level), Cooldown: 35 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n },\n \"6\": {\n \"Avatar\": {\n ranks: 1,\n text: \"Amara's Action Skill can be activated while it's cooling down. This skill may only be used once per completed cooldown. Additionally, increases Amara's Maximum Rush Stacks. Additionally, if Amara's Action Skill kills an enemy, it refunds half of her Rush stacks.\",\n effect: (rank, level) => `Maximum Rush Stacks: +10`,\n },\n },\n },\n \"Fist of the Elements\": {\n \"0\": {\n \"Phasegrasp\": {\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Some enemies are immune to being Grasped and instantly take damage instead.\",\n effect: (rank, level) => `Skill Duration: 7 sec, Cooldown: 16 seconds, Grasp Immune Damage: ${flat(rank, level, 28)} (increases with character level)`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Anima\": {\n ranks: 5,\n text: \"Amara's Status Effects deal increased damage over time and have increased duration. Her Action Skill Status Effect deals further increased damage.\",\n effect: (rank, level) => `Action Skill Status Effect Damage: +${percent(rank, 8)}%, Status Effect Damage: +${percent(rank, 4)}%, Status Effect Duration: +${percent(rank, 20)}%`,\n },\n \"Steady Hands\": {\n ranks: 3,\n text: \"Amara gains increased Weapon Handling and Accuracy.\",\n effect: (rank, level) => `Handling: +${getSteadyHandsHandling(rank)}%, Accuracy: +${getSteadyHandsAccuracy(rank)}%`,\n },\n \"Infusion\": {\n ranks: 5,\n text: \"Convert a portion of damage dealt by Amara's weapons into her Action Skill Element.\",\n effect: (rank, level) => `Converted Damage: ${percent(rank, 8)}%`,\n },\n },\n \"2\": {\n \"Tempest\": {\n ranks: 5,\n text: \"Amara deals increased Elemental Damage. Shock Damage is further increased.\",\n effect: (rank, level) => `Elemental Damage: +${percent(rank, 6)}%, Shock Damage: +${percent(rank, 2)}%`,\n },\n \"Illuminated Fist\": {\n ranks: 1,\n text: \"Amara gains increased Melee Damage and her Melee Damage is converted to Action Skill Element.\",\n effect: (rank, level) => `Melee Damage: +75%`,\n },\n \"Wildfire\": {\n ranks: 5,\n text: \"Whenever Amara applies a Status Effect to an enemy, it has a chance to spread to a nearby enemy.\",\n effect: (rank, level) => `Spread Chance: +${percent(rank, 8)}%`,\n },\n \"Soulfire\": {\n ranks: 0,\n text: \"Converts Amara's Action Skill to Incendiary Damage.\",\n effect: (rank, level) => `Converts to Incendiary Damage`,\n type: SKILLS.AUGMENT_DIAMOND,\n },\n },\n \"3\": {\n \"The Eternal Fist\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Whenever the Grasped enemy is killed, a new fist seeks out and Grasps a new target.\",\n effect: (rank, level) => `Bonus Targets: Up to +4, Duration: 7 seconds, Cooldown: 20 seconds, Grasp Immune Damage: ${flat(rank, level, 28)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Dread\": {\n ranks: 1,\n text: \"Amara's Gun Damage is increased for a few seconds after an enemy is Grasped. Whenever any player kills a Grasped enemy, their current weapon is instantly reloaded.\",\n effect: (rank, level) => `Gun Damage: +15%, Duration: 8 seconds`,\n },\n \"Allure\": {\n ranks: 0,\n text: \"Amara's Action Skill creates a singularity that pull in enemies.\",\n effect: (rank, level) => `Action Skill Damage: -20%, Duration: 2.5 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Indiscriminate\": {\n ranks: 3,\n text: \"Amara's bullets that damage enemies have a chance to ricochet and deal decreased damage to other nearby enemies. Richochet Chance and Damage are increased if target is affected by Phasegrasp or Stillness of Mind.\",\n effect: (rank, level) => `Ricochet Chance: +${percent(rank, 10)}%, Ricochet Damage: -50%, Action Skill Ricochet Chance: +${percent(rank, 20)}%, Action Skill Ricochet Damage: -25%`,\n },\n \"Deep Well\": {\n ranks: 1,\n text: \"Amara gains increased Magazine Size with elemental weapons.\",\n effect: (rank, level) => `Magazine Size: +20%`,\n },\n \"Catharsis\": {\n ranks: 3,\n text: \"Whenever Amara riggers an elemental effect on an enemy, when that enemy that dies the enemy explodes, dealing her attuned element damage along with any other element that is currently inflicted upon that enemy. This skill has a short cooldown.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 4)} (increases with character level), Cooldown: 8 seconds`,\n },\n \"Ties That Bind\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Enemies near the Grasped target are linked, and any damage dealt to a linked target is shared between all other linked targets.\",\n effect: (rank, level) => `Link Damage: 35% of damage dealt, Duration: 7 seconds, Cooldown: 18 seconds, Grasp Immune Damage: ${flat(rank, level, 34)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n },\n \"5\": {\n \"Fist Over Matter\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. After Grasping the targeted enemy, large fists appear and constantly smash the area, dealing damage to nearby enemies.\",\n effect: (rank, level) => `Damage ${flat(rank, level, 35)} (increases with character level), Duration: 7 seconds, Cooldown: 28 seconds, Grasp Immune Damage ${flat(rank, level, 39)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Sustainment\": {\n ranks: 5,\n text: \"Amara gains Life Steal whenever she deals Elemental Damage with her weapon.\",\n effect: (rank, level) => `Life Steal: +${percent(rank, 4)}% of damage dealt`,\n },\n \"Conflux\": {\n ranks: 5,\n text: \"Whenever Amara applies a Status Effect to an enemy, she gains a chance to randomly Electrocute, Ignite, or Melt that enemy.\",\n effect: (rank, level) => `Extra Effect Chance: +${percent(rank, 7)}%`,\n },\n },\n \"6\": {\n \"Forceful Expression\": {\n ranks: 1,\n text: \"Amara's guns deal Bonus Elemental Damage based on her Action Skill Element.\",\n effect: (rank, level) => `Bonus Elemental Damage: +18% of damage dealt`,\n },\n },\n },\n};\n\nexport default skills;\n","import style from './index.css';\n\nexport default function () {\n return (\n \n );\n}\n","import { Router } from 'preact-router';\n\nimport Home from '@pages/Home';\nimport Operative from '@pages/Operative';\nimport Siren from '@pages/Siren';\nimport Beastmaster from '@pages/Beastmaster';\nimport Gunner from '@pages/Gunner';\n\nconst App = () =>\n (\n \n \n \n \n \n );\n\nexport default App;\n","// import { useReducer } from 'preact/hooks'; // Downgraded from Preact 10 for compat with @pwa/cli\nimport { Component } from 'preact';\nimport Skill from '@components/Skill';\nimport Nav from '@components/Nav';\nimport Footer from '@components/Footer';\nimport { getHash, setHash } from './hashHandler';\nimport reducer from './reducer';\nimport { getLevel } from './selectors';\nimport style from './index.css';\n\nfunction contextKiller (event) {\n event.preventDefault();\n return false;\n}\n\nexport default class VaultHunter extends Component {\n constructor (props) {\n super(props);\n this.state = {\n invested: [0, 0, 0],\n skills: props.skills || {},\n };\n }\n\n componentDidMount () {\n this.setState(reducer(this.state, {\n type: 'loadSkills',\n skills: getHash(this.state.skills),\n }));\n }\n\n render ({\n name = 'Unnamed',\n discipline = 'Classless',\n path,\n skills: initialSkills,\n }) {\n const skillChangeListenerFactory = (skillName, treeIndex, treeName, tierIndex) => {\n return (oldValue, newValue) => {\n this.setState(reducer(this.state, {\n type: 'skillChange',\n skillName,\n treeIndex,\n treeName,\n tierIndex,\n newValue,\n oldValue,\n }));\n };\n };\n\n const resetSkills = () => {\n setHash(initialSkills);\n this.setState({\n invested: [0, 0, 0],\n skills: initialSkills || {},\n });\n };\n\n const trees =\n Object.keys(this.state.skills).map((treeName, treeIndex) => {\n return (\n
\n );\n }\n}\n","export default {\n ACTION_SKILL: 1,\n AUGMENT_CHEVRON: 2,\n AUGMENT_DIAMOND: 3,\n AUGMENT_ACTION_SKILL: 4,\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"VaultHunter\":\"_2zgqJ\",\"header\":\"_1Jomm\",\"title\":\"_17kLY\",\"subtitle\":\"_3J3hw\",\"sidepanel\":\"_2UO55\",\"level\":\"xH9ts\",\"reset\":\"K9CBr\",\"overlevelA\":\"_1LE8c\",\"overlevelB\":\"_1vOfn\",\"trees\":\"_3ek45\",\"tier\":\"_3Ch4X\",\"treeName\":\"_1WAM2\",\"tree\":\"gRWZY\",\"skills\":\"_2Su0b\",\"green\":\"-Pl7G\",\"blue\":\"_1nm1I\",\"red\":\"_3T1pZ\"};","import { Link } from 'preact-router';\nimport Footer from '@components/Footer';\nimport style from './index.css';\n\nexport default function () {\n const pages = [\n { name: 'Zane', job: 'the Operative', path: '/operative' },\n { name: 'Amara', job: 'the Siren', path: '/siren' },\n { name: 'FL4K', job: 'the Beastmaster', path: '/beastmaster' },\n { name: 'Moze', job: 'the Gunner', path: '/gunner' },\n ];\n return (\n
\n
\n
\n
(Unofficial)
Borderlands 3 skill calculator
\n { pages.map(page => {\n return (\n \n
\n {page.name}\n
\n {page.job}\n
\n
\n \n );\n }) }\n
\n
\n \n
\n );\n}\n","import { h, render } from 'preact';\nimport App from '@components/App';\nimport './index.css';\n\nlet elem = document.querySelector('#app');\nlet root = render(, elem, elem.firstElementChild);\n\nif (process.env.NODE_ENV === 'development' && module.hot) {\n // enable preact devtools\n require('preact/debug');\n // respond to HMR updates\n module.hot.accept('@components/App', New => {\n New = require('@components/App').default;\n root = render(, elem, root);\n });\n} else if (process.env.NODE_ENV === 'production') {\n // Service Worker registration\n require('offline-plugin/runtime').install();\n}\n","import { Component, cloneElement, h } from 'preact';\n\nvar EMPTY$1 = {};\n\nfunction assign(obj, props) {\n\t// eslint-disable-next-line guard-for-in\n\tfor (var i in props) {\n\t\tobj[i] = props[i];\n\t}\n\treturn obj;\n}\n\nfunction exec(url, route, opts) {\n\tvar reg = /(?:\\?([^#]*))?(#.*)?$/,\n\t\tc = url.match(reg),\n\t\tmatches = {},\n\t\tret;\n\tif (c && c[1]) {\n\t\tvar p = c[1].split('&');\n\t\tfor (var i=0; i b.rank) ? -1 :\n\t\t(a.index - b.index)\n\t);\n}\n\n// filter out VNodes without attributes (which are unrankeable), and add `index`/`rank` properties to be used in sorting.\nfunction prepareVNodeForRanking(vnode, index) {\n\tvnode.index = index;\n\tvnode.rank = rankChild(vnode);\n\treturn vnode.attributes;\n}\n\nfunction segmentize(url) {\n\treturn url.replace(/(^\\/+|\\/+$)/g, '').split('/');\n}\n\nfunction rankSegment(segment) {\n\treturn segment.charAt(0)==':' ? (1 + '*+?'.indexOf(segment.charAt(segment.length-1))) || 4 : 5;\n}\n\nfunction rank(path) {\n\treturn segmentize(path).map(rankSegment).join('');\n}\n\nfunction rankChild(vnode) {\n\treturn vnode.attributes.default ? 0 : rank(vnode.attributes.path);\n}\n\nvar customHistory = null;\n\nvar ROUTERS = [];\n\nvar subscribers = [];\n\nvar EMPTY = {};\n\nfunction isPreactElement(node) {\n\treturn node.__preactattr_!=null || typeof Symbol!=='undefined' && node[Symbol.for('preactattr')]!=null;\n}\n\nfunction setUrl(url, type) {\n\tif ( type === void 0 ) type='push';\n\n\tif (customHistory && customHistory[type]) {\n\t\tcustomHistory[type](url);\n\t}\n\telse if (typeof history!=='undefined' && history[type+'State']) {\n\t\thistory[type+'State'](null, null, url);\n\t}\n}\n\n\nfunction getCurrentUrl() {\n\tvar url;\n\tif (customHistory && customHistory.location) {\n\t\turl = customHistory.location;\n\t}\n\telse if (customHistory && customHistory.getCurrentLocation) {\n\t\turl = customHistory.getCurrentLocation();\n\t}\n\telse {\n\t\turl = typeof location!=='undefined' ? location : EMPTY;\n\t}\n\treturn (\"\" + (url.pathname || '') + (url.search || ''));\n}\n\n\n\nfunction route(url, replace) {\n\tif ( replace === void 0 ) replace=false;\n\n\tif (typeof url!=='string' && url.url) {\n\t\treplace = url.replace;\n\t\turl = url.url;\n\t}\n\n\t// only push URL into history if we can handle it\n\tif (canRoute(url)) {\n\t\tsetUrl(url, replace ? 'replace' : 'push');\n\t}\n\n\treturn routeTo(url);\n}\n\n\n/** Check if the given URL can be handled by any router instances. */\nfunction canRoute(url) {\n\tfor (var i=ROUTERS.length; i--; ) {\n\t\tif (ROUTERS[i].canRoute(url)) { return true; }\n\t}\n\treturn false;\n}\n\n\n/** Tell all router instances to handle the given URL. */\nfunction routeTo(url) {\n\tvar didRoute = false;\n\tfor (var i=0; i 0;\n\t};\n\n\t/** Re-render children with a new URL to match against. */\n\tRouter.prototype.routeTo = function routeTo (url) {\n\t\tthis._didRoute = false;\n\t\tthis.setState({ url: url });\n\n\t\t// if we're in the middle of an update, don't synchronously re-route.\n\t\tif (this.updating) { return this.canRoute(url); }\n\n\t\tthis.forceUpdate();\n\t\treturn this._didRoute;\n\t};\n\n\tRouter.prototype.componentWillMount = function componentWillMount () {\n\t\tROUTERS.push(this);\n\t\tthis.updating = true;\n\t};\n\n\tRouter.prototype.componentDidMount = function componentDidMount () {\n\t\tvar this$1 = this;\n\n\t\tif (customHistory) {\n\t\t\tthis.unlisten = customHistory.listen(function (location) {\n\t\t\t\tthis$1.routeTo((\"\" + (location.pathname || '') + (location.search || '')));\n\t\t\t});\n\t\t}\n\t\tthis.updating = false;\n\t};\n\n\tRouter.prototype.componentWillUnmount = function componentWillUnmount () {\n\t\tif (typeof this.unlisten==='function') { this.unlisten(); }\n\t\tROUTERS.splice(ROUTERS.indexOf(this), 1);\n\t};\n\n\tRouter.prototype.componentWillUpdate = function componentWillUpdate () {\n\t\tthis.updating = true;\n\t};\n\n\tRouter.prototype.componentDidUpdate = function componentDidUpdate () {\n\t\tthis.updating = false;\n\t};\n\n\tRouter.prototype.getMatchingChildren = function getMatchingChildren (children, url, invoke) {\n\t\treturn children\n\t\t\t.filter(prepareVNodeForRanking)\n\t\t\t.sort(pathRankSort)\n\t\t\t.map( function (vnode) {\n\t\t\t\tvar matches = exec(url, vnode.attributes.path, vnode.attributes);\n\t\t\t\tif (matches) {\n\t\t\t\t\tif (invoke !== false) {\n\t\t\t\t\t\tvar newProps = { url: url, matches: matches };\n\t\t\t\t\t\tassign(newProps, matches);\n\t\t\t\t\t\tdelete newProps.ref;\n\t\t\t\t\t\tdelete newProps.key;\n\t\t\t\t\t\treturn cloneElement(vnode, newProps);\n\t\t\t\t\t}\n\t\t\t\t\treturn vnode;\n\t\t\t\t}\n\t\t\t}).filter(Boolean);\n\t};\n\n\tRouter.prototype.render = function render (ref, ref$1) {\n\t\tvar children = ref.children;\n\t\tvar onChange = ref.onChange;\n\t\tvar url = ref$1.url;\n\n\t\tvar active = this.getMatchingChildren(children, url, true);\n\n\t\tvar current = active[0] || null;\n\t\tthis._didRoute = !!current;\n\n\t\tvar previous = this.previousUrl;\n\t\tif (url!==previous) {\n\t\t\tthis.previousUrl = url;\n\t\t\tif (typeof onChange==='function') {\n\t\t\t\tonChange({\n\t\t\t\t\trouter: this,\n\t\t\t\t\turl: url,\n\t\t\t\t\tprevious: previous,\n\t\t\t\t\tactive: active,\n\t\t\t\t\tcurrent: current\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t};\n\n\treturn Router;\n}(Component));\n\nvar Link = function (props) { return (\n\th('a', assign({ onClick: handleLinkClick }, props))\n); };\n\nvar Route = function (props) { return h(props.component, props); };\n\nRouter.subscribers = subscribers;\nRouter.getCurrentUrl = getCurrentUrl;\nRouter.route = route;\nRouter.Router = Router;\nRouter.Route = Route;\nRouter.Link = Link;\n\nexport { subscribers, getCurrentUrl, route, Router, Route, Link };export default Router;\n//# sourceMappingURL=preact-router.es.js.map\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\n\n/* These three skills dont follow a linear patch for some increases. Data came from official builder.\nhttps://borderlands.com/en-US/characters/fl4k/#-\nMight be different in game but I haven't played FL4K yet!\nThere are probably diminishing return algorithms for these but this was quicker than figuring that out. */\n\n// Hunter's Eye Damage Reduction\nfunction getHuntersEyeDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 5.3;\n case 2:\n return 10.1;\n case 3:\n return 14.4;\n case 4:\n return 18.3;\n case 5:\n return 21.9;\n default:\n return 0;\n }\n}\n\n// Ambush Predator Handling\nfunction getAmbushPredatorHandling(rank) {\n switch (rank) {\n case 1:\n return 17;\n case 2:\n return 29;\n case 3:\n return 38;\n case 4:\n return 44;\n case 5:\n return 50;\n default:\n return 0;\n }\n}\n\n// The Most Dangerous Game Handling\nfunction getMostDangerousGameHandling (rank) {\n switch (rank) {\n case 1:\n return 14.3;\n case 2:\n return 25.0;\n case 3:\n return 33.3;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Stalker\": {\n \"0\": {\n \"Jabber Sidekick\": {\n text: \"FL4K gains a Jabber companion, who shoots enemies with a pistol. FL4K gains increased movement speed. Jabber throws a radiation barrel after FL4K uses the attack command.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed +5%`,\n },\n \"Fade Away\": {\n text: \"FL4K turns invisible, gains increased movement speed, health generation, and can fire three guaranteed critical shots before uncloaking.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Critical Hit Damage +200%,\n Cloaked Movement Speed +25%,\n Max Health Regeneration +3% of Max Health/second,\n Cooldown 45 seconds,\n Skill Duration 15 seconds`,\n },\n },\n \"1\": {\n \"Self-Repairing System\": {\n text: \"FL4K has increased health and constantly regenerates health.\",\n ranks: 5,\n effect: (rank, level) => `Max Health +${percent(rank, 6)}%,\n Health Regen ${percent(rank, 0.3)}%`,\n },\n \"Sic'Em\": {\n text: \"FL4K's attack command's cooldown is shorter and deals increased damage\",\n ranks: 3,\n effect: (rank, level) => `Attack Command Damage +${percent(rank, 10)}%,\n Attack Command Cooldown -${percent(rank, 10)}%`,\n },\n \"Furious Attack\": {\n text: \"Shooting enemies grants stacks of Furious Attack. Each stack increases handling and gun damage. Stacks decay over time.\",\n ranks: 5,\n effect: (rank, level) => `Handling +${percent(rank, 1)}% per stack, \n Gun Damage +${percent(rank, 0.4)}% per stack, \n Stacks: 10, Ability Duration: 4 seconds`,\n },\n },\n \"2\": {\n \"Guerrillas In The Mist\": {\n text: \"Fade Away's stealth no longer dissipates after three attacks, but lowers critical damage and has a shorter duration.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Fade Away Duration 8 seconds, \n Critical Hit Damage 50%`,\n },\n \"Eager To Impress\": {\n text: \"FL4K reduces their skill cooldown with each kill. Pet kills further reduce the action skill cooldown, and refresh Attack Command's cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Pet Kill Cool Down Time -${percent(rank, 0.5)}%,\n FL4K Kill Cool Down Time -${percent(rank, 0.25)}%`,\n },\n \"All My BFF's\": {\n text: \"Allies share in FL4K's health regeneration. FL4K's pet gains double health regeneration.\",\n ranks: 3,\n effect: (rank, level) => `Allies Share of Health Regeneration ${Math.round(percent(rank, 16.66666))}%`,\n },\n \"Overclocked\": {\n text: \"FL4K has an increased fire rate, with increased fire rate after a reload.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate After Reloading +${percent(rank, 2)}%,\n Fire Rate +${percent(rank, 2)}%,\n Duration 4 seconds`,\n },\n },\n \"3\": {\n \"Not My Circus\": {\n text: \"FL4K's pet taunts enemies after Fade Away ends. The pet gains damage resistance after taunting.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Pet Taunt Duration 6 seconds, \n Pet Damage Reduction +80%`,\n },\n \"Lick The Wounds\": {\n text: \"FL4K's pet can revive them in Fight For Your Life\",\n ranks: 1,\n },\n \"Turn Tail And Run\": {\n text: \"FL4K constantly regenerates health and gains damage reduction while moving. FL4K has increased gun damage and fire rate while standing still.\",\n ranks: 3,\n effect: (rank, level) => `Damage Reduction While Moving +${percent(rank, 6.5)}%,\n Health Generation While Moving +${percent(rank, 0.3)}% of Max Health/second,\n Gun Damage While Still +${percent(rank, 8.3)}%,\n Fire Rate While Still +${percent(rank, 4)}%`,\n },\n \"Beefcake Jabber\": {\n text: \"FL4K's Jabber is now a Beefcake. Beefcake wields a shotgun, and FL4K gains movement speed and health. Attack Command makes Beefcake summon a melee weapon that knocks enemies back.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed +5%,\n Max Health +10%`,\n },\n },\n \"4\": {\n \"Until You Are Dead\": {\n text: \"Fade Away's health regeneration and movement speed last after the skill ends.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Post Cloak Duration 10 seconds`,\n },\n \"The Fast And The Furryous\": {\n text: \"FL4K gains increased gun damage and movement speed when above half health.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage +${percent(rank, 8)}%,\n Movement Speed +${Math.round(percent(rank, 3.33333))}%`,\n },\n \"Hidden Machine\": {\n text: \"FL4K deals more damage against targets not attacking them.\",\n ranks: 5,\n effect: (rank, level) => `Damage +${percent(rank, 6)}%`,\n },\n \"Gunslinger Jabber\": {\n text: \"FL4K's Jabber is now a Gunslinger. Gunslinger has upgraded weapons and wields a submachine gun. FL4K gains increased critical damage and movement speed. Attack Command causes the Gunslinger to wield a rocket launcher for a time.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed +5%,\n Critical Hit Damage +5%`,\n },\n },\n \"5\": {\n \"Unblinking Eye\": {\n text: \"Hitting the same target multiple times increases FL4K's critical damage. Unblinking Eye resets on three hits.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Critical Hit Damage +75% per hit`,\n },\n \"Rage And Recover\": {\n text: \"Killing an enemy increases pet health regeneration.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration +${percent(rank, 1.6)}% of Missing Health/second,\n Duration 3 seconds`,\n },\n },\n \"6\": {\n \"The Power Inside\": {\n text: \"FL4K and their pet gains increased damage after FL4K activates an Action Skill. The effect for FL4K is doubled if their health is full.\",\n ranks: 1,\n effect: (rank, level) => `Damage +25%,\n Duration 15 seconds`,\n },\n },\n },\n \"Master\": {\n \"0\": {\n \"Guard Skag\": {\n text: \"FL4K summons a Skag to follow them, which increases their damage. Using Attack Command causes the skag to vomit acid on enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage +5%`,\n },\n \"Gamma Burst\": {\n text: \"FL4K teleports their pet to a target location, causing an explosion of radiation damage. FL4K's pet becomes irradiated, making them bigger and causing them to deal radiation damage to enemies. Gamma Busrt can also revive a downed pet to 30% health, but doubles the cooldown time.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Damage 56,\n Duration 20 seconds,\n Cooldown 30 seconds`,\n },\n },\n \"1\": {\n \"Ferocity\": {\n text: \"Increased FL4K's pet damage.\",\n ranks: 5,\n effect: (rank, level) => `Pet Damage +${percent(rank, 10)}%`,\n },\n \"Persistence Hunter\": {\n text: \"Increased FL4K's gun damage and action skill duration.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage +${percent(rank, 4)}%,\n Action Skill Duration +${percent(rank, 15)}%`,\n },\n \"Go For The Eyes!\": {\n text: \"FL4K's pet's first attack on a enemy is a guaranteed critical hit.\",\n ranks: 5,\n effect: (rank, level) => `Pet Critical Hit Damage ${percent(rank, 15)}%`,\n },\n },\n \"2\": {\n \"Atomic Aroma\": {\n text: \"After Gamma Burst, FL4K's pet gains radiation damage, dealing damage to enemies around it.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Radiation Damage 4 per second`,\n },\n \"Who Rescued Who?\": {\n text: \"When FL4K's pet damages a enemy, FL4K regenerates health. FL4K damaging an enemy regenerates their pet's health.\",\n ranks: 5,\n effect: (rank, level) => `Converts +${percent(rank, 1)}% of Damage Dealt into Pet Health,\n Health Regeneration +${percent(rank, 0.4)}% of Max Health/second`,\n },\n \"He Bites!\": {\n text: \"When FL4K's pet takes damage, the pet reflects damage back to the enemy.\",\n ranks: 3,\n effect: (rank, level) => `Damage Reflected +${percent(rank, 5)}%`,\n },\n \"Frenzy\": {\n text: \"When FL4K's pet damages an enemy, both FL4K and their pet gain stacks of Frenzy, which increases their damage for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Damage +${percent(rank, 0.8)}%,\n \"Max Frenzy Stacks 10`,\n },\n },\n \"3\": {\n \"Empathic Rage\": {\n text: \"FL4K deals additional damage while Gamma Burst is active.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Damage +20%`,\n },\n \"Psycho Head On A Stick\": {\n text: \"When FL4K kills an enemy, their pet gains bonus movement speed and damage.\",\n ranks: 1,\n effect: (rank, level) => `Pet Movement Speed 12%,\n Pet Damage 10%,\n Duration 8 seconds`,\n },\n \"Hive Mind\": {\n text: \"FL4K shares their damage taken with their pet.\",\n ranks: 3,\n effect: (rank, level) => `Damage Shared ${percent(rank, 5)}%`,\n },\n \"Great Horned Skag\": {\n text: \"FL4K summons a Great Horned Skag, which increases their damage and gun damage. Attack Command makes the Great Horned Skag charge enemies and knock them up.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage +5%,\n Gun Damage +10%`,\n\n },\n },\n \"4\": {\n \"Endurance\": {\n text: \"If FL4K or their pet kill an enemy during Gamma Burst, Gamma Burst's duration is extended and the pet damage grows. This can happen up to five times.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Skill Duration +3 seconds per kill,\n Pet Damage +10% per kill`,\n },\n \"Barbaric Yawp\": {\n text: \"FL4K's pet bonus skills are more effective.\",\n ranks: 5,\n effect: (rank, level) => `Pet Bonuses +${percent(rank, 20)}%`,\n },\n \"Mutated Defenses\": {\n text: \"FL4K's pet gains bonus health regeneration and defenses if it reaches low health.\",\n ranks: 1,\n effect: (rank, level) => `Damage Reduction +30%\n Health Regeneration +40% of Max Pet Health\n Cooldown 15 seconds`,\n },\n \"Eridian Skag\": {\n text: \"FL4K summons an Eridian Skag, increasing their fire rate and damage. Attack Command causes the Eridian Skag to summon a singularity, drawing enemies in\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage +5%,\n Fire Rate +5%`,\n },\n },\n \"5\": {\n \"Burst Aid\": {\n text: \"After Gamma Burst, FL4K and allies can stand near their pet's exit point to regenerate health.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration +20% of Max Health/second`,\n },\n \"Pack Tactics\": {\n text: \"FL4K and their pet gain bonus health and damage.\",\n ranks: 3,\n effect: (rank, level) => `Pet And FL4K Damage +${percent(rank, 5)}%,\n Pet And FL4K Maximum Health +${percent(rank, 5)}%`,\n },\n \"Shared Spirit\": {\n text: \"When FL4K is at low health, they share more damage with their pet.\",\n ranks: 1,\n effect: (rank, level) => `Damage Shared +50%`,\n },\n },\n \"6\": {\n \"Dominance\": {\n text: \"Overrides FL4K's melee attack. FL4K dominates an enemy with their melee, turning them into an ally for a short time. This duration is doubled for beast enemies. Dominated enemies constantly lose health, can only be dominated once, and FL4K can only dominate one enemy at a time.\",\n ranks: 1,\n effect: (rank, level) => `Target Loses 2% of Max Health/second,\n Duration 12 seconds`,\n },\n },\n },\n \"Hunter\": {\n \"0\": {\n \"Spiderant Centurion\": {\n text: \"FL4K summons a Spiderant, which regenerates FL4K's health. Attack Command makes the Spiderant charge into enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration 1% of Max Health/second`,\n },\n \"Rakk Attack!\": {\n text: \"FL4K sends two Rakks to attack enemies. This skill has multiple charges per activation.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Damage 35,\n Cooldown 18 seconds`,\n },\n },\n \"1\": {\n \"Interplanetary Stalker\": {\n text: \"FL4K gains a stack of Interplanetary Stalker after killing an enemy, which increases their damage. FL4K also gains unique bonuses depending on the type of enemy killed, stacking up to three times per enemy type.\",\n ranks: 5,\n effect: (rank, level) => `Damage +${percent(rank, 2)}%/stack,\n Human Bonus +${percent(rank, 3)}% Action Skill Damage/stack,\n Robot Bonus +${percent(rank, 1.5)}% Corrosive Damage/stack,\n Beast Bonus +${percent(rank, 2)}% Movement Speed/stack,\n Max Stacks 3`,\n },\n \"Leave No Trace\": {\n text: \"Critical hits have a chance to refund some ammo to the magazine.\",\n ranks: 3,\n effect: (rank, level) => `Chance to add ammo ${percent(rank, 12)}%`,\n },\n \"Second Intention\": {\n text: \"Killing an enemy increases FL4K's reload speed. Critical kills increase the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Reload Speed +${Math.round(percent(rank, 2.6))}%,\n Critical Kill Reload Speed +${Math.round(percent(rank, 4.6))}%,\n Critical Kill Reload Speed Duration 5 seconds`,\n },\n },\n \"2\": {\n \"Rakk Open A Cold One\": {\n text: \"FL4K's Rakks deal Cryo damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Deals Cryo Elemental Damage`,\n },\n \"Hunter's Eye\": {\n text: \"When FL4K fights different kinds of enemies, they earn bonuses.\",\n ranks: 5,\n effect: (rank, level) => `Critical Hit Damage +${percent(rank, 3)}% vs. Humans,\n Armor Damage +${percent(rank, 6)}% vs. Robots,\n Damage Reduction +${getHuntersEyeDamageReduction(rank)}% vs. Beasts`,\n },\n \"Head Count\": {\n text: \"Critical hits have a chance to reduce the Action Skill cooldown.\",\n ranks: 3,\n effect: (rank, level) => `Cooldown Time Reduction Chance +${percent(rank, 10)}%,\n Cooldown Time -2 seconds`,\n },\n \"Ambush Predator\": {\n text: \"FL4K's handling and critical damage are increased when no enemies are nearby.\",\n ranks: 5,\n effect: (rank, level) => `Critical Hit Damage +${percent(rank, 4)}%,\n Handling +${getAmbushPredatorHandling(rank)}%`,\n },\n },\n \"3\": {\n \"Falconer's Feast\": {\n text: \"FL4K's Rakks steal health for them.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Health Returned 7% of Max Health`,\n },\n \"Two F4ng\": {\n text: \"FL4K has a chance to fire an extra attack per shot.\",\n ranks: 5,\n effect: (rank, level) => `Extra Projectile Chance ${percent(rank, 5)}%`,\n },\n \"Spiderant Scorcher\": {\n text: \"FL4K's Spiderant is now a Scorcher, which deals Incendiary damage to nearby enemies. FL4K regenerates health and gains elemental resistance. Attack Command makes the Scorcher charge enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration +1% of Max Health/second,\n Elemental Damage +10%`,\n },\n },\n \"4\": {\n \"Flock'N'Load\": {\n text: \"FL4K sends forward additional Rakk.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Additional Rakk +2`,\n },\n \"Big Game\": {\n text: \"FL4K's Hunter skills are more powerful and last longer.\",\n ranks: 3,\n effect: (rank, level) => `Hunter Skill Effects +${percent(rank, 10)}%,\n Hunter Skill Duration +${Math.round(percent(rank, 33.33333))}%`,\n },\n \"The Most Dangerous Game\": {\n text: \"Killing a Badass (or higher rank) enemy increases critical hit damage, gun damage, and handling. High rank enemies also come with a cash reward.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage +${percent(rank, 8)}%,\n Critical Hit Damage +${Math.round(percent(rank, 3.33333))}%,\n Handling +${getMostDangerousGameHandling(rank)}%,\n Duration 120 seconds`,\n },\n \"Spiderant Countess\": {\n text: \"FL4K's Spiderant is now a Countess, and FL4K regenerates health and has damage reduction. The attack command makes the Countess burrow underground and emerge later, dealing Corrosive damage.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration +1% of Max Health/second,\n Damage Reduction +5%`,\n },\n },\n \"5\": {\n \"Rakkcelerate\": {\n text: \"FL4K's Rakks cooldown faster and have an additional charge.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Cooldown Rate +20%,\n Skill Charges +1`,\n },\n \"Galactic Shadow\": {\n text: \"FL4K deals bonus critical hit damage and enemies are less likely to attack them.\",\n ranks: 1,\n effect: (rank, level) => `Critical Hit Damage 15%`,\n },\n \"Grim Harvest\": {\n text: \"FL4K deals bonus gun and Action Skill damage.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage ${percent(rank, 3)}%,\n Action Skill Damage ${percent(rank, 5)}%`,\n },\n },\n \"6\": {\n \"Megavore\": {\n text: \"FL4K has a chance to land a critical hit on any enemy body part.\",\n ranks: 1,\n effect: (rank, level) => `Critical Hit Chance +20%`,\n },\n },\n },\n};\n\nexport default skills;\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Gunner ({ path }) {\n return (\n \n );\n}\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Operative ({ path }) {\n return (\n \n );\n}\n","export function getLevel (state) {\n return state.invested.reduce((total, current) => total + current, 2);\n};\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Bottomless Mags\": {\n \"0\": {\n \"Minigun\": {\n text: \"The Minigun is capable of sustained rapid fire. Firing for long periods causes the Minigun to overheat, rendering it inoperable for a few seconds.\",\n type: SKILLS.ACTION_SKILL,\n effect: (rank, level) => `Put a little lead in the air and see what falls over.`,\n },\n },\n \"1\": {\n \"Cloud of Lead\": {\n text: \"Occasionally, Moze's and Iron Bear's shots will deal additional Fire Damage and won't consume ammo.\",\n ranks: 5,\n effect: (rank, level) => `Bonus Fire Damage: +${percent(rank, 2.25)}%, Every ${9 - rank} shots does not consume ammo`,\n },\n \"Dakka Bear\": {\n text: \"Adds a manned turret to the back of Iron Bear.\",\n ranks: 1,\n effect: (rank, level) => `Fasten your seatbelt, it's going to be a bumpy ride.`,\n },\n \"Matched Set\": {\n text: \"Moze's currently equipped weapon gains a stacking bonus to Magazine Size and Decreased Heat Per Shot for every piece of Equipped Gear that has a matching manufacturer.\",\n ranks: 5,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 2)}%, Heat Per Shot: -${percent(rank, 2)}%`,\n },\n },\n \"2\": {\n \"Let Off Some Steam\": {\n text: \"Minigun deals more damage as heat increases, and can be fired for longer before overheating.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Damage: up to +80%, Minigun Heat Capacity: +35%`,\n },\n \"Stoke the Embers\": {\n text: \"Increases Moze and Iron Bear's Fire Damage.\",\n ranks: 3,\n effect: (rank, level) => `Fire Damage: +${percent(rank, 10)}%%`,\n },\n \"Redistribution\": {\n text: \"After Moze scores a Critical Hit, she regenerates ammo for a few seconds.\",\n ranks: 1,\n effect: (rank, level) => `Ammo Regeneration: +${percent(rank, 5)}% of Magazine, Redistribution Duration: 3 seconds`,\n },\n \"Scrappy\": {\n text: \"Increases Moze's Handling. While moving, Moze's Weapon Swap and Mode Switch Speed are increased.\",\n ranks: 5,\n effect: (rank, level) => `Handling: +${percent(rank, 7.5)}%, Weapon Swap Speed: +${percent(rank, 7.5)}%, Mode Switch Speed: +${percent(rank, 7.5)}%`,\n },\n \"Salamander\": {\n text: \"The Salamander is a flamethrower that deals Fire Damage to enemies at close range. Though the Salamander has infinite ammo, it drains Fuel with use.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `Fire... for effect.`,\n },\n },\n \"3\": {\n \"General Winter\": {\n text: \"Minigun fires Cryo rounds which reduce Heat Gain and Fuel Drain, but deal reduced damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: -40%, Minigun Damage: -30%, Cryo Efficiency: +20%, Converts to Cryo Damage`,\n },\n \"Rushin' Offensive\": {\n text: \"Moze can sprint and shoot at the same time.\",\n ranks: 1,\n effect: (rank, level) => `I don't want any messages saying \"I'm holding my position.\"`,\n },\n \"Scorching RPM's\": {\n text: \"Moze gains increased Fire Rate and Critical Hit Damage.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 1.5)}%, Critical Hit Damage: +${percent(rank, 2.5)}%`,\n },\n \"Fuel Economy\": {\n text: \"Reduces Salamander's Fuel Drain. Additionally, Iron Bear's Movement Speed is increased after damaging an enemy with Salamander.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: -25%, Movement Speed: +25% for 3s`,\n },\n },\n \"4\": {\n \"Exploding. Bullets.\": {\n text: \"Minigun fires Explosive Rounds that deal increased Splash Damage, but its Fire Rate is decreased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Minigun Fire Rate: -75%, Minigun Damage: +126%`,\n },\n \"The Iron Bank\": {\n text: \"Increases Moze's Magazine Size.\",\n ranks: 5,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 4)}%`,\n },\n \"Specialist Bear\": {\n text: \"Equipping two of the same Weapons on Iron Bear increases the damage they deal.\",\n ranks: 1,\n effect: (rank, level) => `Iron Bear Damage: +${percent(rank, 10)}%`,\n },\n \"Chemical Warfare\": {\n text: \"Salamander now deals Corrosive Damage. Additionally, Salamander's Melt Damage is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Melt Damage: +50%, Converts to Corrosive Damage`,\n },\n },\n \"5\": {\n \"Some for the Road\": {\n text: \"Moze gains infinite ammo for a few seconds after exiting Iron Bear.\",\n ranks: 1,\n effect: (rank, level) => `Some for the Road Duration: 5 seconds`,\n },\n \"Click, Click\": {\n text: \"Moze gains increased Gun Damage as her magazine empties. The less ammo there is remaining, the greater the increase.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: up to +${percent(rank, 12)}%`,\n },\n \"Molten Roar\": {\n text: \"The Salamander burst-fires 3 projectiles with increased Fuel Drain, the first of which leaves a large Fire area.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: +25%`,\n },\n },\n \"6\": {\n \"Forge\": {\n text: \"Moze constantly regenerates ammo for her currently equipped weapon.\",\n ranks: 1,\n effect: (rank, level) => `Ammo Regeneration: +${percent(rank, 1.5)}% of magazine/sec`,\n },\n },\n },\n \"Demolition Woman\": {\n \"0\": {\n \"V-35 Grenade Launcher\": {\n text: \"The V-35 is a semi-automatic grenade launcher. Its grenades are not affected by Moze's equipped grenade mod.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `For when the V-34 just isn't enough`,\n },\n },\n \"1\": {\n \"Fire in the Skag Den\": {\n text: \"Whenever Moze deals Splash Damage, she deals bonus Fire Damage.\",\n ranks: 5,\n effect: (rank, level) => `Bonus Fire Damage: +${percent(rank, 3)}%`,\n },\n \"Deadlines\": {\n text: \"Firing Iron Bear Weapons drains less Fuel. Killing an enemy while Iron Bear is active increases Fuel. This skill has diminishing returns.\",\n ranks: 3,\n effect: (rank, level) => `Fuel Returned: Up to ${percent(rank, 2)}%, Fuel Drain: -${percent(rank, 10)}%`,\n },\n \"Grizzled\": {\n text: \"Kill Skill. Killing an enemy reduces Moze's remaining Action Skill Cooldown Time. This skill has diminishing returns.\",\n ranks: 5,\n effect: (rank, level) => `Iron Bear Cooldown Time: -${rank * 1}) seconds`,\n },\n },\n \"2\": {\n \"Shaped Charge\": {\n text: \"Direct hits with the V-35 deal increased damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Direct Hit Damage: +35%`,\n },\n \"Means of Destruction\": {\n text: \"Whenever Moze deals Splash Damage, there is a chance to add ammo to her currently equipped weapon's magazine, with a smaller chance to return a grenade.\",\n ranks: 3,\n effect: (rank, level) => `Ammo Chance: ${percent(rank, 3.3)}%, Grenade Chance: ${percent(rank, 2)}%`,\n },\n \"Torgue Cross-Promotion\": {\n text: \"All Splash Damage dealt by Moze has a chance to double in size.\",\n ranks: 5,\n effect: (rank, level) => `+${percent(rank, 3)}% chance to double Splash Damage Radius`,\n },\n \"Stainless Steel Bear\": {\n text: \"Iron Bear gains additional armor and increased Maximum Fuel.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Fuel: +${percent(rank, 4)}%, Iron Bear Armor: +${percent(rank, 6)}%`,\n },\n \"Vanquisher Rocket Pod\": {\n text: \"The Vanquisher Rocket Pod is a rocket launcher capable of rapid-firing volleys of unguided explosive rockets.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `If you want guidance, get a sherpa. If you want explosions, get a Vladof.`,\n },\n },\n \"3\": {\n \"Musical Chairs\": {\n text: \"Occasionally, the V-35 fires a Singularity Grenade that pulls in nearby enemies before exploding.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Singularity: Every 7th grenade`,\n },\n \"Pull the Holy Pin\": {\n text: \"Moze's grenades have a chance to score a Critical Hit, dealing greatly increased damage.\",\n ranks: 3,\n effect: (rank, level) => `Critical Hit Chance: +${percent(rank, 10)}%`,\n },\n \"Auto Bear\": {\n text: \"After Moze exits Iron Bear, it will remain deployed in place for a short time. While Auto Bear remains active, it will target and attack nearby enemies until its duration ends, then it will charge at an enemy and self-destruct.\",\n ranks: 1,\n effect: (rank, level) => `Auto Bear Duration: 15 seconds`,\n },\n \"Active Tracking\": {\n text: \"The Vanquisher Rocket Pod now fires homing rockets and has increased Reload Speed. Hold down Fire Button and aim at enemies to designate up to 6 targets. Releasing Fire Button launches a volley of homing rockets at the designated targets.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Reload Speed: +25%`,\n },\n },\n \"4\": {\n \"Lock and Speedload\": {\n text: \"The V-35's Reload Speed is greatly increased and it now fires a 5-round burst.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Reload Speed: +25%`,\n },\n \"Vampyr\": {\n text: \"Whenever Moze damages an enemy with a grenade, for every enemy hit, she restores a portion of her missing health.\",\n ranks: 5,\n effect: (rank, level) => `Restores +${percent(rank, 4)}% of missing health per enemy hit`,\n },\n \"Why Can't I Carry All These Grenades\": {\n text: \"Increases Moze's grenade carrying capacity\",\n ranks: 3,\n effect: (rank, level) => `Grenade Capacity: +${rank}`,\n },\n \"Target Softening\": {\n text: \"The Vanquisher Rocket Pod deals greatly reduced damage per rocket, but fires in a 6-rocket spread. Additionally, enemies hit by Vanquisher Rocket Pod rockets take increased damage frmo all sources.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Damage: -74%, Enemy Damage Taken: +15%`,\n },\n },\n \"5\": {\n \"To the Last\": {\n text: \"Moze gains the ability to throw grenades while in Fight For Your Life. If she threw a grenade before gaining Second Wind, a grenade is refunded.\",\n ranks: 1,\n effect: (rank, level) => `The greatest enemy is one with nothing to lose... and a grenade.`,\n },\n \"Explosive Punctuation\": {\n text: \"When Moze deals Splash Damage, her Action Skill Cooldown Rate is briefly increased.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Cooldown Rate: +${percent(rank, 5)}%`,\n },\n \"Hammerdown Protocol\": {\n text: \"Instead of a volley of conventional rockets, the Vanquisher Rocket Pod launches a single rocket with a nuclear warhead, dealing massive Radiation Damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Damage: +380%, Magazine Size: 1`,\n },\n },\n \"6\": {\n \"Short Fuse\": {\n text: \"Whenever Moze deals Gun Damage, there is a chance of a secondary explosion centered on the target.\",\n ranks: 1,\n effect: (rank, level) => `Secondary Explosion Chance: 20%, Secondary Explosion Damage: 75% of Gun Damage`,\n },\n },\n },\n \"Shield of Retribution\": {\n \"0\": {\n \"Railgun\": {\n text: \"The Railgun fires electrified high-velocity projectiles that deal Shock Damage\",\n type: SKILLS.ACTION_SKILL,\n effect: (rank, level) => `It's like a bullet, only bigger. And faster. And wrapped in lightning.`,\n },\n },\n \"1\": {\n \"Selfless Vengeance\": {\n text: \"Whenever Moze reloads, she loses a small portion of her health and grants additional Fire Damage to her and her allies' rounds for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Bonus Fire Damage: +${percent(rank, 3)}% of gun damage dealt, Current Health Removed: ${percent(rank, 1)}%, Selfless Vengeance Duration: 5 sec`,\n },\n \"Security Bear\": {\n text: \"Iron Bear gains a bubble shield that reduces damage taken. The shield deactivates if it sustains too much damage, reactivating after a short cooldown.\",\n ranks: 1,\n effect: (rank, level) => `Bubble Recharge Delay: 5sec, 20% Iron Bear Max Health added as Shields`,\n },\n \"Armored Infantry\": {\n text: \"While Moze's shields are active, she gains Damage Reduction and Increased Gun Damage.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%, Damage Reduction: +${percent(rank, 2)}%`,\n },\n },\n \"2\": {\n \"Hell on Rails\": {\n text: \"Railgun now fires superheated rounds that deal Fire Damage, but have increased Fuel Drain per shot.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: +30%, Converts to Fire Damage`,\n },\n \"Drowning in Brass\": {\n text: \"Kill Skill. Killing an enemy grants Moze a stack of Drowning in Brass. For each stack of Drowning in Brass, Moze's Fire Rate is reduced, but Gun Damage is increased for both her and her allies.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% per stack, Moze Fire Rate: -${percent(rank, 0.5)}% per stack, Max Drowning In Brass Stacks: ${2 + rank}`,\n },\n \"Thin Red Line\": {\n text: \"A portion of Moze's health is removed and cannot be restored, but her Maximum Shield is increased by the same amount.\",\n ranks: 3,\n effect: (rank, level) => `+${percent(rank, 20)}% Max Health Removed and Added to Max Shields`,\n },\n \"Vladof Ingenuity\": {\n text: \"Moze's Maximum Shield is increased, and she gains resistance to Shock Damage.\",\n ranks: 5,\n effect: (rank, level) => `Max Shield: +${percent(rank, 6)}%, Shock Damage Resistance: +${percent(rank, 10)}%`,\n },\n \"Bear Fist\": {\n text: \"The Bear Fist is a pneumatic-driven fist that deals massive damage to a single target at close range.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `Vladof supports the right to bear armored bear arms.`,\n },\n },\n \"3\": {\n \"Capacitive Armature\": {\n text: \"When Railgun hits an enemy, it chains to nearby enemies, dealing reduced Shock Damage to more targets.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Splinter Damage: -75%`,\n },\n \"Full Can of Whoop-Ass\": {\n text: \"Entering Iron Bear causes Moze's and her allies' shields to immediately begin recharging at an increased Shield Recharge Rate.\",\n ranks: 1,\n effect: (rank, level) => `Shield Recharge Rate: +25%`,\n },\n \"Experimental Munitions\": {\n text: \"Whenever Moze scores a Critical Hit, she deals bonus Fire Damage.\",\n ranks: 1,\n effect: (rank, level) => `Bonus Fire Damage: +${percent(rank, 10)}% of damage dealt`,\n },\n \"Wild Swing\": {\n text: \"Whenever Bear Fist hits an enemy, it deals random Bonus Elemental Damage to that enemy and all enemies nearby.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Elemental Damage: +35% of damage dealt`,\n },\n },\n \"4\": {\n \"Corrosive Sabot Round\": {\n text: \"Railgun now fires a specialty round that deals reduced damage and explodes after a short delay. Railgun shots have reduced Fuel Drain and the Magazine Size is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: -50%, Railgun Damage: -50%, Magazine Size: 2, Converts to Corrosive Damage`,\n },\n \"Behind the Iron Curtain\": {\n text: \"Moze's Shield Recharge Delay is reduced, and her Shield Recharge Rate is increased.\",\n ranks: 3,\n effect: (rank, level) => `Shield Recharge Rate: +${percent(rank, 7)}%, Shield Recharge Delay: -${percent(rank, 8)}%`,\n },\n \"Desperate Measures\": {\n text: \"Moze's Gun Damage is increased depending on how low her health is. The lower her health, the greater the increase.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: Up to +${percent(rank, 17)}%`,\n },\n \"Close the Distance\": {\n text: \"Instead of punching, Bear Fist now launches its fist forward and grabs enemies at greatly increased range, pulling them back to Iron Bear.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Step into my office.`,\n },\n },\n \"5\": {\n \"Phalanx Doctrine\": {\n text: \"Kill Skill: After killing an enemy, Moze gains a stack of Phalanx Doctrine. Moze's Maximum Shield and Gun Damage are increased. Each stack lasts 30 seconds. There is no stack limit.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 2)}% per stack, Max Shields: +${percent(rank, 3)}% per stack, Phalanx Doctrine Duration: 30 seconds`,\n },\n \"Force Feedback\": {\n text: \"Whenever Moze scores a Critical Kill, her shields immediately begin recharging.\",\n ranks: 1,\n effect: (rank, level) => `Just click on their heads.`,\n },\n \"Shockhammer\": {\n text: \"Bear Fist is now capable of sustained rapid fire, punching as long as the fire button is held. Additionally, Bear Fist has reduced Fuel Drain and deals Bonus Shock Damage with each hit.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Shock Damage: +19% of damage dealt, Fuel Drain: -40%`,\n },\n },\n \"6\": {\n \"Tenacious Defense\": {\n text: \"Whenever Moze's shield is fully depleted, she instantly restores a portion of her shield, and her Gun Damage is increased for a short time. This skill can only trigger after Moze's shields have fully recharged.\",\n ranks: 1,\n effect: (rank, level) => `Gun Damage: +12%, Restores: +40% of Max Shield, Tenacious Defense Duration: 30 seconds`,\n },\n },\n },\n};\n\nexport default skills;\n","!function(){\"use strict\";function e(e,t){var n,o,r,i,l=W;for(i=arguments.length;i-- >2;)P.push(arguments[i]);t&&null!=t.children&&(P.length||P.push(t.children),delete t.children);while(P.length)if((o=P.pop())&&void 0!==o.pop)for(i=o.length;i--;)P.push(o[i]);else\"boolean\"==typeof o&&(o=null),(r=\"function\"!=typeof e)&&(null==o?o=\"\":\"number\"==typeof o?o+=\"\":\"string\"!=typeof o&&(r=!1)),r&&n?l[l.length-1]+=o:l===W?l=[o]:l.push(o),n=r;var a=new T;return a.nodeName=e,a.children=l,a.attributes=null==t?void 0:t,a.key=null==t?void 0:t.key,void 0!==M.vnode&&M.vnode(a),a}function t(e,t){for(var n in t)e[n]=t[n];return e}function n(e,t){null!=e&&(\"function\"==typeof e?e(t):e.current=t)}function o(n,o){return e(n.nodeName,t(t({},n.attributes),o),arguments.length>2?[].slice.call(arguments,2):n.children)}function r(e){!e.__d&&(e.__d=!0)&&1==V.push(e)&&(M.debounceRendering||D)(i)}function i(){var e;while(e=V.pop())e.__d&&x(e)}function l(e,t,n){return\"string\"==typeof t||\"number\"==typeof t?void 0!==e.splitText:\"string\"==typeof t.nodeName?!e._componentConstructor&&a(e,t.nodeName):n||e._componentConstructor===t.nodeName}function a(e,t){return e.__n===t||e.nodeName.toLowerCase()===t.toLowerCase()}function u(e){var n=t({},e.attributes);n.children=e.children;var o=e.nodeName.defaultProps;if(void 0!==o)for(var r in o)void 0===n[r]&&(n[r]=o[r]);return n}function c(e,t){var n=t?document.createElementNS(\"http://www.w3.org/2000/svg\",e):document.createElement(e);return n.__n=e,n}function p(e){var t=e.parentNode;t&&t.removeChild(e)}function s(e,t,o,r,i){if(\"className\"===t&&(t=\"class\"),\"key\"===t);else if(\"ref\"===t)n(o,null),n(r,e);else if(\"class\"!==t||i)if(\"style\"===t){if(r&&\"string\"!=typeof r&&\"string\"!=typeof o||(e.style.cssText=r||\"\"),r&&\"object\"==typeof r){if(\"string\"!=typeof o)for(var l in o)l in r||(e.style[l]=\"\");for(var l in r)e.style[l]=\"number\"==typeof r[l]&&!1===E.test(l)?r[l]+\"px\":r[l]}}else if(\"dangerouslySetInnerHTML\"===t)r&&(e.innerHTML=r.__html||\"\");else if(\"o\"==t[0]&&\"n\"==t[1]){var a=t!==(t=t.replace(/Capture$/,\"\"));t=t.toLowerCase().substring(2),r?o||e.addEventListener(t,_,a):e.removeEventListener(t,_,a),(e.__l||(e.__l={}))[t]=r}else if(\"list\"!==t&&\"type\"!==t&&!i&&t in e){try{e[t]=null==r?\"\":r}catch(e){}null!=r&&!1!==r||\"spellcheck\"==t||e.removeAttribute(t)}else{var u=i&&t!==(t=t.replace(/^xlink:?/,\"\"));null==r||!1===r?u?e.removeAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase()):e.removeAttribute(t):\"function\"!=typeof r&&(u?e.setAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase(),r):e.setAttribute(t,r))}else e.className=r||\"\"}function _(e){return this.__l[e.type](M.event&&M.event(e)||e)}function f(){var e;while(e=A.shift())M.afterMount&&M.afterMount(e),e.componentDidMount&&e.componentDidMount()}function d(e,t,n,o,r,i){H++||(R=null!=r&&void 0!==r.ownerSVGElement,B=null!=e&&!(\"__preactattr_\"in e));var l=h(e,t,n,o,i);return r&&l.parentNode!==r&&r.appendChild(l),--H||(B=!1,i||f()),l}function h(e,t,n,o,r){var i=e,l=R;if(null!=t&&\"boolean\"!=typeof t||(t=\"\"),\"string\"==typeof t||\"number\"==typeof t)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=t&&(e.nodeValue=t):(i=document.createTextNode(t),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),v(e,!0))),i.__preactattr_=!0,i;var u=t.nodeName;if(\"function\"==typeof u)return N(e,t,n,o);if(R=\"svg\"===u||\"foreignObject\"!==u&&R,u+=\"\",(!e||!a(e,u))&&(i=c(u,R),e)){while(e.firstChild)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),v(e,!0)}var p=i.firstChild,s=i.__preactattr_,_=t.children;if(null==s){s=i.__preactattr_={};for(var f=i.attributes,d=f.length;d--;)s[f[d].name]=f[d].value}return!B&&_&&1===_.length&&\"string\"==typeof _[0]&&null!=p&&void 0!==p.splitText&&null==p.nextSibling?p.nodeValue!=_[0]&&(p.nodeValue=_[0]):(_&&_.length||null!=p)&&m(i,_,n,o,B||null!=s.dangerouslySetInnerHTML),y(i,t.attributes,s),R=l,i}function m(e,t,n,o,r){var i,a,u,c,s,_=e.childNodes,f=[],d={},m=0,b=0,y=_.length,g=0,w=t?t.length:0;if(0!==y)for(var C=0;C skill.ranks) { return false; }\n tierTotal += skill.invested || 0;\n };\n if (tierTotal > 0 && treeTotal + 5 < tierIndex * 5) { return false; }\n treeTotal += tierTotal;\n tierIndex += 1;\n };\n treeTotals[treeIndex] = treeTotal;\n totalSpent += treeTotal;\n treeIndex += 1;\n };\n if (totalSpent > (50 - 3) + 11 + 11) { return false; }\n return treeTotals;\n}\n","import deepmerge from 'deepmerge';\nimport investmentValidator from './investmentValidator';\nimport { setHash } from './hashHandler';\n\nexport default function reducer (state, action) {\n switch (action.type) {\n case 'skillChange':\n var newSkills = deepmerge(state.skills, {\n [action.treeName]: {\n [action.tierIndex + '']: {\n [action.skillName]: {\n invested: action.newValue,\n }\n }\n }\n });\n const skillChangeTotals = investmentValidator(newSkills);\n if (skillChangeTotals) {\n setHash(newSkills);\n return {\n ...state,\n invested: skillChangeTotals,\n skills: newSkills,\n };\n } else {\n return state;\n }\n case 'loadSkills':\n const loadSkillsTotals = investmentValidator(action.skills);\n if (loadSkillsTotals) {\n return {\n ...state,\n invested: loadSkillsTotals,\n skills: deepmerge(state.skills, action.skills),\n };\n } else {\n return state;\n }\n }\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"footer\":\"Eq4mJ\",\"heart\":\"_37Gl6\",\"moveHeart\":\"_34mPq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"splash\":\"_2_d3x\",\"wrapper\":\"vMurv\",\"link\":\"_3lx8i\",\"name\":\"_1SiOU\",\"job\":\"_3chgr\",\"disclaimer\":\"_3RIFV\"};","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.deepmerge = factory());\n}(this, (function () { 'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tObject.keys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tObject.keys(source).forEach(function(key) {\n\t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nreturn deepmerge_1;\n\n})));\n","import SKILLS from '@constants/skills';\nimport style from './index.css';\n\nfunction getInitials (string) {\n const numWords = (string.match(/\\s/g) || []).length + 1;\n switch (numWords) {\n case 1:\n return string.slice(0, 3);\n case 2:\n return (string.match(/^\\w{1,2}|\\s\\w{1,2}/g) || []).join('').replace(/\\s/g, '');\n default:\n return (string.match(/^\\w|\\s\\w/g) || []).join('').replace(/\\s/g, '');\n }\n}\n\nexport default function Skill ({\n name = '?',\n text = 'Long description',\n ranks = 0,\n invested = 0,\n tier = 0,\n level = 1,\n effect = (rank, level) => `Rank ${rank} effect`,\n type = null,\n enabled = true,\n image = null,\n onChange = (oldValue, newValue) => null,\n}) {\n const isAugment = [\n SKILLS.AUGMENT_CHEVRON,\n SKILLS.AUGMENT_DIAMOND,\n SKILLS.AUGMENT_ACTION_SKILL,\n ].includes(type);\n let shapeStyle = null;\n if (type === SKILLS.ACTION_SKILL) { shapeStyle = style.actionSkill; }\n if (type === SKILLS.AUGMENT_CHEVRON) { shapeStyle = style.chevron; }\n if (type === SKILLS.AUGMENT_DIAMOND) { shapeStyle = style.diamond; }\n if (type === SKILLS.AUGMENT_ACTION_SKILL) { shapeStyle = style.actionSkill; }\n function clickListener (event) {\n var newValue;\n if (event.type === 'click') {\n newValue = Math.min(invested + 1, ranks);\n } else { // (event.type === 'contextmenu')\n newValue = Math.max(invested - 1, 0);\n }\n if (enabled && invested !== newValue) {\n onChange(invested, newValue);\n }\n event.preventDefault();\n return false;\n }\n return (\n
\n );\n}\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Siren ({ path }) {\n return (\n \n );\n}\n","export function setHash (skillsState) {\n const hashparts = [];\n for (let tree of Object.values(skillsState)) {\n for (let tier of Object.values(tree)) {\n for (let skill of Object.values(tier)) {\n if (skill.type == null) {\n hashparts.push(skill.invested || 0);\n }\n };\n };\n };\n const url = window.location.href.split('#')[0] + '#' + hashparts.join('');\n window.location.replace(url);\n};\n\nexport function getHash (skillsState) {\n const hash = window.location.href.split('#')[1] || '';\n const hashparts = hash.match(/./g) || [];\n const skills = JSON.parse(JSON.stringify(skillsState));\n for (let tree of Object.keys(skills)) {\n for (let tier of Object.keys(skills[tree])) {\n for (let skill of Object.keys(skills[tree][tier])) {\n if (skills[tree][tier][skill].type == null) {\n skills[tree][tier][skill] = { invested: parseInt(hashparts.shift() || 0) };\n } else {\n skills[tree][tier][skill] = {};\n }\n };\n };\n };\n return skills;\n};\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Beastmaster ({ path }) {\n return (\n \n );\n}\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\nfunction flat (rank, level, unit) {\n return Math.floor(rank * unit);\n}\n\n// Stiff Upper Lip Damage Resistance\nfunction getStiffUpperLipDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 6;\n case 2:\n return 12;\n case 3:\n return 16;\n default:\n return 0;\n }\n}\n\n// Nerves of Steel Handling\nfunction getNervesOfSteelHandling(rank) {\n switch (rank) {\n case 1:\n return 2.4;\n case 2:\n return 4.8;\n case 3:\n return 7;\n default:\n return 0;\n }\n}\n\n// Cold Bore Weapon Swap Speed\nfunction getColdBoreWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 13;\n case 2:\n return 23;\n case 3:\n return 31;\n case 4:\n return 38;\n case 5:\n return 43;\n default:\n return 0;\n }\n}\n\n// Cool Hand Passive Reload Speed\nfunction getCoolHandPassiveReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 2.9;\n case 2:\n return 5.7;\n case 3:\n return 8.3;\n case 4:\n return 10.7;\n case 5:\n return 13;\n default:\n return 0;\n }\n}\n\n// Cool Hand After Kill Reload Speed\nfunction getCoolHandAfterKillReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 4;\n case 2:\n return 7;\n case 3:\n return 11;\n case 4:\n return 14;\n case 5:\n return 17;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Under Cover\": {\n \"0\": {\n \"Barrier\": {\n text: \"Drop a deployable Barrier that blocks incoming projectiles. Zane and his allies can shoot through the Barrier, dealing increased Gun Damage. Pressing [Action Skill key] while Barrier is active picks up and holds the Barrier, but the size and bonuses are decreased.\",\n effect: (rank, level) => `Duration: 14 seconds, Cooldown: 24 seconds, Gun Damage Amp: +25%`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Adrenaline\": {\n text: \"Zane gains increased Action Skill Cooldown Rate. This bonus is based on the amount of shield he has. The more percent full, the greater the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Cooldown Rate: Up to +${percent(rank, 7)}%`,\n },\n \"Hearty Stock\": {\n text: \"Zane gains increased Maximum Shield Capacity.\",\n ranks: 3,\n effect: (rank, level) => `Maximum Shield Capacity: +${percent(rank, 10)}%`,\n },\n \"Ready for Action\": {\n text: \"Zane gains improved Shield Recharge Rate and Shield Recharge Delay.\",\n ranks: 5,\n effect: (rank, level) => `Shield Recharge Rate: +${percent(rank, 6)}%, Shield Recharge Delay: -${percent(rank, 7)}%`,\n },\n },\n \"2\": {\n \"Charged Relay\": {\n text: \"Whenever Zane or an ally touches the Barrier, they gain increased Movement Speed and Reload Speed for a few seconds.\",\n ranks: 0,\n effect: (rank, level) => `Reload Speed: +20%, Movement Speed: +11%, Duration: 8 seconds after moving away from Barrier`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Brainfreeze\": {\n text: \"Whenever Zane scores a Critical Hit on an enemy, there is a chance they will be Slowed. This effect stacks until the target is Frozen.\",\n ranks: 5,\n effect: (rank, level) => `Slow Chance: +${percent(rank, 4)}%`,\n },\n \"Stiff Upper Lip\": {\n text: \"Whenever Zane is damaged, he gains Damage Resistance against that damage type.\",\n ranks: 3,\n effect: (rank, level) => `Damage Resistance: +${getStiffUpperLipDamageResistance(rank)}%`,\n },\n \"Rise to the Occasion\": {\n text: \"Zane gains Health Regeneration. The lower his shield is, the higher the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: Up to +${percent(rank, 1)}% of Maximum Health per second`,\n },\n },\n \"3\": {\n \"Nanites or Some Shite\": {\n text: \"Zane and his allies gain Health Regeneration, increased Reload Speed, and greatly improved Shield Recharge Delay while near his Barrier. The lower their health, the more health is regenerated.\",\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: Up to +4% of Maximum Health per second, Shield Recharge Delay: -33%, Reload Speed: +11%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Confident Competence\": {\n text: \"While Zane's shields are active, he gains increased Gun Damage and Accuracy. These bonuses are based on the amount of shields he has. The more percent full, the greater the bonuses.\",\n ranks: 1,\n effect: (rank, level) => `Gun Damage: Up to +35%, Accuracy: Up to +33%`,\n },\n \"All-Rounder\": {\n text: \"Zane's Barrier becomes a dome, covering all sides.\",\n ranks: 0,\n effect: (rank, level) => `Barrier Cooldown: +20%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Redistribution\": {\n text: \"Zane and allies near the Barrier gain increased Gun Damage for a few seconds after the Barrier takes damage.\",\n ranks: 0,\n effect: (rank, level) => `Gun Damage: +10%, Duration: 3 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Really Expensive Jacket\": {\n text: \"Elemental Status Effects applied to Zane have reduced duration.\",\n ranks: 1,\n effect: (rank, level) => `Status Effect Duration: -50%`,\n },\n \"Best Served Cold\": {\n text: \"Kill Skill. Whenever Zane kills an enemy, they create a Cryo Nova, dealing damage to all nearby enemies. This skill has a short cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Damage: ${flat(rank, level, 2)} (increases with character level), Cooldown: 3 seconds`,\n },\n \"Futility Belt\": {\n text: \"Zane gains resistance to non-elemental damage. Kill Skill. After killing an enemy, all elemental damage Zane takes is converted to non-elemental damage.\",\n ranks: 1,\n effect: (rank, level) => `Damage Reduction: +15%, Duration: 8 seconds`,\n },\n \"Deterrence Field\": {\n text: \"Enemies that touch the Barrier take Shock Damage and are staggered.\",\n ranks: 0,\n effect: (rank, level) => `Shock Damage: ${flat(1, level, 27)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Refreshment\": {\n text: \"Whenever Zane damages a frozen enemy with his weapon, he gains some of that damage back as health.\",\n ranks: 3,\n effect: (rank, level) => `Life Steal: +${percent(rank, 8)}% of damage dealt`,\n },\n \"Calm, Cool, Collected\": {\n text: \"Whenever Zane Freezes an enemy, his shield instantly begins recharging. If Zane's shields are already full, he regenerates health for a few seconds. If Zane's health is already full, his Action Skill Cooldowns and Durations are immediately reset.\",\n ranks: 1,\n effect: (rank, level) => `Health Regeneration: +3% of Maximum Health per second, Health Regeneration Duration: 3 seconds`,\n },\n \"Nerves of Steel\": {\n text: \"Zane gains increasing Accuracy and Handling. The longer his shield is full, the greater the bonuses.\",\n ranks: 3,\n effect: (rank, level) => `Accuracy: +${percent(rank, 2)}% per second, Handling: +${getNervesOfSteelHandling(rank)}% per second, Maximum Nerves of Steel Stacks: 15`,\n },\n },\n \"6\": {\n \"Distributed Denial\": {\n text: \"Zane's Barrier gains the effects of his currently equipped Shield Mod. Additionally, shield effects are applied to all allies near the Barrier. Bonuses to Zane are reduced.\",\n ranks: 1,\n },\n },\n },\n \"Hitman\": {\n \"0\": {\n \"SNTNL\": {\n text: \"Send into battle an automated SNTL drone that continually flies through the environment and attacks enemies with its Machine Guns. Pressing [Action Skill key] while SNTNL is active causes it to attack the enemy under Zane's crosshairs, if any.\",\n effect: (rank, level) => `Machine Gun Damage: ${flat(rank, level, 6)} (increases with character level), Duration: 24 seconds, Cooldown: 60 seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n }\n },\n \"1\": {\n \"Violent Speed\": {\n text: \"Kill Skill. After killing an enemy, Zane gains increased Movement Speed for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Movement Speed: +${percent(rank, 4)}%, Duration: 8 seconds`,\n },\n \"Cold Bore\": {\n text: \"Zane gains increased Weapon Swap Speed. The next shot fired after swapping weapons deals Bonus Cryo Damage.\",\n ranks: 5,\n effect: (rank, level) => `Weapon Swap Speed: +${getColdBoreWeaponSwapSpeed(rank)}%, Bonus Cryo Damage: +${percent(rank, 6)}% of damage dealt`,\n },\n \"Violent Momentum\": {\n text: \"Zane's Gun Damage is increased while moving. The quicker he moves, the greater the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% at default walk speed`,\n },\n },\n \"2\": {\n \"Winter's Drone\": {\n text: \"Converts SNTNL's primary weapons to Cryo Damage.\",\n ranks: 0,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Cool Hand\": {\n text: \"Zane gains increased Reload Speed. Kill Skill. After killing an enemy, Zane's Reload Speed is increased for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Reload Speed: +${getCoolHandPassiveReloadSpeed(rank)}%, Reload Speed: +${getCoolHandAfterKillReloadSpeed(rank)}% after kill, Duration: 8 seconds `,\n },\n \"Drone Delivery\": {\n text: \"SNTRY will occasionally drop a free grenade based on your current grenade mod while attacking enemies.\",\n ranks: 1,\n effect: (rank, level) => `Cooldown: 15 seconds`,\n },\n \"Salvation\": {\n text: \"Kill Skill. After killing an enemy, Zane's weapons gain Life Steal for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Life Steal: +${percent(rank, 2)}% of damage dealt, Duration: 8 seconds`,\n },\n },\n \"3\": {\n \"Bad Dose\": {\n text: \"SNTNL occasionally shoots out a beam of Radiation that weakens enemies and buffs Zane. For every weakened enemy, Zane's Movement Speed and Fire Rate are increased. Weakened enemies have decreased Movement Speed and Attack Speed.\",\n ranks: 0,\n effect: (rank, level) => `Fire Rate: +2% per affected enemy, Movement Speed: +6% per affected enemy, Damage ${flat(rank, level, 4)} (increases with character level), Duration: 12 seconds, Cooldown: 8 sec`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Death Follows Close\": {\n text: \"All of Zane's Kill Skills gain increased effect and duration.\",\n ranks: 1,\n effect: (rank, level) => `Kill Skill Duration: +7 seconds, Kill Skill Bonus: +25%`,\n },\n \"Static Field\": {\n text: \"SNTNL emits a static field that sends a Shock Beam to nearby enemies, draining their shields and replenishing Zane's.\",\n ranks: 0,\n effect: (rank, level) => `Shield Damage: ${flat(rank, level, 2)} per second, Cooldown: 2 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Boomsday\": {\n text: \"SNTNL adds a rocket pod to its primary weapons, allowing it to shoot rockets as well as machine guns.\",\n ranks: 0,\n effect: (rank, level) => `Rocket Damage: ${flat(rank, level, 32)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Violent Violence\": {\n text: \"Kill Skill. After killing an enemy, Zane gains increased Fire Rate for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 33)}%, Cooldown: 8 seconds`,\n },\n \"Playing Dirty\": {\n text: \"Kill Skill. After killing an enemy, Zane's next five shots all have a chance to fire an additional projectile.\",\n ranks: 5,\n effect: (rank, level) => `Extra Shot Chance: +${percent(rank, 10)}%`,\n },\n \"Almighty Ordnance\": {\n text: \"Hold down [Action Skill key] while SNTNL is deployed to paint a target area. SNTNL fires a missile barrage at that area, and if an enemy is killed, SNTNL's duration is reset. This can only be used once per Action Skill use.\",\n ranks: 0,\n effect: (rank, level) => `Missile Damage: ${flat(rank, level, 56)} (increases with character level), Missiles per Barrage: 4`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Good Misfortune\": {\n text: \"Kill Skill. Killing an enemy increases Zane's Action Skill Duration. This skill has diminishing returns.\",\n ranks: 3,\n effect: (rank, level) => `Action Skill Duration: Up to +${percent(rank, 4)}% Maximum Action Skill Duration`,\n },\n },\n \"6\": {\n \"Seein' Red\": {\n text: \"Activating an Action Skill automatically activates all of Zane's Kill Skills.\",\n ranks: 1,\n }\n }\n },\n \"Doubled Agent\": {\n \"0\": {\n \"Digi-Clone\": {\n text: \"Spawn a Digi-Clone of Zane. The Digi-Clone stays in place, but distracts and fires at enemies. Pressing [Action Skill key] while the Digi-Clone is active causes Zane and the Digi-Clone to swap places.\",\n effect: (rank, level) => `Duration: 15 seconds, Cooldown: 28 seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Synchronicity\": {\n text: \"Zane gains increased Gun Damage for each active Action Skill.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% per active Action Skill`,\n },\n \"Praemunitus\": {\n text: \"Zane and his Dig-Clone gain increased Magazine Size.\",\n ranks: 3,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 8.333)}%`,\n },\n \"Borrowed Time\": {\n text: \"Zane gains increased Action Skill Duration for each active Action Skill.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Duration: +${percent(rank, 6)}% per active Action Skill`,\n },\n },\n \"2\": {\n \"Binary System\": {\n text: \"Whenever Zane swaps places with his Digi-Clone, a Cryo Nova is triggered around Zane and his Digi-Clone.\",\n ranks: 0,\n effect: (rank, level) => `Nova Damage: ${flat(rank, level, 46)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Donnybrook\": {\n text: \"Kill Skill. Whenever Zane kills an enemy, he and his Digi-Clone receive increased Gun Damage and gain Health Regeneration for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%, Health Regeneration: +${percent(rank, 0.5)}% of Missing Health per second, Duration: 8 sec`,\n },\n \"Fractal Frags\": {\n text: \"The Digi-Clone throws a copy of Zane's current grenade mod when it is first activated. If the Digi-Clone is killed, it drops a free grenade. Killing an enemy while the Digi-Clone is active gives the Digi-Clone a chance to throw a grenade.\",\n ranks: 1,\n effect: (rank, level) => `Grenade Chance: 30%`,\n },\n \"Duct Tape Mod\": {\n text: \"The first shot fired from Zane's gun has a chance to also fire a grenade. This skill has a short cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Grenade Chance: ${percent(rank, 4)}%, Cooldown: 8 seconds`,\n },\n },\n \"3\": {\n \"Schadenfreude\": {\n text: \"Whenever the Digi-Clone takes damage, Zane's shield is restored by a portion of that damage.\",\n ranks: 0,\n effect: (rank, level) => `Shields Restored: +100% of damage taken by Digi-Clone`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Quick Breather\": {\n text: \"Whenever Zane swaps places with his Digi-Clone, his shield immediately begins recharging. The Digi-Clone also immediately restores health.\",\n ranks: 1,\n effect: (rank, level) => `Digi-Clone Heal: Up to 50% of Digi-Clone's Maximum Health`,\n },\n \"Which One's Real?\": {\n text: \"Enemies are more likely to target the Digi-Clone for a few seconds after it's summoned and after swapping places.\",\n ranks: 0,\n effect: (rank, level) => `Duration: 4 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Dopplebanger\": {\n text: \"Hold down [Action Skill key] to end the action skill early. When Zane's Action Skill is ended, the Digi-Clone explodes, dealing Splash Damage to all nearby enemies. The more Action Skill time remaining, the greater the damage.\",\n ranks: 0,\n effect: (rank, level) => `Damage: Up to ${flat(rank, level, 280)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Pocket Full of Grenades\": {\n text: \"Kill Skill. After killing an enemy, Zane gains Grenade Regeneration for a few seconds.\",\n ranks: 3,\n effect: (rank, level) => `Grenade Regeneration: ${percent(rank, 5)}% per second, Duration: 8 seconds`,\n },\n \"Old-U\": {\n text: \"Press [Action Skill key] during Fight for Your Life if Digi-Clone is active to destroy the Digi-Clone and immediately gain a Second Wind with full health.\",\n ranks: 1,\n effect: (rank, level) => `Health Restored: 100% of Maximum Health`,\n },\n \"Supersonic Man\": {\n text: \"Zane gains increased Movement Speed for each active Action Skill.\",\n ranks: 3,\n effect: (rank, level) => `Movement Speed: +${percent(rank, 4)}% per active Action Skill`,\n },\n \"Digital Distribution\": {\n text: \"If Zane takes health damage while the Digi-Clone is active, a portion of that damage is inflicted on his Digi-Clone instead.\",\n ranks: 0,\n effect: (rank, level) => `Shared Health Damage: +75%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Like a Ghost\": {\n text: \"Zane and his Digi-Clone gain a chance to ignore bullets. This chance is increased for a few seconds after activating an Action Skill. This effect stacks.\",\n ranks: 3,\n effect: (rank, level) => `Ignore Bullet Chance: +${percent(rank, 2)}%, Additional Ignore Bullet Chance: +${percent(rank, 3)}%, Duration: 8 seconds`,\n },\n \"Boom. Enhance.\": {\n text: \"Whenever Zane summons his Digi-Clone, it consumes up to 3 grenades. For every grenade consumed, the Digi-Clone gains increased Gun Damage, Maximum Health, Fire Rate, Reload Speed, and Digi-Clone Duration.\",\n ranks: 1,\n effect: (rank, level) => `Digi-Clone Gun Damage: +20% per grenade, Digi-Clone Maximum Health: +81% per grenade, Digi-Clone Fire Rate: +5% per grenade, Digi-Clone Reload Speed: +31% per grenade, Digi-Clone Duration: +25% per grenade`,\n },\n \"Trick of the Light\": {\n text: \"Zane deals Bonus Cryo Damage to enemies that aren't targeting him.\",\n ranks: 3,\n effect: (rank, level) => `Bonus Cryo Damage: +${percent(rank, 12)}% of damage dealt`,\n },\n },\n \"6\": {\n \"Double Barrel\": {\n text: \"The Digi-Clone is equipped with a copy of Zane's Current Weapon when activated. Swapping places with the Digi-Clone causes Zane and his Digi-Clone to gain increased Gun Damage.\",\n ranks: 1,\n effect: (rank, level) => `Item Duping: +100%, Gun Damage: +25%`,\n },\n },\n },\n};\n\nexport default skills;\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/bundle.eb121f75.js b/bundle.eb121f75.js
new file mode 100644
index 0000000..dbd6f8b
--- /dev/null
+++ b/bundle.eb121f75.js
@@ -0,0 +1,2 @@
+!function(e){function t(n){if(a[n])return a[n].exports;var r=a[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var a={};t.m=e,t.c=a,t.d=function(e,a,n){t.o(e,a)||Object.defineProperty(e,a,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,a){if(1&a&&(e=t(e)),8&a)return e;if(4&a&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&a&&"string"!=typeof e)for(var r in e)t.d(n,r,function(t){return e[t]}.bind(null,r));return n},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="/",t(t.s=0)}({"/Yqc":function(e,t){function a(){return"serviceWorker"in navigator&&("https:"===window.location.protocol||"localhost"===window.location.hostname||0===window.location.hostname.indexOf("127."))}t.install=function(e){if(e||(e={}),a()){var t=navigator.serviceWorker.register("/sw.js",{}),n=function(e){function t(){switch(s.state){case"redundant":r("onUpdateFailed"),s.onstatechange=null;break;case"installing":n||r("onUpdating");break;case"installed":i||r("onUpdateReady");break;case"activated":r("onUpdated"),s.onstatechange=null}}function a(){switch(s.state){case"redundant":s.onstatechange=null;break;case"installing":case"installed":break;case"activated":r("onInstalled"),s.onstatechange=null}}var n,i,o,s=e.installing||e.waiting;s&&!s.onstatechange&&(e.active?(t(),o=t):(a(),o=a),n=!0,e.waiting&&(i=!0),s.onstatechange=o)},r=function(t){"function"==typeof e[t]&&e[t]({source:"ServiceWorker"})};t.then(function(e){e&&(n(e),e.onupdatefound=function(){n(e)})}).catch(function(e){return r("onError"),Promise.reject(e)})}},t.applyUpdate=function(e,t){a()&&navigator.serviceWorker.getRegistration().then(function(a){a&&a.waiting?(a.waiting.postMessage({action:"skipWaiting"}),e&&e()):t&&t()})},t.update=function(){a()&&navigator.serviceWorker.getRegistration().then(function(e){if(e)return e.update()})}},0:function(e,t,a){e.exports=a("QfWi")},"31cR":function(e){e.exports={skill:"_3JH8h",enabled:"_1mLSi",usable:"_1xemn",augment:"_3VkFk",actionSkill:"-z8wv",chevron:"_2t_-G",diamond:"_2ej0d",image:"_8ejWg",ranks:"_3DD7O",skillTitle:"_394yV",description:"_1S9-f",effect:"oiyDq"}},"9fQE":function(e,t,a){"use strict";(function(e){function n(t){var a=t.path;return e("nav",null,[{name:"Zane",path:"/operative"},{name:"Amara",path:"/siren"},{name:"FL4K",path:"/beastmaster"},{name:"Moze",path:"/gunner"}].map(function(t){return a===t.path?null:e(r.a,{href:t.path},t.name)}))}a.d(t,"a",function(){return n});var r=a("Y3FI")}).call(this,a("gDde").h)},"Et/u":function(e,t,a){"use strict";function n(e,t){return Math.round(e*t*10)/10}function r(e,t,a){return Math.floor(e*a)}var i=a("LMbI");t.a={Brawl:{0:{Phaseslam:{text:"Amara leaps into the air and Slams the ground, dealing damage to all nearby enemies and knocking them up.",effect:function(e){return"Damage: "+r(e,0,98)+" (increases with character level), Cooldown: 35 Seconds"},type:i.a.ACTION_SKILL,ranks:0}},1:{"Root to Rise":{ranks:5,text:"Amara gains inceased Maximum Health.",effect:function(e){return"Maximum Health: +"+n(e,8)+"%"}},"Personal Space":{ranks:3,text:"Amara's weapon shots deal Bonus Damage based on the distance to her target. The closer the target, the greater the bonus.",effect:function(e){return"Bonus Damage: Up to +"+n(e,18)+"% of damage dealt"}},Clarity:{ranks:5,text:"Amara constantly regenerates health. The lower her health, the more powerful the regeneration. After using an Action Skill, this bonus is doubled for a few seconds.",effect:function(e){return"Health Regeneration: Up to +"+n(e,1)+"% of Missing Health per second, Duration: 5 seconds"}}},2:{"Arms Deal":{ranks:5,text:"Amara deals increased Splash Damage and takes reduced Splash Damage.",effect:function(e){return"Splash Damage: +"+n(e,4)+"%, Splash Damage Reduction +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%"}},Samsara:{ranks:3,text:"Whenever Amara deals damage to an enemy with her Action Skill, she adds a stack of Samsara. For every stack of Samsara, Amara gains increased Gun Damage and Health Regeneration for a few seconds. Stacks decay after a few seconds.",effect:function(e){return"Gun Damage: +"+n(e,1.7)+"% per stack, Health Regeneration: +"+n(e,1.7)+"% of Missing Health per second per stack, Maximum Samara Stacks: 5, Duration: 20 seconds"}},"Helping Hand(s)":{ranks:5,text:"For a few seconds after using her Action Skill, Amara's arms remain active and grant her Damage Reduction.",effect:function(e){return"Damage Reduction: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%, Duration: 15 seconds"}},"Blight Tiger":{ranks:0,text:"Converts Amara's Action Skill to Corrosive Damage.",effect:function(){return"Converts to Corrossive Damage"},type:i.a.AUGMENT_DIAMOND}},3:{Fracture:{ranks:0,text:"Amara summons a line of fists that erupt from the ground, dealing damage to enemies in front of Amara.",effect:function(e){return"Damage: "+r(e,0,88)+" (increases with character level), Cooldown: 28 sec"},type:i.a.AUGMENT_ACTION_SKILL},Mindfulness:{ranks:3,text:"Whenenever Amara takes damage, she gains a stack of Mindfulness. For every stack of Mindfulness, Amara gains improved Shield Regeneration Delay and Movement Speed. Stacks decay after a few seconds.",effect:function(e){return"Shield Regeneration Delay: -"+function(e){switch(e){case 1:return 9;case 2:return 17;case 3:return 23;default:return 0}}(e)+"% per Mindfulness stack, Movement Speed: +"+n(e,1.4)+"% per Mindfulness stack, Maximum Mindfulness Stacks: 25, Duration: 5 seconds"}},"Find Your Center":{ranks:1,text:"Amara gains increased Melee Damage. Additionally, for a few seconds after using her Action Skill, Amara gains increased Melee Range.",effect:function(){return"Melee Damage: +100%, Melee Range: +75%, Duration: 20 seconds"}},Vigor:{ranks:3,text:"Kill Skill. Killing an enemy with Amara's Action Skill grants all allies increased Movement Speed for a few seconds.",effect:function(e){return"Team Movement Speed: +"+n(e,3.333)+"%, Duration: 8 seconds"}},Revelation:{ranks:0,text:"Amara's Action Skill now creates a Nova when it damages enemies, dealing damage to all nearby enemies.",effect:function(e){return"Nova Damage: "+r(e,0,41)+" (increases with character level), Action Skill Damage: -15%"},type:i.a.AUGMENT_CHEVRON}},4:{Downfall:{ranks:0,text:"Amara leaps into the air and shoots an Elemental Beam below her, followed by a Slam.",effect:function(e){return"Beam Damage: "+r(e,0,14)+" per second (increases with character level), Slam Damage: "+r(e,0,95)+" (increases with character level), Cooldown: 47 seconds"},type:i.a.AUGMENT_ACTION_SKILL},"One With Nature":{ranks:5,text:"Amara gains increased Maximum Health and Elemental Damage Resistance to her Action Skill Element.",effect:function(e){return"Maximum Health: +"+n(e,5)+"%, Elemental Damage Reduction: +"+function(e){switch(e){case 1:return 12;case 2:return 21;case 3:return 28;case 4:return 35;case 5:return 40;default:return 0}}(e)+"%"}}},5:{"Do Unto Others":{ranks:1,text:"Whenever an emey damages Amara, she automatically throws an energy orb back at them, dealing Action Skill Elemental Damage. This skill has a short cooldown.",effect:function(){return"Cooldown: 8 seconds"}},"Jab Cross":{ranks:5,text:"Whenever Amara deals melee damage to an enemy, she gains increased Action Skill Damage and increased Gun Damage for a few seconds.",effect:function(e){return"Gun Damage: +"+n(e,3)+"%, Action Skill Damage: +"+n(e,15)+"%, Duration: 10 seconds"}},"Guardian Angel":{ranks:1,text:"When Amara enters Fight For Your Life, she immediately gains a Second Wind, restores her health, and creates an Action Skill Elemental Nova that may knock back nearby enemies. This skill has a long cooldown.",effect:function(){return"Maximum Health Restored: 50% of Maximum Health, Cooldown: 120 seconds"}},Glamour:{ranks:0,text:"Enemies damaged by Amara's Action Skill become confused and temporarily attack their allies. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are confused as well.",effect:function(){return"Confuse Duration: 8 seconds, Action Skill Cooldown: +20%, Action Skill Damage: -10%"},type:i.a.AUGMENT_CHEVRON}},6:{Blitz:{ranks:1,text:"Melee Override. Press [Melee key] while aiming at an enemy to make Amara dash a short distance forward and perform a special melee strike, dealing Elemental Melee Damage. If a Blitz melee attack kills an enemy, Blitz's cooldown is immediately reset.",effect:function(){return"Melee Damage: +100%, Cooldown: 8 seconds"}}}},"Mystical Assault":{0:{Phasecast:{text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path.",effect:function(e){return"Damage: "+r(e,0,92)+", Cooldown: 28 Seconds"},type:i.a.ACTION_SKILL,ranks:0}},1:{"Do Harm":{ranks:5,text:"Killing an enemy grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Action Skill Damage is temporarily increased.",effect:function(e){return"Maximum Rush Stacks: 10, Action Skill Damage: +"+n(e,.9)+"% per Rush stack consumed, Duration: 20 seconds"}},"Fast Hand(s)":{ranks:3,text:"Amara's Reload Speed, Weapon Swap Speed, and Mode Switch Speed are improved.",effect:function(e){return"Reload Speed: +"+function(e){switch(e){case 1:return 7;case 2:return 14;case 3:return 19;default:return 0}}(e)+"%, Weapon Swap Speed: +"+function(e){switch(e){case 1:return 16;case 2:return 28;case 3:return 36;default:return 0}}(e)+"%, Mode Switch Speed: +"+function(e){switch(e){case 1:return 16;case 2:return 28;case 3:return 36;default:return 0}}(e)+"%"}},"Violent Tapestry":{ranks:5,text:"Applying a Status Effect grants Amara a stack of Rush. For every stack of Rush consumed, Amara's Status Effect Chance is temporarily increased.",effect:function(e){return"Maximum Rush Stacks: 10, Status Effect Chance: +"+n(e,.6)+"% per Rush stack consumed, Duration: 20 seconds"}}},2:{Alacrity:{ranks:5,text:"Amara gains increased Reload Speed for every stack of Rush. After consuming Rush stacks, this bonus is increased for a few seconds.",effect:function(e){return"Reload Speed: +"+n(e,.4)+"% per Rush stack, Reload Speed: +"+function(e){switch(e){case 1:return.6;case 2:return 1.2;case 3:return 1.8;case 4:return 2.3;case 5:return 2.9;default:return 0}}(e)+"% per Rush stack consumed, Duration: 8 seconds"}},Transcend:{ranks:3,text:"Amara gains increased Accuracy and Critical Hit Damage for a few seconds after activating her Action Skill.",effect:function(e){return"Accuracy: +"+function(e){switch(e){case 1:return 17;case 2:return 29;case 3:return 38;default:return 0}}(e)+"%, Critical Hit Damage: +"+n(e,9)+"%, Duration: 12 seconds"}},Restless:{ranks:5,text:"Amara gains increased Action Skill Cooldown Rate.",effect:function(e){return"Action Skill Cooldown Rate: +"+n(e,5)+"%"}},"Soul Sap":{ranks:0,text:"A portion of all damage dealt by Amara's Action Skill is returned to her or a nearby ally as health.",effect:function(){return"Life Steal: 30% of Action Skill damage dealt"},type:i.a.AUGMENT_CHEVRON}},3:{Deliverance:{ranks:0,text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Whenever Amara's Astral Projection damages an enemy or object, it releases homing Elemental Projectiles that trigger her Action Skill Elemental Effect on enemies.",effect:function(e){return"Damage: "+r(e,0,86)+" (increases with character level), Elemental Projectiles: 3 per enemy or object hit, Cooldown: 28 seconds"},type:i.a.AUGMENT_ACTION_SKILL},Ascendant:{ranks:1,text:"All Action Skill Augments gain increased effects.",effect:function(){return"Soul Sap Life Steal: +20%, Allure Radius: +100%, Glamour Duration: +50%, Stillness of Mind: Breaks 0.75 seconds after being damaged, Revelation Damage: +25%"}},"Stillness of Mind":{ranks:0,text:"Enemies damaged by Amara's Action Skill become phaselocked until they are damaged or the duration ends. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are also phaselocked.",effect:function(){return"Phaselock Duration: 6 seconds, Action Skill Damage: -25%, Action Skill Cooldown: +15%"},type:i.a.AUGMENT_CHEVRON}},4:{Reverberation:{ranks:0,text:"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Astra Projection deals increased damage for every enemy it hits.",effect:function(e){return"Damage: "+r(e,0,88)+" (increases with character level), Damage Bonus: +50% per enemy hit, Cooldown: 30 seconds"},type:i.a.AUGMENT_ACTION_SKILL},"From Rest":{ranks:3,text:"Amara gains improved Fire Rate and Charge Time.",effect:function(e){return"Fire Rate: +"+n(e,4)+"%, Charge Time: +"+function(e){switch(e){case 1:return 21;case 2:return 34;case 3:return 44;default:return 0}}(e)+"%"}},"Laid Bare":{ranks:3,text:"Enemies take increased damage from all sources for a few seconds after being damaged by Amara's Action Skill.",effect:function(e){return"Damage Increase: +"+n(e,8.333)+"%, Duration: 8 seconds"}},Wrath:{ranks:3,text:"Amara gains increased Gun Damage. This effect is increased after she activates her action skill for a few seconds.",effect:function(e){return"Gun Damage: +"+function(e){switch(e){case 1:return 6.7;case 2:return 13.3;case 3:return 20;default:return 0}}(e)+"%, Gun Damage: +"+function(e){switch(e){case 1:return 6.7;case 2:return 13.3;case 3:return 20;default:return 0}}(e)+"% after Action Skill use, Duration: 8 seconds"}}},5:{Remnant:{ranks:3,text:"When Amara kills an enemy with a Gun or Action Skill, she creates a homing projectile that seeks out a new enemy dealing her Action Skill Elemental Damage. Any Overkill Damage is added to the projectile's damage.",effect:function(e){return"Remnant Base Damage: "+r(e,0,9)+" (increases with character level)"}},Awakening:{ranks:3,text:"Amara's Rush stacks gain increased effectiveness.",effect:function(e){return"Rush Stack Effectiveness: +"+n(e,10)+"%"}},Tandava:{ranks:0,text:"Amara sends forward an Astral Projection of herself. When it hits a target, it explodes, damaging all nearby enemies.",effect:function(e){return"Damage: "+r(e,0,91)+" (increases with character level), Cooldown: 35 seconds"},type:i.a.AUGMENT_ACTION_SKILL}},6:{Avatar:{ranks:1,text:"Amara's Action Skill can be activated while it's cooling down. This skill may only be used once per completed cooldown. Additionally, increases Amara's Maximum Rush Stacks. Additionally, if Amara's Action Skill kills an enemy, it refunds half of her Rush stacks.",effect:function(){return"Maximum Rush Stacks: +10"}}}},"Fist of the Elements":{0:{Phasegrasp:{text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Some enemies are immune to being Grasped and instantly take damage instead.",effect:function(e){return"Skill Duration: 7 sec, Cooldown: 16 seconds, Grasp Immune Damage: "+r(e,0,28)+" (increases with character level)"},type:i.a.ACTION_SKILL,ranks:0}},1:{Anima:{ranks:5,text:"Amara's Status Effects deal increased damage over time and have increased duration. Her Action Skill Status Effect deals further increased damage.",effect:function(e){return"Action Skill Status Effect Damage: +"+n(e,8)+"%, Status Effect Damage: +"+n(e,4)+"%, Status Effect Duration: +"+n(e,20)+"%"}},"Steady Hands":{ranks:3,text:"Amara gains increased Weapon Handling and Accuracy.",effect:function(e){return"Handling: +"+function(e){switch(e){case 1:return 14;case 2:return 24;case 3:return 32;default:return 0}}(e)+"%, Accuracy: +"+function(e){switch(e){case 1:return 13;case 2:return 23;case 3:return 31;default:return 0}}(e)+"%"}},Infusion:{ranks:5,text:"Convert a portion of damage dealt by Amara's weapons into her Action Skill Element.",effect:function(e){return"Converted Damage: "+n(e,8)+"%"}}},2:{Tempest:{ranks:5,text:"Amara deals increased Elemental Damage. Shock Damage is further increased.",effect:function(e){return"Elemental Damage: +"+n(e,6)+"%, Shock Damage: +"+n(e,2)+"%"}},"Illuminated Fist":{ranks:1,text:"Amara gains increased Melee Damage and her Melee Damage is converted to Action Skill Element.",effect:function(){return"Melee Damage: +75%"}},Wildfire:{ranks:5,text:"Whenever Amara applies a Status Effect to an enemy, it has a chance to spread to a nearby enemy.",effect:function(e){return"Spread Chance: +"+n(e,8)+"%"}},Soulfire:{ranks:0,text:"Converts Amara's Action Skill to Incendiary Damage.",effect:function(){return"Converts to Incendiary Damage"},type:i.a.AUGMENT_DIAMOND}},3:{"The Eternal Fist":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Whenever the Grasped enemy is killed, a new fist seeks out and Grasps a new target.",effect:function(e){return"Bonus Targets: Up to +4, Duration: 7 seconds, Cooldown: 20 seconds, Grasp Immune Damage: "+r(e,0,28)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL},Dread:{ranks:1,text:"Amara's Gun Damage is increased for a few seconds after an enemy is Grasped. Whenever any player kills a Grasped enemy, their current weapon is instantly reloaded.",effect:function(){return"Gun Damage: +15%, Duration: 8 seconds"}},Allure:{ranks:0,text:"Amara's Action Skill creates a singularity that pull in enemies.",effect:function(){return"Action Skill Damage: -20%, Duration: 2.5 seconds"},type:i.a.AUGMENT_CHEVRON}},4:{Indiscriminate:{ranks:3,text:"Amara's bullets that damage enemies have a chance to ricochet and deal decreased damage to other nearby enemies. Richochet Chance and Damage are increased if target is affected by Phasegrasp or Stillness of Mind.",effect:function(e){return"Ricochet Chance: +"+n(e,10)+"%, Ricochet Damage: -50%, Action Skill Ricochet Chance: +"+n(e,20)+"%, Action Skill Ricochet Damage: -25%"}},"Deep Well":{ranks:1,text:"Amara gains increased Magazine Size with elemental weapons.",effect:function(){return"Magazine Size: +20%"}},Catharsis:{ranks:3,text:"Whenever Amara riggers an elemental effect on an enemy, when that enemy that dies the enemy explodes, dealing her attuned element damage along with any other element that is currently inflicted upon that enemy. This skill has a short cooldown.",effect:function(e){return"Damage: "+r(e,0,4)+" (increases with character level), Cooldown: 8 seconds"}},"Ties That Bind":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Enemies near the Grasped target are linked, and any damage dealt to a linked target is shared between all other linked targets.",effect:function(e){return"Link Damage: 35% of damage dealt, Duration: 7 seconds, Cooldown: 18 seconds, Grasp Immune Damage: "+r(e,0,34)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL}},5:{"Fist Over Matter":{ranks:0,text:"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. After Grasping the targeted enemy, large fists appear and constantly smash the area, dealing damage to nearby enemies.",effect:function(e){return"Damage "+r(e,0,35)+" (increases with character level), Duration: 7 seconds, Cooldown: 28 seconds, Grasp Immune Damage "+r(e,0,39)+" (increases with character level)"},type:i.a.AUGMENT_ACTION_SKILL},Sustainment:{ranks:5,text:"Amara gains Life Steal whenever she deals Elemental Damage with her weapon.",effect:function(e){return"Life Steal: +"+n(e,4)+"% of damage dealt"}},Conflux:{ranks:5,text:"Whenever Amara applies a Status Effect to an enemy, she gains a chance to randomly Electrocute, Ignite, or Melt that enemy.",effect:function(e){return"Extra Effect Chance: +"+n(e,7)+"%"}}},6:{"Forceful Expression":{ranks:1,text:"Amara's guns deal Bonus Elemental Damage based on her Action Skill Element.",effect:function(){return"Bonus Elemental Damage: +18% of damage dealt"}}}}}},Fl18:function(e,t,a){"use strict";(function(e){var n=a("laFY"),r=a.n(n),i=e("span",null,e("a",{href:"https://borderlands.com/"},"Official Borderlands website")," - ",e("a",{href:"https://github.com/seigler/bl3skills.com"},"Source Code")," - ",e("a",{href:"https://github.com/seigler/bl3skills.com/labels/bug"},e("img",{alt:"GitHub issues: bugs",src:"https://img.shields.io/github/issues-raw/seigler/bl3skills.com/bug"}))," ",e("a",{href:"https://github.com/seigler/bl3skills.com/labels/enhancement"},e("img",{alt:"GitHub issues: enhancements",src:"https://img.shields.io/github/issues-raw/seigler/bl3skills.com/enhancement"}))," ",e("img",{alt:"GitHub contributors",src:"https://img.shields.io/github/contributors/seigler/bl3skills.com"}));t.a=function(){return e("footer",{class:r.a.footer},i)}}).call(this,a("gDde").h)},G9Up:function(e,t,a){"use strict";(function(e){var n=a("Y3FI"),r=a("NZ6x"),i=a("cY+X"),o=a("rFP/"),s=a("x3c/"),c=a("cQx2"),l=e(n.b,null,e(r.a,{path:"/"}),e(i.a,{path:"/operative"}),e(o.a,{path:"/siren"}),e(s.a,{path:"/beastmaster"}),e(c.a,{path:"/gunner"}));t.a=function(){return l}}).call(this,a("gDde").h)},J3pd:function(e,t,a){"use strict";(function(e){function n(){return(n=Object.assign||function(e){for(var t=1;t=5*s-5,level:Object(d.a)(a.state),image:"../../assets/hunters/"+g+"/"+r+s+l+".png",onChange:y(c,r,t,s)}))}))})))}),D=Object(d.a)(this.state);return e("div",null,e("div",{class:h.a.header},e("h1",{class:h.a.title},c,e("div",{class:h.a.subtitle},"the ",g)),e("div",{class:h.a.sidepanel},e("div",{class:h.a.level+" "+(D>50?D>61?h.a.overlevelB:h.a.overlevelA:"")},"Level ",D),e("div",{class:h.a.reset},e("a",{onClick:function(){Object(l.b)(k),a.setState({invested:[0,0,0],skills:k||{}})}},"Reset"))),e(s.a,{path:p})),e("main",null,e("div",{class:h.a.VaultHunter,onContextMenu:r},e("div",{class:h.a.trees},v))),m)},a}(i.Component)}).call(this,a("gDde").h)},LMbI:function(e,t){"use strict";t.a={ACTION_SKILL:1,AUGMENT_CHEVRON:2,AUGMENT_DIAMOND:3,AUGMENT_ACTION_SKILL:4}},MKmk:function(e){e.exports={VaultHunter:"_2zgqJ",header:"_1Jomm",title:"_17kLY",subtitle:"_3J3hw",sidepanel:"_2UO55",level:"xH9ts",reset:"K9CBr",overlevelA:"_1LE8c",overlevelB:"_1vOfn",trees:"_3ek45",tier:"_3Ch4X",treeName:"_1WAM2",tree:"gRWZY",skills:"_2Su0b",green:"-Pl7G",blue:"_1nm1I",red:"_3T1pZ"}},NZ6x:function(e,t,a){"use strict";(function(e){var n=a("Y3FI"),r=a("Fl18"),i=a("odKX"),o=a.n(i),s=e(r.a,null);t.a=function(){return e("div",null,e("div",{class:o.a.splash},e("div",{class:o.a.wrapper},e("h1",null,e("div",{class:o.a.disclaimer},"(Unofficial)"),"Borderlands 3 skill calculator"),[{name:"Zane",job:"the Operative",path:"/operative"},{name:"Amara",job:"the Siren",path:"/siren"},{name:"FL4K",job:"the Beastmaster",path:"/beastmaster"},{name:"Moze",job:"the Gunner",path:"/gunner"}].map(function(t){return e(n.a,{class:o.a.link,href:t.path},e("div",{class:o.a.name},t.name,e("div",{class:o.a.job},t.job)))}))),s)}}).call(this,a("gDde").h)},QfWi:function(e,t,a){"use strict";a.r(t);var n=a("gDde"),r=a("G9Up"),i=(a("pyAK"),document.querySelector("#app"));Object(n.render)(Object(n.h)(r.a,null),i,i.firstElementChild);a("/Yqc").install()},Y3FI:function(e,t,a){"use strict";function n(e,t){for(var a in t)e[a]=t[a];return e}function r(e,t){return e.rankt.rank?-1:e.index-t.index}function i(e,t){return e.index=t,e.rank=function(e){return e.attributes.default?0:(t=e.attributes.path,o(t).map(s).join(""));var t}(e),e.attributes}function o(e){return e.replace(/(^\/+|\/+$)/g,"").split("/")}function s(e){return":"==e.charAt(0)?1+"*+?".indexOf(e.charAt(e.length-1))||4:5}function c(){var e;return""+((e=k&&k.location?k.location:k&&k.getCurrentLocation?k.getCurrentLocation():"undefined"!=typeof location?location:D).pathname||"")+(e.search||"")}function l(e,t){return void 0===t&&(t=!1),"string"!=typeof e&&e.url&&(t=e.replace,e=e.url),function(e){for(var t=y.length;t--;)if(y[t].canRoute(e))return!0;return!1}(e)&&function(e,t){void 0===t&&(t="push"),k&&k[t]?k[t](e):"undefined"!=typeof history&&history[t+"State"]&&history[t+"State"](null,null,e)}(e,t?"replace":"push"),u(e)}function u(e){for(var t=!1,a=0;a0},t.prototype.routeTo=function(e){return this._didRoute=!1,this.setState({url:e}),this.updating?this.canRoute(e):(this.forceUpdate(),this._didRoute)},t.prototype.componentWillMount=function(){y.push(this),this.updating=!0},t.prototype.componentDidMount=function(){var e=this;k&&(this.unlisten=k.listen(function(t){e.routeTo(""+(t.pathname||"")+(t.search||""))})),this.updating=!1},t.prototype.componentWillUnmount=function(){"function"==typeof this.unlisten&&this.unlisten(),y.splice(y.indexOf(this),1)},t.prototype.componentWillUpdate=function(){this.updating=!0},t.prototype.componentDidUpdate=function(){this.updating=!1},t.prototype.getMatchingChildren=function(e,t,a){return e.filter(i).sort(r).map(function(e){var r=function(e,t,a){var n,r=/(?:\?([^#]*))?(#.*)?$/,i=e.match(r),s={};if(i&&i[1])for(var c=i[1].split("&"),l=0;l2;)R.push(arguments[i]);for(t&&null!=t.children&&(R.length||R.push(t.children),delete t.children);R.length;)if((n=R.pop())&&void 0!==n.pop)for(i=n.length;i--;)R.push(n[i]);else"boolean"==typeof n&&(n=null),(r="function"!=typeof e)&&(null==n?n="":"number"==typeof n?n+="":"string"!=typeof n&&(r=!1)),r&&a?o[o.length-1]+=n:o===_?o=[n]:o.push(n),a=r;var s=new C;return s.nodeName=e,s.children=o,s.attributes=null==t?void 0:t,s.key=null==t?void 0:t.key,void 0!==M.vnode&&M.vnode(s),s}function a(e,t){for(var a in t)e[a]=t[a];return e}function n(e,t){null!=e&&("function"==typeof e?e(t):e.current=t)}function r(e){!e.__d&&(e.__d=!0)&&1==E.push(e)&&(M.debounceRendering||F)(i)}function i(){for(var e;e=E.pop();)e.__d&&A(e)}function o(e,t,a){return"string"==typeof t||"number"==typeof t?void 0!==e.splitText:"string"==typeof t.nodeName?!e._componentConstructor&&s(e,t.nodeName):a||e._componentConstructor===t.nodeName}function s(e,t){return e.__n===t||e.nodeName.toLowerCase()===t.toLowerCase()}function c(e){var t=a({},e.attributes);t.children=e.children;var n=e.nodeName.defaultProps;if(void 0!==n)for(var r in n)void 0===t[r]&&(t[r]=n[r]);return t}function l(e){var t=e.parentNode;t&&t.removeChild(e)}function u(e,t,a,r,i){if("className"===t&&(t="class"),"key"===t);else if("ref"===t)n(a,null),n(r,e);else if("class"!==t||i)if("style"===t){if(r&&"string"!=typeof r&&"string"!=typeof a||(e.style.cssText=r||""),r&&"object"==typeof r){if("string"!=typeof a)for(var o in a)o in r||(e.style[o]="");for(var o in r)e.style[o]="number"==typeof r[o]&&!1===N.test(o)?r[o]+"px":r[o]}}else if("dangerouslySetInnerHTML"===t)r&&(e.innerHTML=r.__html||"");else if("o"==t[0]&&"n"==t[1]){var s=t!==(t=t.replace(/Capture$/,""));t=t.toLowerCase().substring(2),r?a||e.addEventListener(t,d,s):e.removeEventListener(t,d,s),(e.__l||(e.__l={}))[t]=r}else if("list"!==t&&"type"!==t&&!i&&t in e){try{e[t]=null==r?"":r}catch(e){}null!=r&&!1!==r||"spellcheck"==t||e.removeAttribute(t)}else{var c=i&&t!==(t=t.replace(/^xlink:?/,""));null==r||!1===r?c?e.removeAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase()):e.removeAttribute(t):"function"!=typeof r&&(c?e.setAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase(),r):e.setAttribute(t,r))}else e.className=r||""}function d(e){return this.__l[e.type](M.event&&M.event(e)||e)}function f(){for(var e;e=T.shift();)M.afterMount&&M.afterMount(e),e.componentDidMount&&e.componentDidMount()}function h(e,t,a,n,r,i){H++||(L=null!=r&&void 0!==r.ownerSVGElement,G=null!=e&&!("__preactattr_"in e));var o=m(e,t,a,n,i);return r&&o.parentNode!==r&&r.appendChild(o),--H||(G=!1,i||f()),o}function m(e,t,a,n,r){var i=e,o=L;if(null!=t&&"boolean"!=typeof t||(t=""),"string"==typeof t||"number"==typeof t)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=t&&(e.nodeValue=t):(i=document.createTextNode(t),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),p(e,!0))),i.__preactattr_=!0,i;var c=t.nodeName;if("function"==typeof c)return w(e,t,a,n);if(L="svg"===c||"foreignObject"!==c&&L,c+="",(!e||!s(e,c))&&(i=function(e,t){var a=t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e);return a.__n=e,a}(c,L),e)){for(;e.firstChild;)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),p(e,!0)}var l=i.firstChild,u=i.__preactattr_,d=t.children;if(null==u){u=i.__preactattr_={};for(var f=i.attributes,h=f.length;h--;)u[f[h].name]=f[h].value}return!G&&d&&1===d.length&&"string"==typeof d[0]&&null!=l&&void 0!==l.splitText&&null==l.nextSibling?l.nodeValue!=d[0]&&(l.nodeValue=d[0]):(d&&d.length||null!=l)&&g(i,d,a,n,G||null!=u.dangerouslySetInnerHTML),y(i,t.attributes,u),L=o,i}function g(e,t,a,n,r){var i,s,c,u,d,f=e.childNodes,h=[],g={},k=0,y=0,v=f.length,D=0,S=t?t.length:0;if(0!==v)for(var A=0;A2?[].slice.call(arguments,2):e.children)},createRef:function(){return{}},Component:x,render:function(e,t,a){return h(a,e,{},!1,t,!1)},rerender:i,options:M}}()},gqmc:function(e,t,a){"use strict";function n(e){for(var t=0,a=[0,0,0],n=0,r=0,i=Object.values(e);rh.ranks)return!1;u+=h.invested||0}if(u>0&&o+5<5*s)return!1;o+=u,s+=1}a[n]=o,t+=o,n+=1}return!(t>69)&&a}function r(e){for(var t=1;t0)?s.a.usable:""].join(" "),onClick:a,onContextMenu:a},e("div",{class:s.a.image},e("img",{src:x,alt:n(o)})),w&&h>0&&e("div",{class:s.a.ranks},g,"/",h),e("div",{class:s.a.description},e("h3",{class:s.a.skillTitle},o),d,g>0&&e("div",{class:s.a.effect},"Current Effect:",c,v(g,k)),null!==S&&e("div",{class:s.a.effect},v(1,k)),null==S&&g\n {\n pages.map(page => (\n path === page.path ? null : {page.name}\n ))\n }\n \n );\n}\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\nfunction flat (rank, level, unit) {\n return Math.floor(rank * unit);\n}\n\n// Arms Deal Splash Damage Reduction\nfunction getArmsDealSplashDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Helping Hand(s) Damage Reduction\nfunction getHelpingHandsDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Mindfulness Shield Regeneration Delay\nfunction getMindfulnessShieldRegenerationDelay(rank) {\n switch (rank) {\n case 1:\n return 9;\n case 2:\n return 17;\n case 3:\n return 23;\n default:\n return 0;\n }\n}\n\n// One With Nature Elemental Damage Reduction\nfunction getOneWithNatureElementalDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 12;\n case 2:\n return 21;\n case 3:\n return 28;\n case 4:\n return 35;\n case 5:\n return 40;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Reload Speed\nfunction getFastHandsReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 7;\n case 2:\n return 14;\n case 3:\n return 19;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Weapon Swap Speed\nfunction getFastHandsWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 28;\n case 3:\n return 36;\n default:\n return 0;\n }\n}\n\n// Fast Hand(s) Mode Switch Speed\nfunction getFastHandsModeSwitchSpeed(rank) {\n switch (rank) {\n case 1:\n return 16;\n case 2:\n return 28;\n case 3:\n return 36;\n default:\n return 0;\n }\n}\n\n// Alacrity Reload Speed After Action Skill\nfunction getAlacrityReloadSpeedAfterActionSkill(rank) {\n switch (rank) {\n case 1:\n return 0.6;\n case 2:\n return 1.2;\n case 3:\n return 1.8;\n case 4:\n return 2.3;\n case 5:\n return 2.9;\n default:\n return 0;\n }\n}\n\n// Transcend Accuracy\nfunction getTranscendAccuracy(rank) {\n switch (rank) {\n case 1:\n return 17;\n case 2:\n return 29;\n case 3:\n return 38;\n default:\n return 0;\n }\n}\n\n// From Rest Charge Time\nfunction getFromRestChargeTime(rank) {\n switch (rank) {\n case 1:\n return 21;\n case 2:\n return 34;\n case 3:\n return 44;\n default:\n return 0;\n }\n}\n\n// Wrath Gun Damage\nfunction getWrathGunDamage(rank) {\n switch (rank) {\n case 1:\n return 6.7;\n case 2:\n return 13.3;\n case 3:\n return 20;\n default:\n return 0;\n }\n}\n\n// Wrath Gun Damage After Action Skill\nfunction getWrathGunDamageAfterActionSkill(rank) {\n switch (rank) {\n case 1:\n return 6.7;\n case 2:\n return 13.3;\n case 3:\n return 20;\n default:\n return 0;\n }\n}\n\n// Steady Hands Handling\nfunction getSteadyHandsHandling(rank) {\n switch (rank) {\n case 1:\n return 14;\n case 2:\n return 24;\n case 3:\n return 32;\n default:\n return 0;\n }\n}\n\n// Steady Hands Accuracy\nfunction getSteadyHandsAccuracy(rank) {\n switch (rank) {\n case 1:\n return 13;\n case 2:\n return 23;\n case 3:\n return 31;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Brawl\": {\n \"0\": {\n \"Phaseslam\": {\n text: \"Amara leaps into the air and Slams the ground, dealing damage to all nearby enemies and knocking them up.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 98)} (increases with character level), Cooldown: 35 Seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Root to Rise\": {\n ranks: 5,\n text: \"Amara gains inceased Maximum Health.\",\n effect: (rank, level) => `Maximum Health: +${percent(rank, 8)}%`,\n },\n \"Personal Space\": {\n ranks: 3,\n text: \"Amara's weapon shots deal Bonus Damage based on the distance to her target. The closer the target, the greater the bonus.\",\n effect: (rank, level) => `Bonus Damage: Up to +${percent(rank, 18)}% of damage dealt`,\n },\n \"Clarity\": {\n ranks: 5,\n text: \"Amara constantly regenerates health. The lower her health, the more powerful the regeneration. After using an Action Skill, this bonus is doubled for a few seconds.\",\n effect: (rank, level) => `Health Regeneration: Up to +${percent(rank, 1)}% of Missing Health per second, Duration: 5 seconds`,\n },\n },\n \"2\": {\n \"Arms Deal\": {\n ranks: 5,\n text: \"Amara deals increased Splash Damage and takes reduced Splash Damage.\",\n effect: (rank, level) => `Splash Damage: +${percent(rank, 4)}%, Splash Damage Reduction +${getArmsDealSplashDamageReduction(rank)}%`,\n },\n \"Samsara\": {\n ranks: 3,\n text: \"Whenever Amara deals damage to an enemy with her Action Skill, she adds a stack of Samsara. For every stack of Samsara, Amara gains increased Gun Damage and Health Regeneration for a few seconds. Stacks decay after a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${percent(rank, 1.7)}% per stack, Health Regeneration: +${percent(rank, 1.7)}% of Missing Health per second per stack, Maximum Samara Stacks: 5, Duration: 20 seconds`,\n },\n \"Helping Hand(s)\": {\n ranks: 5,\n text: \"For a few seconds after using her Action Skill, Amara's arms remain active and grant her Damage Reduction.\",\n effect: (rank, level) => `Damage Reduction: +${getHelpingHandsDamageReduction(rank)}%, Duration: 15 seconds`,\n },\n \"Blight Tiger\": {\n ranks: 0,\n text: \"Converts Amara's Action Skill to Corrosive Damage.\",\n effect: (rank, level) => `Converts to Corrossive Damage`,\n type: SKILLS.AUGMENT_DIAMOND,\n },\n },\n \"3\": {\n \"Fracture\": {\n ranks: 0,\n text: \"Amara summons a line of fists that erupt from the ground, dealing damage to enemies in front of Amara.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 88)} (increases with character level), Cooldown: 28 sec`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Mindfulness\": {\n ranks: 3,\n text: \"Whenenever Amara takes damage, she gains a stack of Mindfulness. For every stack of Mindfulness, Amara gains improved Shield Regeneration Delay and Movement Speed. Stacks decay after a few seconds.\",\n effect: (rank, level) => `Shield Regeneration Delay: -${getMindfulnessShieldRegenerationDelay(rank)}% per Mindfulness stack, Movement Speed: +${percent(rank, 1.4)}% per Mindfulness stack, Maximum Mindfulness Stacks: 25, Duration: 5 seconds`,\n },\n \"Find Your Center\": {\n ranks: 1,\n text: \"Amara gains increased Melee Damage. Additionally, for a few seconds after using her Action Skill, Amara gains increased Melee Range.\",\n effect: (rank, level) => `Melee Damage: +100%, Melee Range: +75%, Duration: 20 seconds`,\n },\n \"Vigor\": {\n ranks: 3,\n text: \"Kill Skill. Killing an enemy with Amara's Action Skill grants all allies increased Movement Speed for a few seconds.\",\n effect: (rank, level) => `Team Movement Speed: +${percent(rank, 3.333)}%, Duration: 8 seconds`,\n },\n \"Revelation\": {\n ranks: 0,\n text: \"Amara's Action Skill now creates a Nova when it damages enemies, dealing damage to all nearby enemies.\",\n effect: (rank, level) => `Nova Damage: ${flat(rank, level, 41)} (increases with character level), Action Skill Damage: -15%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Downfall\": {\n ranks: 0,\n text: \"Amara leaps into the air and shoots an Elemental Beam below her, followed by a Slam.\",\n effect: (rank, level) => `Beam Damage: ${flat(rank, level, 14)} per second (increases with character level), Slam Damage: ${flat(rank, level, 95)} (increases with character level), Cooldown: 47 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"One With Nature\": {\n ranks: 5,\n text: \"Amara gains increased Maximum Health and Elemental Damage Resistance to her Action Skill Element.\",\n effect: (rank, level) => `Maximum Health: +${percent(rank, 5)}%, Elemental Damage Reduction: +${getOneWithNatureElementalDamageReduction(rank)}%`,\n },\n },\n \"5\": {\n \"Do Unto Others\": {\n ranks: 1,\n text: \"Whenever an emey damages Amara, she automatically throws an energy orb back at them, dealing Action Skill Elemental Damage. This skill has a short cooldown.\",\n effect: (rank, level) => `Cooldown: 8 seconds`,\n },\n \"Jab Cross\": {\n ranks: 5,\n text: \"Whenever Amara deals melee damage to an enemy, she gains increased Action Skill Damage and increased Gun Damage for a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%, Action Skill Damage: +${percent(rank, 15)}%, Duration: 10 seconds`,\n },\n \"Guardian Angel\": {\n ranks: 1,\n text: \"When Amara enters Fight For Your Life, she immediately gains a Second Wind, restores her health, and creates an Action Skill Elemental Nova that may knock back nearby enemies. This skill has a long cooldown.\",\n effect: (rank, level) => `Maximum Health Restored: 50% of Maximum Health, Cooldown: 120 seconds`,\n },\n \"Glamour\": {\n ranks: 0,\n text: \"Enemies damaged by Amara's Action Skill become confused and temporarily attack their allies. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are confused as well.\",\n effect: (rank, level) => `Confuse Duration: 8 seconds, Action Skill Cooldown: +20%, Action Skill Damage: -10%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"6\": {\n \"Blitz\": {\n ranks: 1,\n text: \"Melee Override. Press [Melee key] while aiming at an enemy to make Amara dash a short distance forward and perform a special melee strike, dealing Elemental Melee Damage. If a Blitz melee attack kills an enemy, Blitz's cooldown is immediately reset.\",\n effect: (rank, level) => `Melee Damage: +100%, Cooldown: 8 seconds`,\n },\n },\n },\n \"Mystical Assault\": {\n \"0\": {\n \"Phasecast\": {\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 92)}, Cooldown: 28 Seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Do Harm\": {\n ranks: 5,\n text: \"Killing an enemy grants Amara a stack of Rush. Activating her Action Skill consumes all Rush stacks. For every stack of Rush consumed, Amara's Action Skill Damage is temporarily increased.\",\n effect: (rank, level) => `Maximum Rush Stacks: 10, Action Skill Damage: +${percent(rank, 0.9)}% per Rush stack consumed, Duration: 20 seconds`,\n },\n \"Fast Hand(s)\": {\n ranks: 3,\n text: \"Amara's Reload Speed, Weapon Swap Speed, and Mode Switch Speed are improved.\",\n effect: (rank, level) => `Reload Speed: +${getFastHandsReloadSpeed(rank)}%, Weapon Swap Speed: +${getFastHandsWeaponSwapSpeed(rank)}%, Mode Switch Speed: +${getFastHandsModeSwitchSpeed(rank)}%`,\n },\n \"Violent Tapestry\": {\n ranks: 5,\n text: \"Applying a Status Effect grants Amara a stack of Rush. For every stack of Rush consumed, Amara's Status Effect Chance is temporarily increased.\",\n effect: (rank, level) => `Maximum Rush Stacks: 10, Status Effect Chance: +${percent(rank, 0.6)}% per Rush stack consumed, Duration: 20 seconds`,\n },\n },\n \"2\": {\n \"Alacrity\": {\n ranks: 5,\n text: \"Amara gains increased Reload Speed for every stack of Rush. After consuming Rush stacks, this bonus is increased for a few seconds.\",\n effect: (rank, level) => `Reload Speed: +${percent(rank, 0.4)}% per Rush stack, Reload Speed: +${getAlacrityReloadSpeedAfterActionSkill(rank)}% per Rush stack consumed, Duration: 8 seconds`,\n },\n \"Transcend\": {\n ranks: 3,\n text: \"Amara gains increased Accuracy and Critical Hit Damage for a few seconds after activating her Action Skill.\",\n effect: (rank, level) => `Accuracy: +${getTranscendAccuracy(rank)}%, Critical Hit Damage: +${percent(rank, 9)}%, Duration: 12 seconds`,\n },\n \"Restless\": {\n ranks: 5,\n text: \"Amara gains increased Action Skill Cooldown Rate.\",\n effect: (rank, level) => `Action Skill Cooldown Rate: +${percent(rank, 5)}%`,\n },\n \"Soul Sap\": {\n ranks: 0,\n text: \"A portion of all damage dealt by Amara's Action Skill is returned to her or a nearby ally as health.\",\n effect: (rank, level) => `Life Steal: 30% of Action Skill damage dealt`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"3\": {\n \"Deliverance\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Whenever Amara's Astral Projection damages an enemy or object, it releases homing Elemental Projectiles that trigger her Action Skill Elemental Effect on enemies.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 86)} (increases with character level), Elemental Projectiles: 3 per enemy or object hit, Cooldown: 28 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Ascendant\": {\n ranks: 1,\n text: \"All Action Skill Augments gain increased effects.\",\n effect: (rank, level) => `Soul Sap Life Steal: +20%, Allure Radius: +100%, Glamour Duration: +50%, Stillness of Mind: Breaks 0.75 seconds after being damaged, Revelation Damage: +25%`,\n },\n \"Stillness of Mind\": {\n ranks: 0,\n text: \"Enemies damaged by Amara's Action Skill become phaselocked until they are damaged or the duration ends. However, Action Skill Cooldown is increased. If Amara targets an enemy with Phasegrasp, enemies near the Grasped target are also phaselocked.\",\n effect: (rank, level) => `Phaselock Duration: 6 seconds, Action Skill Damage: -25%, Action Skill Cooldown: +15%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Reverberation\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself, dealing damage to everything in its path. Astra Projection deals increased damage for every enemy it hits.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 88)} (increases with character level), Damage Bonus: +50% per enemy hit, Cooldown: 30 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"From Rest\": {\n ranks: 3,\n text: \"Amara gains improved Fire Rate and Charge Time.\",\n effect: (rank, level) => `Fire Rate: +${percent(rank, 4)}%, Charge Time: +${getFromRestChargeTime(rank)}%`,\n },\n \"Laid Bare\": {\n ranks: 3,\n text: \"Enemies take increased damage from all sources for a few seconds after being damaged by Amara's Action Skill.\",\n effect: (rank, level) => `Damage Increase: +${percent(rank, 8.333)}%, Duration: 8 seconds`,\n },\n \"Wrath\": {\n ranks: 3,\n text: \"Amara gains increased Gun Damage. This effect is increased after she activates her action skill for a few seconds.\",\n effect: (rank, level) => `Gun Damage: +${getWrathGunDamage(rank)}%, Gun Damage: +${getWrathGunDamageAfterActionSkill(rank)}% after Action Skill use, Duration: 8 seconds`,\n },\n },\n \"5\": {\n \"Remnant\": {\n ranks: 3,\n text: \"When Amara kills an enemy with a Gun or Action Skill, she creates a homing projectile that seeks out a new enemy dealing her Action Skill Elemental Damage. Any Overkill Damage is added to the projectile's damage.\",\n effect: (rank, level) => `Remnant Base Damage: ${flat(rank, level, 9)} (increases with character level)`,\n },\n \"Awakening\": {\n ranks: 3,\n text: \"Amara's Rush stacks gain increased effectiveness.\",\n effect: (rank, level) => `Rush Stack Effectiveness: +${percent(rank, 10)}%`,\n },\n \"Tandava\": {\n ranks: 0,\n text: \"Amara sends forward an Astral Projection of herself. When it hits a target, it explodes, damaging all nearby enemies.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 91)} (increases with character level), Cooldown: 35 seconds`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n },\n \"6\": {\n \"Avatar\": {\n ranks: 1,\n text: \"Amara's Action Skill can be activated while it's cooling down. This skill may only be used once per completed cooldown. Additionally, increases Amara's Maximum Rush Stacks. Additionally, if Amara's Action Skill kills an enemy, it refunds half of her Rush stacks.\",\n effect: (rank, level) => `Maximum Rush Stacks: +10`,\n },\n },\n },\n \"Fist of the Elements\": {\n \"0\": {\n \"Phasegrasp\": {\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Some enemies are immune to being Grasped and instantly take damage instead.\",\n effect: (rank, level) => `Skill Duration: 7 sec, Cooldown: 16 seconds, Grasp Immune Damage: ${flat(rank, level, 28)} (increases with character level)`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Anima\": {\n ranks: 5,\n text: \"Amara's Status Effects deal increased damage over time and have increased duration. Her Action Skill Status Effect deals further increased damage.\",\n effect: (rank, level) => `Action Skill Status Effect Damage: +${percent(rank, 8)}%, Status Effect Damage: +${percent(rank, 4)}%, Status Effect Duration: +${percent(rank, 20)}%`,\n },\n \"Steady Hands\": {\n ranks: 3,\n text: \"Amara gains increased Weapon Handling and Accuracy.\",\n effect: (rank, level) => `Handling: +${getSteadyHandsHandling(rank)}%, Accuracy: +${getSteadyHandsAccuracy(rank)}%`,\n },\n \"Infusion\": {\n ranks: 5,\n text: \"Convert a portion of damage dealt by Amara's weapons into her Action Skill Element.\",\n effect: (rank, level) => `Converted Damage: ${percent(rank, 8)}%`,\n },\n },\n \"2\": {\n \"Tempest\": {\n ranks: 5,\n text: \"Amara deals increased Elemental Damage. Shock Damage is further increased.\",\n effect: (rank, level) => `Elemental Damage: +${percent(rank, 6)}%, Shock Damage: +${percent(rank, 2)}%`,\n },\n \"Illuminated Fist\": {\n ranks: 1,\n text: \"Amara gains increased Melee Damage and her Melee Damage is converted to Action Skill Element.\",\n effect: (rank, level) => `Melee Damage: +75%`,\n },\n \"Wildfire\": {\n ranks: 5,\n text: \"Whenever Amara applies a Status Effect to an enemy, it has a chance to spread to a nearby enemy.\",\n effect: (rank, level) => `Spread Chance: +${percent(rank, 8)}%`,\n },\n \"Soulfire\": {\n ranks: 0,\n text: \"Converts Amara's Action Skill to Incendiary Damage.\",\n effect: (rank, level) => `Converts to Incendiary Damage`,\n type: SKILLS.AUGMENT_DIAMOND,\n },\n },\n \"3\": {\n \"The Eternal Fist\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Whenever the Grasped enemy is killed, a new fist seeks out and Grasps a new target.\",\n effect: (rank, level) => `Bonus Targets: Up to +4, Duration: 7 seconds, Cooldown: 20 seconds, Grasp Immune Damage: ${flat(rank, level, 28)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Dread\": {\n ranks: 1,\n text: \"Amara's Gun Damage is increased for a few seconds after an enemy is Grasped. Whenever any player kills a Grasped enemy, their current weapon is instantly reloaded.\",\n effect: (rank, level) => `Gun Damage: +15%, Duration: 8 seconds`,\n },\n \"Allure\": {\n ranks: 0,\n text: \"Amara's Action Skill creates a singularity that pull in enemies.\",\n effect: (rank, level) => `Action Skill Damage: -20%, Duration: 2.5 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Indiscriminate\": {\n ranks: 3,\n text: \"Amara's bullets that damage enemies have a chance to ricochet and deal decreased damage to other nearby enemies. Richochet Chance and Damage are increased if target is affected by Phasegrasp or Stillness of Mind.\",\n effect: (rank, level) => `Ricochet Chance: +${percent(rank, 10)}%, Ricochet Damage: -50%, Action Skill Ricochet Chance: +${percent(rank, 20)}%, Action Skill Ricochet Damage: -25%`,\n },\n \"Deep Well\": {\n ranks: 1,\n text: \"Amara gains increased Magazine Size with elemental weapons.\",\n effect: (rank, level) => `Magazine Size: +20%`,\n },\n \"Catharsis\": {\n ranks: 3,\n text: \"Whenever Amara riggers an elemental effect on an enemy, when that enemy that dies the enemy explodes, dealing her attuned element damage along with any other element that is currently inflicted upon that enemy. This skill has a short cooldown.\",\n effect: (rank, level) => `Damage: ${flat(rank, level, 4)} (increases with character level), Cooldown: 8 seconds`,\n },\n \"Ties That Bind\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. Enemies near the Grasped target are linked, and any damage dealt to a linked target is shared between all other linked targets.\",\n effect: (rank, level) => `Link Damage: 35% of damage dealt, Duration: 7 seconds, Cooldown: 18 seconds, Grasp Immune Damage: ${flat(rank, level, 34)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n },\n \"5\": {\n \"Fist Over Matter\": {\n ranks: 0,\n text: \"Amara summons a giant fist that bursts from the ground and locks the targeted enemy in place for a few seconds. After Grasping the targeted enemy, large fists appear and constantly smash the area, dealing damage to nearby enemies.\",\n effect: (rank, level) => `Damage ${flat(rank, level, 35)} (increases with character level), Duration: 7 seconds, Cooldown: 28 seconds, Grasp Immune Damage ${flat(rank, level, 39)} (increases with character level)`,\n type: SKILLS.AUGMENT_ACTION_SKILL,\n },\n \"Sustainment\": {\n ranks: 5,\n text: \"Amara gains Life Steal whenever she deals Elemental Damage with her weapon.\",\n effect: (rank, level) => `Life Steal: +${percent(rank, 4)}% of damage dealt`,\n },\n \"Conflux\": {\n ranks: 5,\n text: \"Whenever Amara applies a Status Effect to an enemy, she gains a chance to randomly Electrocute, Ignite, or Melt that enemy.\",\n effect: (rank, level) => `Extra Effect Chance: +${percent(rank, 7)}%`,\n },\n },\n \"6\": {\n \"Forceful Expression\": {\n ranks: 1,\n text: \"Amara's guns deal Bonus Elemental Damage based on her Action Skill Element.\",\n effect: (rank, level) => `Bonus Elemental Damage: +18% of damage dealt`,\n },\n },\n },\n};\n\nexport default skills;\n","import style from './index.css';\n\nexport default function () {\n return (\n \n );\n}\n","import { Router } from 'preact-router';\n\nimport Home from '@pages/Home';\nimport Operative from '@pages/Operative';\nimport Siren from '@pages/Siren';\nimport Beastmaster from '@pages/Beastmaster';\nimport Gunner from '@pages/Gunner';\n\nconst App = () =>\n (\n \n \n \n \n \n );\n\nexport default App;\n","// import { useReducer } from 'preact/hooks'; // Downgraded from Preact 10 for compat with @pwa/cli\nimport { Component } from 'preact';\nimport Skill from '@components/Skill';\nimport Nav from '@components/Nav';\nimport Footer from '@components/Footer';\nimport { getHash, setHash } from './hashHandler';\nimport reducer from './reducer';\nimport { getLevel } from './selectors';\nimport style from './index.css';\n\nfunction contextKiller (event) {\n event.preventDefault();\n return false;\n}\n\nexport default class VaultHunter extends Component {\n constructor (props) {\n super(props);\n this.state = {\n invested: [0, 0, 0],\n skills: props.skills || {},\n };\n }\n\n componentDidMount () {\n this.setState(reducer(this.state, {\n type: 'loadSkills',\n skills: getHash(this.state.skills),\n }));\n }\n\n render ({\n name = 'Unnamed',\n discipline = 'Classless',\n path,\n skills: initialSkills,\n }) {\n const skillChangeListenerFactory = (skillName, treeIndex, treeName, tierIndex) => {\n return (oldValue, newValue) => {\n this.setState(reducer(this.state, {\n type: 'skillChange',\n skillName,\n treeIndex,\n treeName,\n tierIndex,\n newValue,\n oldValue,\n }));\n };\n };\n\n const resetSkills = () => {\n setHash(initialSkills);\n this.setState({\n invested: [0, 0, 0],\n skills: initialSkills || {},\n });\n };\n\n const trees =\n Object.keys(this.state.skills).map((treeName, treeIndex) => {\n return (\n
\n );\n }\n}\n","export default {\n ACTION_SKILL: 1,\n AUGMENT_CHEVRON: 2,\n AUGMENT_DIAMOND: 3,\n AUGMENT_ACTION_SKILL: 4,\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"VaultHunter\":\"_2zgqJ\",\"header\":\"_1Jomm\",\"title\":\"_17kLY\",\"subtitle\":\"_3J3hw\",\"sidepanel\":\"_2UO55\",\"level\":\"xH9ts\",\"reset\":\"K9CBr\",\"overlevelA\":\"_1LE8c\",\"overlevelB\":\"_1vOfn\",\"trees\":\"_3ek45\",\"tier\":\"_3Ch4X\",\"treeName\":\"_1WAM2\",\"tree\":\"gRWZY\",\"skills\":\"_2Su0b\",\"green\":\"-Pl7G\",\"blue\":\"_1nm1I\",\"red\":\"_3T1pZ\"};","import { Link } from 'preact-router';\nimport Footer from '@components/Footer';\nimport style from './index.css';\n\nexport default function () {\n const pages = [\n { name: 'Zane', job: 'the Operative', path: '/operative' },\n { name: 'Amara', job: 'the Siren', path: '/siren' },\n { name: 'FL4K', job: 'the Beastmaster', path: '/beastmaster' },\n { name: 'Moze', job: 'the Gunner', path: '/gunner' },\n ];\n return (\n
\n
\n
\n
(Unofficial)
Borderlands 3 skill calculator
\n { pages.map(page => {\n return (\n \n
\n {page.name}\n
\n {page.job}\n
\n
\n \n );\n }) }\n
\n
\n \n
\n );\n}\n","import { h, render } from 'preact';\nimport App from '@components/App';\nimport './index.css';\n\nlet elem = document.querySelector('#app');\nlet root = render(, elem, elem.firstElementChild);\n\nif (process.env.NODE_ENV === 'development' && module.hot) {\n // enable preact devtools\n require('preact/debug');\n // respond to HMR updates\n module.hot.accept('@components/App', New => {\n New = require('@components/App').default;\n root = render(, elem, root);\n });\n} else if (process.env.NODE_ENV === 'production') {\n // Service Worker registration\n require('offline-plugin/runtime').install();\n}\n","import { Component, cloneElement, h } from 'preact';\n\nvar EMPTY$1 = {};\n\nfunction assign(obj, props) {\n\t// eslint-disable-next-line guard-for-in\n\tfor (var i in props) {\n\t\tobj[i] = props[i];\n\t}\n\treturn obj;\n}\n\nfunction exec(url, route, opts) {\n\tvar reg = /(?:\\?([^#]*))?(#.*)?$/,\n\t\tc = url.match(reg),\n\t\tmatches = {},\n\t\tret;\n\tif (c && c[1]) {\n\t\tvar p = c[1].split('&');\n\t\tfor (var i=0; i b.rank) ? -1 :\n\t\t(a.index - b.index)\n\t);\n}\n\n// filter out VNodes without attributes (which are unrankeable), and add `index`/`rank` properties to be used in sorting.\nfunction prepareVNodeForRanking(vnode, index) {\n\tvnode.index = index;\n\tvnode.rank = rankChild(vnode);\n\treturn vnode.attributes;\n}\n\nfunction segmentize(url) {\n\treturn url.replace(/(^\\/+|\\/+$)/g, '').split('/');\n}\n\nfunction rankSegment(segment) {\n\treturn segment.charAt(0)==':' ? (1 + '*+?'.indexOf(segment.charAt(segment.length-1))) || 4 : 5;\n}\n\nfunction rank(path) {\n\treturn segmentize(path).map(rankSegment).join('');\n}\n\nfunction rankChild(vnode) {\n\treturn vnode.attributes.default ? 0 : rank(vnode.attributes.path);\n}\n\nvar customHistory = null;\n\nvar ROUTERS = [];\n\nvar subscribers = [];\n\nvar EMPTY = {};\n\nfunction isPreactElement(node) {\n\treturn node.__preactattr_!=null || typeof Symbol!=='undefined' && node[Symbol.for('preactattr')]!=null;\n}\n\nfunction setUrl(url, type) {\n\tif ( type === void 0 ) type='push';\n\n\tif (customHistory && customHistory[type]) {\n\t\tcustomHistory[type](url);\n\t}\n\telse if (typeof history!=='undefined' && history[type+'State']) {\n\t\thistory[type+'State'](null, null, url);\n\t}\n}\n\n\nfunction getCurrentUrl() {\n\tvar url;\n\tif (customHistory && customHistory.location) {\n\t\turl = customHistory.location;\n\t}\n\telse if (customHistory && customHistory.getCurrentLocation) {\n\t\turl = customHistory.getCurrentLocation();\n\t}\n\telse {\n\t\turl = typeof location!=='undefined' ? location : EMPTY;\n\t}\n\treturn (\"\" + (url.pathname || '') + (url.search || ''));\n}\n\n\n\nfunction route(url, replace) {\n\tif ( replace === void 0 ) replace=false;\n\n\tif (typeof url!=='string' && url.url) {\n\t\treplace = url.replace;\n\t\turl = url.url;\n\t}\n\n\t// only push URL into history if we can handle it\n\tif (canRoute(url)) {\n\t\tsetUrl(url, replace ? 'replace' : 'push');\n\t}\n\n\treturn routeTo(url);\n}\n\n\n/** Check if the given URL can be handled by any router instances. */\nfunction canRoute(url) {\n\tfor (var i=ROUTERS.length; i--; ) {\n\t\tif (ROUTERS[i].canRoute(url)) { return true; }\n\t}\n\treturn false;\n}\n\n\n/** Tell all router instances to handle the given URL. */\nfunction routeTo(url) {\n\tvar didRoute = false;\n\tfor (var i=0; i 0;\n\t};\n\n\t/** Re-render children with a new URL to match against. */\n\tRouter.prototype.routeTo = function routeTo (url) {\n\t\tthis._didRoute = false;\n\t\tthis.setState({ url: url });\n\n\t\t// if we're in the middle of an update, don't synchronously re-route.\n\t\tif (this.updating) { return this.canRoute(url); }\n\n\t\tthis.forceUpdate();\n\t\treturn this._didRoute;\n\t};\n\n\tRouter.prototype.componentWillMount = function componentWillMount () {\n\t\tROUTERS.push(this);\n\t\tthis.updating = true;\n\t};\n\n\tRouter.prototype.componentDidMount = function componentDidMount () {\n\t\tvar this$1 = this;\n\n\t\tif (customHistory) {\n\t\t\tthis.unlisten = customHistory.listen(function (location) {\n\t\t\t\tthis$1.routeTo((\"\" + (location.pathname || '') + (location.search || '')));\n\t\t\t});\n\t\t}\n\t\tthis.updating = false;\n\t};\n\n\tRouter.prototype.componentWillUnmount = function componentWillUnmount () {\n\t\tif (typeof this.unlisten==='function') { this.unlisten(); }\n\t\tROUTERS.splice(ROUTERS.indexOf(this), 1);\n\t};\n\n\tRouter.prototype.componentWillUpdate = function componentWillUpdate () {\n\t\tthis.updating = true;\n\t};\n\n\tRouter.prototype.componentDidUpdate = function componentDidUpdate () {\n\t\tthis.updating = false;\n\t};\n\n\tRouter.prototype.getMatchingChildren = function getMatchingChildren (children, url, invoke) {\n\t\treturn children\n\t\t\t.filter(prepareVNodeForRanking)\n\t\t\t.sort(pathRankSort)\n\t\t\t.map( function (vnode) {\n\t\t\t\tvar matches = exec(url, vnode.attributes.path, vnode.attributes);\n\t\t\t\tif (matches) {\n\t\t\t\t\tif (invoke !== false) {\n\t\t\t\t\t\tvar newProps = { url: url, matches: matches };\n\t\t\t\t\t\tassign(newProps, matches);\n\t\t\t\t\t\tdelete newProps.ref;\n\t\t\t\t\t\tdelete newProps.key;\n\t\t\t\t\t\treturn cloneElement(vnode, newProps);\n\t\t\t\t\t}\n\t\t\t\t\treturn vnode;\n\t\t\t\t}\n\t\t\t}).filter(Boolean);\n\t};\n\n\tRouter.prototype.render = function render (ref, ref$1) {\n\t\tvar children = ref.children;\n\t\tvar onChange = ref.onChange;\n\t\tvar url = ref$1.url;\n\n\t\tvar active = this.getMatchingChildren(children, url, true);\n\n\t\tvar current = active[0] || null;\n\t\tthis._didRoute = !!current;\n\n\t\tvar previous = this.previousUrl;\n\t\tif (url!==previous) {\n\t\t\tthis.previousUrl = url;\n\t\t\tif (typeof onChange==='function') {\n\t\t\t\tonChange({\n\t\t\t\t\trouter: this,\n\t\t\t\t\turl: url,\n\t\t\t\t\tprevious: previous,\n\t\t\t\t\tactive: active,\n\t\t\t\t\tcurrent: current\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn current;\n\t};\n\n\treturn Router;\n}(Component));\n\nvar Link = function (props) { return (\n\th('a', assign({ onClick: handleLinkClick }, props))\n); };\n\nvar Route = function (props) { return h(props.component, props); };\n\nRouter.subscribers = subscribers;\nRouter.getCurrentUrl = getCurrentUrl;\nRouter.route = route;\nRouter.Router = Router;\nRouter.Route = Route;\nRouter.Link = Link;\n\nexport { subscribers, getCurrentUrl, route, Router, Route, Link };export default Router;\n//# sourceMappingURL=preact-router.es.js.map\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\n\n/* These three skills dont follow a linear patch for some increases. Data came from official builder.\nhttps://borderlands.com/en-US/characters/fl4k/#-\nMight be different in game but I haven't played FL4K yet!\nThere are probably diminishing return algorithms for these but this was quicker than figuring that out. */\n\n// Hunter's Eye Damage Reduction\nfunction getHuntersEyeDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 5.3;\n case 2:\n return 10.1;\n case 3:\n return 14.4;\n case 4:\n return 18.3;\n case 5:\n return 21.9;\n default:\n return 0;\n }\n}\n\n// Ambush Predator Handling\nfunction getAmbushPredatorHandling(rank) {\n switch (rank) {\n case 1:\n return 17;\n case 2:\n return 29;\n case 3:\n return 38;\n case 4:\n return 44;\n case 5:\n return 50;\n default:\n return 0;\n }\n}\n\n// The Most Dangerous Game Handling\nfunction getMostDangerousGameHandling(rank) {\n switch (rank) {\n case 1:\n return 14.3;\n case 2:\n return 25.0;\n case 3:\n return 33.3;\n default:\n return 0;\n }\n}\n\n// Furious Attack Handling\nfunction getFuriousAttackHandling(rank) {\n switch (rank) {\n case 1:\n return 1;\n case 2:\n return 2;\n case 3:\n return 2.9;\n case 4:\n return 3.8;\n case 5:\n return 4.8;\n default:\n return 0;\n }\n}\n\n// Turn Tail And Run Damage Reduction\nfunction getTurnTailAndRunDamageReduction(rank) {\n switch (rank) {\n case 1:\n return 6.5;\n case 2:\n return 12.3;\n case 3:\n return 17.4;\n default:\n return 0;\n }\n}\n\n// Interplanetary Stalker Beast Movement Speed\nfunction getInterplanetaryStalkerBeastMovementSpeed(rank) {\n switch (rank) {\n case 1:\n return 2;\n case 2:\n return 3;\n case 3:\n return 5;\n case 4:\n return 6;\n case 5:\n return 7;\n default:\n return 0;\n }\n}\n\n// Second Intention Critical Kill Reload Speed\nfunction getSecondIntentionCriticalKillReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 6;\n case 2:\n return 11;\n case 3:\n return 15;\n case 4:\n return 19;\n case 5:\n return 23;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Stalker\": {\n \"0\": {\n \"Jabber Sidekick\": {\n text: \"FL4K is joined by a loyal Jabber companion, armed with a Pistol. While accompanied by the Jabber, FL4K's Movement Speed is increased. Hold [Pet Skill key] to issue an Attack Command, which will cause the Jabber to throw a Radiation Barrel at enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%`,\n },\n \"Fade Away\": {\n text: \"FL4K cloaks, turning invisible. FL4K can fire 3 shots while cloaked, and each shot is automatically a Critical Hit. While cloaked, FL4K has increased Movement Speed and Health Regeneration.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Fade Away Critical Hit Damage: +200%, Cloaked Movement Speed: +25%, Health Regeneration: +3% of Maximum Health per second, Duration: 15 seconds, Cooldown: 45 seconds`,\n },\n },\n \"1\": {\n \"Self-Repairing System\": {\n text: \"FL4K's Maximum Health is increased, and they constantly regenerate health.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Health: +${percent(rank, 6)}%, Health Regeneration: +${percent(rank, 0.3)}% of Maximum Health per second`,\n },\n \"Sic'Em\": {\n text: \"Attack Command has lowered Cooldown and increased Damage.\",\n ranks: 3,\n effect: (rank, level) => `Attack Command Damage: +${percent(rank, 10)}%, Attack Command Cooldown: -${percent(rank, 10)}%`,\n },\n \"Furious Attack\": {\n text: \"Hunter Skill. After shooting an enemy, FL4K gains a stack of Furious Attack. For each stack of Furious Attack, FL4K's Handling and Gun Damage are increased, and their Pet gains increased Damage per stack. Stacks decay after a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 0.4)}% per Furious Attack stack, Handling: +${getFuriousAttackHandling(rank)}% per Furious Attack stack, Pet Damage: +${percent(rank, 0.6)}% per Furious Attack Stack, Maximum Furious Attack Stacks: 10, Duration: 4 seconds`,\n },\n },\n \"2\": {\n \"Guerrillas In The Mist\": {\n text: \"Fade Away no longer ends after FL4K attacks, at the cost of Critical Hit Damage and Fade Away duration being reduced.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Fade Away Critical Hit Damage: +25%, Fade Away Duration: 5 seconds`,\n },\n \"Eager To Impress\": {\n text: \"Kill Skill. Whenever FL4K kills an enemy, Action Skill Cooldown Time is reduced. Whenever FL4K's pet kills an enemy, Action Skill Cooldown Time is reduced even more and Attack Command's duration is refreshed.\",\n ranks: 5,\n effect: (rank, level) => `FL4K Kill Cooldown Time: -${percent(rank, 0.25)} seconds, Pet Kill Cooldown Time: -${percent(rank, 0.5)} seconds`,\n },\n \"All My BFF's\": {\n text: \"Allies share a portion of FL4K's total Health Regeneration. FL4K's pet shares twice the amount of Health Regeneration.\",\n ranks: 3,\n effect: (rank, level) => `Allies Share ${Math.round(percent(rank, 16.66666))}% of Fl4k's Health Regeneration, Pets Share ${Math.round(percent(rank, 33.33333))}% of Fl4k's Health Regeneration`,\n },\n \"Overclocked\": {\n text: \"FL4K gains increased Fire Rate. FL4K gains even more Fire Rate after reloading.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 2)}%, Fire Rate: +${percent(rank, 2)}% after reloading, Duration: 4 seconds`,\n },\n },\n \"3\": {\n \"Not My Circus\": {\n text: \"After Fade Away ends, FL4K's pet will Taunt, drawing the attention of all enemies in a huge radius. For a few seconds after Taunting, the pet gains powerful Damage Reduction.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Pet Taunt Duration: 6 seconds, Pet Damage Reduction: +80%`,\n },\n \"Lick The Wounds\": {\n text: \"When FL4K is in Fight For Your Life, their pet will attempt to revive them. If it does, it gains increased Damage for a short time.\",\n ranks: 1,\n effect: (rank, level) => `Pet Damage: +30%, Duration: 60 seconds`,\n },\n \"Turn Tail And Run\": {\n text: \"While moving, FL4K constantly regenerates health and gains Damage Reduction. While still, FL4K gains Gun Damage and Fire Rate.\",\n ranks: 3,\n effect: (rank, level) => `Damage Reduction While Moving: +${getTurnTailAndRunDamageReduction(rank)}%, Health Regeneration While Moving: +${percent(rank, 0.3)}% of Maximum Health per second, Gun Damage While Still: +${percent(rank, 8.333)}%, Fire Rate While Still: +${percent(rank, 4)}%`,\n },\n \"Beefcake Jabber\": {\n text: \"FL4K's Jabber evolves into a Beefcake, discarding its pistol and equipping a Shotgun. While accompanied by the Beefcake, FL4K gains increased Movement Speed and Maximum Health. When FL4K issues an Attack Command, the Beefcake will summon a melee weapon to deliver a powerful attack that knocks enemies back.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%, Maximum Health: +10%`,\n },\n },\n \"4\": {\n \"Until You Are Dead\": {\n text: \"The Health Regeneration and Movement Speed of Fade Away persists for a short time after the skill has ended.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Post Cloak Duration: 10 seconds`,\n },\n \"The Fast And The Furryous\": {\n text: \"While above half health, FL4K's Gun Damage and Movement Speed are increased, and their pet gains increased Damage\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: +${Math.round(percent(rank, 8.333))}%, Movement Speed: +${percent(rank, 3.333)}%, Pet Damage: +${percent(rank, 10)}%`,\n },\n \"Hidden Machine\": {\n text: \"When an enemy has no target or is attacking a different target, FL4K deals increased damage against them.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 6)}%`,\n },\n \"Gunslinger Jabber\": {\n text: \"FL4K's Jabber upgrades his gear and equips an SMG. While accompanied by the Gunslinger, FL4K gains increased Movement Speed and Critical Hit Damage. When FL4K issues an Attack Command, the Gunslinger equips a Rocket Launcher to attack the target.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Movement Speed: +5%, Critical Hit Damage: +5%`,\n },\n },\n \"5\": {\n \"Unblinking Eye\": {\n text: \"During Fade Away, successive hits on the same target increase FL4K's Critical Damage per hit. Unblinking Eye resets every 3 hits.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Fade Away Critical Hit Damage: +75% per hit`,\n },\n \"Rage And Recover\": {\n text: \"Kill Skill. After killing an enemy, FL4K and FL4K's pet regenerate health for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: +${percent(rank, 1.6)}% of Missing Health per second, Duration: 3 seconds`,\n },\n },\n \"6\": {\n \"The Power Inside\": {\n text: \"FL4K and FL4K's pet gain increased Damage when FL4K activates an Action Skill. If FL4K is at full health, the increased Damage is doubled.\",\n ranks: 1,\n effect: (rank, level) => `Damage: +25%, Duration: 15 seconds`,\n },\n },\n },\n \"Master\": {\n \"0\": {\n \"Guard Skag\": {\n text: \"FL4K is joined by a loyal Skag companion, which will increase FL4K's Damage. Hold [Pet Skill key] to issue an Attack Command, which will cause the Skag to vomit acid onto enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%`,\n },\n \"Gamma Burst\": {\n text: \"FL4K creates a Rift at a target location, teleporting their pet through the Rift and dealing Radiation Damage to nearby enemies. Additionally, FL4K's pet becomes irradiated, growing in size and dealing bonus Radiation Damage when it attacks. Using Gamma Burst while FL4K's Pet is downed or dead will revive the pet at the targeted location with 30% of its health, but will double Action Skill Cooldown Time.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Damage 56: (increases with character level), Duration: 20 seconds, Cooldown: 30 seconds`,\n },\n },\n \"1\": {\n \"Ferocity\": {\n text: \"FL4K's Pet deals increased damage.\",\n ranks: 5,\n effect: (rank, level) => `Pet Damage: +${percent(rank, 10)}%`,\n },\n \"Persistence Hunter\": {\n text: \"Increases FL4K's Gun Damage and Action Skill Duration.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}%, Action Skill Duration: +${percent(rank, 15)}%`,\n },\n \"Go For The Eyes!\": {\n text: \"When FL4K's pet attacks an enemy, the first melee attack is an automatic Critical Hit that deals increased damage.\",\n ranks: 5,\n effect: (rank, level) => `Pet Critical Hit Damage: ${percent(rank, 15)}%`,\n },\n },\n \"2\": {\n \"Atomic Aroma\": {\n text: \"While Gamma Burst is active, FL4K's pet is surrounded by a Radiation Aura, constantly damaging all nearby enemies.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Radiation Damage: 4 per second (increases with character level)`,\n },\n \"Who Rescued Who?\": {\n text: \"Whenever FL4K's Pet deals damage, FL4K regenerates health for a few seconds. Whenever FL4K deals damage to an enemy, their Pet's health is restored for a portion of the damage dealt.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: +${percent(rank, 0.4)}% of Maximum Health per second, Pet Health Restored: +${percent(rank, 1)}% of damage dealt`,\n },\n \"He Bites!\": {\n text: \"When FL4K's pet takes damage, the pet returns some of that damage to the attacker.\",\n ranks: 3,\n effect: (rank, level) => `Damage Reflected: +${percent(rank, 5)}%`,\n },\n \"Frenzy\": {\n text: \"Hunter Skill. When FL4K's pet deals damage, FL4K and their pet gain a stack of Frenzy. Each stack of Frenzy increases Damage. The stacks decay after a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 0.8)}% per Frenzy stack, Maximum Frenzy Stacks: 10`,\n },\n },\n \"3\": {\n \"Empathic Rage\": {\n text: \"For the duration of Gamma Burst, Damage dealt by FL4K is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Damage: +20%`,\n },\n \"Psycho Head On A Stick\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, their Pet gains increased Movement Speed and Damage for a few seconds.\",\n ranks: 1,\n effect: (rank, level) => `Pet Movement Speed: +12%, Pet Damage: +20%, Duration: 8 seconds`,\n },\n \"Hive Mind\": {\n text: \"When FL4K takes damage, a portion of all damage they take is shared to their pet instead.\",\n ranks: 3,\n effect: (rank, level) => `Damage Shared: ${percent(rank, 5)}%`,\n },\n \"Great Horned Skag\": {\n text: \"FL4K's Skag evolves into a larger Great Horned Skag, which will increase FL4K's Damage and Gun Damage. When FL4K issues an Attack Command, the Great Horned Skag will charge at enemies and knock them into the air.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%, Gun Damage: +10%`,\n },\n },\n \"4\": {\n \"Endurance\": {\n text: \"When FL4K or FL4K's Pet kills an enemy while Gamma Burst is active, the duration of Gamma Burst is extended and pet damage is increased. These effects can stack up to 5 times.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Gamma Burst Duration: +3 seconds per kill, Pet Damage: +10% per kill`,\n },\n \"Barbaric Yawp\": {\n text: \"Increases the power of Pet Bonuses granted to FL4K.\",\n ranks: 5,\n effect: (rank, level) => `Pet Bonuses: +${percent(rank, 40)}%`,\n },\n \"Mutated Defenses\": {\n text: \"When FL4K's pet is at low health, it gains Damage Reduction and regenerates health. This skill has a long cooldown.\",\n ranks: 1,\n effect: (rank, level) => `Pet Damage Reduction: +30%, Pet Health Regeneration: +6.667% of Maximum Pet Health per second, Duration: 6 seconds, Cooldown: 15 seconds`,\n },\n \"Eridian Skag\": {\n text: \"FL4K's Skag evolves into an Eridian Skag, which will increase FL4K's Damage and Fire Rate. When FL4K issues an Attack Command, their Eridian Skag pulls nearby enemies in by generating a Singularity.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Damage: +5%, Fire Rate: +5%`,\n },\n },\n \"5\": {\n \"Burst Aid\": {\n text: \"After using Gamma Burst, the Rift remains for the duration of the skill. While standing near the Rift, FL4K and their allies rapidly Regenerate Health.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: +20% of Maximum Health per second`,\n },\n \"Pack Tactics\": {\n text: \"All Damage dealt by FL4K and their Pet is increased. Additionally, the Maximum Health of both FL4K and their Pet is increased.\",\n ranks: 3,\n effect: (rank, level) => `Fl4k and Pet Damage: +${percent(rank, 7)}%, Fl4k and Pet Maximum Health: +${percent(rank, 5)}%`,\n },\n \"Shared Spirit\": {\n text: \"While FL4K is at low health, a portion of all damage they take is inflicted on their pet instead.\",\n ranks: 1,\n effect: (rank, level) => `Damage Shared: 50%`,\n },\n },\n \"6\": {\n \"Dominance\": {\n text: \"Melee Override Skill. FL4K establishes dominance over an enemy, turning it into an ally for a short time. If the enemy is a Beast, the duration is doubled. While under the effects of Domiance, the enemy constantly loses health until it dies or the effect ends. Only one enemy can be dominated at a time. An enemy can only be dominated once.\",\n ranks: 1,\n effect: (rank, level) => `Target loses 2% of Maximum Health per second, Duration: 12 seconds`,\n },\n },\n },\n \"Hunter\": {\n \"0\": {\n \"Spiderant Centurion\": {\n text: \"FL4K is joined by a loyal Spiderant companion, which will cause FL4K to constant regenerate health. Hold [Pet Skill key] to issue an Attack Command, which will cause the Spiderant to charge into enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: 1% of Maximum Health per second`,\n },\n \"Rakk Attack!\": {\n text: \"FL4K sends forward 2 Rakk to dive-bomb enemies. This skill has multiple charges.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `Damage: 35 (increases with character level), Rakk Element Status Effect Chance: 100%, Cooldown: 18 seconds`,\n },\n },\n \"1\": {\n \"Interplanetary Stalker\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, they gain a stack of Interplanetary Stalker. For each stack of Interplanetary Stalker, they and their pet gain a bonus to all damage dealt. Additionally, they gain a unique stacking bonus depending on the type of enemy killed. Each unique bonus can stack up to 3 times. Each stack decays after a short time.\",\n ranks: 5,\n effect: (rank, level) => `Damage: +${percent(rank, 2)}% per stack, Pet Damage: +${percent(rank, 1)}% per stack, Human Bonus: +${percent(rank, 3)}% Action Skill Damage per stack, Robot Bonus: +${percent(rank, 1.5)}% Corrosive Damage per stack, Beast Bonus: +${getInterplanetaryStalkerBeastMovementSpeed(rank)}% Movement Speed per stack, Maximum Interplanetary Stalker Stacks: 3`,\n },\n \"Leave No Trace\": {\n text: \"When FL4K scores a Critical Hit, there is a chance for 1 ammo to be added to their magazine.\",\n ranks: 3,\n effect: (rank, level) => `Chance to add ammo: +${percent(rank, 12)}%, Cooldown: 0.3 seconds`,\n },\n \"Second Intention\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills an enemy, they gain increased Reload Speed. This bonus is increased if FL4K scores a Critical Kill.\",\n ranks: 5,\n effect: (rank, level) => `Reload Speed: +${Math.ceil(percent(rank, 2.6))}%, Critical Kill Reload Speed: +${getSecondIntentionCriticalKillReloadSpeed(rank)}%, Critical Kill Reload Speed Duration: 5 seconds`,\n },\n },\n \"2\": {\n \"Rakk Open A Cold One\": {\n text: \"Converts FL4K's Rakk to Cryo damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Deals Cryo Elemental Damage`,\n },\n \"Hunter's Eye\": {\n text: \"FL4K gains bonuses when fighting different types of enemies.\",\n ranks: 5,\n effect: (rank, level) => `Critical Hit Damage: +${percent(rank, 2.48)}% vs. Humans, Armor Damage: +${percent(rank, 6)}% vs. Robots, Damage Reduction: +${getHuntersEyeDamageReduction(rank)}% vs. Beasts`,\n },\n \"Head Count\": {\n text: \"Whenever FL4K scores a Critical Hit, there is a chance their Action Skill Cooldown is reduced.\",\n ranks: 3,\n effect: (rank, level) => `Cooldown Time Reduction Chance: +${percent(rank, 10)}%, Cooldown Time: -2 seconds`,\n },\n \"Ambush Predator\": {\n text: \"While there are no enemies nearby, FL4K's Weapon Handling and Critical Hit Damage are increased.\",\n ranks: 5,\n effect: (rank, level) => `Critical Hit Damage: +${percent(rank, 4)}%, Handling: +${getAmbushPredatorHandling(rank)}%`,\n },\n },\n \"3\": {\n \"Falconer's Feast\": {\n text: \"When FL4K's Rakk damage an enemy, a portion of FL4K's health is restored.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Health Restored: 7% of Maximum Health`,\n },\n \"Two F4ng\": {\n text: \"FL4K has a chance to fire an extra projectile per shot.\",\n ranks: 5,\n effect: (rank, level) => `Extra Projectile Chance: +${percent(rank, 5)}%`,\n },\n \"Spiderant Scorcher\": {\n text: \"FL4K's Spiderant evolves into a Scorcher, occasionally dealing Incendiary Damage to all enemies nearby. While accompanied by the Scorcher, FL4K constantly regenerates health and deals increased Elemental Damage. When FL4K issues an Attack Command, the Scorcher will charge enemies.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: +1% of Maximum Health per second, Elemental Damage: +10%`,\n },\n },\n \"4\": {\n \"Flock'N'Load\": {\n text: \"FL4K sends forward additional Rakk.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Additional Rakk: +2`,\n },\n \"Big Game\": {\n text: \"FL4K's Hunter Skills become much more effective and have a longer duration.\",\n ranks: 3,\n effect: (rank, level) => `Hunter Skill Effects: +${percent(rank, 10)}%, Hunter Skill Duration: +${Math.round(percent(rank, 33.333))}%`,\n },\n \"The Most Dangerous Game\": {\n text: \"Hunter Kill Skill. Whenever FL4K kills a Badass or stronger enemy, they gain increased Critical Hit Damage, Gun Damage, and Handling for a long time and their pet receives increased Damage for a long time. Additionally, they receive a cash reward from the Intergalactic Bureau of Bounty Hunting.\",\n ranks: 3,\n effect: (rank, level) => `Critical Hit Damage: +${Math.round(percent(rank, 8.333))}%, Gun Damage: +${percent(rank, 3.333)}%, Handling: +${getMostDangerousGameHandling(rank)}%, Pet Damage: +${percent(rank, 9)}%, Duration: 120 seconds`,\n },\n \"Spiderant Countess\": {\n text: \"FL4K's Spiderant evolves into a Countess, which will cause FL4K to constantly regenerate health and gain Damage Reduction. When FL4K issues an Attack Command, the Countess will burrow underground and then emerge dealing Corrosive Damage in an area.\",\n type: SKILLS.AUGMENT_DIAMOND,\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: +1% of Maximum Health per second, Damage Reduction: +5%`,\n },\n },\n \"5\": {\n \"Rakkcelerate\": {\n text: \"FL4K's Rakk have increased Cooldown Rate, and gain an Additional Charge.\",\n type: SKILLS.AUGMENT_CHEVRON,\n ranks: 0,\n effect: (rank, level) => `Cooldown Rate: +20%, Maximum Rakk Attack! Charges: +1`,\n },\n \"Galactic Shadow\": {\n text: \"FL4K deals increased Critical Hit Damage, and enemies are less likely to attack them.\",\n ranks: 1,\n effect: (rank, level) => `Critical Hit Damage: +15%`,\n },\n \"Grim Harvest\": {\n text: \"FL4K gains increased Gun Damage and Action Skill Damage. FL4K's Pet gains increased Damage.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%, Action Skill Damage: +${percent(rank, 5)}%, Pet Damage: +${percent(rank, 7)}%`,\n },\n },\n \"6\": {\n \"Megavore\": {\n text: \"FL4K gains a chance to score a Critical Hit with weapons against any part of enemies.\",\n ranks: 1,\n effect: (rank, level) => `Critical Hit Chance: +20%`,\n },\n },\n },\n};\n\nexport default skills;\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Gunner ({ path }) {\n return (\n \n );\n}\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Operative ({ path }) {\n return (\n \n );\n}\n","export function getLevel (state) {\n return state.invested.reduce((total, current) => total + current, 2);\n};\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Bottomless Mags\": {\n \"0\": {\n \"Minigun\": {\n text: \"The Minigun is capable of sustained rapid fire. Firing for long periods causes the Minigun to overheat, rendering it inoperable for a few seconds.\",\n type: SKILLS.ACTION_SKILL,\n effect: (rank, level) => `Put a little lead in the air and see what falls over.`,\n },\n },\n \"1\": {\n \"Cloud of Lead\": {\n text: \"Occasionally, Moze's and Iron Bear's shots will deal additional Fire Damage and won't consume ammo.\",\n ranks: 5,\n effect: (rank, level) => `Bonus Fire Damage: +${percent(rank, 2.25)}%, Every ${9 - rank} shots does not consume ammo`,\n },\n \"Dakka Bear\": {\n text: \"Adds a manned turret to the back of Iron Bear.\",\n ranks: 1,\n effect: (rank, level) => `Fasten your seatbelt, it's going to be a bumpy ride.`,\n },\n \"Matched Set\": {\n text: \"Moze's currently equipped weapon gains a stacking bonus to Magazine Size and Decreased Heat Per Shot for every piece of Equipped Gear that has a matching manufacturer.\",\n ranks: 5,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 2)}%, Heat Per Shot: -${percent(rank, 2)}%`,\n },\n },\n \"2\": {\n \"Let Off Some Steam\": {\n text: \"Minigun deals more damage as heat increases, and can be fired for longer before overheating.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Damage: up to +80%, Minigun Heat Capacity: +35%`,\n },\n \"Stoke the Embers\": {\n text: \"Increases Moze and Iron Bear's Fire Damage.\",\n ranks: 3,\n effect: (rank, level) => `Fire Damage: +${percent(rank, 10)}%%`,\n },\n \"Redistribution\": {\n text: \"After Moze scores a Critical Hit, she regenerates ammo for a few seconds.\",\n ranks: 1,\n effect: (rank, level) => `Ammo Regeneration: +${percent(rank, 5)}% of Magazine, Redistribution Duration: 3 seconds`,\n },\n \"Scrappy\": {\n text: \"Increases Moze's Handling. While moving, Moze's Weapon Swap and Mode Switch Speed are increased.\",\n ranks: 5,\n effect: (rank, level) => `Handling: +${percent(rank, 7.5)}%, Weapon Swap Speed: +${percent(rank, 7.5)}%, Mode Switch Speed: +${percent(rank, 7.5)}%`,\n },\n \"Salamander\": {\n text: \"The Salamander is a flamethrower that deals Fire Damage to enemies at close range. Though the Salamander has infinite ammo, it drains Fuel with use.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `Fire... for effect.`,\n },\n },\n \"3\": {\n \"General Winter\": {\n text: \"Minigun fires Cryo rounds which reduce Heat Gain and Fuel Drain, but deal reduced damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: -40%, Minigun Damage: -30%, Cryo Efficiency: +20%, Converts to Cryo Damage`,\n },\n \"Rushin' Offensive\": {\n text: \"Moze can sprint and shoot at the same time.\",\n ranks: 1,\n effect: (rank, level) => `I don't want any messages saying \"I'm holding my position.\"`,\n },\n \"Scorching RPM's\": {\n text: \"Moze gains increased Fire Rate and Critical Hit Damage.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 1.5)}%, Critical Hit Damage: +${percent(rank, 2.5)}%`,\n },\n \"Fuel Economy\": {\n text: \"Reduces Salamander's Fuel Drain. Additionally, Iron Bear's Movement Speed is increased after damaging an enemy with Salamander.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: -25%, Movement Speed: +25% for 3s`,\n },\n },\n \"4\": {\n \"Exploding. Bullets.\": {\n text: \"Minigun fires Explosive Rounds that deal increased Splash Damage, but its Fire Rate is decreased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Minigun Fire Rate: -75%, Minigun Damage: +126%`,\n },\n \"The Iron Bank\": {\n text: \"Increases Moze's Magazine Size.\",\n ranks: 5,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 4)}%`,\n },\n \"Specialist Bear\": {\n text: \"Equipping two of the same Weapons on Iron Bear increases the damage they deal.\",\n ranks: 1,\n effect: (rank, level) => `Iron Bear Damage: +${percent(rank, 10)}%`,\n },\n \"Chemical Warfare\": {\n text: \"Salamander now deals Corrosive Damage. Additionally, Salamander's Melt Damage is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Melt Damage: +50%, Converts to Corrosive Damage`,\n },\n },\n \"5\": {\n \"Some for the Road\": {\n text: \"Moze gains infinite ammo for a few seconds after exiting Iron Bear.\",\n ranks: 1,\n effect: (rank, level) => `Some for the Road Duration: 5 seconds`,\n },\n \"Click, Click\": {\n text: \"Moze gains increased Gun Damage as her magazine empties. The less ammo there is remaining, the greater the increase.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: up to +${percent(rank, 12)}%`,\n },\n \"Molten Roar\": {\n text: \"The Salamander burst-fires 3 projectiles with increased Fuel Drain, the first of which leaves a large Fire area.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: +25%`,\n },\n },\n \"6\": {\n \"Forge\": {\n text: \"Moze constantly regenerates ammo for her currently equipped weapon.\",\n ranks: 1,\n effect: (rank, level) => `Ammo Regeneration: +${percent(rank, 1.5)}% of magazine/sec`,\n },\n },\n },\n \"Demolition Woman\": {\n \"0\": {\n \"V-35 Grenade Launcher\": {\n text: \"The V-35 is a semi-automatic grenade launcher. Its grenades are not affected by Moze's equipped grenade mod.\",\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n effect: (rank, level) => `For when the V-34 just isn't enough`,\n },\n },\n \"1\": {\n \"Fire in the Skag Den\": {\n text: \"Whenever Moze deals Splash Damage, she deals bonus Fire Damage.\",\n ranks: 5,\n effect: (rank, level) => `Bonus Fire Damage: +${percent(rank, 3)}%`,\n },\n \"Deadlines\": {\n text: \"Firing Iron Bear Weapons drains less Fuel. Killing an enemy while Iron Bear is active increases Fuel. This skill has diminishing returns.\",\n ranks: 3,\n effect: (rank, level) => `Fuel Returned: Up to ${percent(rank, 2)}%, Fuel Drain: -${percent(rank, 10)}%`,\n },\n \"Grizzled\": {\n text: \"Kill Skill. Killing an enemy reduces Moze's remaining Action Skill Cooldown Time. This skill has diminishing returns.\",\n ranks: 5,\n effect: (rank, level) => `Iron Bear Cooldown Time: -${rank * 1}) seconds`,\n },\n },\n \"2\": {\n \"Shaped Charge\": {\n text: \"Direct hits with the V-35 deal increased damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Direct Hit Damage: +35%`,\n },\n \"Means of Destruction\": {\n text: \"Whenever Moze deals Splash Damage, there is a chance to add ammo to her currently equipped weapon's magazine, with a smaller chance to return a grenade.\",\n ranks: 3,\n effect: (rank, level) => `Ammo Chance: ${percent(rank, 3.3)}%, Grenade Chance: ${percent(rank, 2)}%`,\n },\n \"Torgue Cross-Promotion\": {\n text: \"All Splash Damage dealt by Moze has a chance to double in size.\",\n ranks: 5,\n effect: (rank, level) => `+${percent(rank, 3)}% chance to double Splash Damage Radius`,\n },\n \"Stainless Steel Bear\": {\n text: \"Iron Bear gains additional armor and increased Maximum Fuel.\",\n ranks: 5,\n effect: (rank, level) => `Maximum Fuel: +${percent(rank, 4)}%, Iron Bear Armor: +${percent(rank, 6)}%`,\n },\n \"Vanquisher Rocket Pod\": {\n text: \"The Vanquisher Rocket Pod is a rocket launcher capable of rapid-firing volleys of unguided explosive rockets.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `If you want guidance, get a sherpa. If you want explosions, get a Vladof.`,\n },\n },\n \"3\": {\n \"Musical Chairs\": {\n text: \"Occasionally, the V-35 fires a Singularity Grenade that pulls in nearby enemies before exploding.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Singularity: Every 7th grenade`,\n },\n \"Pull the Holy Pin\": {\n text: \"Moze's grenades have a chance to score a Critical Hit, dealing greatly increased damage.\",\n ranks: 3,\n effect: (rank, level) => `Critical Hit Chance: +${percent(rank, 10)}%`,\n },\n \"Auto Bear\": {\n text: \"After Moze exits Iron Bear, it will remain deployed in place for a short time. While Auto Bear remains active, it will target and attack nearby enemies until its duration ends, then it will charge at an enemy and self-destruct.\",\n ranks: 1,\n effect: (rank, level) => `Auto Bear Duration: 15 seconds`,\n },\n \"Active Tracking\": {\n text: \"The Vanquisher Rocket Pod now fires homing rockets and has increased Reload Speed. Hold down Fire Button and aim at enemies to designate up to 6 targets. Releasing Fire Button launches a volley of homing rockets at the designated targets.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Reload Speed: +25%`,\n },\n },\n \"4\": {\n \"Lock and Speedload\": {\n text: \"The V-35's Reload Speed is greatly increased and it now fires a 5-round burst.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Reload Speed: +25%`,\n },\n \"Vampyr\": {\n text: \"Whenever Moze damages an enemy with a grenade, for every enemy hit, she restores a portion of her missing health.\",\n ranks: 5,\n effect: (rank, level) => `Restores +${percent(rank, 4)}% of missing health per enemy hit`,\n },\n \"Why Can't I Carry All These Grenades\": {\n text: \"Increases Moze's grenade carrying capacity\",\n ranks: 3,\n effect: (rank, level) => `Grenade Capacity: +${rank}`,\n },\n \"Target Softening\": {\n text: \"The Vanquisher Rocket Pod deals greatly reduced damage per rocket, but fires in a 6-rocket spread. Additionally, enemies hit by Vanquisher Rocket Pod rockets take increased damage frmo all sources.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Damage: -74%, Enemy Damage Taken: +15%`,\n },\n },\n \"5\": {\n \"To the Last\": {\n text: \"Moze gains the ability to throw grenades while in Fight For Your Life. If she threw a grenade before gaining Second Wind, a grenade is refunded.\",\n ranks: 1,\n effect: (rank, level) => `The greatest enemy is one with nothing to lose... and a grenade.`,\n },\n \"Explosive Punctuation\": {\n text: \"When Moze deals Splash Damage, her Action Skill Cooldown Rate is briefly increased.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Cooldown Rate: +${percent(rank, 5)}%`,\n },\n \"Hammerdown Protocol\": {\n text: \"Instead of a volley of conventional rockets, the Vanquisher Rocket Pod launches a single rocket with a nuclear warhead, dealing massive Radiation Damage.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Damage: +380%, Magazine Size: 1`,\n },\n },\n \"6\": {\n \"Short Fuse\": {\n text: \"Whenever Moze deals Gun Damage, there is a chance of a secondary explosion centered on the target.\",\n ranks: 1,\n effect: (rank, level) => `Secondary Explosion Chance: 20%, Secondary Explosion Damage: 75% of Gun Damage`,\n },\n },\n },\n \"Shield of Retribution\": {\n \"0\": {\n \"Railgun\": {\n text: \"The Railgun fires electrified high-velocity projectiles that deal Shock Damage\",\n type: SKILLS.ACTION_SKILL,\n effect: (rank, level) => `It's like a bullet, only bigger. And faster. And wrapped in lightning.`,\n },\n },\n \"1\": {\n \"Selfless Vengeance\": {\n text: \"Whenever Moze reloads, she loses a small portion of her health and grants additional Fire Damage to her and her allies' rounds for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Bonus Fire Damage: +${percent(rank, 3)}% of gun damage dealt, Current Health Removed: ${percent(rank, 1)}%, Selfless Vengeance Duration: 5 sec`,\n },\n \"Security Bear\": {\n text: \"Iron Bear gains a bubble shield that reduces damage taken. The shield deactivates if it sustains too much damage, reactivating after a short cooldown.\",\n ranks: 1,\n effect: (rank, level) => `Bubble Recharge Delay: 5sec, 20% Iron Bear Max Health added as Shields`,\n },\n \"Armored Infantry\": {\n text: \"While Moze's shields are active, she gains Damage Reduction and Increased Gun Damage.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%, Damage Reduction: +${percent(rank, 2)}%`,\n },\n },\n \"2\": {\n \"Hell on Rails\": {\n text: \"Railgun now fires superheated rounds that deal Fire Damage, but have increased Fuel Drain per shot.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: +30%, Converts to Fire Damage`,\n },\n \"Drowning in Brass\": {\n text: \"Kill Skill. Killing an enemy grants Moze a stack of Drowning in Brass. For each stack of Drowning in Brass, Moze's Fire Rate is reduced, but Gun Damage is increased for both her and her allies.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% per stack, Moze Fire Rate: -${percent(rank, 0.5)}% per stack, Max Drowning In Brass Stacks: ${2 + rank}`,\n },\n \"Thin Red Line\": {\n text: \"A portion of Moze's health is removed and cannot be restored, but her Maximum Shield is increased by the same amount.\",\n ranks: 3,\n effect: (rank, level) => `+${percent(rank, 20)}% Max Health Removed and Added to Max Shields`,\n },\n \"Vladof Ingenuity\": {\n text: \"Moze's Maximum Shield is increased, and she gains resistance to Shock Damage.\",\n ranks: 5,\n effect: (rank, level) => `Max Shield: +${percent(rank, 6)}%, Shock Damage Resistance: +${percent(rank, 10)}%`,\n },\n \"Bear Fist\": {\n text: \"The Bear Fist is a pneumatic-driven fist that deals massive damage to a single target at close range.\",\n type: SKILLS.AUGMENT_ACTION_SKILL,\n effect: (rank, level) => `Vladof supports the right to bear armored bear arms.`,\n },\n },\n \"3\": {\n \"Capacitive Armature\": {\n text: \"When Railgun hits an enemy, it chains to nearby enemies, dealing reduced Shock Damage to more targets.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Splinter Damage: -75%`,\n },\n \"Full Can of Whoop-Ass\": {\n text: \"Entering Iron Bear causes Moze's and her allies' shields to immediately begin recharging at an increased Shield Recharge Rate.\",\n ranks: 1,\n effect: (rank, level) => `Shield Recharge Rate: +25%`,\n },\n \"Experimental Munitions\": {\n text: \"Whenever Moze scores a Critical Hit, she deals bonus Fire Damage.\",\n ranks: 1,\n effect: (rank, level) => `Bonus Fire Damage: +${percent(rank, 10)}% of damage dealt`,\n },\n \"Wild Swing\": {\n text: \"Whenever Bear Fist hits an enemy, it deals random Bonus Elemental Damage to that enemy and all enemies nearby.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Elemental Damage: +35% of damage dealt`,\n },\n },\n \"4\": {\n \"Corrosive Sabot Round\": {\n text: \"Railgun now fires a specialty round that deals reduced damage and explodes after a short delay. Railgun shots have reduced Fuel Drain and the Magazine Size is increased.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Fuel Drain: -50%, Railgun Damage: -50%, Magazine Size: 2, Converts to Corrosive Damage`,\n },\n \"Behind the Iron Curtain\": {\n text: \"Moze's Shield Recharge Delay is reduced, and her Shield Recharge Rate is increased.\",\n ranks: 3,\n effect: (rank, level) => `Shield Recharge Rate: +${percent(rank, 7)}%, Shield Recharge Delay: -${percent(rank, 8)}%`,\n },\n \"Desperate Measures\": {\n text: \"Moze's Gun Damage is increased depending on how low her health is. The lower her health, the greater the increase.\",\n ranks: 3,\n effect: (rank, level) => `Gun Damage: Up to +${percent(rank, 17)}%`,\n },\n \"Close the Distance\": {\n text: \"Instead of punching, Bear Fist now launches its fist forward and grabs enemies at greatly increased range, pulling them back to Iron Bear.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Step into my office.`,\n },\n },\n \"5\": {\n \"Phalanx Doctrine\": {\n text: \"Kill Skill: After killing an enemy, Moze gains a stack of Phalanx Doctrine. Moze's Maximum Shield and Gun Damage are increased. Each stack lasts 30 seconds. There is no stack limit.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 2)}% per stack, Max Shields: +${percent(rank, 3)}% per stack, Phalanx Doctrine Duration: 30 seconds`,\n },\n \"Force Feedback\": {\n text: \"Whenever Moze scores a Critical Kill, her shields immediately begin recharging.\",\n ranks: 1,\n effect: (rank, level) => `Just click on their heads.`,\n },\n \"Shockhammer\": {\n text: \"Bear Fist is now capable of sustained rapid fire, punching as long as the fire button is held. Additionally, Bear Fist has reduced Fuel Drain and deals Bonus Shock Damage with each hit.\",\n type: SKILLS.AUGMENT_CHEVRON,\n effect: (rank, level) => `Shock Damage: +19% of damage dealt, Fuel Drain: -40%`,\n },\n },\n \"6\": {\n \"Tenacious Defense\": {\n text: \"Whenever Moze's shield is fully depleted, she instantly restores a portion of her shield, and her Gun Damage is increased for a short time. This skill can only trigger after Moze's shields have fully recharged.\",\n ranks: 1,\n effect: (rank, level) => `Gun Damage: +12%, Restores: +40% of Max Shield, Tenacious Defense Duration: 30 seconds`,\n },\n },\n },\n};\n\nexport default skills;\n","!function(){\"use strict\";function e(e,t){var n,o,r,i,l=W;for(i=arguments.length;i-- >2;)P.push(arguments[i]);t&&null!=t.children&&(P.length||P.push(t.children),delete t.children);while(P.length)if((o=P.pop())&&void 0!==o.pop)for(i=o.length;i--;)P.push(o[i]);else\"boolean\"==typeof o&&(o=null),(r=\"function\"!=typeof e)&&(null==o?o=\"\":\"number\"==typeof o?o+=\"\":\"string\"!=typeof o&&(r=!1)),r&&n?l[l.length-1]+=o:l===W?l=[o]:l.push(o),n=r;var a=new T;return a.nodeName=e,a.children=l,a.attributes=null==t?void 0:t,a.key=null==t?void 0:t.key,void 0!==M.vnode&&M.vnode(a),a}function t(e,t){for(var n in t)e[n]=t[n];return e}function n(e,t){null!=e&&(\"function\"==typeof e?e(t):e.current=t)}function o(n,o){return e(n.nodeName,t(t({},n.attributes),o),arguments.length>2?[].slice.call(arguments,2):n.children)}function r(e){!e.__d&&(e.__d=!0)&&1==V.push(e)&&(M.debounceRendering||D)(i)}function i(){var e;while(e=V.pop())e.__d&&x(e)}function l(e,t,n){return\"string\"==typeof t||\"number\"==typeof t?void 0!==e.splitText:\"string\"==typeof t.nodeName?!e._componentConstructor&&a(e,t.nodeName):n||e._componentConstructor===t.nodeName}function a(e,t){return e.__n===t||e.nodeName.toLowerCase()===t.toLowerCase()}function u(e){var n=t({},e.attributes);n.children=e.children;var o=e.nodeName.defaultProps;if(void 0!==o)for(var r in o)void 0===n[r]&&(n[r]=o[r]);return n}function c(e,t){var n=t?document.createElementNS(\"http://www.w3.org/2000/svg\",e):document.createElement(e);return n.__n=e,n}function p(e){var t=e.parentNode;t&&t.removeChild(e)}function s(e,t,o,r,i){if(\"className\"===t&&(t=\"class\"),\"key\"===t);else if(\"ref\"===t)n(o,null),n(r,e);else if(\"class\"!==t||i)if(\"style\"===t){if(r&&\"string\"!=typeof r&&\"string\"!=typeof o||(e.style.cssText=r||\"\"),r&&\"object\"==typeof r){if(\"string\"!=typeof o)for(var l in o)l in r||(e.style[l]=\"\");for(var l in r)e.style[l]=\"number\"==typeof r[l]&&!1===E.test(l)?r[l]+\"px\":r[l]}}else if(\"dangerouslySetInnerHTML\"===t)r&&(e.innerHTML=r.__html||\"\");else if(\"o\"==t[0]&&\"n\"==t[1]){var a=t!==(t=t.replace(/Capture$/,\"\"));t=t.toLowerCase().substring(2),r?o||e.addEventListener(t,_,a):e.removeEventListener(t,_,a),(e.__l||(e.__l={}))[t]=r}else if(\"list\"!==t&&\"type\"!==t&&!i&&t in e){try{e[t]=null==r?\"\":r}catch(e){}null!=r&&!1!==r||\"spellcheck\"==t||e.removeAttribute(t)}else{var u=i&&t!==(t=t.replace(/^xlink:?/,\"\"));null==r||!1===r?u?e.removeAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase()):e.removeAttribute(t):\"function\"!=typeof r&&(u?e.setAttributeNS(\"http://www.w3.org/1999/xlink\",t.toLowerCase(),r):e.setAttribute(t,r))}else e.className=r||\"\"}function _(e){return this.__l[e.type](M.event&&M.event(e)||e)}function f(){var e;while(e=A.shift())M.afterMount&&M.afterMount(e),e.componentDidMount&&e.componentDidMount()}function d(e,t,n,o,r,i){H++||(R=null!=r&&void 0!==r.ownerSVGElement,B=null!=e&&!(\"__preactattr_\"in e));var l=h(e,t,n,o,i);return r&&l.parentNode!==r&&r.appendChild(l),--H||(B=!1,i||f()),l}function h(e,t,n,o,r){var i=e,l=R;if(null!=t&&\"boolean\"!=typeof t||(t=\"\"),\"string\"==typeof t||\"number\"==typeof t)return e&&void 0!==e.splitText&&e.parentNode&&(!e._component||r)?e.nodeValue!=t&&(e.nodeValue=t):(i=document.createTextNode(t),e&&(e.parentNode&&e.parentNode.replaceChild(i,e),v(e,!0))),i.__preactattr_=!0,i;var u=t.nodeName;if(\"function\"==typeof u)return N(e,t,n,o);if(R=\"svg\"===u||\"foreignObject\"!==u&&R,u+=\"\",(!e||!a(e,u))&&(i=c(u,R),e)){while(e.firstChild)i.appendChild(e.firstChild);e.parentNode&&e.parentNode.replaceChild(i,e),v(e,!0)}var p=i.firstChild,s=i.__preactattr_,_=t.children;if(null==s){s=i.__preactattr_={};for(var f=i.attributes,d=f.length;d--;)s[f[d].name]=f[d].value}return!B&&_&&1===_.length&&\"string\"==typeof _[0]&&null!=p&&void 0!==p.splitText&&null==p.nextSibling?p.nodeValue!=_[0]&&(p.nodeValue=_[0]):(_&&_.length||null!=p)&&m(i,_,n,o,B||null!=s.dangerouslySetInnerHTML),y(i,t.attributes,s),R=l,i}function m(e,t,n,o,r){var i,a,u,c,s,_=e.childNodes,f=[],d={},m=0,b=0,y=_.length,g=0,w=t?t.length:0;if(0!==y)for(var C=0;C skill.ranks) { return false; }\n tierTotal += skill.invested || 0;\n };\n if (tierTotal > 0 && treeTotal + 5 < tierIndex * 5) { return false; }\n treeTotal += tierTotal;\n tierIndex += 1;\n };\n treeTotals[treeIndex] = treeTotal;\n totalSpent += treeTotal;\n treeIndex += 1;\n };\n if (totalSpent > (50 - 3) + 11 + 11) { return false; }\n return treeTotals;\n}\n","import deepmerge from 'deepmerge';\nimport investmentValidator from './investmentValidator';\nimport { setHash } from './hashHandler';\n\nexport default function reducer (state, action) {\n switch (action.type) {\n case 'skillChange':\n var newSkills = deepmerge(state.skills, {\n [action.treeName]: {\n [action.tierIndex + '']: {\n [action.skillName]: {\n invested: action.newValue,\n }\n }\n }\n });\n const skillChangeTotals = investmentValidator(newSkills);\n if (skillChangeTotals) {\n setHash(newSkills);\n return {\n ...state,\n invested: skillChangeTotals,\n skills: newSkills,\n };\n } else {\n return state;\n }\n case 'loadSkills':\n const loadSkillsTotals = investmentValidator(action.skills);\n if (loadSkillsTotals) {\n return {\n ...state,\n invested: loadSkillsTotals,\n skills: deepmerge(state.skills, action.skills),\n };\n } else {\n return state;\n }\n }\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"footer\":\"Eq4mJ\",\"heart\":\"_37Gl6\",\"moveHeart\":\"_34mPq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"splash\":\"_2_d3x\",\"wrapper\":\"vMurv\",\"link\":\"_3lx8i\",\"name\":\"_1SiOU\",\"job\":\"_3chgr\",\"disclaimer\":\"_3RIFV\"};","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.deepmerge = factory());\n}(this, (function () { 'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tObject.keys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tObject.keys(source).forEach(function(key) {\n\t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nreturn deepmerge_1;\n\n})));\n","import SKILLS from '@constants/skills';\nimport style from './index.css';\n\nfunction getInitials (string) {\n const numWords = (string.match(/\\s/g) || []).length + 1;\n switch (numWords) {\n case 1:\n return string.slice(0, 3);\n case 2:\n return (string.match(/^\\w{1,2}|\\s\\w{1,2}/g) || []).join('').replace(/\\s/g, '');\n default:\n return (string.match(/^\\w|\\s\\w/g) || []).join('').replace(/\\s/g, '');\n }\n}\n\nexport default function Skill ({\n name = '?',\n text = 'Long description',\n ranks = 0,\n invested = 0,\n tier = 0,\n level = 1,\n effect = (rank, level) => `Rank ${rank} effect`,\n type = null,\n enabled = true,\n image = null,\n onChange = (oldValue, newValue) => null,\n}) {\n const isAugment = [\n SKILLS.AUGMENT_CHEVRON,\n SKILLS.AUGMENT_DIAMOND,\n SKILLS.AUGMENT_ACTION_SKILL,\n ].includes(type);\n let shapeStyle = null;\n if (type === SKILLS.ACTION_SKILL) { shapeStyle = style.actionSkill; }\n if (type === SKILLS.AUGMENT_CHEVRON) { shapeStyle = style.chevron; }\n if (type === SKILLS.AUGMENT_DIAMOND) { shapeStyle = style.diamond; }\n if (type === SKILLS.AUGMENT_ACTION_SKILL) { shapeStyle = style.actionSkill; }\n function clickListener (event) {\n var newValue;\n if (event.type === 'click') {\n newValue = Math.min(invested + 1, ranks);\n } else { // (event.type === 'contextmenu')\n newValue = Math.max(invested - 1, 0);\n }\n if (enabled && invested !== newValue) {\n onChange(invested, newValue);\n }\n event.preventDefault();\n return false;\n }\n return (\n
\n );\n}\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Siren ({ path }) {\n return (\n \n );\n}\n","export function setHash (skillsState) {\n const hashparts = [];\n for (let tree of Object.values(skillsState)) {\n for (let tier of Object.values(tree)) {\n for (let skill of Object.values(tier)) {\n if (skill.type == null) {\n hashparts.push(skill.invested || 0);\n }\n };\n };\n };\n const url = window.location.href.split('#')[0] + '#' + hashparts.join('');\n window.location.replace(url);\n};\n\nexport function getHash (skillsState) {\n const hash = window.location.href.split('#')[1] || '';\n const hashparts = hash.match(/./g) || [];\n const skills = JSON.parse(JSON.stringify(skillsState));\n for (let tree of Object.keys(skills)) {\n for (let tier of Object.keys(skills[tree])) {\n for (let skill of Object.keys(skills[tree][tier])) {\n if (skills[tree][tier][skill].type == null) {\n skills[tree][tier][skill] = { invested: parseInt(hashparts.shift() || 0) };\n } else {\n skills[tree][tier][skill] = {};\n }\n };\n };\n };\n return skills;\n};\n","import VaultHunter from '@components/VaultHunter';\n\nimport skills from './skills.js';\n\nexport default function Beastmaster ({ path }) {\n return (\n \n );\n}\n","import SKILLS from '@constants/skills';\n\nfunction percent (rank, unit) {\n return Math.round(rank * unit * 10) / 10;\n}\nfunction flat (rank, level, unit) {\n return Math.floor(rank * unit);\n}\n\n// Stiff Upper Lip Damage Resistance\nfunction getStiffUpperLipDamageResistance(rank) {\n switch (rank) {\n case 1:\n return 6;\n case 2:\n return 12;\n case 3:\n return 16;\n default:\n return 0;\n }\n}\n\n// Nerves of Steel Handling\nfunction getNervesOfSteelHandling(rank) {\n switch (rank) {\n case 1:\n return 2.4;\n case 2:\n return 4.8;\n case 3:\n return 7;\n default:\n return 0;\n }\n}\n\n// Cold Bore Weapon Swap Speed\nfunction getColdBoreWeaponSwapSpeed(rank) {\n switch (rank) {\n case 1:\n return 13;\n case 2:\n return 23;\n case 3:\n return 31;\n case 4:\n return 38;\n case 5:\n return 43;\n default:\n return 0;\n }\n}\n\n// Cool Hand Passive Reload Speed\nfunction getCoolHandPassiveReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 2.9;\n case 2:\n return 5.7;\n case 3:\n return 8.3;\n case 4:\n return 10.7;\n case 5:\n return 13;\n default:\n return 0;\n }\n}\n\n// Cool Hand After Kill Reload Speed\nfunction getCoolHandAfterKillReloadSpeed(rank) {\n switch (rank) {\n case 1:\n return 4;\n case 2:\n return 7;\n case 3:\n return 11;\n case 4:\n return 14;\n case 5:\n return 17;\n default:\n return 0;\n }\n}\n\n/* eslint-disable quotes */\nconst skills = {\n \"Under Cover\": {\n \"0\": {\n \"Barrier\": {\n text: \"Drop a deployable Barrier that blocks incoming projectiles. Zane and his allies can shoot through the Barrier, dealing increased Gun Damage. Pressing [Action Skill key] while Barrier is active picks up and holds the Barrier, but the size and bonuses are decreased.\",\n effect: (rank, level) => `Duration: 14 seconds, Cooldown: 24 seconds, Gun Damage Amp: +25%`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Adrenaline\": {\n text: \"Zane gains increased Action Skill Cooldown Rate. This bonus is based on the amount of shield he has. The more percent full, the greater the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Cooldown Rate: Up to +${percent(rank, 7)}%`,\n },\n \"Hearty Stock\": {\n text: \"Zane gains increased Maximum Shield Capacity.\",\n ranks: 3,\n effect: (rank, level) => `Maximum Shield Capacity: +${percent(rank, 10)}%`,\n },\n \"Ready for Action\": {\n text: \"Zane gains improved Shield Recharge Rate and Shield Recharge Delay.\",\n ranks: 5,\n effect: (rank, level) => `Shield Recharge Rate: +${percent(rank, 6)}%, Shield Recharge Delay: -${percent(rank, 7)}%`,\n },\n },\n \"2\": {\n \"Charged Relay\": {\n text: \"Whenever Zane or an ally touches the Barrier, they gain increased Movement Speed and Reload Speed for a few seconds.\",\n ranks: 0,\n effect: (rank, level) => `Reload Speed: +20%, Movement Speed: +11%, Duration: 8 seconds after moving away from Barrier`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Brainfreeze\": {\n text: \"Whenever Zane scores a Critical Hit on an enemy, there is a chance they will be Slowed. This effect stacks until the target is Frozen.\",\n ranks: 5,\n effect: (rank, level) => `Slow Chance: +${percent(rank, 4)}%`,\n },\n \"Stiff Upper Lip\": {\n text: \"Whenever Zane is damaged, he gains Damage Resistance against that damage type.\",\n ranks: 3,\n effect: (rank, level) => `Damage Resistance: +${getStiffUpperLipDamageResistance(rank)}%`,\n },\n \"Rise to the Occasion\": {\n text: \"Zane gains Health Regeneration. The lower his shield is, the higher the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Health Regeneration: Up to +${percent(rank, 1)}% of Maximum Health per second`,\n },\n },\n \"3\": {\n \"Nanites or Some Shite\": {\n text: \"Zane and his allies gain Health Regeneration, increased Reload Speed, and greatly improved Shield Recharge Delay while near his Barrier. The lower their health, the more health is regenerated.\",\n ranks: 0,\n effect: (rank, level) => `Health Regeneration: Up to +4% of Maximum Health per second, Shield Recharge Delay: -33%, Reload Speed: +11%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Confident Competence\": {\n text: \"While Zane's shields are active, he gains increased Gun Damage and Accuracy. These bonuses are based on the amount of shields he has. The more percent full, the greater the bonuses.\",\n ranks: 1,\n effect: (rank, level) => `Gun Damage: Up to +35%, Accuracy: Up to +33%`,\n },\n \"All-Rounder\": {\n text: \"Zane's Barrier becomes a dome, covering all sides.\",\n ranks: 0,\n effect: (rank, level) => `Barrier Cooldown: +20%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Redistribution\": {\n text: \"Zane and allies near the Barrier gain increased Gun Damage for a few seconds after the Barrier takes damage.\",\n ranks: 0,\n effect: (rank, level) => `Gun Damage: +10%, Duration: 3 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Really Expensive Jacket\": {\n text: \"Elemental Status Effects applied to Zane have reduced duration.\",\n ranks: 1,\n effect: (rank, level) => `Status Effect Duration: -50%`,\n },\n \"Best Served Cold\": {\n text: \"Kill Skill. Whenever Zane kills an enemy, they create a Cryo Nova, dealing damage to all nearby enemies. This skill has a short cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Damage: ${flat(rank, level, 2)} (increases with character level), Cooldown: 3 seconds`,\n },\n \"Futility Belt\": {\n text: \"Zane gains resistance to non-elemental damage. Kill Skill. After killing an enemy, all elemental damage Zane takes is converted to non-elemental damage.\",\n ranks: 1,\n effect: (rank, level) => `Damage Reduction: +15%, Duration: 8 seconds`,\n },\n \"Deterrence Field\": {\n text: \"Enemies that touch the Barrier take Shock Damage and are staggered.\",\n ranks: 0,\n effect: (rank, level) => `Shock Damage: ${flat(1, level, 27)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Refreshment\": {\n text: \"Whenever Zane damages a frozen enemy with his weapon, he gains some of that damage back as health.\",\n ranks: 3,\n effect: (rank, level) => `Life Steal: +${percent(rank, 8)}% of damage dealt`,\n },\n \"Calm, Cool, Collected\": {\n text: \"Whenever Zane Freezes an enemy, his shield instantly begins recharging. If Zane's shields are already full, he regenerates health for a few seconds. If Zane's health is already full, his Action Skill Cooldowns and Durations are immediately reset.\",\n ranks: 1,\n effect: (rank, level) => `Health Regeneration: +3% of Maximum Health per second, Health Regeneration Duration: 3 seconds`,\n },\n \"Nerves of Steel\": {\n text: \"Zane gains increasing Accuracy and Handling. The longer his shield is full, the greater the bonuses.\",\n ranks: 3,\n effect: (rank, level) => `Accuracy: +${percent(rank, 2)}% per second, Handling: +${getNervesOfSteelHandling(rank)}% per second, Maximum Nerves of Steel Stacks: 15`,\n },\n },\n \"6\": {\n \"Distributed Denial\": {\n text: \"Zane's Barrier gains the effects of his currently equipped Shield Mod. Additionally, shield effects are applied to all allies near the Barrier. Bonuses to Zane are reduced.\",\n ranks: 1,\n },\n },\n },\n \"Hitman\": {\n \"0\": {\n \"SNTNL\": {\n text: \"Send into battle an automated SNTL drone that continually flies through the environment and attacks enemies with its Machine Guns. Pressing [Action Skill key] while SNTNL is active causes it to attack the enemy under Zane's crosshairs, if any.\",\n effect: (rank, level) => `Machine Gun Damage: ${flat(rank, level, 6)} (increases with character level), Duration: 24 seconds, Cooldown: 60 seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n }\n },\n \"1\": {\n \"Violent Speed\": {\n text: \"Kill Skill. After killing an enemy, Zane gains increased Movement Speed for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Movement Speed: +${percent(rank, 4)}%, Duration: 8 seconds`,\n },\n \"Cold Bore\": {\n text: \"Zane gains increased Weapon Swap Speed. The next shot fired after swapping weapons deals Bonus Cryo Damage.\",\n ranks: 5,\n effect: (rank, level) => `Weapon Swap Speed: +${getColdBoreWeaponSwapSpeed(rank)}%, Bonus Cryo Damage: +${percent(rank, 6)}% of damage dealt`,\n },\n \"Violent Momentum\": {\n text: \"Zane's Gun Damage is increased while moving. The quicker he moves, the greater the bonus.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% at default walk speed`,\n },\n },\n \"2\": {\n \"Winter's Drone\": {\n text: \"Converts SNTNL's primary weapons to Cryo Damage.\",\n ranks: 0,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Cool Hand\": {\n text: \"Zane gains increased Reload Speed. Kill Skill. After killing an enemy, Zane's Reload Speed is increased for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Reload Speed: +${getCoolHandPassiveReloadSpeed(rank)}%, Reload Speed: +${getCoolHandAfterKillReloadSpeed(rank)}% after kill, Duration: 8 seconds `,\n },\n \"Drone Delivery\": {\n text: \"SNTRY will occasionally drop a free grenade based on your current grenade mod while attacking enemies.\",\n ranks: 1,\n effect: (rank, level) => `Cooldown: 15 seconds`,\n },\n \"Salvation\": {\n text: \"Kill Skill. After killing an enemy, Zane's weapons gain Life Steal for a few seconds.\",\n ranks: 5,\n effect: (rank, level) => `Life Steal: +${percent(rank, 2)}% of damage dealt, Duration: 8 seconds`,\n },\n },\n \"3\": {\n \"Bad Dose\": {\n text: \"SNTNL occasionally shoots out a beam of Radiation that weakens enemies and buffs Zane. For every weakened enemy, Zane's Movement Speed and Fire Rate are increased. Weakened enemies have decreased Movement Speed and Attack Speed.\",\n ranks: 0,\n effect: (rank, level) => `Fire Rate: +2% per affected enemy, Movement Speed: +6% per affected enemy, Damage ${flat(rank, level, 4)} (increases with character level), Duration: 12 seconds, Cooldown: 8 sec`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Death Follows Close\": {\n text: \"All of Zane's Kill Skills gain increased effect and duration.\",\n ranks: 1,\n effect: (rank, level) => `Kill Skill Duration: +7 seconds, Kill Skill Bonus: +25%`,\n },\n \"Static Field\": {\n text: \"SNTNL emits a static field that sends a Shock Beam to nearby enemies, draining their shields and replenishing Zane's.\",\n ranks: 0,\n effect: (rank, level) => `Shield Damage: ${flat(rank, level, 2)} per second, Cooldown: 2 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Boomsday\": {\n text: \"SNTNL adds a rocket pod to its primary weapons, allowing it to shoot rockets as well as machine guns.\",\n ranks: 0,\n effect: (rank, level) => `Rocket Damage: ${flat(rank, level, 32)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Violent Violence\": {\n text: \"Kill Skill. After killing an enemy, Zane gains increased Fire Rate for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Fire Rate: +${percent(rank, 3)}%, Cooldown: 8 seconds`,\n },\n \"Playing Dirty\": {\n text: \"Kill Skill. After killing an enemy, Zane's next five shots all have a chance to fire an additional projectile.\",\n ranks: 5,\n effect: (rank, level) => `Extra Shot Chance: +${percent(rank, 10)}%`,\n },\n \"Almighty Ordnance\": {\n text: \"Hold down [Action Skill key] while SNTNL is deployed to paint a target area. SNTNL fires a missile barrage at that area, and if an enemy is killed, SNTNL's duration is reset. This can only be used once per Action Skill use.\",\n ranks: 0,\n effect: (rank, level) => `Missile Damage: ${flat(rank, level, 56)} (increases with character level), Missiles per Barrage: 4`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Good Misfortune\": {\n text: \"Kill Skill. Killing an enemy increases Zane's Action Skill Duration. This skill has diminishing returns.\",\n ranks: 3,\n effect: (rank, level) => `Action Skill Duration: Up to +${percent(rank, 4)}% Maximum Action Skill Duration`,\n },\n },\n \"6\": {\n \"Seein' Red\": {\n text: \"Activating an Action Skill automatically activates all of Zane's Kill Skills.\",\n ranks: 1,\n }\n }\n },\n \"Doubled Agent\": {\n \"0\": {\n \"Digi-Clone\": {\n text: \"Spawn a Digi-Clone of Zane. The Digi-Clone stays in place, but distracts and fires at enemies. Pressing [Action Skill key] while the Digi-Clone is active causes Zane and the Digi-Clone to swap places.\",\n effect: (rank, level) => `Duration: 15 seconds, Cooldown: 28 seconds`,\n type: SKILLS.ACTION_SKILL,\n ranks: 0,\n },\n },\n \"1\": {\n \"Synchronicity\": {\n text: \"Zane gains increased Gun Damage for each active Action Skill.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 4)}% per active Action Skill`,\n },\n \"Praemunitus\": {\n text: \"Zane and his Dig-Clone gain increased Magazine Size.\",\n ranks: 3,\n effect: (rank, level) => `Magazine Size: +${percent(rank, 8.333)}%`,\n },\n \"Borrowed Time\": {\n text: \"Zane gains increased Action Skill Duration for each active Action Skill.\",\n ranks: 5,\n effect: (rank, level) => `Action Skill Duration: +${percent(rank, 6)}% per active Action Skill`,\n },\n },\n \"2\": {\n \"Binary System\": {\n text: \"Whenever Zane swaps places with his Digi-Clone, a Cryo Nova is triggered around Zane and his Digi-Clone.\",\n ranks: 0,\n effect: (rank, level) => `Nova Damage: ${flat(rank, level, 46)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Donnybrook\": {\n text: \"Kill Skill. Whenever Zane kills an enemy, he and his Digi-Clone receive increased Gun Damage and gain Health Regeneration for a few seconds. This effect stacks twice.\",\n ranks: 5,\n effect: (rank, level) => `Gun Damage: +${percent(rank, 3)}%, Health Regeneration: +${percent(rank, 0.5)}% of Missing Health per second, Duration: 8 sec`,\n },\n \"Fractal Frags\": {\n text: \"The Digi-Clone throws a copy of Zane's current grenade mod when it is first activated. If the Digi-Clone is killed, it drops a free grenade. Killing an enemy while the Digi-Clone is active gives the Digi-Clone a chance to throw a grenade.\",\n ranks: 1,\n effect: (rank, level) => `Grenade Chance: 30%`,\n },\n \"Duct Tape Mod\": {\n text: \"The first shot fired from Zane's gun has a chance to also fire a grenade. This skill has a short cooldown.\",\n ranks: 5,\n effect: (rank, level) => `Grenade Chance: ${percent(rank, 4)}%, Cooldown: 8 seconds`,\n },\n },\n \"3\": {\n \"Schadenfreude\": {\n text: \"Whenever the Digi-Clone takes damage, Zane's shield is restored by a portion of that damage.\",\n ranks: 0,\n effect: (rank, level) => `Shields Restored: +100% of damage taken by Digi-Clone`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Quick Breather\": {\n text: \"Whenever Zane swaps places with his Digi-Clone, his shield immediately begins recharging. The Digi-Clone also immediately restores health.\",\n ranks: 1,\n effect: (rank, level) => `Digi-Clone Heal: Up to 50% of Digi-Clone's Maximum Health`,\n },\n \"Which One's Real?\": {\n text: \"Enemies are more likely to target the Digi-Clone for a few seconds after it's summoned and after swapping places.\",\n ranks: 0,\n effect: (rank, level) => `Duration: 4 seconds`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"4\": {\n \"Dopplebanger\": {\n text: \"Hold down [Action Skill key] to end the action skill early. When Zane's Action Skill is ended, the Digi-Clone explodes, dealing Splash Damage to all nearby enemies. The more Action Skill time remaining, the greater the damage.\",\n ranks: 0,\n effect: (rank, level) => `Damage: Up to ${flat(rank, level, 280)} (increases with character level)`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n \"Pocket Full of Grenades\": {\n text: \"Kill Skill. After killing an enemy, Zane gains Grenade Regeneration for a few seconds.\",\n ranks: 3,\n effect: (rank, level) => `Grenade Regeneration: ${percent(rank, 5)}% per second, Duration: 8 seconds`,\n },\n \"Old-U\": {\n text: \"Press [Action Skill key] during Fight for Your Life if Digi-Clone is active to destroy the Digi-Clone and immediately gain a Second Wind with full health.\",\n ranks: 1,\n effect: (rank, level) => `Health Restored: 100% of Maximum Health`,\n },\n \"Supersonic Man\": {\n text: \"Zane gains increased Movement Speed for each active Action Skill.\",\n ranks: 3,\n effect: (rank, level) => `Movement Speed: +${percent(rank, 4)}% per active Action Skill`,\n },\n \"Digital Distribution\": {\n text: \"If Zane takes health damage while the Digi-Clone is active, a portion of that damage is inflicted on his Digi-Clone instead.\",\n ranks: 0,\n effect: (rank, level) => `Shared Health Damage: +75%`,\n type: SKILLS.AUGMENT_CHEVRON,\n },\n },\n \"5\": {\n \"Like a Ghost\": {\n text: \"Zane and his Digi-Clone gain a chance to ignore bullets. This chance is increased for a few seconds after activating an Action Skill. This effect stacks.\",\n ranks: 3,\n effect: (rank, level) => `Ignore Bullet Chance: +${percent(rank, 2)}%, Additional Ignore Bullet Chance: +${percent(rank, 3)}%, Duration: 8 seconds`,\n },\n \"Boom. Enhance.\": {\n text: \"Whenever Zane summons his Digi-Clone, it consumes up to 3 grenades. For every grenade consumed, the Digi-Clone gains increased Gun Damage, Maximum Health, Fire Rate, Reload Speed, and Digi-Clone Duration.\",\n ranks: 1,\n effect: (rank, level) => `Digi-Clone Gun Damage: +20% per grenade, Digi-Clone Maximum Health: +81% per grenade, Digi-Clone Fire Rate: +5% per grenade, Digi-Clone Reload Speed: +31% per grenade, Digi-Clone Duration: +25% per grenade`,\n },\n \"Trick of the Light\": {\n text: \"Zane deals Bonus Cryo Damage to enemies that aren't targeting him.\",\n ranks: 3,\n effect: (rank, level) => `Bonus Cryo Damage: +${percent(rank, 12)}% of damage dealt`,\n },\n },\n \"6\": {\n \"Double Barrel\": {\n text: \"The Digi-Clone is equipped with a copy of Zane's Current Weapon when activated. Swapping places with the Digi-Clone causes Zane and his Digi-Clone to gain increased Gun Damage.\",\n ranks: 1,\n effect: (rank, level) => `Item Duping: +100%, Gun Damage: +25%`,\n },\n },\n },\n};\n\nexport default skills;\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/gunner/index.html b/gunner/index.html
index edd8a8a..2bba17a 100644
--- a/gunner/index.html
+++ b/gunner/index.html
@@ -1 +1 @@
-Borderlands 3 Skill Planner
\ No newline at end of file
+Borderlands 3 Skill Planner
\ No newline at end of file
diff --git a/index.html b/index.html
index edd8a8a..2bba17a 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-Borderlands 3 Skill Planner
\ No newline at end of file
+Borderlands 3 Skill Planner
\ No newline at end of file
diff --git a/operative/index.html b/operative/index.html
index edd8a8a..2bba17a 100644
--- a/operative/index.html
+++ b/operative/index.html
@@ -1 +1 @@
-Borderlands 3 Skill Planner
\ No newline at end of file
+Borderlands 3 Skill Planner
\ No newline at end of file
diff --git a/siren/index.html b/siren/index.html
index edd8a8a..2bba17a 100644
--- a/siren/index.html
+++ b/siren/index.html
@@ -1 +1 @@
-Borderlands 3 Skill Planner
\ No newline at end of file
+Borderlands 3 Skill Planner
\ No newline at end of file
diff --git a/sw.js b/sw.js
index 1658def..4a15793 100644
--- a/sw.js
+++ b/sw.js
@@ -1,3 +1,3 @@
-var __wpo = {"assets":{"main":["/45598562077bdc84281b5330ff4d283e.png","/6274c9808eb08785f146a2b78283b5f6.jpg","/bundle.24252.css","/bundle.1b1eeefb.js","/assets/favicon.png","/assets/hunters/Beastmaster/000.png","/assets/hunters/Beastmaster/001.png","/assets/hunters/Beastmaster/010.png","/assets/hunters/Beastmaster/011.png","/assets/hunters/Beastmaster/012.png","/assets/hunters/Beastmaster/020.png","/assets/hunters/Beastmaster/021.png","/assets/hunters/Beastmaster/022.png","/assets/hunters/Beastmaster/023.png","/assets/hunters/Beastmaster/030.png","/assets/hunters/Beastmaster/031.png","/assets/hunters/Beastmaster/032.png","/assets/hunters/Beastmaster/033.png","/assets/hunters/Beastmaster/040.png","/assets/hunters/Beastmaster/041.png","/assets/hunters/Beastmaster/042.png","/assets/hunters/Beastmaster/043.png","/assets/hunters/Beastmaster/050.png","/assets/hunters/Beastmaster/051.png","/assets/hunters/Beastmaster/060.png","/assets/hunters/Beastmaster/100.png","/assets/hunters/Beastmaster/101.png","/assets/hunters/Beastmaster/110.png","/assets/hunters/Beastmaster/111.png","/assets/hunters/Beastmaster/112.png","/assets/hunters/Beastmaster/120.png","/assets/hunters/Beastmaster/121.png","/assets/hunters/Beastmaster/122.png","/assets/hunters/Beastmaster/123.png","/assets/hunters/Beastmaster/130.png","/assets/hunters/Beastmaster/131.png","/assets/hunters/Beastmaster/132.png","/assets/hunters/Beastmaster/133.png","/assets/hunters/Beastmaster/140.png","/assets/hunters/Beastmaster/141.png","/assets/hunters/Beastmaster/142.png","/assets/hunters/Beastmaster/143.png","/assets/hunters/Beastmaster/150.png","/assets/hunters/Beastmaster/151.png","/assets/hunters/Beastmaster/152.png","/assets/hunters/Beastmaster/160.png","/assets/hunters/Beastmaster/200.png","/assets/hunters/Beastmaster/201.png","/assets/hunters/Beastmaster/210.png","/assets/hunters/Beastmaster/211.png","/assets/hunters/Beastmaster/212.png","/assets/hunters/Beastmaster/220.png","/assets/hunters/Beastmaster/221.png","/assets/hunters/Beastmaster/222.png","/assets/hunters/Beastmaster/223.png","/assets/hunters/Beastmaster/230.png","/assets/hunters/Beastmaster/231.png","/assets/hunters/Beastmaster/232.png","/assets/hunters/Beastmaster/240.png","/assets/hunters/Beastmaster/241.png","/assets/hunters/Beastmaster/242.png","/assets/hunters/Beastmaster/243.png","/assets/hunters/Beastmaster/250.png","/assets/hunters/Beastmaster/251.png","/assets/hunters/Beastmaster/252.png","/assets/hunters/Beastmaster/260.png","/assets/hunters/Beastmaster/hero.png","/assets/hunters/Gunner/000.png","/assets/hunters/Gunner/010.png","/assets/hunters/Gunner/011.png","/assets/hunters/Gunner/012.png","/assets/hunters/Gunner/020.png","/assets/hunters/Gunner/021.png","/assets/hunters/Gunner/022.png","/assets/hunters/Gunner/023.png","/assets/hunters/Gunner/024.png","/assets/hunters/Gunner/030.png","/assets/hunters/Gunner/031.png","/assets/hunters/Gunner/032.png","/assets/hunters/Gunner/033.png","/assets/hunters/Gunner/040.png","/assets/hunters/Gunner/041.png","/assets/hunters/Gunner/042.png","/assets/hunters/Gunner/043.png","/assets/hunters/Gunner/050.png","/assets/hunters/Gunner/051.png","/assets/hunters/Gunner/052.png","/assets/hunters/Gunner/060.png","/assets/hunters/Gunner/100.png","/assets/hunters/Gunner/110.png","/assets/hunters/Gunner/111.png","/assets/hunters/Gunner/112.png","/assets/hunters/Gunner/120.png","/assets/hunters/Gunner/121.png","/assets/hunters/Gunner/122.png","/assets/hunters/Gunner/123.png","/assets/hunters/Gunner/124.png","/assets/hunters/Gunner/130.png","/assets/hunters/Gunner/131.png","/assets/hunters/Gunner/132.png","/assets/hunters/Gunner/133.png","/assets/hunters/Gunner/140.png","/assets/hunters/Gunner/141.png","/assets/hunters/Gunner/142.png","/assets/hunters/Gunner/143.png","/assets/hunters/Gunner/150.png","/assets/hunters/Gunner/151.png","/assets/hunters/Gunner/152.png","/assets/hunters/Gunner/160.png","/assets/hunters/Gunner/200.png","/assets/hunters/Gunner/210.png","/assets/hunters/Gunner/211.png","/assets/hunters/Gunner/212.png","/assets/hunters/Gunner/220.png","/assets/hunters/Gunner/221.png","/assets/hunters/Gunner/222.png","/assets/hunters/Gunner/223.png","/assets/hunters/Gunner/224.png","/assets/hunters/Gunner/230.png","/assets/hunters/Gunner/231.png","/assets/hunters/Gunner/232.png","/assets/hunters/Gunner/233.png","/assets/hunters/Gunner/240.png","/assets/hunters/Gunner/241.png","/assets/hunters/Gunner/242.png","/assets/hunters/Gunner/243.png","/assets/hunters/Gunner/250.png","/assets/hunters/Gunner/251.png","/assets/hunters/Gunner/252.png","/assets/hunters/Gunner/260.png","/assets/hunters/Gunner/hero.png","/assets/hunters/Operative/000.png","/assets/hunters/Operative/010.png","/assets/hunters/Operative/011.png","/assets/hunters/Operative/012.png","/assets/hunters/Operative/020.png","/assets/hunters/Operative/021.png","/assets/hunters/Operative/022.png","/assets/hunters/Operative/023.png","/assets/hunters/Operative/030.png","/assets/hunters/Operative/031.png","/assets/hunters/Operative/032.png","/assets/hunters/Operative/040.png","/assets/hunters/Operative/041.png","/assets/hunters/Operative/042.png","/assets/hunters/Operative/043.png","/assets/hunters/Operative/044.png","/assets/hunters/Operative/050.png","/assets/hunters/Operative/051.png","/assets/hunters/Operative/052.png","/assets/hunters/Operative/060.png","/assets/hunters/Operative/100.png","/assets/hunters/Operative/110.png","/assets/hunters/Operative/111.png","/assets/hunters/Operative/112.png","/assets/hunters/Operative/120.png","/assets/hunters/Operative/121.png","/assets/hunters/Operative/122.png","/assets/hunters/Operative/123.png","/assets/hunters/Operative/130.png","/assets/hunters/Operative/131.png","/assets/hunters/Operative/132.png","/assets/hunters/Operative/140.png","/assets/hunters/Operative/141.png","/assets/hunters/Operative/142.png","/assets/hunters/Operative/143.png","/assets/hunters/Operative/150.png","/assets/hunters/Operative/160.png","/assets/hunters/Operative/200.png","/assets/hunters/Operative/210.png","/assets/hunters/Operative/211.png","/assets/hunters/Operative/212.png","/assets/hunters/Operative/220.png","/assets/hunters/Operative/221.png","/assets/hunters/Operative/222.png","/assets/hunters/Operative/223.png","/assets/hunters/Operative/230.png","/assets/hunters/Operative/231.png","/assets/hunters/Operative/232.png","/assets/hunters/Operative/240.png","/assets/hunters/Operative/241.png","/assets/hunters/Operative/242.png","/assets/hunters/Operative/243.png","/assets/hunters/Operative/244.png","/assets/hunters/Operative/250.png","/assets/hunters/Operative/251.png","/assets/hunters/Operative/252.png","/assets/hunters/Operative/260.png","/assets/hunters/Operative/hero.png","/assets/hunters/Siren/000.png","/assets/hunters/Siren/010.png","/assets/hunters/Siren/011.png","/assets/hunters/Siren/012.png","/assets/hunters/Siren/020.png","/assets/hunters/Siren/021.png","/assets/hunters/Siren/022.png","/assets/hunters/Siren/023.png","/assets/hunters/Siren/030.png","/assets/hunters/Siren/031.png","/assets/hunters/Siren/032.png","/assets/hunters/Siren/033.png","/assets/hunters/Siren/034.png","/assets/hunters/Siren/040.png","/assets/hunters/Siren/041.png","/assets/hunters/Siren/050.png","/assets/hunters/Siren/051.png","/assets/hunters/Siren/052.png","/assets/hunters/Siren/053.png","/assets/hunters/Siren/06.png","/assets/hunters/Siren/060.png","/assets/hunters/Siren/100.png","/assets/hunters/Siren/110.png","/assets/hunters/Siren/111.png","/assets/hunters/Siren/112.png","/assets/hunters/Siren/120.png","/assets/hunters/Siren/121.png","/assets/hunters/Siren/122.png","/assets/hunters/Siren/123.png","/assets/hunters/Siren/130.png","/assets/hunters/Siren/131.png","/assets/hunters/Siren/132.png","/assets/hunters/Siren/140.png","/assets/hunters/Siren/141.png","/assets/hunters/Siren/142.png","/assets/hunters/Siren/143.png","/assets/hunters/Siren/150.png","/assets/hunters/Siren/151.png","/assets/hunters/Siren/152.png","/assets/hunters/Siren/160.png","/assets/hunters/Siren/200.png","/assets/hunters/Siren/210.png","/assets/hunters/Siren/211.png","/assets/hunters/Siren/212.png","/assets/hunters/Siren/220.png","/assets/hunters/Siren/221.png","/assets/hunters/Siren/222.png","/assets/hunters/Siren/223.png","/assets/hunters/Siren/230.png","/assets/hunters/Siren/231.png","/assets/hunters/Siren/232.png","/assets/hunters/Siren/240.png","/assets/hunters/Siren/241.png","/assets/hunters/Siren/242.png","/assets/hunters/Siren/243.png","/assets/hunters/Siren/250.png","/assets/hunters/Siren/251.png","/assets/hunters/Siren/252.png","/assets/hunters/Siren/260.png","/assets/hunters/Siren/hero.png","/assets/hunters/augment-action.png","/assets/hunters/augment-chevron.png","/assets/hunters/augment-diamond.png","/assets/hunters/basic.png","/assets/manifest.json","/assets/robots.txt","/"],"additional":[],"optional":[]},"externals":[],"hashesMap":{"6e148698d382b2c0806ba60a00e5e3e431d7232f":"/45598562077bdc84281b5330ff4d283e.png","507dda73c3ff7f9e08f8788d03b518bb39678b85":"/6274c9808eb08785f146a2b78283b5f6.jpg","4d5ecfee89b05a370ba1ba2c91c1d91389c74022":"/bundle.24252.css","00fa17865d928baf4c6aed4e99ad8783d784aa76":"/bundle.1b1eeefb.js","67af5559591f22ffba90d13299f3df513e5cbc52":"/assets/favicon.png","9af1150332d75385d8ffdc64d571ec8d1a437f0f":"/assets/hunters/Beastmaster/000.png","c2925bcd582074cfd7e6aeedcd1dbb2781a48031":"/assets/hunters/Beastmaster/001.png","6d40ff1f4f45ea121a66d2293d2db879d9d66ef6":"/assets/hunters/Beastmaster/010.png","ed9f7a1a2d7e0bbc75bb655a9899f5daee69d9df":"/assets/hunters/Beastmaster/011.png","189f08d09779099cb3866ecd2e5db147e8688f7b":"/assets/hunters/Beastmaster/012.png","4da990290ac582249093aa0762ec03ce194568d9":"/assets/hunters/Beastmaster/020.png","c587d5fe8d5e028bb7e616dcea87379611f268f1":"/assets/hunters/Beastmaster/021.png","a46ddf7becbdfc0de6acab4527ab2ea2321a2d5a":"/assets/hunters/Beastmaster/022.png","af94b67084c450485969b7f3b9214db033c72084":"/assets/hunters/Beastmaster/023.png","fd0cfa0fed9faca922742630721f5816554e93e3":"/assets/hunters/Beastmaster/030.png","901a3ecef0ef8dada62b1b30e8bdf49fb1551ddf":"/assets/hunters/Beastmaster/031.png","dadc56494285303f24541f5577bb205a74043a62":"/assets/hunters/Beastmaster/032.png","7ae0e52589523f74914281227f6e461ff2d9a267":"/assets/hunters/Beastmaster/033.png","faeaa65837f8379a0e11960b89caec4d5bace436":"/assets/hunters/Beastmaster/040.png","f28d5dc8cf56ec11f6d2ecdef2375edfe953a562":"/assets/hunters/Beastmaster/041.png","ac562b991899445dcc8878a69d1a2a76de25f4e6":"/assets/hunters/Beastmaster/042.png","1a91e2aa94ad216dc0c71851c008bd818bdb1941":"/assets/hunters/Beastmaster/043.png","f03ca5e3841494d7773c1c0aff46aaa11e53f85a":"/assets/hunters/Beastmaster/050.png","cb621aefc1783ddb201e202d412ad3907b78f414":"/assets/hunters/Beastmaster/051.png","22d915e3a307b42461c9b8cfb1c2bb3c78f36a8a":"/assets/hunters/Beastmaster/060.png","30628665bf411727c306cbeac159456db3be9e1f":"/assets/hunters/Beastmaster/100.png","82dcc57934ea55d61fa48dbbb190574a5b83a3d8":"/assets/hunters/Beastmaster/101.png","7e14ff5afd5e2eec8e0f0f6e11f7f475317924fa":"/assets/hunters/Beastmaster/110.png","024f1a8d93699ef6add10638fb7a34d8edb60d8c":"/assets/hunters/Beastmaster/111.png","7df3c789dbf3a63f3a1b226a9d52dad1d882b2f9":"/assets/hunters/Beastmaster/112.png","26cf2fdbb660e73e0127dd4d3db270f9caddef3a":"/assets/hunters/Beastmaster/120.png","33e7cb07076d660b1124bf0e700b54c560b35396":"/assets/hunters/Beastmaster/121.png","a2e8552717e0b056949779ae5720c1a03bdb4372":"/assets/hunters/Beastmaster/122.png","ac7ffb0b0746ac85d369e1bd3c7947a34ba396aa":"/assets/hunters/Beastmaster/123.png","0bec5e860f684498986e687f265c30f8091869c2":"/assets/hunters/Beastmaster/130.png","8b693e1a7730d22dcf1c1b2eddcaae94b372c769":"/assets/hunters/Beastmaster/131.png","aaf378398b332e219c89cc0a4a4f401cc254866b":"/assets/hunters/Beastmaster/132.png","99a3944a10da723293bca8c01cf335b1068093f0":"/assets/hunters/Beastmaster/133.png","32cc792225263a7d52b1e4f20893365f20cc812b":"/assets/hunters/Beastmaster/140.png","ce96b467323aab2967e07124fef6b58d4259229c":"/assets/hunters/Beastmaster/141.png","d78620f70a3ce4f785c8f4b1d7aebd23a0831fe2":"/assets/hunters/Beastmaster/142.png","e71e828300067bb37ddff61f38d3559ae9e20c2c":"/assets/hunters/Beastmaster/143.png","eeff605535573fed8b6ce039e91e37beaf5ea456":"/assets/hunters/Beastmaster/150.png","ea2699d4b4c5eaca7588dc33bc10f27f1206052c":"/assets/hunters/Beastmaster/151.png","e325151f9b69d8d147407c8b70ce72627ca93830":"/assets/hunters/Beastmaster/152.png","982415964f422ed25a5ffab32a28ea7a854c1541":"/assets/hunters/Beastmaster/160.png","977877a464943f876846612ecc8493bb8137b0f6":"/assets/hunters/Beastmaster/200.png","7fb64ed1f5d0baf25f772cd5af5da6feb2f6270d":"/assets/hunters/Beastmaster/201.png","d9a71f3dee3ed3f69ff83794687c9c06228385b3":"/assets/hunters/Beastmaster/210.png","96ce6f53559178f4dfbbabf251242a4c5c241b17":"/assets/hunters/Beastmaster/211.png","6e044f76a1700b3739bfcafbbfb33e9146f2693a":"/assets/hunters/Beastmaster/212.png","23abf2f2c2b3bba52a7eef79e2e3460a063b063a":"/assets/hunters/Beastmaster/220.png","32c28e47255087a985b6f17c2076534ea631c1ee":"/assets/hunters/Beastmaster/221.png","b23df346b16cd8aa7e320e90d3c759f8fafc9929":"/assets/hunters/Beastmaster/222.png","663f88fff3084d908fd24a36ecd7b6c88bc4b940":"/assets/hunters/Beastmaster/223.png","1b61af090bb407ae59f4fce586f777e99f390abd":"/assets/hunters/Beastmaster/230.png","15d9fbd82ef4e0de5eaafb1ee079ef276e721573":"/assets/hunters/Beastmaster/231.png","253f574bc73a1cd2b808a382de2ec3a04c3b94bb":"/assets/hunters/Beastmaster/232.png","ddeda995655074539ee0bad9c6588a2cdcc36e61":"/assets/hunters/Beastmaster/240.png","94b05d293948e5d6588dcc423019b40eff55396d":"/assets/hunters/Beastmaster/241.png","afaf095f2bf2a9478fde265dd06b5b1d6d68ef1b":"/assets/hunters/Beastmaster/242.png","e3073e7192fa6ac41dd2a48d309056f37a908c92":"/assets/hunters/Beastmaster/243.png","8df769891eeb6868762131a107658dff76f4b139":"/assets/hunters/Beastmaster/250.png","ba3887ee18f5edd865c6069f89ff1a5603dd119b":"/assets/hunters/Beastmaster/251.png","5e9b8f8e3d316c352177fa203cc280ccaed98f43":"/assets/hunters/Beastmaster/252.png","5d20741e9d260aca46897c69dd5427c50000c012":"/assets/hunters/Beastmaster/260.png","a130dbe9dbd85818b542218b80337b41a60b8f57":"/assets/hunters/Beastmaster/hero.png","23e8e8b6d3d399cd4d95461e4d01e8ad0e1af46f":"/assets/hunters/Gunner/000.png","5b5b8f8b00151388f16077133d744479006e0bcf":"/assets/hunters/Gunner/010.png","a7bd5f48af2fb324e735f3bee72987393d2a78fa":"/assets/hunters/Gunner/011.png","c27385fd9aa0409c1799939b2de24f7398b6f341":"/assets/hunters/Gunner/012.png","16833bfda89cfb73d9484e014a099da62dfa4bef":"/assets/hunters/Gunner/020.png","1ee7ec85fbb6df916bb49736a8e5a65034070d88":"/assets/hunters/Gunner/021.png","acc7cc6c1b83ba606d89e7c34bdb2b9e14554fb1":"/assets/hunters/Gunner/022.png","701f49d7c026dffcdacd6b3fddf417312c90f2f8":"/assets/hunters/Gunner/023.png","38313df1bedb289c392aae2f12cc1885d0426943":"/assets/hunters/Gunner/024.png","2b9b3c81913f7896ad2ebf8351bbf7ba72827482":"/assets/hunters/Gunner/030.png","3a928dcf9776c52bb501b583cb551611dce51c90":"/assets/hunters/Gunner/031.png","05ccd93d330af1ac0c97f25f48e75e788232e3f9":"/assets/hunters/Gunner/032.png","73770c159217caaac0d2fb5bf5859bf6bde58b93":"/assets/hunters/Gunner/033.png","1469bb1f1c57795c120fae42b8ee44ef1c315cd3":"/assets/hunters/Gunner/040.png","2650cdbb9de5cc6775675f02a4e0315445f0377c":"/assets/hunters/Gunner/041.png","f5e8b3143e9cf2ff78b33d309d10e5bdeab22e7a":"/assets/hunters/Gunner/042.png","4fe6553e5b1d8aba29f691eb123f4f7a1c743308":"/assets/hunters/Gunner/043.png","a922c1fc538d9a49adf04dad39fd97bf9ff22b18":"/assets/hunters/Gunner/050.png","87b871ce6af1b8a6151d74c061854090209f36fe":"/assets/hunters/Gunner/051.png","eba1433143f158a65e799bea5629294e8836bb71":"/assets/hunters/Gunner/052.png","e3d2c7b4a19e8b947b8bfb561a55aceaa0cab39c":"/assets/hunters/Gunner/060.png","71ee81aefda7a37484400e430c0e73d0cfcdbc50":"/assets/hunters/Gunner/100.png","78406559b20a904c7a1e3d8ce403ddd11900ed95":"/assets/hunters/Gunner/110.png","91c545335597cf3651fae82d3d011daba8b06180":"/assets/hunters/Gunner/111.png","3d4326a8df98f81b71bca423edd743558ef715b7":"/assets/hunters/Gunner/112.png","18cb95edd794224f4b8aa8e09e4626b38710113b":"/assets/hunters/Gunner/120.png","e729843d5714b212b5cf99043f00d3c36515bfd7":"/assets/hunters/Gunner/121.png","45e58daa84a58ac11511cc6aefc099753eb4e725":"/assets/hunters/Gunner/122.png","e3ecc889adea59c7e9d7c2a01b4cdedfc36dee35":"/assets/hunters/Gunner/123.png","668d6cdfabec7deea687e4e7186a8d2d7db5d875":"/assets/hunters/Gunner/124.png","30a60bdd359a67b92a3e1927f87595b86774e987":"/assets/hunters/Gunner/130.png","192e374ef5df405034552f3940ad8fc4f87ddf3f":"/assets/hunters/Gunner/131.png","f6143f9cdb407f89ce7ffca8b615b3260c700ac8":"/assets/hunters/Gunner/132.png","c5ee0e43f0177f83707bb1f97242e091e0683ed2":"/assets/hunters/Gunner/133.png","968e1b6494ac3056c38a5fa4c79949d34ec222ed":"/assets/hunters/Gunner/140.png","1d01d750c011a63bf9e8693ac6b6b0728320b7cf":"/assets/hunters/Gunner/141.png","dd3c476249e8d3d7e522b7d1811a38331861d61e":"/assets/hunters/Gunner/142.png","c98707fe16d6b0a6221fd5cc1c9bcb8a0cd645ae":"/assets/hunters/Gunner/143.png","2c6b00e38bf4d0c1074f2ef142b726d2b04fbb2a":"/assets/hunters/Gunner/150.png","fe1a3fd195fa727a5eaf2bfa03451b684aa88077":"/assets/hunters/Gunner/151.png","c5a505106c971acd502108e89bf77d86a5cdf144":"/assets/hunters/Gunner/152.png","f7c8cc975ac0ab8ea2d7b84af972c098c28d8bd0":"/assets/hunters/Gunner/160.png","1622282989a1cc6fa83db8581b551a917cd52330":"/assets/hunters/Gunner/200.png","b46910fea6bfca0ed6b63c094fa80bd89c2264d9":"/assets/hunters/Gunner/210.png","f7adcc610a8f995258a6faf8156f00163cced543":"/assets/hunters/Gunner/211.png","74bc6a2f86b8b20500bcc311a3b627ac16d9d4e6":"/assets/hunters/Gunner/212.png","21f7d3a64c8791dd123720278b6704315ad28df4":"/assets/hunters/Gunner/220.png","dfeb1821cfb13f6addf640b1ee67914cb14d30fd":"/assets/hunters/Gunner/221.png","39da5205b90dbff2bf0fb94d1c99979f81aeb271":"/assets/hunters/Gunner/222.png","9c9198a1953bb44e5de81865647363c9d176fa3d":"/assets/hunters/Gunner/223.png","684eff117dade4ebe27f650246e62d939889db43":"/assets/hunters/Gunner/224.png","65c0665551f5d001fd3ab7b3bffa6c9edd8c62fc":"/assets/hunters/Gunner/230.png","7977f30fcca8878127307dacf472adf220bd2c5d":"/assets/hunters/Gunner/231.png","52f4435246eff588fa2a124376cc084cf661d4c5":"/assets/hunters/Gunner/232.png","9f6d0651d31e3d817beecf635a4fda3633aab967":"/assets/hunters/Gunner/233.png","eff83ac676f4441f53656f02515079f33ef80630":"/assets/hunters/Gunner/240.png","efb258ed895b6b3edd25b6c65b2609d1f231524b":"/assets/hunters/Gunner/241.png","69ccd6d0e97d92c5257c6d8fc3e41324549219c9":"/assets/hunters/Gunner/242.png","385e1713cbb6ebefa805ef9f7f826ac987848685":"/assets/hunters/Gunner/243.png","42c36d9d6b166dcebd782cbeac73d3f7de953747":"/assets/hunters/Gunner/250.png","652e37797eb0d37b444b8010b7193fcefbfe57a9":"/assets/hunters/Gunner/251.png","b7f15e93c3200e22fd5d4d7095d181a826b46441":"/assets/hunters/Gunner/252.png","72fe4ac2297b473f87970a102b3f4bfd98e5c9bf":"/assets/hunters/Gunner/260.png","eaf0686064b5bc00abc5b7cc0fb8939369a41503":"/assets/hunters/Gunner/hero.png","7ef159acba264bc42d95c6189b827225796e0b5b":"/assets/hunters/Operative/000.png","0a108afb2118bc9e330581e83bd32183255b3046":"/assets/hunters/Operative/010.png","70a8f250d108dd0f8176c2d6a2218c307913dfd0":"/assets/hunters/Operative/011.png","36ec4cb958c4f167991ce9a01b5fb46c5e076964":"/assets/hunters/Operative/012.png","6634bf9575bd6c9eccf4c47be055eea8c1301e19":"/assets/hunters/Operative/020.png","c3c82ea03e6e1d7d8bf0ca219d87865707a6cb4e":"/assets/hunters/Operative/021.png","72a8f92d4bff4f7aba4bd305b9105ea18dc8a138":"/assets/hunters/Operative/022.png","3f876579c0f7f4b3d70a19dc16078c336e044805":"/assets/hunters/Operative/023.png","5dc95fe77eebf25959d5b1d3ee79423924061184":"/assets/hunters/Operative/030.png","4512860249aa95b482d40c12fa38fdd2ceca2a57":"/assets/hunters/Operative/031.png","c5ed6b800129670e081301c7d109639f1caa6436":"/assets/hunters/Operative/032.png","67479a4c6d8b41c87e6e9a73ce89144fdecb63bd":"/assets/hunters/Operative/040.png","bd0c790a5fce329577a5b8bf277bedf4ff44a22b":"/assets/hunters/Operative/041.png","a0a359398034700eb798bcb4794c6b1c15e9fa86":"/assets/hunters/Operative/220.png","01d9bbe2bb9ab56f03eb5962faa450f81a5d5d90":"/assets/hunters/Operative/043.png","bea7fb77a1fc1dc80f504fc513d465f45b60b978":"/assets/hunters/Operative/044.png","887058c07d97376bcc8a2788d83491de5e5d7675":"/assets/hunters/Operative/050.png","0227c3523bd61f5ed7e519a9611fc419cad851ce":"/assets/hunters/Operative/051.png","cf639ad5784c2dc8181d29016afb4be64cd2b055":"/assets/hunters/Operative/052.png","77f5bdc3559983bfb123a9fc4a973f331f2b0054":"/assets/hunters/Operative/060.png","32670c4aa1974ce7140aad22d97870b293494f97":"/assets/hunters/Operative/100.png","fddea87bf684c5661ac7fca05bff0dd33142304a":"/assets/hunters/Operative/110.png","2e9fa60325f13aa0a133b25f336509927db44efd":"/assets/hunters/Operative/242.png","b708a1c79ae717809b0b9e72d2fc0443b0f45899":"/assets/hunters/Operative/112.png","df31851b2f1ed9dca521ddc6aa424222c3c9819c":"/assets/hunters/Operative/120.png","d87b3a4a8f33a2cd3b9e48bbae55f7c5c355be4d":"/assets/hunters/Operative/121.png","db8598afb13384100d862520f85e0b804612d7f4":"/assets/hunters/Operative/122.png","0ec73cd854d2079dc492ef4732e0035d8f6da00c":"/assets/hunters/Operative/123.png","bb35ad5e5546ff779055a3235534e36d57b07eb8":"/assets/hunters/Operative/130.png","dfe2ba07413e3147dc1077a302d00ed5e3478c1a":"/assets/hunters/Operative/131.png","1978aff23464b114fd32db1b3600f247291bca39":"/assets/hunters/Operative/132.png","df91d746e68f18e5c1d37214b119c003fb1ec2ce":"/assets/hunters/Operative/140.png","159294f9a90d288f836fd1d253788cd62a05b964":"/assets/hunters/Operative/141.png","e27f84a32cced908b4227564979085f90dc46c67":"/assets/hunters/Operative/142.png","d4a8b30ba1e889bb2254a5114518063774ee6511":"/assets/hunters/Operative/143.png","32baf66e98a3ba1bcb598ab592ea93151d937ff0":"/assets/hunters/Operative/150.png","e7e7b8af504419ca00b6329db603fa3f25c542dd":"/assets/hunters/Operative/160.png","f888d064faaa59aa77f00364844550e0347a747c":"/assets/hunters/Operative/200.png","2bda2e0dca133527ac48ed33a13120fcfa31bd6b":"/assets/hunters/Operative/210.png","fa34dd2b1fd00883400ec5eb28f7e044faf6e991":"/assets/hunters/Operative/211.png","38e69bd15d69386b5d7dd6e2400da413129b034d":"/assets/hunters/Operative/212.png","e55745c8ee0366fe89a142aa47d1c427f5173b10":"/assets/hunters/Operative/221.png","42321b188187f5c49a7c1378709984026d0340a9":"/assets/hunters/Operative/222.png","60e8372568097238ad315f475365d66f70505f52":"/assets/hunters/Operative/223.png","f3939574dda35cf7bca441cd5e06e5f9ae0d6e6c":"/assets/hunters/Operative/230.png","16b09276e51db8965d575ac482c7d7c142c46cde":"/assets/hunters/Operative/231.png","12438d22429c821b657e4a9edf4f35a3d5a54566":"/assets/hunters/Operative/232.png","26b60a2f768375f86d69ab5a83f1699ce3db8f7f":"/assets/hunters/Operative/240.png","310e3fb50445806904045b9cdee77898091481b6":"/assets/hunters/Operative/241.png","1a072e484698ec68252d0eeafe19f929ffa8cecc":"/assets/hunters/Operative/243.png","5a096695224f2126f56e0ec5f9ea42abdd96cc5e":"/assets/hunters/Operative/244.png","a9d67fcb5c187ee58d9ead33c568f2e4e92e3cfb":"/assets/hunters/Operative/250.png","4c28d38742af997fe77c09314e09dc846cb349d0":"/assets/hunters/Operative/251.png","2adad79588ca38d4afbb8e1d4cf96b465a835e2b":"/assets/hunters/Operative/252.png","c89710ed72a6484c4e7d663832fbebeb37db4925":"/assets/hunters/Operative/260.png","695afb5dc6e3bdfadb89b6eb3d12415efca249fe":"/assets/hunters/Operative/hero.png","b4017efa1ca43982dafc30596850300ee96a863a":"/assets/hunters/Siren/000.png","6023a253acd3041a850c1cd424aa9587e000d32a":"/assets/hunters/Siren/010.png","169308c7625065d71d7c2ddd306c465b7db264af":"/assets/hunters/Siren/011.png","8fec7aedcd869d7ee88ec796f8d82e1be7d4d493":"/assets/hunters/Siren/012.png","8e58ecd8148e8149188b6ffac8f10b9886eaed8c":"/assets/hunters/Siren/020.png","57d9183509906b00a2b5816a4237c6147a3138d8":"/assets/hunters/Siren/021.png","05b4881d3a74db16cb1fcb91076392b88ea1ab95":"/assets/hunters/Siren/022.png","d0d1ff7a21d2528f55e9a6f7a365b6fcb1fb62cd":"/assets/hunters/Siren/023.png","7ead1aed2379038624a4abfbf3903e96b24511f3":"/assets/hunters/Siren/030.png","4c5c84e4a0e217741aa21a150456d30e573c978f":"/assets/hunters/Siren/031.png","95007e633fcd85172f53d29068bf1d108c03a484":"/assets/hunters/Siren/032.png","d7b92fff331a3b48edba5a675226b0085ea6dba7":"/assets/hunters/Siren/033.png","a847810e3960dd38f50a3c60e59376b07c9d0310":"/assets/hunters/Siren/034.png","59016060d9320923ab4b48ee508a4d8199e9fc66":"/assets/hunters/Siren/040.png","34f661c56329d9a8e15cc1f248edeb8a22e54ded":"/assets/hunters/Siren/041.png","041f615cd6c520a8580c6244d3f33c459505e717":"/assets/hunters/Siren/050.png","183ba2d24528d50f116ba6b25925ed07ae9a56e6":"/assets/hunters/Siren/051.png","c204ddf867720fbff13de0f16b21135193cbac41":"/assets/hunters/Siren/052.png","d3828fcbfce32ec1d5f7856426ca6bfa248856fa":"/assets/hunters/Siren/06.png","c2afe33b331c3746f6579040d96d4320664825a5":"/assets/hunters/Siren/060.png","1ff8118e0db2c5aed4fb5abf58990713fefb1756":"/assets/hunters/Siren/100.png","6e671f99f4a9ba531599c1b989e43d45b66961c9":"/assets/hunters/Siren/110.png","d13c7cae1e49f26522b9fb60822e5c20edc948f9":"/assets/hunters/Siren/111.png","2f69da074b61bcac9582741a29adce556df901f6":"/assets/hunters/Siren/112.png","a1f28e21a7e98368a181970323d27f8662dcab8f":"/assets/hunters/Siren/120.png","98e92f76bd0ebe2918303ae633969399bb200602":"/assets/hunters/Siren/121.png","ce291a353177d3825e6c5f046faf1a7ca044e08c":"/assets/hunters/Siren/122.png","93609663868c6cb3ee2dca8ef6bff5c104cc3dda":"/assets/hunters/Siren/123.png","5602f358af85318f18e57ce1e9c47aa14e88305c":"/assets/hunters/Siren/130.png","1f635e3056b7c3174572f155cc34cbb2d56a9a2c":"/assets/hunters/Siren/131.png","6308de0f81c2f6d3839cbed8680f193ce5dc48e1":"/assets/hunters/Siren/132.png","479b0557635c5830429e85f642e9785393fc5ee0":"/assets/hunters/Siren/140.png","ee85ab849f91c7e455ec4b41ef4a808ba9e41ea7":"/assets/hunters/Siren/141.png","686ea56e145c9041e25c83f9f6c6a9f0cf0bc000":"/assets/hunters/Siren/142.png","6a3db332e9e62cea96ca05542f7150dac1621589":"/assets/hunters/Siren/143.png","c5539f412c581565f73aa62f357863a58b5ff20b":"/assets/hunters/Siren/150.png","9374469eb759d444a07a39ea54759f466cb3c030":"/assets/hunters/Siren/151.png","7f7d4012a40b6dd32e0ff9daa8a41b9651ceb52b":"/assets/hunters/Siren/152.png","cbc7b3d491e2c171da4d9ab9a9c4432e20bbe996":"/assets/hunters/Siren/160.png","7c553ffeb1fe2a99e05de0ad403f63b63d205cce":"/assets/hunters/Siren/200.png","fe96d230b6993d6dd5861457a2d04de143efbcc9":"/assets/hunters/Siren/210.png","8c67a2bb82290396fcd3101dee0790b16e46e3ce":"/assets/hunters/Siren/211.png","0cfb681bf388401758db4d38f2cd3d44f32259c9":"/assets/hunters/Siren/212.png","cfd20f56f7a3254a75cf1f2602a3881197f30fed":"/assets/hunters/Siren/220.png","03dbbb07f9139b5a9c72b297b6da04bb0fcac22b":"/assets/hunters/Siren/221.png","b94d73432e54f58b4cb341f6bff8bd1e0296e137":"/assets/hunters/Siren/222.png","0462e6bb95301245a17a1c646f4600baad807e1c":"/assets/hunters/Siren/223.png","80a6a4efdc4b7004ce3f985858caabc1dca07028":"/assets/hunters/Siren/230.png","8578d2573faec884908606431f5d615cbc1425b2":"/assets/hunters/Siren/231.png","7cc1ef6f46e91bca039aca36f9ef457c2b94973c":"/assets/hunters/Siren/232.png","220722b787ec35936a51aaf75dfee3bbb4af4b5d":"/assets/hunters/Siren/240.png","05f5e3e18eb53583314d32064830a5511ced741e":"/assets/hunters/Siren/241.png","48836afb2cc4ad09883111d754a56f920e6c0114":"/assets/hunters/Siren/242.png","0a666b4c52199933bb2aed351b9c72dd41ed2b4d":"/assets/hunters/Siren/243.png","f25cbf1ca0c27741c3494ca8c19769c582e6c97f":"/assets/hunters/Siren/250.png","8054c10392c67a2baf21e92bdd9bba24a5fdcca4":"/assets/hunters/Siren/251.png","40653c8ac7a6b7f23b90d1c555cde438fe97352b":"/assets/hunters/Siren/252.png","e18f33f08115e9b2422a2c7a0243550a328d49ec":"/assets/hunters/Siren/260.png","88c73b79a233f81fb265f4a5440157968b250a51":"/assets/hunters/Siren/hero.png","da5115eef0fec4fa4125932d2979689e8c9401e0":"/assets/hunters/augment-action.png","6f1cc287ad25e2f0d8ca12256c2f0277e932b8a8":"/assets/hunters/augment-chevron.png","cfb4c486971c9fac258b2288e3511bc78b7b94b9":"/assets/hunters/augment-diamond.png","1a69f37c8ca85b7e15720d4557b7c3e610b5bd13":"/assets/hunters/basic.png","3a03eb4a327cd89d096bd1ed9f95366649e8e259":"/assets/manifest.json","c47ccf1a49c24cc5842430aa75c72ef491292412":"/assets/robots.txt","9abd93113a06c12cbdf0cd8d63a570b0512bad3b":"/"},"strategy":"changed","responseStrategy":"cache-first","version":"1/3/2020, 1:46:08 PM","name":"webpack-offline","pluginVersion":"5.0.7","relativePaths":false};
+var __wpo = {"assets":{"main":["/45598562077bdc84281b5330ff4d283e.png","/6274c9808eb08785f146a2b78283b5f6.jpg","/bundle.24252.css","/bundle.eb121f75.js","/assets/favicon.png","/assets/hunters/Beastmaster/000.png","/assets/hunters/Beastmaster/001.png","/assets/hunters/Beastmaster/010.png","/assets/hunters/Beastmaster/011.png","/assets/hunters/Beastmaster/012.png","/assets/hunters/Beastmaster/020.png","/assets/hunters/Beastmaster/021.png","/assets/hunters/Beastmaster/022.png","/assets/hunters/Beastmaster/023.png","/assets/hunters/Beastmaster/030.png","/assets/hunters/Beastmaster/031.png","/assets/hunters/Beastmaster/032.png","/assets/hunters/Beastmaster/033.png","/assets/hunters/Beastmaster/040.png","/assets/hunters/Beastmaster/041.png","/assets/hunters/Beastmaster/042.png","/assets/hunters/Beastmaster/043.png","/assets/hunters/Beastmaster/050.png","/assets/hunters/Beastmaster/051.png","/assets/hunters/Beastmaster/060.png","/assets/hunters/Beastmaster/100.png","/assets/hunters/Beastmaster/101.png","/assets/hunters/Beastmaster/110.png","/assets/hunters/Beastmaster/111.png","/assets/hunters/Beastmaster/112.png","/assets/hunters/Beastmaster/120.png","/assets/hunters/Beastmaster/121.png","/assets/hunters/Beastmaster/122.png","/assets/hunters/Beastmaster/123.png","/assets/hunters/Beastmaster/130.png","/assets/hunters/Beastmaster/131.png","/assets/hunters/Beastmaster/132.png","/assets/hunters/Beastmaster/133.png","/assets/hunters/Beastmaster/140.png","/assets/hunters/Beastmaster/141.png","/assets/hunters/Beastmaster/142.png","/assets/hunters/Beastmaster/143.png","/assets/hunters/Beastmaster/150.png","/assets/hunters/Beastmaster/151.png","/assets/hunters/Beastmaster/152.png","/assets/hunters/Beastmaster/160.png","/assets/hunters/Beastmaster/200.png","/assets/hunters/Beastmaster/201.png","/assets/hunters/Beastmaster/210.png","/assets/hunters/Beastmaster/211.png","/assets/hunters/Beastmaster/212.png","/assets/hunters/Beastmaster/220.png","/assets/hunters/Beastmaster/221.png","/assets/hunters/Beastmaster/222.png","/assets/hunters/Beastmaster/223.png","/assets/hunters/Beastmaster/230.png","/assets/hunters/Beastmaster/231.png","/assets/hunters/Beastmaster/232.png","/assets/hunters/Beastmaster/240.png","/assets/hunters/Beastmaster/241.png","/assets/hunters/Beastmaster/242.png","/assets/hunters/Beastmaster/243.png","/assets/hunters/Beastmaster/250.png","/assets/hunters/Beastmaster/251.png","/assets/hunters/Beastmaster/252.png","/assets/hunters/Beastmaster/260.png","/assets/hunters/Beastmaster/hero.png","/assets/hunters/Gunner/000.png","/assets/hunters/Gunner/010.png","/assets/hunters/Gunner/011.png","/assets/hunters/Gunner/012.png","/assets/hunters/Gunner/020.png","/assets/hunters/Gunner/021.png","/assets/hunters/Gunner/022.png","/assets/hunters/Gunner/023.png","/assets/hunters/Gunner/024.png","/assets/hunters/Gunner/030.png","/assets/hunters/Gunner/031.png","/assets/hunters/Gunner/032.png","/assets/hunters/Gunner/033.png","/assets/hunters/Gunner/040.png","/assets/hunters/Gunner/041.png","/assets/hunters/Gunner/042.png","/assets/hunters/Gunner/043.png","/assets/hunters/Gunner/050.png","/assets/hunters/Gunner/051.png","/assets/hunters/Gunner/052.png","/assets/hunters/Gunner/060.png","/assets/hunters/Gunner/100.png","/assets/hunters/Gunner/110.png","/assets/hunters/Gunner/111.png","/assets/hunters/Gunner/112.png","/assets/hunters/Gunner/120.png","/assets/hunters/Gunner/121.png","/assets/hunters/Gunner/122.png","/assets/hunters/Gunner/123.png","/assets/hunters/Gunner/124.png","/assets/hunters/Gunner/130.png","/assets/hunters/Gunner/131.png","/assets/hunters/Gunner/132.png","/assets/hunters/Gunner/133.png","/assets/hunters/Gunner/140.png","/assets/hunters/Gunner/141.png","/assets/hunters/Gunner/142.png","/assets/hunters/Gunner/143.png","/assets/hunters/Gunner/150.png","/assets/hunters/Gunner/151.png","/assets/hunters/Gunner/152.png","/assets/hunters/Gunner/160.png","/assets/hunters/Gunner/200.png","/assets/hunters/Gunner/210.png","/assets/hunters/Gunner/211.png","/assets/hunters/Gunner/212.png","/assets/hunters/Gunner/220.png","/assets/hunters/Gunner/221.png","/assets/hunters/Gunner/222.png","/assets/hunters/Gunner/223.png","/assets/hunters/Gunner/224.png","/assets/hunters/Gunner/230.png","/assets/hunters/Gunner/231.png","/assets/hunters/Gunner/232.png","/assets/hunters/Gunner/233.png","/assets/hunters/Gunner/240.png","/assets/hunters/Gunner/241.png","/assets/hunters/Gunner/242.png","/assets/hunters/Gunner/243.png","/assets/hunters/Gunner/250.png","/assets/hunters/Gunner/251.png","/assets/hunters/Gunner/252.png","/assets/hunters/Gunner/260.png","/assets/hunters/Gunner/hero.png","/assets/hunters/Operative/000.png","/assets/hunters/Operative/010.png","/assets/hunters/Operative/011.png","/assets/hunters/Operative/012.png","/assets/hunters/Operative/020.png","/assets/hunters/Operative/021.png","/assets/hunters/Operative/022.png","/assets/hunters/Operative/023.png","/assets/hunters/Operative/030.png","/assets/hunters/Operative/031.png","/assets/hunters/Operative/032.png","/assets/hunters/Operative/040.png","/assets/hunters/Operative/041.png","/assets/hunters/Operative/042.png","/assets/hunters/Operative/043.png","/assets/hunters/Operative/044.png","/assets/hunters/Operative/050.png","/assets/hunters/Operative/051.png","/assets/hunters/Operative/052.png","/assets/hunters/Operative/060.png","/assets/hunters/Operative/100.png","/assets/hunters/Operative/110.png","/assets/hunters/Operative/111.png","/assets/hunters/Operative/112.png","/assets/hunters/Operative/120.png","/assets/hunters/Operative/121.png","/assets/hunters/Operative/122.png","/assets/hunters/Operative/123.png","/assets/hunters/Operative/130.png","/assets/hunters/Operative/131.png","/assets/hunters/Operative/132.png","/assets/hunters/Operative/140.png","/assets/hunters/Operative/141.png","/assets/hunters/Operative/142.png","/assets/hunters/Operative/143.png","/assets/hunters/Operative/150.png","/assets/hunters/Operative/160.png","/assets/hunters/Operative/200.png","/assets/hunters/Operative/210.png","/assets/hunters/Operative/211.png","/assets/hunters/Operative/212.png","/assets/hunters/Operative/220.png","/assets/hunters/Operative/221.png","/assets/hunters/Operative/222.png","/assets/hunters/Operative/223.png","/assets/hunters/Operative/230.png","/assets/hunters/Operative/231.png","/assets/hunters/Operative/232.png","/assets/hunters/Operative/240.png","/assets/hunters/Operative/241.png","/assets/hunters/Operative/242.png","/assets/hunters/Operative/243.png","/assets/hunters/Operative/244.png","/assets/hunters/Operative/250.png","/assets/hunters/Operative/251.png","/assets/hunters/Operative/252.png","/assets/hunters/Operative/260.png","/assets/hunters/Operative/hero.png","/assets/hunters/Siren/000.png","/assets/hunters/Siren/010.png","/assets/hunters/Siren/011.png","/assets/hunters/Siren/012.png","/assets/hunters/Siren/020.png","/assets/hunters/Siren/021.png","/assets/hunters/Siren/022.png","/assets/hunters/Siren/023.png","/assets/hunters/Siren/030.png","/assets/hunters/Siren/031.png","/assets/hunters/Siren/032.png","/assets/hunters/Siren/033.png","/assets/hunters/Siren/034.png","/assets/hunters/Siren/040.png","/assets/hunters/Siren/041.png","/assets/hunters/Siren/050.png","/assets/hunters/Siren/051.png","/assets/hunters/Siren/052.png","/assets/hunters/Siren/053.png","/assets/hunters/Siren/06.png","/assets/hunters/Siren/060.png","/assets/hunters/Siren/100.png","/assets/hunters/Siren/110.png","/assets/hunters/Siren/111.png","/assets/hunters/Siren/112.png","/assets/hunters/Siren/120.png","/assets/hunters/Siren/121.png","/assets/hunters/Siren/122.png","/assets/hunters/Siren/123.png","/assets/hunters/Siren/130.png","/assets/hunters/Siren/131.png","/assets/hunters/Siren/132.png","/assets/hunters/Siren/140.png","/assets/hunters/Siren/141.png","/assets/hunters/Siren/142.png","/assets/hunters/Siren/143.png","/assets/hunters/Siren/150.png","/assets/hunters/Siren/151.png","/assets/hunters/Siren/152.png","/assets/hunters/Siren/160.png","/assets/hunters/Siren/200.png","/assets/hunters/Siren/210.png","/assets/hunters/Siren/211.png","/assets/hunters/Siren/212.png","/assets/hunters/Siren/220.png","/assets/hunters/Siren/221.png","/assets/hunters/Siren/222.png","/assets/hunters/Siren/223.png","/assets/hunters/Siren/230.png","/assets/hunters/Siren/231.png","/assets/hunters/Siren/232.png","/assets/hunters/Siren/240.png","/assets/hunters/Siren/241.png","/assets/hunters/Siren/242.png","/assets/hunters/Siren/243.png","/assets/hunters/Siren/250.png","/assets/hunters/Siren/251.png","/assets/hunters/Siren/252.png","/assets/hunters/Siren/260.png","/assets/hunters/Siren/hero.png","/assets/hunters/augment-action.png","/assets/hunters/augment-chevron.png","/assets/hunters/augment-diamond.png","/assets/hunters/basic.png","/assets/manifest.json","/assets/robots.txt","/"],"additional":[],"optional":[]},"externals":[],"hashesMap":{"6e148698d382b2c0806ba60a00e5e3e431d7232f":"/45598562077bdc84281b5330ff4d283e.png","507dda73c3ff7f9e08f8788d03b518bb39678b85":"/6274c9808eb08785f146a2b78283b5f6.jpg","4d5ecfee89b05a370ba1ba2c91c1d91389c74022":"/bundle.24252.css","06473a006a7b9643b23c78a89a096033ec035d6c":"/bundle.eb121f75.js","67af5559591f22ffba90d13299f3df513e5cbc52":"/assets/favicon.png","9af1150332d75385d8ffdc64d571ec8d1a437f0f":"/assets/hunters/Beastmaster/000.png","c2925bcd582074cfd7e6aeedcd1dbb2781a48031":"/assets/hunters/Beastmaster/001.png","6d40ff1f4f45ea121a66d2293d2db879d9d66ef6":"/assets/hunters/Beastmaster/010.png","ed9f7a1a2d7e0bbc75bb655a9899f5daee69d9df":"/assets/hunters/Beastmaster/011.png","189f08d09779099cb3866ecd2e5db147e8688f7b":"/assets/hunters/Beastmaster/012.png","4da990290ac582249093aa0762ec03ce194568d9":"/assets/hunters/Beastmaster/020.png","c587d5fe8d5e028bb7e616dcea87379611f268f1":"/assets/hunters/Beastmaster/021.png","a46ddf7becbdfc0de6acab4527ab2ea2321a2d5a":"/assets/hunters/Beastmaster/022.png","af94b67084c450485969b7f3b9214db033c72084":"/assets/hunters/Beastmaster/023.png","fd0cfa0fed9faca922742630721f5816554e93e3":"/assets/hunters/Beastmaster/030.png","901a3ecef0ef8dada62b1b30e8bdf49fb1551ddf":"/assets/hunters/Beastmaster/031.png","dadc56494285303f24541f5577bb205a74043a62":"/assets/hunters/Beastmaster/032.png","7ae0e52589523f74914281227f6e461ff2d9a267":"/assets/hunters/Beastmaster/033.png","faeaa65837f8379a0e11960b89caec4d5bace436":"/assets/hunters/Beastmaster/040.png","f28d5dc8cf56ec11f6d2ecdef2375edfe953a562":"/assets/hunters/Beastmaster/041.png","ac562b991899445dcc8878a69d1a2a76de25f4e6":"/assets/hunters/Beastmaster/042.png","1a91e2aa94ad216dc0c71851c008bd818bdb1941":"/assets/hunters/Beastmaster/043.png","f03ca5e3841494d7773c1c0aff46aaa11e53f85a":"/assets/hunters/Beastmaster/050.png","cb621aefc1783ddb201e202d412ad3907b78f414":"/assets/hunters/Beastmaster/051.png","22d915e3a307b42461c9b8cfb1c2bb3c78f36a8a":"/assets/hunters/Beastmaster/060.png","30628665bf411727c306cbeac159456db3be9e1f":"/assets/hunters/Beastmaster/100.png","82dcc57934ea55d61fa48dbbb190574a5b83a3d8":"/assets/hunters/Beastmaster/101.png","7e14ff5afd5e2eec8e0f0f6e11f7f475317924fa":"/assets/hunters/Beastmaster/110.png","024f1a8d93699ef6add10638fb7a34d8edb60d8c":"/assets/hunters/Beastmaster/111.png","7df3c789dbf3a63f3a1b226a9d52dad1d882b2f9":"/assets/hunters/Beastmaster/112.png","26cf2fdbb660e73e0127dd4d3db270f9caddef3a":"/assets/hunters/Beastmaster/120.png","33e7cb07076d660b1124bf0e700b54c560b35396":"/assets/hunters/Beastmaster/121.png","a2e8552717e0b056949779ae5720c1a03bdb4372":"/assets/hunters/Beastmaster/122.png","ac7ffb0b0746ac85d369e1bd3c7947a34ba396aa":"/assets/hunters/Beastmaster/123.png","0bec5e860f684498986e687f265c30f8091869c2":"/assets/hunters/Beastmaster/130.png","8b693e1a7730d22dcf1c1b2eddcaae94b372c769":"/assets/hunters/Beastmaster/131.png","aaf378398b332e219c89cc0a4a4f401cc254866b":"/assets/hunters/Beastmaster/132.png","99a3944a10da723293bca8c01cf335b1068093f0":"/assets/hunters/Beastmaster/133.png","32cc792225263a7d52b1e4f20893365f20cc812b":"/assets/hunters/Beastmaster/140.png","ce96b467323aab2967e07124fef6b58d4259229c":"/assets/hunters/Beastmaster/141.png","d78620f70a3ce4f785c8f4b1d7aebd23a0831fe2":"/assets/hunters/Beastmaster/142.png","e71e828300067bb37ddff61f38d3559ae9e20c2c":"/assets/hunters/Beastmaster/143.png","eeff605535573fed8b6ce039e91e37beaf5ea456":"/assets/hunters/Beastmaster/150.png","ea2699d4b4c5eaca7588dc33bc10f27f1206052c":"/assets/hunters/Beastmaster/151.png","e325151f9b69d8d147407c8b70ce72627ca93830":"/assets/hunters/Beastmaster/152.png","982415964f422ed25a5ffab32a28ea7a854c1541":"/assets/hunters/Beastmaster/160.png","977877a464943f876846612ecc8493bb8137b0f6":"/assets/hunters/Beastmaster/200.png","7fb64ed1f5d0baf25f772cd5af5da6feb2f6270d":"/assets/hunters/Beastmaster/201.png","d9a71f3dee3ed3f69ff83794687c9c06228385b3":"/assets/hunters/Beastmaster/210.png","96ce6f53559178f4dfbbabf251242a4c5c241b17":"/assets/hunters/Beastmaster/211.png","6e044f76a1700b3739bfcafbbfb33e9146f2693a":"/assets/hunters/Beastmaster/212.png","23abf2f2c2b3bba52a7eef79e2e3460a063b063a":"/assets/hunters/Beastmaster/220.png","32c28e47255087a985b6f17c2076534ea631c1ee":"/assets/hunters/Beastmaster/221.png","b23df346b16cd8aa7e320e90d3c759f8fafc9929":"/assets/hunters/Beastmaster/222.png","663f88fff3084d908fd24a36ecd7b6c88bc4b940":"/assets/hunters/Beastmaster/223.png","1b61af090bb407ae59f4fce586f777e99f390abd":"/assets/hunters/Beastmaster/230.png","15d9fbd82ef4e0de5eaafb1ee079ef276e721573":"/assets/hunters/Beastmaster/231.png","253f574bc73a1cd2b808a382de2ec3a04c3b94bb":"/assets/hunters/Beastmaster/232.png","ddeda995655074539ee0bad9c6588a2cdcc36e61":"/assets/hunters/Beastmaster/240.png","94b05d293948e5d6588dcc423019b40eff55396d":"/assets/hunters/Beastmaster/241.png","afaf095f2bf2a9478fde265dd06b5b1d6d68ef1b":"/assets/hunters/Beastmaster/242.png","e3073e7192fa6ac41dd2a48d309056f37a908c92":"/assets/hunters/Beastmaster/243.png","8df769891eeb6868762131a107658dff76f4b139":"/assets/hunters/Beastmaster/250.png","ba3887ee18f5edd865c6069f89ff1a5603dd119b":"/assets/hunters/Beastmaster/251.png","5e9b8f8e3d316c352177fa203cc280ccaed98f43":"/assets/hunters/Beastmaster/252.png","5d20741e9d260aca46897c69dd5427c50000c012":"/assets/hunters/Beastmaster/260.png","a130dbe9dbd85818b542218b80337b41a60b8f57":"/assets/hunters/Beastmaster/hero.png","23e8e8b6d3d399cd4d95461e4d01e8ad0e1af46f":"/assets/hunters/Gunner/000.png","5b5b8f8b00151388f16077133d744479006e0bcf":"/assets/hunters/Gunner/010.png","a7bd5f48af2fb324e735f3bee72987393d2a78fa":"/assets/hunters/Gunner/011.png","c27385fd9aa0409c1799939b2de24f7398b6f341":"/assets/hunters/Gunner/012.png","16833bfda89cfb73d9484e014a099da62dfa4bef":"/assets/hunters/Gunner/020.png","1ee7ec85fbb6df916bb49736a8e5a65034070d88":"/assets/hunters/Gunner/021.png","acc7cc6c1b83ba606d89e7c34bdb2b9e14554fb1":"/assets/hunters/Gunner/022.png","701f49d7c026dffcdacd6b3fddf417312c90f2f8":"/assets/hunters/Gunner/023.png","38313df1bedb289c392aae2f12cc1885d0426943":"/assets/hunters/Gunner/024.png","2b9b3c81913f7896ad2ebf8351bbf7ba72827482":"/assets/hunters/Gunner/030.png","3a928dcf9776c52bb501b583cb551611dce51c90":"/assets/hunters/Gunner/031.png","05ccd93d330af1ac0c97f25f48e75e788232e3f9":"/assets/hunters/Gunner/032.png","73770c159217caaac0d2fb5bf5859bf6bde58b93":"/assets/hunters/Gunner/033.png","1469bb1f1c57795c120fae42b8ee44ef1c315cd3":"/assets/hunters/Gunner/040.png","2650cdbb9de5cc6775675f02a4e0315445f0377c":"/assets/hunters/Gunner/041.png","f5e8b3143e9cf2ff78b33d309d10e5bdeab22e7a":"/assets/hunters/Gunner/042.png","4fe6553e5b1d8aba29f691eb123f4f7a1c743308":"/assets/hunters/Gunner/043.png","a922c1fc538d9a49adf04dad39fd97bf9ff22b18":"/assets/hunters/Gunner/050.png","87b871ce6af1b8a6151d74c061854090209f36fe":"/assets/hunters/Gunner/051.png","eba1433143f158a65e799bea5629294e8836bb71":"/assets/hunters/Gunner/052.png","e3d2c7b4a19e8b947b8bfb561a55aceaa0cab39c":"/assets/hunters/Gunner/060.png","71ee81aefda7a37484400e430c0e73d0cfcdbc50":"/assets/hunters/Gunner/100.png","78406559b20a904c7a1e3d8ce403ddd11900ed95":"/assets/hunters/Gunner/110.png","91c545335597cf3651fae82d3d011daba8b06180":"/assets/hunters/Gunner/111.png","3d4326a8df98f81b71bca423edd743558ef715b7":"/assets/hunters/Gunner/112.png","18cb95edd794224f4b8aa8e09e4626b38710113b":"/assets/hunters/Gunner/120.png","e729843d5714b212b5cf99043f00d3c36515bfd7":"/assets/hunters/Gunner/121.png","45e58daa84a58ac11511cc6aefc099753eb4e725":"/assets/hunters/Gunner/122.png","e3ecc889adea59c7e9d7c2a01b4cdedfc36dee35":"/assets/hunters/Gunner/123.png","668d6cdfabec7deea687e4e7186a8d2d7db5d875":"/assets/hunters/Gunner/124.png","30a60bdd359a67b92a3e1927f87595b86774e987":"/assets/hunters/Gunner/130.png","192e374ef5df405034552f3940ad8fc4f87ddf3f":"/assets/hunters/Gunner/131.png","f6143f9cdb407f89ce7ffca8b615b3260c700ac8":"/assets/hunters/Gunner/132.png","c5ee0e43f0177f83707bb1f97242e091e0683ed2":"/assets/hunters/Gunner/133.png","968e1b6494ac3056c38a5fa4c79949d34ec222ed":"/assets/hunters/Gunner/140.png","1d01d750c011a63bf9e8693ac6b6b0728320b7cf":"/assets/hunters/Gunner/141.png","dd3c476249e8d3d7e522b7d1811a38331861d61e":"/assets/hunters/Gunner/142.png","c98707fe16d6b0a6221fd5cc1c9bcb8a0cd645ae":"/assets/hunters/Gunner/143.png","2c6b00e38bf4d0c1074f2ef142b726d2b04fbb2a":"/assets/hunters/Gunner/150.png","fe1a3fd195fa727a5eaf2bfa03451b684aa88077":"/assets/hunters/Gunner/151.png","c5a505106c971acd502108e89bf77d86a5cdf144":"/assets/hunters/Gunner/152.png","f7c8cc975ac0ab8ea2d7b84af972c098c28d8bd0":"/assets/hunters/Gunner/160.png","1622282989a1cc6fa83db8581b551a917cd52330":"/assets/hunters/Gunner/200.png","b46910fea6bfca0ed6b63c094fa80bd89c2264d9":"/assets/hunters/Gunner/210.png","f7adcc610a8f995258a6faf8156f00163cced543":"/assets/hunters/Gunner/211.png","74bc6a2f86b8b20500bcc311a3b627ac16d9d4e6":"/assets/hunters/Gunner/212.png","21f7d3a64c8791dd123720278b6704315ad28df4":"/assets/hunters/Gunner/220.png","dfeb1821cfb13f6addf640b1ee67914cb14d30fd":"/assets/hunters/Gunner/221.png","39da5205b90dbff2bf0fb94d1c99979f81aeb271":"/assets/hunters/Gunner/222.png","9c9198a1953bb44e5de81865647363c9d176fa3d":"/assets/hunters/Gunner/223.png","684eff117dade4ebe27f650246e62d939889db43":"/assets/hunters/Gunner/224.png","65c0665551f5d001fd3ab7b3bffa6c9edd8c62fc":"/assets/hunters/Gunner/230.png","7977f30fcca8878127307dacf472adf220bd2c5d":"/assets/hunters/Gunner/231.png","52f4435246eff588fa2a124376cc084cf661d4c5":"/assets/hunters/Gunner/232.png","9f6d0651d31e3d817beecf635a4fda3633aab967":"/assets/hunters/Gunner/233.png","eff83ac676f4441f53656f02515079f33ef80630":"/assets/hunters/Gunner/240.png","efb258ed895b6b3edd25b6c65b2609d1f231524b":"/assets/hunters/Gunner/241.png","69ccd6d0e97d92c5257c6d8fc3e41324549219c9":"/assets/hunters/Gunner/242.png","385e1713cbb6ebefa805ef9f7f826ac987848685":"/assets/hunters/Gunner/243.png","42c36d9d6b166dcebd782cbeac73d3f7de953747":"/assets/hunters/Gunner/250.png","652e37797eb0d37b444b8010b7193fcefbfe57a9":"/assets/hunters/Gunner/251.png","b7f15e93c3200e22fd5d4d7095d181a826b46441":"/assets/hunters/Gunner/252.png","72fe4ac2297b473f87970a102b3f4bfd98e5c9bf":"/assets/hunters/Gunner/260.png","eaf0686064b5bc00abc5b7cc0fb8939369a41503":"/assets/hunters/Gunner/hero.png","7ef159acba264bc42d95c6189b827225796e0b5b":"/assets/hunters/Operative/000.png","0a108afb2118bc9e330581e83bd32183255b3046":"/assets/hunters/Operative/010.png","70a8f250d108dd0f8176c2d6a2218c307913dfd0":"/assets/hunters/Operative/011.png","36ec4cb958c4f167991ce9a01b5fb46c5e076964":"/assets/hunters/Operative/012.png","6634bf9575bd6c9eccf4c47be055eea8c1301e19":"/assets/hunters/Operative/020.png","c3c82ea03e6e1d7d8bf0ca219d87865707a6cb4e":"/assets/hunters/Operative/021.png","72a8f92d4bff4f7aba4bd305b9105ea18dc8a138":"/assets/hunters/Operative/022.png","3f876579c0f7f4b3d70a19dc16078c336e044805":"/assets/hunters/Operative/023.png","5dc95fe77eebf25959d5b1d3ee79423924061184":"/assets/hunters/Operative/030.png","4512860249aa95b482d40c12fa38fdd2ceca2a57":"/assets/hunters/Operative/031.png","c5ed6b800129670e081301c7d109639f1caa6436":"/assets/hunters/Operative/032.png","67479a4c6d8b41c87e6e9a73ce89144fdecb63bd":"/assets/hunters/Operative/040.png","bd0c790a5fce329577a5b8bf277bedf4ff44a22b":"/assets/hunters/Operative/041.png","a0a359398034700eb798bcb4794c6b1c15e9fa86":"/assets/hunters/Operative/220.png","01d9bbe2bb9ab56f03eb5962faa450f81a5d5d90":"/assets/hunters/Operative/043.png","bea7fb77a1fc1dc80f504fc513d465f45b60b978":"/assets/hunters/Operative/044.png","887058c07d97376bcc8a2788d83491de5e5d7675":"/assets/hunters/Operative/050.png","0227c3523bd61f5ed7e519a9611fc419cad851ce":"/assets/hunters/Operative/051.png","cf639ad5784c2dc8181d29016afb4be64cd2b055":"/assets/hunters/Operative/052.png","77f5bdc3559983bfb123a9fc4a973f331f2b0054":"/assets/hunters/Operative/060.png","32670c4aa1974ce7140aad22d97870b293494f97":"/assets/hunters/Operative/100.png","fddea87bf684c5661ac7fca05bff0dd33142304a":"/assets/hunters/Operative/110.png","2e9fa60325f13aa0a133b25f336509927db44efd":"/assets/hunters/Operative/242.png","b708a1c79ae717809b0b9e72d2fc0443b0f45899":"/assets/hunters/Operative/112.png","df31851b2f1ed9dca521ddc6aa424222c3c9819c":"/assets/hunters/Operative/120.png","d87b3a4a8f33a2cd3b9e48bbae55f7c5c355be4d":"/assets/hunters/Operative/121.png","db8598afb13384100d862520f85e0b804612d7f4":"/assets/hunters/Operative/122.png","0ec73cd854d2079dc492ef4732e0035d8f6da00c":"/assets/hunters/Operative/123.png","bb35ad5e5546ff779055a3235534e36d57b07eb8":"/assets/hunters/Operative/130.png","dfe2ba07413e3147dc1077a302d00ed5e3478c1a":"/assets/hunters/Operative/131.png","1978aff23464b114fd32db1b3600f247291bca39":"/assets/hunters/Operative/132.png","df91d746e68f18e5c1d37214b119c003fb1ec2ce":"/assets/hunters/Operative/140.png","159294f9a90d288f836fd1d253788cd62a05b964":"/assets/hunters/Operative/141.png","e27f84a32cced908b4227564979085f90dc46c67":"/assets/hunters/Operative/142.png","d4a8b30ba1e889bb2254a5114518063774ee6511":"/assets/hunters/Operative/143.png","32baf66e98a3ba1bcb598ab592ea93151d937ff0":"/assets/hunters/Operative/150.png","e7e7b8af504419ca00b6329db603fa3f25c542dd":"/assets/hunters/Operative/160.png","f888d064faaa59aa77f00364844550e0347a747c":"/assets/hunters/Operative/200.png","2bda2e0dca133527ac48ed33a13120fcfa31bd6b":"/assets/hunters/Operative/210.png","fa34dd2b1fd00883400ec5eb28f7e044faf6e991":"/assets/hunters/Operative/211.png","38e69bd15d69386b5d7dd6e2400da413129b034d":"/assets/hunters/Operative/212.png","e55745c8ee0366fe89a142aa47d1c427f5173b10":"/assets/hunters/Operative/221.png","42321b188187f5c49a7c1378709984026d0340a9":"/assets/hunters/Operative/222.png","60e8372568097238ad315f475365d66f70505f52":"/assets/hunters/Operative/223.png","f3939574dda35cf7bca441cd5e06e5f9ae0d6e6c":"/assets/hunters/Operative/230.png","16b09276e51db8965d575ac482c7d7c142c46cde":"/assets/hunters/Operative/231.png","12438d22429c821b657e4a9edf4f35a3d5a54566":"/assets/hunters/Operative/232.png","26b60a2f768375f86d69ab5a83f1699ce3db8f7f":"/assets/hunters/Operative/240.png","310e3fb50445806904045b9cdee77898091481b6":"/assets/hunters/Operative/241.png","1a072e484698ec68252d0eeafe19f929ffa8cecc":"/assets/hunters/Operative/243.png","5a096695224f2126f56e0ec5f9ea42abdd96cc5e":"/assets/hunters/Operative/244.png","a9d67fcb5c187ee58d9ead33c568f2e4e92e3cfb":"/assets/hunters/Operative/250.png","4c28d38742af997fe77c09314e09dc846cb349d0":"/assets/hunters/Operative/251.png","2adad79588ca38d4afbb8e1d4cf96b465a835e2b":"/assets/hunters/Operative/252.png","c89710ed72a6484c4e7d663832fbebeb37db4925":"/assets/hunters/Operative/260.png","695afb5dc6e3bdfadb89b6eb3d12415efca249fe":"/assets/hunters/Operative/hero.png","b4017efa1ca43982dafc30596850300ee96a863a":"/assets/hunters/Siren/000.png","6023a253acd3041a850c1cd424aa9587e000d32a":"/assets/hunters/Siren/010.png","169308c7625065d71d7c2ddd306c465b7db264af":"/assets/hunters/Siren/011.png","8fec7aedcd869d7ee88ec796f8d82e1be7d4d493":"/assets/hunters/Siren/012.png","8e58ecd8148e8149188b6ffac8f10b9886eaed8c":"/assets/hunters/Siren/020.png","57d9183509906b00a2b5816a4237c6147a3138d8":"/assets/hunters/Siren/021.png","05b4881d3a74db16cb1fcb91076392b88ea1ab95":"/assets/hunters/Siren/022.png","d0d1ff7a21d2528f55e9a6f7a365b6fcb1fb62cd":"/assets/hunters/Siren/023.png","7ead1aed2379038624a4abfbf3903e96b24511f3":"/assets/hunters/Siren/030.png","4c5c84e4a0e217741aa21a150456d30e573c978f":"/assets/hunters/Siren/031.png","95007e633fcd85172f53d29068bf1d108c03a484":"/assets/hunters/Siren/032.png","d7b92fff331a3b48edba5a675226b0085ea6dba7":"/assets/hunters/Siren/033.png","a847810e3960dd38f50a3c60e59376b07c9d0310":"/assets/hunters/Siren/034.png","59016060d9320923ab4b48ee508a4d8199e9fc66":"/assets/hunters/Siren/040.png","34f661c56329d9a8e15cc1f248edeb8a22e54ded":"/assets/hunters/Siren/041.png","041f615cd6c520a8580c6244d3f33c459505e717":"/assets/hunters/Siren/050.png","183ba2d24528d50f116ba6b25925ed07ae9a56e6":"/assets/hunters/Siren/051.png","c204ddf867720fbff13de0f16b21135193cbac41":"/assets/hunters/Siren/052.png","d3828fcbfce32ec1d5f7856426ca6bfa248856fa":"/assets/hunters/Siren/06.png","c2afe33b331c3746f6579040d96d4320664825a5":"/assets/hunters/Siren/060.png","1ff8118e0db2c5aed4fb5abf58990713fefb1756":"/assets/hunters/Siren/100.png","6e671f99f4a9ba531599c1b989e43d45b66961c9":"/assets/hunters/Siren/110.png","d13c7cae1e49f26522b9fb60822e5c20edc948f9":"/assets/hunters/Siren/111.png","2f69da074b61bcac9582741a29adce556df901f6":"/assets/hunters/Siren/112.png","a1f28e21a7e98368a181970323d27f8662dcab8f":"/assets/hunters/Siren/120.png","98e92f76bd0ebe2918303ae633969399bb200602":"/assets/hunters/Siren/121.png","ce291a353177d3825e6c5f046faf1a7ca044e08c":"/assets/hunters/Siren/122.png","93609663868c6cb3ee2dca8ef6bff5c104cc3dda":"/assets/hunters/Siren/123.png","5602f358af85318f18e57ce1e9c47aa14e88305c":"/assets/hunters/Siren/130.png","1f635e3056b7c3174572f155cc34cbb2d56a9a2c":"/assets/hunters/Siren/131.png","6308de0f81c2f6d3839cbed8680f193ce5dc48e1":"/assets/hunters/Siren/132.png","479b0557635c5830429e85f642e9785393fc5ee0":"/assets/hunters/Siren/140.png","ee85ab849f91c7e455ec4b41ef4a808ba9e41ea7":"/assets/hunters/Siren/141.png","686ea56e145c9041e25c83f9f6c6a9f0cf0bc000":"/assets/hunters/Siren/142.png","6a3db332e9e62cea96ca05542f7150dac1621589":"/assets/hunters/Siren/143.png","c5539f412c581565f73aa62f357863a58b5ff20b":"/assets/hunters/Siren/150.png","9374469eb759d444a07a39ea54759f466cb3c030":"/assets/hunters/Siren/151.png","7f7d4012a40b6dd32e0ff9daa8a41b9651ceb52b":"/assets/hunters/Siren/152.png","cbc7b3d491e2c171da4d9ab9a9c4432e20bbe996":"/assets/hunters/Siren/160.png","7c553ffeb1fe2a99e05de0ad403f63b63d205cce":"/assets/hunters/Siren/200.png","fe96d230b6993d6dd5861457a2d04de143efbcc9":"/assets/hunters/Siren/210.png","8c67a2bb82290396fcd3101dee0790b16e46e3ce":"/assets/hunters/Siren/211.png","0cfb681bf388401758db4d38f2cd3d44f32259c9":"/assets/hunters/Siren/212.png","cfd20f56f7a3254a75cf1f2602a3881197f30fed":"/assets/hunters/Siren/220.png","03dbbb07f9139b5a9c72b297b6da04bb0fcac22b":"/assets/hunters/Siren/221.png","b94d73432e54f58b4cb341f6bff8bd1e0296e137":"/assets/hunters/Siren/222.png","0462e6bb95301245a17a1c646f4600baad807e1c":"/assets/hunters/Siren/223.png","80a6a4efdc4b7004ce3f985858caabc1dca07028":"/assets/hunters/Siren/230.png","8578d2573faec884908606431f5d615cbc1425b2":"/assets/hunters/Siren/231.png","7cc1ef6f46e91bca039aca36f9ef457c2b94973c":"/assets/hunters/Siren/232.png","220722b787ec35936a51aaf75dfee3bbb4af4b5d":"/assets/hunters/Siren/240.png","05f5e3e18eb53583314d32064830a5511ced741e":"/assets/hunters/Siren/241.png","48836afb2cc4ad09883111d754a56f920e6c0114":"/assets/hunters/Siren/242.png","0a666b4c52199933bb2aed351b9c72dd41ed2b4d":"/assets/hunters/Siren/243.png","f25cbf1ca0c27741c3494ca8c19769c582e6c97f":"/assets/hunters/Siren/250.png","8054c10392c67a2baf21e92bdd9bba24a5fdcca4":"/assets/hunters/Siren/251.png","40653c8ac7a6b7f23b90d1c555cde438fe97352b":"/assets/hunters/Siren/252.png","e18f33f08115e9b2422a2c7a0243550a328d49ec":"/assets/hunters/Siren/260.png","88c73b79a233f81fb265f4a5440157968b250a51":"/assets/hunters/Siren/hero.png","da5115eef0fec4fa4125932d2979689e8c9401e0":"/assets/hunters/augment-action.png","6f1cc287ad25e2f0d8ca12256c2f0277e932b8a8":"/assets/hunters/augment-chevron.png","cfb4c486971c9fac258b2288e3511bc78b7b94b9":"/assets/hunters/augment-diamond.png","1a69f37c8ca85b7e15720d4557b7c3e610b5bd13":"/assets/hunters/basic.png","3a03eb4a327cd89d096bd1ed9f95366649e8e259":"/assets/manifest.json","c47ccf1a49c24cc5842430aa75c72ef491292412":"/assets/robots.txt","b81c83dd37e02d9c6d9a8e0620e1bed7a7bbd590":"/"},"strategy":"changed","responseStrategy":"cache-first","version":"1/3/2020, 3:37:03 PM","name":"webpack-offline","pluginVersion":"5.0.7","relativePaths":false};
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(n){return e[n]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="/",n(n.s="+N4f")}({"+N4f":function(e,n,t){"use strict";function r(e,n){return caches.match(e,{cacheName:n}).then(function(t){return o(t)?t:i(t).then(function(t){return caches.open(n).then(function(n){return n.put(e,t)}).then(function(){return t})})}).catch(function(){})}function o(e){return!e||!e.redirected||!e.ok||"opaqueredirect"===e.type}function i(e){return o(e)?Promise.resolve(e):("body"in e?Promise.resolve(e.body):e.blob()).then(function(n){return new Response(n,{headers:e.headers,status:e.status})})}function a(e,n){console.groupCollapsed("[SW]:",e),n.forEach(function(e){console.log("Asset:",e)}),console.groupEnd()}var c,s,u;if(c=ExtendableEvent.prototype.waitUntil,s=FetchEvent.prototype.respondWith,u=new WeakMap,ExtendableEvent.prototype.waitUntil=function(e){var n=this,t=u.get(n);if(!t)return t=[Promise.resolve(e)],u.set(n,t),c.call(n,Promise.resolve().then(function e(){var r=t.length;return Promise.all(t.map(function(e){return e.catch(function(){})})).then(function(){return t.length!=r?e():(u.delete(n),Promise.all(t))})}));t.push(Promise.resolve(e))},FetchEvent.prototype.respondWith=function(e){return this.waitUntil(e),s.call(this,e)},void 0===f)var f=!1;!function(e,n){function t(n){var t=w[n];return caches.open(q).then(function(r){return h(r,t,{bust:e.version,request:b,failAll:"main"===n})}).then(function(){a("Cached assets: "+n,t)}).catch(function(e){throw console.error(e),e})}function o(n){return caches.keys().then(function(e){for(var n=e.length,t=void 0;n--&&0!==(t=e[n]).indexOf(P););if(t){var r=void 0;return caches.open(t).then(function(e){return r=e,e.match(new URL(R,location).toString())}).then(function(e){if(e)return Promise.all([r,r.keys(),e.json()])})}}).then(function(r){if(!r)return t(n);var o=r[0],i=r[1],c=r[2],s=c.hashmap;if(!c.hashmap||c.version===e.version)return t(n);var u=Object.keys(s).map(function(e){return s[e]}),f=i.map(function(e){var n=new URL(e.url);return n.search="",n.hash="",n.toString()}),l=w[n],d=[],p=l.filter(function(e){return-1===f.indexOf(e)||-1===u.indexOf(e)});Object.keys(y).forEach(function(e){var n=y[e];if(-1!==l.indexOf(n)&&-1===p.indexOf(n)&&-1===d.indexOf(n)){var t=s[e];t&&-1!==f.indexOf(t)?d.push([t,n]):p.push(n)}}),a("Changed assets: "+n,p),a("Moved assets: "+n,d);var v=Promise.all(d.map(function(e){return o.match(e[0]).then(function(n){return[e[1],n]})}));return caches.open(q).then(function(t){var r=v.then(function(e){return Promise.all(e.map(function(e){return t.put(e[0],e[1])}))});return Promise.all([r,h(t,p,{bust:e.version,request:b,failAll:"main"===n,deleteFirst:"main"!==n})])})})}function c(){return caches.keys().then(function(e){var n=e.map(function(e){if(0===e.indexOf(P)&&0!==e.indexOf(q))return console.log("[SW]:","Delete cache:",e),caches.delete(e)});return Promise.all(n)})}function s(){return caches.open(q).then(function(n){var t=new Response(JSON.stringify({version:e.version,hashmap:y}));return n.put(new URL(R,location).toString(),t)})}function u(e,n,t){return function(e){if(v&&"function"==typeof v.map&&e.preloadResponse&&"navigate"===e.request.mode){var n=v.map(new URL(e.request.url),e.request);n&&function(e,n){var t=new URL(e,location),r=n.preloadResponse;x.set(r,{url:t,response:r});var o=function(){return x.has(r)},i=r.then(function(e){if(e&&o()){var n=e.clone();return caches.open(O).then(function(e){if(o())return e.put(t,n).then(function(){if(!o())return caches.open(O).then(function(e){return e.delete(t)})})})}});n.waitUntil(i)}(n,e)}}(e),r(t,q).then(function(r){return r?(f&&console.log("[SW]:","URL ["+t+"]("+n+") from cache"),r):fetch(e.request).then(function(r){return r.ok?(f&&console.log("[SW]:","URL ["+n+"] from network"),t===n&&(o=r.clone(),i=caches.open(q).then(function(e){return e.put(n,o)}).then(function(){console.log("[SW]:","Cache asset: "+n)}),e.waitUntil(i)),r):(f&&console.log("[SW]:","URL ["+n+"] wrong response: ["+r.status+"] "+r.type),r);var o,i})})}function l(e){var n=new URL(e.request.url);if(self.registration.navigationPreload&&v&&v.test&&v.test(n,e.request)){var t=function(e){if(x){var n=void 0,t=void 0;return x.forEach(function(r,o){r.url.href===e.href&&(n=r.response,t=o)}),n?(x.delete(t),n):void 0}}(n),o=e.request;return t?(e.waitUntil(caches.open(O).then(function(e){return e.delete(o)})),t):r(o,O).then(function(n){return n&&e.waitUntil(caches.open(O).then(function(e){return e.delete(o)})),n||fetch(e.request)})}}function h(e,n,t){n=n.slice();var r=t.bust,o=!1!==t.failAll,a=!0===t.deleteFirst,c=t.request||{credentials:"omit",mode:"cors"},s=Promise.resolve();return a&&(s=Promise.all(n.map(function(n){return e.delete(n).catch(function(){})}))),Promise.all(n.map(function(e){var n,t,o;return r&&(t=r,o=-1!==(n=e).indexOf("?"),e=n+(o?"&":"?")+"__uncache="+encodeURIComponent(t)),fetch(e,c).then(i).then(function(e){return e.ok?{response:e}:{error:!0}},function(){return{error:!0}})})).then(function(t){return o&&t.some(function(e){return e.error})?Promise.reject(new Error("Wrong response status")):(o||(t=t.filter(function(e,t){return!e.error||(n.splice(t,1),!1)})),s.then(function(){var r=t.map(function(t,r){return e.put(n[r],t.response)});return Promise.all(r)}))})}function d(e){return e.preloadResponse&&!0===v?e.preloadResponse.then(function(n){return n||fetch(e.request)}):fetch(e.request)}var p=n.cacheMaps,v=n.navigationPreload,m=e.strategy,g=e.responseStrategy,w=e.assets,y=e.hashesMap,U=e.externals,b=e.prefetchRequest||{credentials:"same-origin",mode:"cors"},P=e.name,q=P+":"+e.version,O=P+"$preload",R="__offline_webpack__data";Object.keys(w).forEach(function(e){w[e]=w[e].map(function(e){var n=new URL(e,location);return n.hash="",-1===U.indexOf(e)&&(n.search=""),n.toString()})}),y=Object.keys(y).reduce(function(e,n){var t=new URL(y[n],location);return t.search="",t.hash="",e[n]=t.toString(),e},{}),U=U.map(function(e){var n=new URL(e,location);return n.hash="",n.toString()});var S=[].concat(w.main,w.additional,w.optional);self.addEventListener("install",function(e){console.log("[SW]:","Install event");var n=void 0;n="changed"===m?o("main"):t("main"),e.waitUntil(n)}),self.addEventListener("activate",function(e){console.log("[SW]:","Activate event");var n=w.additional.length?(f&&console.log("[SW]:","Caching additional"),("changed"===m?o("additional"):t("additional")).catch(function(){console.error("[SW]:","Cache section `additional` failed to load")})):Promise.resolve();n=(n=(n=n.then(s)).then(c)).then(function(){if(self.clients&&self.clients.claim)return self.clients.claim()}),v&&self.registration.navigationPreload&&(n=Promise.all([n,self.registration.navigationPreload.enable()])),e.waitUntil(n)}),self.addEventListener("fetch",function(e){if("GET"===e.request.method&&("only-if-cached"!==e.request.cache||"same-origin"===e.request.mode)){var n=new URL(e.request.url);n.hash="";var t=n.toString();-1===U.indexOf(t)&&(n.search="",t=n.toString());var o=-1!==S.indexOf(t),i=t;if(!o){var a=function(e){var n=e.url,t=new URL(n),r=void 0;r=function(e){return"navigate"===e.mode||e.headers.get("Upgrade-Insecure-Requests")||-1!==(e.headers.get("Accept")||"").indexOf("text/html")}(e)?"navigate":t.origin===location.origin?"same-origin":"cross-origin";for(var o=0;o