diff --git a/manifest_firefox.json b/manifest_firefox.json deleted file mode 100644 index 6d9f080..0000000 --- a/manifest_firefox.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "manifest_version": 2, - "name": "Rogue Dex", - "version": "2.6", - "permissions": [ - "activeTab", - "webRequest", - "https://pokerogue.net/*", - "https://api.pokerogue.net/*" - ], - "browser_specific_settings": { - "gecko": { - "id": "{46029ed0-cb54-4130-8105-fcbbed40adc1}" - } - }, - "background": { - "scripts": ["background.js"], - "persistent": true - }, - "content_scripts": [ - { - "matches": ["https://api.pokerogue.net/*", "https://pokerogue.net/*"], - "js" : [ - "inject.js" - ], - "run_at": "document_start", - "all_frames": true - }, - { - "matches": ["https://pokerogue.net/*"], - "js" : [ - "content.js", - "libs/crypto-js.min.js" - ], - "css": ["styles.css"] - } - ], - "web_accessible_resources": ["inject.js", "injected.js"] -} diff --git a/roguedex_chrome/background.js b/roguedex_chrome/background.js new file mode 100644 index 0000000..bc58282 --- /dev/null +++ b/roguedex_chrome/background.js @@ -0,0 +1,648 @@ +const browserApi = typeof browser !== "undefined" ? browser : chrome; +let slotId = -1 +let Abilities; +(function (Abilities) { + Abilities[Abilities["NONE"] = 0] = "NONE"; + Abilities[Abilities["STENCH"] = 1] = "STENCH"; + Abilities[Abilities["DRIZZLE"] = 2] = "DRIZZLE"; + Abilities[Abilities["SPEED_BOOST"] = 3] = "SPEED_BOOST"; + Abilities[Abilities["BATTLE_ARMOR"] = 4] = "BATTLE_ARMOR"; + Abilities[Abilities["STURDY"] = 5] = "STURDY"; + Abilities[Abilities["DAMP"] = 6] = "DAMP"; + Abilities[Abilities["LIMBER"] = 7] = "LIMBER"; + Abilities[Abilities["SAND_VEIL"] = 8] = "SAND_VEIL"; + Abilities[Abilities["STATIC"] = 9] = "STATIC"; + Abilities[Abilities["VOLT_ABSORB"] = 10] = "VOLT_ABSORB"; + Abilities[Abilities["WATER_ABSORB"] = 11] = "WATER_ABSORB"; + Abilities[Abilities["OBLIVIOUS"] = 12] = "OBLIVIOUS"; + Abilities[Abilities["CLOUD_NINE"] = 13] = "CLOUD_NINE"; + Abilities[Abilities["COMPOUND_EYES"] = 14] = "COMPOUND_EYES"; + Abilities[Abilities["INSOMNIA"] = 15] = "INSOMNIA"; + Abilities[Abilities["COLOR_CHANGE"] = 16] = "COLOR_CHANGE"; + Abilities[Abilities["IMMUNITY"] = 17] = "IMMUNITY"; + Abilities[Abilities["FLASH_FIRE"] = 18] = "FLASH_FIRE"; + Abilities[Abilities["SHIELD_DUST"] = 19] = "SHIELD_DUST"; + Abilities[Abilities["OWN_TEMPO"] = 20] = "OWN_TEMPO"; + Abilities[Abilities["SUCTION_CUPS"] = 21] = "SUCTION_CUPS"; + Abilities[Abilities["INTIMIDATE"] = 22] = "INTIMIDATE"; + Abilities[Abilities["SHADOW_TAG"] = 23] = "SHADOW_TAG"; + Abilities[Abilities["ROUGH_SKIN"] = 24] = "ROUGH_SKIN"; + Abilities[Abilities["WONDER_GUARD"] = 25] = "WONDER_GUARD"; + Abilities[Abilities["LEVITATE"] = 26] = "LEVITATE"; + Abilities[Abilities["EFFECT_SPORE"] = 27] = "EFFECT_SPORE"; + Abilities[Abilities["SYNCHRONIZE"] = 28] = "SYNCHRONIZE"; + Abilities[Abilities["CLEAR_BODY"] = 29] = "CLEAR_BODY"; + Abilities[Abilities["NATURAL_CURE"] = 30] = "NATURAL_CURE"; + Abilities[Abilities["LIGHTNING_ROD"] = 31] = "LIGHTNING_ROD"; + Abilities[Abilities["SERENE_GRACE"] = 32] = "SERENE_GRACE"; + Abilities[Abilities["SWIFT_SWIM"] = 33] = "SWIFT_SWIM"; + Abilities[Abilities["CHLOROPHYLL"] = 34] = "CHLOROPHYLL"; + Abilities[Abilities["ILLUMINATE"] = 35] = "ILLUMINATE"; + Abilities[Abilities["TRACE"] = 36] = "TRACE"; + Abilities[Abilities["HUGE_POWER"] = 37] = "HUGE_POWER"; + Abilities[Abilities["POISON_POINT"] = 38] = "POISON_POINT"; + Abilities[Abilities["INNER_FOCUS"] = 39] = "INNER_FOCUS"; + Abilities[Abilities["MAGMA_ARMOR"] = 40] = "MAGMA_ARMOR"; + Abilities[Abilities["WATER_VEIL"] = 41] = "WATER_VEIL"; + Abilities[Abilities["MAGNET_PULL"] = 42] = "MAGNET_PULL"; + Abilities[Abilities["SOUNDPROOF"] = 43] = "SOUNDPROOF"; + Abilities[Abilities["RAIN_DISH"] = 44] = "RAIN_DISH"; + Abilities[Abilities["SAND_STREAM"] = 45] = "SAND_STREAM"; + Abilities[Abilities["PRESSURE"] = 46] = "PRESSURE"; + Abilities[Abilities["THICK_FAT"] = 47] = "THICK_FAT"; + Abilities[Abilities["EARLY_BIRD"] = 48] = "EARLY_BIRD"; + Abilities[Abilities["FLAME_BODY"] = 49] = "FLAME_BODY"; + Abilities[Abilities["RUN_AWAY"] = 50] = "RUN_AWAY"; + Abilities[Abilities["KEEN_EYE"] = 51] = "KEEN_EYE"; + Abilities[Abilities["HYPER_CUTTER"] = 52] = "HYPER_CUTTER"; + Abilities[Abilities["PICKUP"] = 53] = "PICKUP"; + Abilities[Abilities["TRUANT"] = 54] = "TRUANT"; + Abilities[Abilities["HUSTLE"] = 55] = "HUSTLE"; + Abilities[Abilities["CUTE_CHARM"] = 56] = "CUTE_CHARM"; + Abilities[Abilities["PLUS"] = 57] = "PLUS"; + Abilities[Abilities["MINUS"] = 58] = "MINUS"; + Abilities[Abilities["FORECAST"] = 59] = "FORECAST"; + Abilities[Abilities["STICKY_HOLD"] = 60] = "STICKY_HOLD"; + Abilities[Abilities["SHED_SKIN"] = 61] = "SHED_SKIN"; + Abilities[Abilities["GUTS"] = 62] = "GUTS"; + Abilities[Abilities["MARVEL_SCALE"] = 63] = "MARVEL_SCALE"; + Abilities[Abilities["LIQUID_OOZE"] = 64] = "LIQUID_OOZE"; + Abilities[Abilities["OVERGROW"] = 65] = "OVERGROW"; + Abilities[Abilities["BLAZE"] = 66] = "BLAZE"; + Abilities[Abilities["TORRENT"] = 67] = "TORRENT"; + Abilities[Abilities["SWARM"] = 68] = "SWARM"; + Abilities[Abilities["ROCK_HEAD"] = 69] = "ROCK_HEAD"; + Abilities[Abilities["DROUGHT"] = 70] = "DROUGHT"; + Abilities[Abilities["ARENA_TRAP"] = 71] = "ARENA_TRAP"; + Abilities[Abilities["VITAL_SPIRIT"] = 72] = "VITAL_SPIRIT"; + Abilities[Abilities["WHITE_SMOKE"] = 73] = "WHITE_SMOKE"; + Abilities[Abilities["PURE_POWER"] = 74] = "PURE_POWER"; + Abilities[Abilities["SHELL_ARMOR"] = 75] = "SHELL_ARMOR"; + Abilities[Abilities["AIR_LOCK"] = 76] = "AIR_LOCK"; + Abilities[Abilities["TANGLED_FEET"] = 77] = "TANGLED_FEET"; + Abilities[Abilities["MOTOR_DRIVE"] = 78] = "MOTOR_DRIVE"; + Abilities[Abilities["RIVALRY"] = 79] = "RIVALRY"; + Abilities[Abilities["STEADFAST"] = 80] = "STEADFAST"; + Abilities[Abilities["SNOW_CLOAK"] = 81] = "SNOW_CLOAK"; + Abilities[Abilities["GLUTTONY"] = 82] = "GLUTTONY"; + Abilities[Abilities["ANGER_POINT"] = 83] = "ANGER_POINT"; + Abilities[Abilities["UNBURDEN"] = 84] = "UNBURDEN"; + Abilities[Abilities["HEATPROOF"] = 85] = "HEATPROOF"; + Abilities[Abilities["SIMPLE"] = 86] = "SIMPLE"; + Abilities[Abilities["DRY_SKIN"] = 87] = "DRY_SKIN"; + Abilities[Abilities["DOWNLOAD"] = 88] = "DOWNLOAD"; + Abilities[Abilities["IRON_FIST"] = 89] = "IRON_FIST"; + Abilities[Abilities["POISON_HEAL"] = 90] = "POISON_HEAL"; + Abilities[Abilities["ADAPTABILITY"] = 91] = "ADAPTABILITY"; + Abilities[Abilities["SKILL_LINK"] = 92] = "SKILL_LINK"; + Abilities[Abilities["HYDRATION"] = 93] = "HYDRATION"; + Abilities[Abilities["SOLAR_POWER"] = 94] = "SOLAR_POWER"; + Abilities[Abilities["QUICK_FEET"] = 95] = "QUICK_FEET"; + Abilities[Abilities["NORMALIZE"] = 96] = "NORMALIZE"; + Abilities[Abilities["SNIPER"] = 97] = "SNIPER"; + Abilities[Abilities["MAGIC_GUARD"] = 98] = "MAGIC_GUARD"; + Abilities[Abilities["NO_GUARD"] = 99] = "NO_GUARD"; + Abilities[Abilities["STALL"] = 100] = "STALL"; + Abilities[Abilities["TECHNICIAN"] = 101] = "TECHNICIAN"; + Abilities[Abilities["LEAF_GUARD"] = 102] = "LEAF_GUARD"; + Abilities[Abilities["KLUTZ"] = 103] = "KLUTZ"; + Abilities[Abilities["MOLD_BREAKER"] = 104] = "MOLD_BREAKER"; + Abilities[Abilities["SUPER_LUCK"] = 105] = "SUPER_LUCK"; + Abilities[Abilities["AFTERMATH"] = 106] = "AFTERMATH"; + Abilities[Abilities["ANTICIPATION"] = 107] = "ANTICIPATION"; + Abilities[Abilities["FOREWARN"] = 108] = "FOREWARN"; + Abilities[Abilities["UNAWARE"] = 109] = "UNAWARE"; + Abilities[Abilities["TINTED_LENS"] = 110] = "TINTED_LENS"; + Abilities[Abilities["FILTER"] = 111] = "FILTER"; + Abilities[Abilities["SLOW_START"] = 112] = "SLOW_START"; + Abilities[Abilities["SCRAPPY"] = 113] = "SCRAPPY"; + Abilities[Abilities["STORM_DRAIN"] = 114] = "STORM_DRAIN"; + Abilities[Abilities["ICE_BODY"] = 115] = "ICE_BODY"; + Abilities[Abilities["SOLID_ROCK"] = 116] = "SOLID_ROCK"; + Abilities[Abilities["SNOW_WARNING"] = 117] = "SNOW_WARNING"; + Abilities[Abilities["HONEY_GATHER"] = 118] = "HONEY_GATHER"; + Abilities[Abilities["FRISK"] = 119] = "FRISK"; + Abilities[Abilities["RECKLESS"] = 120] = "RECKLESS"; + Abilities[Abilities["MULTITYPE"] = 121] = "MULTITYPE"; + Abilities[Abilities["FLOWER_GIFT"] = 122] = "FLOWER_GIFT"; + Abilities[Abilities["BAD_DREAMS"] = 123] = "BAD_DREAMS"; + Abilities[Abilities["PICKPOCKET"] = 124] = "PICKPOCKET"; + Abilities[Abilities["SHEER_FORCE"] = 125] = "SHEER_FORCE"; + Abilities[Abilities["CONTRARY"] = 126] = "CONTRARY"; + Abilities[Abilities["UNNERVE"] = 127] = "UNNERVE"; + Abilities[Abilities["DEFIANT"] = 128] = "DEFIANT"; + Abilities[Abilities["DEFEATIST"] = 129] = "DEFEATIST"; + Abilities[Abilities["CURSED_BODY"] = 130] = "CURSED_BODY"; + Abilities[Abilities["HEALER"] = 131] = "HEALER"; + Abilities[Abilities["FRIEND_GUARD"] = 132] = "FRIEND_GUARD"; + Abilities[Abilities["WEAK_ARMOR"] = 133] = "WEAK_ARMOR"; + Abilities[Abilities["HEAVY_METAL"] = 134] = "HEAVY_METAL"; + Abilities[Abilities["LIGHT_METAL"] = 135] = "LIGHT_METAL"; + Abilities[Abilities["MULTISCALE"] = 136] = "MULTISCALE"; + Abilities[Abilities["TOXIC_BOOST"] = 137] = "TOXIC_BOOST"; + Abilities[Abilities["FLARE_BOOST"] = 138] = "FLARE_BOOST"; + Abilities[Abilities["HARVEST"] = 139] = "HARVEST"; + Abilities[Abilities["TELEPATHY"] = 140] = "TELEPATHY"; + Abilities[Abilities["MOODY"] = 141] = "MOODY"; + Abilities[Abilities["OVERCOAT"] = 142] = "OVERCOAT"; + Abilities[Abilities["POISON_TOUCH"] = 143] = "POISON_TOUCH"; + Abilities[Abilities["REGENERATOR"] = 144] = "REGENERATOR"; + Abilities[Abilities["BIG_PECKS"] = 145] = "BIG_PECKS"; + Abilities[Abilities["SAND_RUSH"] = 146] = "SAND_RUSH"; + Abilities[Abilities["WONDER_SKIN"] = 147] = "WONDER_SKIN"; + Abilities[Abilities["ANALYTIC"] = 148] = "ANALYTIC"; + Abilities[Abilities["ILLUSION"] = 149] = "ILLUSION"; + Abilities[Abilities["IMPOSTER"] = 150] = "IMPOSTER"; + Abilities[Abilities["INFILTRATOR"] = 151] = "INFILTRATOR"; + Abilities[Abilities["MUMMY"] = 152] = "MUMMY"; + Abilities[Abilities["MOXIE"] = 153] = "MOXIE"; + Abilities[Abilities["JUSTIFIED"] = 154] = "JUSTIFIED"; + Abilities[Abilities["RATTLED"] = 155] = "RATTLED"; + Abilities[Abilities["MAGIC_BOUNCE"] = 156] = "MAGIC_BOUNCE"; + Abilities[Abilities["SAP_SIPPER"] = 157] = "SAP_SIPPER"; + Abilities[Abilities["PRANKSTER"] = 158] = "PRANKSTER"; + Abilities[Abilities["SAND_FORCE"] = 159] = "SAND_FORCE"; + Abilities[Abilities["IRON_BARBS"] = 160] = "IRON_BARBS"; + Abilities[Abilities["ZEN_MODE"] = 161] = "ZEN_MODE"; + Abilities[Abilities["VICTORY_STAR"] = 162] = "VICTORY_STAR"; + Abilities[Abilities["TURBOBLAZE"] = 163] = "TURBOBLAZE"; + Abilities[Abilities["TERAVOLT"] = 164] = "TERAVOLT"; + Abilities[Abilities["AROMA_VEIL"] = 165] = "AROMA_VEIL"; + Abilities[Abilities["FLOWER_VEIL"] = 166] = "FLOWER_VEIL"; + Abilities[Abilities["CHEEK_POUCH"] = 167] = "CHEEK_POUCH"; + Abilities[Abilities["PROTEAN"] = 168] = "PROTEAN"; + Abilities[Abilities["FUR_COAT"] = 169] = "FUR_COAT"; + Abilities[Abilities["MAGICIAN"] = 170] = "MAGICIAN"; + Abilities[Abilities["BULLETPROOF"] = 171] = "BULLETPROOF"; + Abilities[Abilities["COMPETITIVE"] = 172] = "COMPETITIVE"; + Abilities[Abilities["STRONG_JAW"] = 173] = "STRONG_JAW"; + Abilities[Abilities["REFRIGERATE"] = 174] = "REFRIGERATE"; + Abilities[Abilities["SWEET_VEIL"] = 175] = "SWEET_VEIL"; + Abilities[Abilities["STANCE_CHANGE"] = 176] = "STANCE_CHANGE"; + Abilities[Abilities["GALE_WINGS"] = 177] = "GALE_WINGS"; + Abilities[Abilities["MEGA_LAUNCHER"] = 178] = "MEGA_LAUNCHER"; + Abilities[Abilities["GRASS_PELT"] = 179] = "GRASS_PELT"; + Abilities[Abilities["SYMBIOSIS"] = 180] = "SYMBIOSIS"; + Abilities[Abilities["TOUGH_CLAWS"] = 181] = "TOUGH_CLAWS"; + Abilities[Abilities["PIXILATE"] = 182] = "PIXILATE"; + Abilities[Abilities["GOOEY"] = 183] = "GOOEY"; + Abilities[Abilities["AERILATE"] = 184] = "AERILATE"; + Abilities[Abilities["PARENTAL_BOND"] = 185] = "PARENTAL_BOND"; + Abilities[Abilities["DARK_AURA"] = 186] = "DARK_AURA"; + Abilities[Abilities["FAIRY_AURA"] = 187] = "FAIRY_AURA"; + Abilities[Abilities["AURA_BREAK"] = 188] = "AURA_BREAK"; + Abilities[Abilities["PRIMORDIAL_SEA"] = 189] = "PRIMORDIAL_SEA"; + Abilities[Abilities["DESOLATE_LAND"] = 190] = "DESOLATE_LAND"; + Abilities[Abilities["DELTA_STREAM"] = 191] = "DELTA_STREAM"; + Abilities[Abilities["STAMINA"] = 192] = "STAMINA"; + Abilities[Abilities["WIMP_OUT"] = 193] = "WIMP_OUT"; + Abilities[Abilities["EMERGENCY_EXIT"] = 194] = "EMERGENCY_EXIT"; + Abilities[Abilities["WATER_COMPACTION"] = 195] = "WATER_COMPACTION"; + Abilities[Abilities["MERCILESS"] = 196] = "MERCILESS"; + Abilities[Abilities["SHIELDS_DOWN"] = 197] = "SHIELDS_DOWN"; + Abilities[Abilities["STAKEOUT"] = 198] = "STAKEOUT"; + Abilities[Abilities["WATER_BUBBLE"] = 199] = "WATER_BUBBLE"; + Abilities[Abilities["STEELWORKER"] = 200] = "STEELWORKER"; + Abilities[Abilities["BERSERK"] = 201] = "BERSERK"; + Abilities[Abilities["SLUSH_RUSH"] = 202] = "SLUSH_RUSH"; + Abilities[Abilities["LONG_REACH"] = 203] = "LONG_REACH"; + Abilities[Abilities["LIQUID_VOICE"] = 204] = "LIQUID_VOICE"; + Abilities[Abilities["TRIAGE"] = 205] = "TRIAGE"; + Abilities[Abilities["GALVANIZE"] = 206] = "GALVANIZE"; + Abilities[Abilities["SURGE_SURFER"] = 207] = "SURGE_SURFER"; + Abilities[Abilities["SCHOOLING"] = 208] = "SCHOOLING"; + Abilities[Abilities["DISGUISE"] = 209] = "DISGUISE"; + Abilities[Abilities["BATTLE_BOND"] = 210] = "BATTLE_BOND"; + Abilities[Abilities["POWER_CONSTRUCT"] = 211] = "POWER_CONSTRUCT"; + Abilities[Abilities["CORROSION"] = 212] = "CORROSION"; + Abilities[Abilities["COMATOSE"] = 213] = "COMATOSE"; + Abilities[Abilities["QUEENLY_MAJESTY"] = 214] = "QUEENLY_MAJESTY"; + Abilities[Abilities["INNARDS_OUT"] = 215] = "INNARDS_OUT"; + Abilities[Abilities["DANCER"] = 216] = "DANCER"; + Abilities[Abilities["BATTERY"] = 217] = "BATTERY"; + Abilities[Abilities["FLUFFY"] = 218] = "FLUFFY"; + Abilities[Abilities["DAZZLING"] = 219] = "DAZZLING"; + Abilities[Abilities["SOUL_HEART"] = 220] = "SOUL_HEART"; + Abilities[Abilities["TANGLING_HAIR"] = 221] = "TANGLING_HAIR"; + Abilities[Abilities["RECEIVER"] = 222] = "RECEIVER"; + Abilities[Abilities["POWER_OF_ALCHEMY"] = 223] = "POWER_OF_ALCHEMY"; + Abilities[Abilities["BEAST_BOOST"] = 224] = "BEAST_BOOST"; + Abilities[Abilities["RKS_SYSTEM"] = 225] = "RKS_SYSTEM"; + Abilities[Abilities["ELECTRIC_SURGE"] = 226] = "ELECTRIC_SURGE"; + Abilities[Abilities["PSYCHIC_SURGE"] = 227] = "PSYCHIC_SURGE"; + Abilities[Abilities["MISTY_SURGE"] = 228] = "MISTY_SURGE"; + Abilities[Abilities["GRASSY_SURGE"] = 229] = "GRASSY_SURGE"; + Abilities[Abilities["FULL_METAL_BODY"] = 230] = "FULL_METAL_BODY"; + Abilities[Abilities["SHADOW_SHIELD"] = 231] = "SHADOW_SHIELD"; + Abilities[Abilities["PRISM_ARMOR"] = 232] = "PRISM_ARMOR"; + Abilities[Abilities["NEUROFORCE"] = 233] = "NEUROFORCE"; + Abilities[Abilities["INTREPID_SWORD"] = 234] = "INTREPID_SWORD"; + Abilities[Abilities["DAUNTLESS_SHIELD"] = 235] = "DAUNTLESS_SHIELD"; + Abilities[Abilities["LIBERO"] = 236] = "LIBERO"; + Abilities[Abilities["BALL_FETCH"] = 237] = "BALL_FETCH"; + Abilities[Abilities["COTTON_DOWN"] = 238] = "COTTON_DOWN"; + Abilities[Abilities["PROPELLER_TAIL"] = 239] = "PROPELLER_TAIL"; + Abilities[Abilities["MIRROR_ARMOR"] = 240] = "MIRROR_ARMOR"; + Abilities[Abilities["GULP_MISSILE"] = 241] = "GULP_MISSILE"; + Abilities[Abilities["STALWART"] = 242] = "STALWART"; + Abilities[Abilities["STEAM_ENGINE"] = 243] = "STEAM_ENGINE"; + Abilities[Abilities["PUNK_ROCK"] = 244] = "PUNK_ROCK"; + Abilities[Abilities["SAND_SPIT"] = 245] = "SAND_SPIT"; + Abilities[Abilities["ICE_SCALES"] = 246] = "ICE_SCALES"; + Abilities[Abilities["RIPEN"] = 247] = "RIPEN"; + Abilities[Abilities["ICE_FACE"] = 248] = "ICE_FACE"; + Abilities[Abilities["POWER_SPOT"] = 249] = "POWER_SPOT"; + Abilities[Abilities["MIMICRY"] = 250] = "MIMICRY"; + Abilities[Abilities["SCREEN_CLEANER"] = 251] = "SCREEN_CLEANER"; + Abilities[Abilities["STEELY_SPIRIT"] = 252] = "STEELY_SPIRIT"; + Abilities[Abilities["PERISH_BODY"] = 253] = "PERISH_BODY"; + Abilities[Abilities["WANDERING_SPIRIT"] = 254] = "WANDERING_SPIRIT"; + Abilities[Abilities["GORILLA_TACTICS"] = 255] = "GORILLA_TACTICS"; + Abilities[Abilities["NEUTRALIZING_GAS"] = 256] = "NEUTRALIZING_GAS"; + Abilities[Abilities["PASTEL_VEIL"] = 257] = "PASTEL_VEIL"; + Abilities[Abilities["HUNGER_SWITCH"] = 258] = "HUNGER_SWITCH"; + Abilities[Abilities["QUICK_DRAW"] = 259] = "QUICK_DRAW"; + Abilities[Abilities["UNSEEN_FIST"] = 260] = "UNSEEN_FIST"; + Abilities[Abilities["CURIOUS_MEDICINE"] = 261] = "CURIOUS_MEDICINE"; + Abilities[Abilities["TRANSISTOR"] = 262] = "TRANSISTOR"; + Abilities[Abilities["DRAGONS_MAW"] = 263] = "DRAGONS_MAW"; + Abilities[Abilities["CHILLING_NEIGH"] = 264] = "CHILLING_NEIGH"; + Abilities[Abilities["GRIM_NEIGH"] = 265] = "GRIM_NEIGH"; + Abilities[Abilities["AS_ONE_GLASTRIER"] = 266] = "AS_ONE_GLASTRIER"; + Abilities[Abilities["AS_ONE_SPECTRIER"] = 267] = "AS_ONE_SPECTRIER"; + Abilities[Abilities["LINGERING_AROMA"] = 268] = "LINGERING_AROMA"; + Abilities[Abilities["SEED_SOWER"] = 269] = "SEED_SOWER"; + Abilities[Abilities["THERMAL_EXCHANGE"] = 270] = "THERMAL_EXCHANGE"; + Abilities[Abilities["ANGER_SHELL"] = 271] = "ANGER_SHELL"; + Abilities[Abilities["PURIFYING_SALT"] = 272] = "PURIFYING_SALT"; + Abilities[Abilities["WELL_BAKED_BODY"] = 273] = "WELL_BAKED_BODY"; + Abilities[Abilities["WIND_RIDER"] = 274] = "WIND_RIDER"; + Abilities[Abilities["GUARD_DOG"] = 275] = "GUARD_DOG"; + Abilities[Abilities["ROCKY_PAYLOAD"] = 276] = "ROCKY_PAYLOAD"; + Abilities[Abilities["WIND_POWER"] = 277] = "WIND_POWER"; + Abilities[Abilities["ZERO_TO_HERO"] = 278] = "ZERO_TO_HERO"; + Abilities[Abilities["COMMANDER"] = 279] = "COMMANDER"; + Abilities[Abilities["ELECTROMORPHOSIS"] = 280] = "ELECTROMORPHOSIS"; + Abilities[Abilities["PROTOSYNTHESIS"] = 281] = "PROTOSYNTHESIS"; + Abilities[Abilities["QUARK_DRIVE"] = 282] = "QUARK_DRIVE"; + Abilities[Abilities["GOOD_AS_GOLD"] = 283] = "GOOD_AS_GOLD"; + Abilities[Abilities["VESSEL_OF_RUIN"] = 284] = "VESSEL_OF_RUIN"; + Abilities[Abilities["SWORD_OF_RUIN"] = 285] = "SWORD_OF_RUIN"; + Abilities[Abilities["TABLETS_OF_RUIN"] = 286] = "TABLETS_OF_RUIN"; + Abilities[Abilities["BEADS_OF_RUIN"] = 287] = "BEADS_OF_RUIN"; + Abilities[Abilities["ORICHALCUM_PULSE"] = 288] = "ORICHALCUM_PULSE"; + Abilities[Abilities["HADRON_ENGINE"] = 289] = "HADRON_ENGINE"; + Abilities[Abilities["OPPORTUNIST"] = 290] = "OPPORTUNIST"; + Abilities[Abilities["CUD_CHEW"] = 291] = "CUD_CHEW"; + Abilities[Abilities["SHARPNESS"] = 292] = "SHARPNESS"; + Abilities[Abilities["SUPREME_OVERLORD"] = 293] = "SUPREME_OVERLORD"; + Abilities[Abilities["COSTAR"] = 294] = "COSTAR"; + Abilities[Abilities["TOXIC_DEBRIS"] = 295] = "TOXIC_DEBRIS"; + Abilities[Abilities["ARMOR_TAIL"] = 296] = "ARMOR_TAIL"; + Abilities[Abilities["EARTH_EATER"] = 297] = "EARTH_EATER"; + Abilities[Abilities["MYCELIUM_MIGHT"] = 298] = "MYCELIUM_MIGHT"; + Abilities[Abilities["MINDS_EYE"] = 299] = "MINDS_EYE"; + Abilities[Abilities["SUPERSWEET_SYRUP"] = 300] = "SUPERSWEET_SYRUP"; + Abilities[Abilities["HOSPITALITY"] = 301] = "HOSPITALITY"; + Abilities[Abilities["TOXIC_CHAIN"] = 302] = "TOXIC_CHAIN"; + Abilities[Abilities["EMBODY_ASPECT_TEAL"] = 303] = "EMBODY_ASPECT_TEAL"; + Abilities[Abilities["EMBODY_ASPECT_WELLSPRING"] = 304] = "EMBODY_ASPECT_WELLSPRING"; + Abilities[Abilities["EMBODY_ASPECT_HEARTHFLAME"] = 305] = "EMBODY_ASPECT_HEARTHFLAME"; + Abilities[Abilities["EMBODY_ASPECT_CORNERSTONE"] = 306] = "EMBODY_ASPECT_CORNERSTONE"; + Abilities[Abilities["TERA_SHIFT"] = 307] = "TERA_SHIFT"; + Abilities[Abilities["TERA_SHELL"] = 308] = "TERA_SHELL"; + Abilities[Abilities["TERAFORM_ZERO"] = 309] = "TERAFORM_ZERO"; + Abilities[Abilities["POISON_PUPPETEER"] = 310] = "POISON_PUPPETEER"; +})(Abilities || (Abilities = {})); + +let Nature; +(function (Nature) { + Nature[Nature["HARDY"] = 0] = "HARDY"; + Nature[Nature["LONELY"] = 1] = "LONELY"; + Nature[Nature["BRAVE"] = 2] = "BRAVE"; + Nature[Nature["ADAMANT"] = 3] = "ADAMANT"; + Nature[Nature["NAUGHTY"] = 4] = "NAUGHTY"; + Nature[Nature["BOLD"] = 5] = "BOLD"; + Nature[Nature["DOCILE"] = 6] = "DOCILE"; + Nature[Nature["RELAXED"] = 7] = "RELAXED"; + Nature[Nature["IMPISH"] = 8] = "IMPISH"; + Nature[Nature["LAX"] = 9] = "LAX"; + Nature[Nature["TIMID"] = 10] = "TIMID"; + Nature[Nature["HASTY"] = 11] = "HASTY"; + Nature[Nature["SERIOUS"] = 12] = "SERIOUS"; + Nature[Nature["JOLLY"] = 13] = "JOLLY"; + Nature[Nature["NAIVE"] = 14] = "NAIVE"; + Nature[Nature["MODEST"] = 15] = "MODEST"; + Nature[Nature["MILD"] = 16] = "MILD"; + Nature[Nature["QUIET"] = 17] = "QUIET"; + Nature[Nature["BASHFUL"] = 18] = "BASHFUL"; + Nature[Nature["RASH"] = 19] = "RASH"; + Nature[Nature["CALM"] = 20] = "CALM"; + Nature[Nature["GENTLE"] = 21] = "GENTLE"; + Nature[Nature["SASSY"] = 22] = "SASSY"; + Nature[Nature["CAREFUL"] = 23] = "CAREFUL"; + Nature[Nature["QUIRKY"] = 24] = "QUIRKY"; +})(Nature || (Nature = {})); + +let WeatherType; +(function (WeatherType) { + WeatherType[WeatherType["NONE"] = 0] = "NONE"; + WeatherType[WeatherType["SUNNY"] = 1] = "SUNNY"; + WeatherType[WeatherType["RAIN"] = 2] = "RAIN"; + WeatherType[WeatherType["SANDSTORM"] = 3] = "SANDSTORM"; + WeatherType[WeatherType["HAIL"] = 4] = "HAIL"; + WeatherType[WeatherType["SNOW"] = 5] = "SNOW"; + WeatherType[WeatherType["FOG"] = 6] = "FOG"; + WeatherType[WeatherType["HEAVY_RAIN"] = 7] = "HEAVY_RAIN"; + WeatherType[WeatherType["HARSH_SUN"] = 8] = "HARSH_SUN"; + WeatherType[WeatherType["STRONG_WINDS"] = 9] = "STRONG_WINDS"; +})(WeatherType || (WeatherType = {})); + +function getPokemonSpriteURL(id) { + // Construct the sprite URL based on the Pokemon ID + const spriteURL = `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${id}.png`; + return spriteURL; +} + +// Function to get Pokémon type +async function getPokeType(id) { + try { + const response = await fetch(`https://pokeapi.co/api/v2/pokemon/${id}`); + const data = await response.json(); + const types = data.types.map(type => type.type.name); + return types; + } catch (error) { + console.error('Error fetching Pokémon type:', error); + return null; + } +} + +// Function to get type effectiveness +async function getTypeEffectiveness(type) { + try { + const response = await fetch(`https://pokeapi.co/api/v2/type/${type}`); + const data = await response.json(); + return data.damage_relations; + } catch (error) { + console.error(`Error fetching type effectiveness for ${type}:`, error); + return null; + } +} + +// Function to calculate weaknesses, resistances, and immunities +async function calculateTypeEffectiveness(types) { + const typeEffectiveness = await Promise.all(types.map(getTypeEffectiveness)); + if (typeEffectiveness.some(data => data === null)) { + return null; + } + + const weaknesses = new Set(); + const resistances = new Set(); + const immunities = new Set(); + + if (types.length === 1) { + const data = typeEffectiveness[0]; + data.double_damage_from.forEach(t => weaknesses.add(t.name)); + data.half_damage_from.forEach(t => resistances.add(t.name)); + data.no_damage_from.forEach(t => immunities.add(t.name)); + } else if (types.length === 2) { + const [type1, type2] = types; + const type1Effectiveness = typeEffectiveness[0]; + const type2Effectiveness = typeEffectiveness[1]; + + // Calculate weaknesses + type1Effectiveness.double_damage_from.forEach(t => { + if (!type2Effectiveness.half_damage_from.some(r => r.name === t.name)) { + weaknesses.add(t.name) + } + }); + type2Effectiveness.double_damage_from.forEach(t => { + if (!type1Effectiveness.half_damage_from.some(r => r.name === t.name)) { + weaknesses.add(t.name) + } + }); + + // Calculate resistances + type1Effectiveness.half_damage_from.forEach(t => { + if (!type2Effectiveness.double_damage_from.some(r => r.name === t.name)) { + resistances.add(t.name) + } + }); + + type2Effectiveness.half_damage_from.forEach(t => { + if (!type1Effectiveness.double_damage_from.some(r => r.name === t.name)) { + resistances.add(t.name) + } + }); + + // Calculate immunities + type1Effectiveness.no_damage_from.forEach(t => immunities.add(t.name)) + type2Effectiveness.no_damage_from.forEach(t => immunities.add(t.name)) + + immunities.forEach(immunity => { + weaknesses.delete(immunity); + resistances.delete(immunity); + }) + } + + return { weaknesses, resistances, immunities }; +} + +// Example usage +async function getPokemonTypeEffectiveness(id) { + const types = await getPokeType(id); + if (types) { + const { weaknesses, resistances, immunities } = await calculateTypeEffectiveness(types); + return { + 'weaknesses': weaknesses, + 'resistances': resistances, + 'immunities': immunities + } + } + return {} +} + +function updateDiv(pokemon, weather, message) { + browserApi.tabs.query({ active: true, currentWindow: true }, function (tabs) { + browserApi.tabs.sendMessage(tabs[0].id, { type: message, pokemon: pokemon, weather: weather, slotId: slotId }, (response) => { + if (response && response.success) { + console.log('Div updated successfully'); + } else { + console.error('Failed to update div'); + } + }); + }); +} + + +function convertPokemonId(pokemonId) { + const conversionList = { + 2019: 10091, + 2020: 10092, + 2026: 10100, + 2027: 10101, + 2028: 10102, + 2037: 10103, + 2038: 10104, + 2050: 10105, + 2051: 10106, + 2052: 10107, + 2053: 10108, + 2074: 10109, + 2075: 10110, + 2076: 10111, + 2088: 10112, + 2089: 10113, + 2103: 10114, + 2105: 10115, + 2670: 10061, + 4052: 10162, + 4077: 10163, + 4078: 10164, + 4079: 10165, + 4080: 10166, + 4083: 10167, + 4110: 10168, + 4122: 10169, + 4144: 10170, + 4145: 10171, + 4146: 10172, + 4199: 10173, + 4222: 10174, + 4263: 10175, + 4264: 10176, + 4554: 10177, + 4555: 10178, + 4562: 10179, + 4618: 10180, + 6058: 10229, + 6059: 10230, + 6100: 10231, + 6101: 10232, + 6157: 10233, + 6211: 10234, + 6215: 10235, + 6503: 10236, + 6549: 10237, + 6570: 10238, + 6571: 10239, + 6628: 10240, + 6705: 10241, + 6706: 10242, + 6713: 10243, + 6724: 10244, + 8128: 10252, + 8194: 10253, + 8901: 10272 + } + if (pokemonId in conversionList) { + return conversionList[pokemonId] + } else { + return pokemonId + } +} + +function mapPartyToPokemonArray(party) { + return party.map(({ species, abilityIndex, nature, ivs }) => ({ species, abilityIndex, nature, ivs })) +} + +// Merge two lists together while preventing duplicates +// > Use: Incoming API call for pokemon data is merged with exisiting weakness, resistance, and immunity data to aggregate data on ally's/enemy's team +// Code was gathered from: https://stackoverflow.com/questions/1584370/how-to-merge-two-arrays-in-javascript-and-de-duplicate-items +const mergeTwoLists = (allTypeEffectivenessList, newTypeEffectivenessList, + predicate = (allTypeEffectivenessList, newTypeEffectivenessList) => allTypeEffectivenessList === newTypeEffectivenessList + ) => { + const combinedTypeEffectivenessList = [...allTypeEffectivenessList] // copy to avoid side effects + + // add all items from newTypeEffectivenessList to copy into combinedTypeEffectivenessList if they're not already present + newTypeEffectivenessList.forEach((newTypeEffectivenessItem) => ( + combinedTypeEffectivenessList.some((combinedTypeEffectivenessItem) => + predicate(newTypeEffectivenessItem, combinedTypeEffectivenessItem)) ? null : combinedTypeEffectivenessList.push(newTypeEffectivenessItem) + ) + ) + return combinedTypeEffectivenessList; +} + +// message can be either "UPDATE_ALLIES_DIV" or "UPDATE_ENEMIES_DIV" +function appendPokemonArrayToDiv(pokemonArray, arena, message) { + let frontendPokemonArray = [ + // Functionality: Aggregate all of Team's Weaknesses, Resistances, and Immunities + // > Important data is the aggregation of weaknesses, resistances, and immunities - Allows player to see coverage of ally/enemy team + // > Dummy data was inserted as Value:0 in id, ivs, ability, and nature + // Dev Note: Need to save a spot for incoming pokemon data - Index 0 + // > New pokemon data will be appended to the end of the list (After Index 0) + { + 'id': 0, + 'typeEffectiveness': { + 'weaknesses': [], + 'resistances': [], + 'immunities': [] + }, + 'ivs': [0, 0, 0, 0, 0, 0], + 'ability': Abilities[0], + 'nature': Nature[0] + } + ] + pokemonArray.forEach((pokemon) => { + const pokemonId = convertPokemonId(pokemon.species) + let weather = {} + if (arena.weather && arena.weather.weatherType) { + weather = { + 'type': WeatherType[arena.weather.weatherType], + 'turnsLeft': arena.weather.turnsLeft || 0 + } + } + getPokemonTypeEffectiveness(pokemonId).then((typeEffectiveness) => { + console.log("Got pokemon", pokemonId, "type effectiveness", typeEffectiveness) + frontendPokemonArray.push({ + 'id': pokemon.species, + 'typeEffectiveness': { + 'weaknesses': Array.from(typeEffectiveness.weaknesses), + 'resistances': Array.from(typeEffectiveness.resistances), + 'immunities': Array.from(typeEffectiveness.immunities) + }, + 'ivs': pokemon.ivs, + 'ability': Abilities[pokemon.abilityIndex], + 'nature': Nature[pokemon.nature] + }) + + // Team Aggregation of Weaknessess, Resistances, and Immunities in Index 0 of frontendPokemonArray + // Merge the current list at index 0 with the new incoming list from the API call + frontendPokemonArray[0]['typeEffectiveness']['weaknesses'] = mergeTwoLists(frontendPokemonArray[0]['typeEffectiveness']['weaknesses'], typeEffectiveness.weaknesses) + frontendPokemonArray[0]['typeEffectiveness']['resistances'] = mergeTwoLists(frontendPokemonArray[0]['typeEffectiveness']['resistances'], typeEffectiveness.resistances) + frontendPokemonArray[0]['typeEffectiveness']['immunities'] = mergeTwoLists(frontendPokemonArray[0]['typeEffectiveness']['immunities'], typeEffectiveness.immunities) + updateDiv(frontendPokemonArray, weather, message) + }) + }) +} + +browserApi.runtime.onMessage.addListener(function(request, sender, sendResponse) { + // Happens when loading a savegame or continuing an old run + if (request.type == 'BG_GET_SAVEDATA') { + const savedata = request.data + slotId = request.slotId + console.log("Received save data", savedata) + appendPokemonArrayToDiv(mapPartyToPokemonArray(savedata.enemyParty), savedata.arena, "UPDATE_ENEMIES_DIV") + appendPokemonArrayToDiv(mapPartyToPokemonArray(savedata.party), savedata.arena, "UPDATE_ALLIES_DIV") + } +}); + +browserApi.webRequest.onBeforeRequest.addListener( + function(details) { + if (details.method === 'POST') { + try { + let sessionData = JSON.parse(new TextDecoder().decode(details.requestBody.raw[0].bytes)) + console.log("POST Session data:", sessionData) + if (details.url.includes("updateall")) sessionData = sessionData.session + appendPokemonArrayToDiv(mapPartyToPokemonArray(sessionData.enemyParty), sessionData.arena, "UPDATE_ENEMIES_DIV") + appendPokemonArrayToDiv(mapPartyToPokemonArray(sessionData.party), sessionData.arena, "UPDATE_ALLIES_DIV") + } catch (e) { + console.error("Error while intercepting web request: ", e) + } + } + }, + { + urls: ['https://api.pokerogue.net/savedata/update?datatype=1*', 'https://api.pokerogue.net/savedata/updateall'] + }, + ["requestBody"] +) \ No newline at end of file diff --git a/roguedex_chrome/content.js b/roguedex_chrome/content.js new file mode 100644 index 0000000..6c14f6b --- /dev/null +++ b/roguedex_chrome/content.js @@ -0,0 +1,426 @@ +const runningStatusDiv = document.createElement('div') +runningStatusDiv.textContent = 'RogueDex is running!' +runningStatusDiv.classList.add('text-base') +runningStatusDiv.classList.add('running-status') +document.body.insertBefore(runningStatusDiv, document.body.firstChild) + +let wrapperDivPositions = { + 'enemies': { + 'top' : '0', + 'left': '0', + 'opacity': '100' + }, + 'allies': { + 'top': '0', + 'left': '0', + 'opacity': '100' + } +} + +let slotId = -1 +const saveKey = 'x0i2O7WRiANTqPmZ' +// Creates the main wrapper div +function createDiv() { + const mainWrapper = document.createElement("div"); + mainWrapper.className = "main-fixed"; + + // Create the table header row + const headerRow = document.createElement("div"); + headerRow.className = "header-row"; + headerRow.id = "headerRow"; + + const pokemonHeader = document.createElement("div"); + pokemonHeader.textContent = "Pokemon"; + headerRow.appendChild(pokemonHeader); + + const weaknessHeader = document.createElement("div"); + weaknessHeader.textContent = "Weakness"; + headerRow.appendChild(weaknessHeader); + + const resistanceHeader = document.createElement("div"); + resistanceHeader.textContent = "Resistance"; + headerRow.appendChild(resistanceHeader); + + const immunityHeader = document.createElement("div"); + immunityHeader.textContent = "Immunity"; + headerRow.appendChild(immunityHeader); + + mainWrapper.appendChild(headerRow); + return mainWrapper; +} + +function createEnemyDiv() { + const enemies = document.createElement("div"); + enemies.className = 'enemy-team' + enemies.id = "enemies"; + return enemies; +} + +function createAlliesDiv() { + const allies = document.createElement("div"); + allies.className = 'allies-team' + allies.id = "allies"; + return allies; +} + +// Enables drag-and-drop functionality on an element +function enableDragElement(elmnt) { + let pos1 = 0, + pos2 = 0, + pos3 = 0, + pos4 = 0; + const dragStartElement = elmnt; + + // Attach the mousedown event handler + dragStartElement.onmousedown = dragMouseDown; + + function dragMouseDown(e) { + e = e || window.event; + if (e.target.type === 'submit' || e.target.type === 'range') return + e.preventDefault(); + pos3 = e.clientX; + pos4 = e.clientY; + document.onmouseup = stopDragging; + document.onmousemove = dragElement; + } + + // Handles dragging movement + function dragElement(e) { + e = e || window.event; + if (e.target.type === 'submit' || e.target.type === 'range') return + e.preventDefault(); + pos1 = pos3 - e.clientX; + pos2 = pos4 - e.clientY; + pos3 = e.clientX; + pos4 = e.clientY; + elmnt.style.top = elmnt.offsetTop - pos2 + "px"; + elmnt.style.left = elmnt.offsetLeft - pos1 + "px"; + } + + // Stops dragging on mouse release + function stopDragging() { + document.onmouseup = null; + document.onmousemove = null; + } +} + +const enemiesDiv = createEnemyDiv() +const alliesDiv = createAlliesDiv() + +enableDragElement(enemiesDiv); +enableDragElement(alliesDiv); + +document.body.appendChild(enemiesDiv); +document.body.appendChild(alliesDiv); + +let Types +(function (Types) { + Types[Types["normal"] = 1] = 1; + Types[Types["fighting"] = 2] = 2; + Types[Types["flying"] = 3] = 3; + Types[Types["poison"] = 4] = 4; + Types[Types["ground"] = 5] = 5; + Types[Types["rock"] = 6] = 6; + Types[Types["bug"] = 7] = 7; + Types[Types["ghost"] = 8] = 8; + Types[Types["steel"] = 9] = 9; + Types[Types["fire"] = 10] = 10; + Types[Types["water"] = 11] = 11; + Types[Types["grass"] = 12] = 12; + Types[Types["electric"] = 13] = 13; + Types[Types["psychic"] = 14] = 14; + Types[Types["ice"] = 15] = 15; + Types[Types["dragon"] = 16] = 16; + Types[Types["dark"] = 17] = 17; + Types[Types["fairy"] = 18] = 18; +})(Types || (Types = {})); + +let Stat; +(function (Stat) { + Stat[Stat["HP"] = 0] = "HP"; + Stat[Stat["ATK"] = 1] = "ATK"; + Stat[Stat["DEF"] = 2] = "DEF"; + Stat[Stat["SPATK"] = 3] = "SPATK"; + Stat[Stat["SPDEF"] = 4] = "SPDEF"; + Stat[Stat["SPD"] = 5] = "SPD"; +})(Stat || (Stat = {})); +; + +function createTooltipDiv(tip) { + const tooltip = document.createElement('div') + tooltip.classList.add('text-base') + tooltip.classList.add('tooltiptext') + tooltip.textContent = tip + return tooltip +} + +// Current values: weaknesses, resistances, immunities +function createTypeEffectivenessWrapper(effectiveness, types) { + const typeEffectivenessWrapper = document.createElement('div') + typeEffectivenessWrapper.classList.add(`pokemon-${effectiveness}`); + typeEffectivenessWrapper.classList.add('tooltip'); + let counter = 0; + let block = document.createElement('div'); + typeEffectivenessWrapper.appendChild(block) + types.forEach(type => { + if (counter % 3 === 0) { + block = document.createElement('div'); + typeEffectivenessWrapper.appendChild(block) + } + const typeIcon = document.createElement('div'); + typeIcon.style.backgroundImage = `url('https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/types/generation-viii/sword-shield/${Types[type]}.png')`; + typeIcon.className = 'type-icon'; + block.appendChild(typeIcon) + counter += 1; + }); + return typeEffectivenessWrapper +} + +let currentEnemyPage = 0; +let currentAllyPage = 0; +let enemiesPokemon = []; +let alliesPokemon = []; +let weather = {}; + +function createArrowButtonsDiv(divId) { + const buttonsDiv = document.createElement('div') + buttonsDiv.classList.add('arrow-button-wrapper') + const arrowUpButton = document.createElement('button') + const arrowDownButton = document.createElement('button') + arrowUpButton.classList.add('text-base') + arrowDownButton.classList.add('text-base') + arrowUpButton.classList.add('arrow-button') + arrowDownButton.classList.add('arrow-button') + arrowUpButton.textContent = "↑" + arrowDownButton.textContent = "↓" + arrowUpButton.id = `${divId}-up` + arrowDownButton.id = `${divId}-down` + arrowUpButton.addEventListener('click', changePage) + arrowDownButton.addEventListener('click', changePage) + buttonsDiv.appendChild(arrowUpButton) + buttonsDiv.appendChild(arrowDownButton) + return buttonsDiv +} + +function createOpacitySliderDiv(divId, initialValue = "100") { + const sliderDiv = document.createElement('div') + sliderDiv.classList.add('slider-wrapper') + const opacityTextDiv = document.createElement('div') + opacityTextDiv.classList.add('text-base') + opacityTextDiv.textContent = "Opacity:" + const slider = document.createElement('input') + slider.type = "range" + slider.min = "10" + slider.max = "100" + slider.value = initialValue + slider.id = `${divId}-slider` + sliderDiv.appendChild(opacityTextDiv) + sliderDiv.appendChild(slider) + sliderDiv.addEventListener('input', changeOpacity) + return sliderDiv +} + +function changeOpacity(e) { + const divId = e.target.id.split("-")[0] + const div = document.getElementById(divId) + wrapperDivPositions[divId].opacity = e.target.value + div.style.opacity = `${e.target.value / 100}` +} + +function changePage(click) { + const buttonId = click.target.id + const divId = buttonId.split("-")[0] + const direction = buttonId.split("-")[1] + if (direction === 'up') { + if (divId === 'enemies') { + if (currentEnemyPage > 0) { + currentEnemyPage -= 1 + } else { + currentEnemyPage = enemiesPokemon.length - 1 + } + } else if (divId === 'allies') { + if (currentAllyPage > 0) { + currentAllyPage -= 1 + } else { + currentAllyPage = alliesPokemon.length - 1 + } + } + } else if (direction === 'down') { + if (divId === 'enemies') { + if ((currentEnemyPage + 1) < enemiesPokemon.length) { + currentEnemyPage += 1 + } else { + currentEnemyPage = 0 + } + } else if (divId === 'allies') { + if ((currentAllyPage + 1) < alliesPokemon.length) { + currentAllyPage += 1 + } else { + currentAllyPage = 0 + } + } + } + createCardsDiv(divId) +} + +function createPokemonCardDiv(divId, pokemon) { + const card = document.createElement('div'); + card.classList.add('pokemon-card'); + + const opacitySliderDiv = createOpacitySliderDiv(divId, wrapperDivPositions[divId].opacity) + + const infoRow = document.createElement('div'); + infoRow.style.display = 'flex'; + + const iconWrapper = document.createElement('div'); + iconWrapper.className = 'pokemon-icon'; + const icon = document.createElement('img'); + icon.src = `https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/${pokemon.id}.png`; + iconWrapper.appendChild(icon); + infoRow.appendChild(iconWrapper); + + const weaknessesWrapper = createTypeEffectivenessWrapper('weaknesses', pokemon.typeEffectiveness.weaknesses) + weaknessesWrapper.appendChild(createTooltipDiv('Weak to')) + + const resistancesWrapper = createTypeEffectivenessWrapper('resistances', pokemon.typeEffectiveness.resistances) + resistancesWrapper.appendChild(createTooltipDiv('Resists')) + + const immunitiesWrapper = createTypeEffectivenessWrapper('immunities', pokemon.typeEffectiveness.immunities) + immunitiesWrapper.appendChild(createTooltipDiv('Immune to')) + + infoRow.appendChild(weaknessesWrapper) + infoRow.appendChild(resistancesWrapper) + infoRow.appendChild(immunitiesWrapper) + + const extraInfoRow = document.createElement('div'); + extraInfoRow.classList.add('text-base') + extraInfoRow.textContent = `Ability: ${pokemon.ability} - Nature: ${pokemon.nature}`; + + const ivsRow = document.createElement('div'); + ivsRow.classList.add('text-base'); + ivsRow.textContent = `HP: ${pokemon.ivs[Stat["HP"]]}, ATK: ${pokemon.ivs[Stat["ATK"]]}, DEF: ${pokemon.ivs[Stat["DEF"]]}, SPE: ${pokemon.ivs[Stat["SPD"]]}, SPD: ${pokemon.ivs[Stat["SPDEF"]]}, SPA: ${pokemon.ivs[Stat["SPATK"]]}`; + + let weatherRow = undefined + if (weather.type && weather.turnsLeft) { + weatherRow = document.createElement('div'); + weatherRow.classList.add('text-base'); + weatherRow.textContent = `Weather: ${weather.type}, Turns Left: ${weather.turnsLeft}` + } + + card.appendChild(opacitySliderDiv) + card.appendChild(infoRow) + card.appendChild(extraInfoRow) + card.appendChild(ivsRow) + if (weatherRow) { + card.appendChild(weatherRow) + } + return card +} + +function createWrapperDiv(divId) { + const oldDiv = document.getElementById(divId) + if (oldDiv) { + wrapperDivPositions[divId].top = oldDiv.style.top; + wrapperDivPositions[divId].left = oldDiv.style.left; + oldDiv.remove(); + } + const newDiv = divId === 'enemies' ? createEnemyDiv() : createAlliesDiv() + enableDragElement(newDiv) + newDiv.style.top = wrapperDivPositions[divId].top + newDiv.style.left = wrapperDivPositions[divId].left + newDiv.style.opacity = "" + (Number(wrapperDivPositions[divId].opacity) / 100) + return newDiv; +} + +function createCardsDiv(divId) { + let newDiv = createWrapperDiv(divId) + let buttonsDiv = createArrowButtonsDiv(divId) + newDiv.appendChild(buttonsDiv) + let pokemon = {} + if (divId === 'enemies') { + if (currentEnemyPage >= enemiesPokemon.length) currentEnemyPage = enemiesPokemon.length - 1 + pokemon = enemiesPokemon[currentEnemyPage] + } + else { + if (currentAllyPage >= alliesPokemon.length) currentAllyPage = alliesPokemon.length - 1 + pokemon = alliesPokemon[currentAllyPage] + } + const pokemonCards = document.createElement("div"); + pokemonCards.className = "pokemon-cards" + const card = createPokemonCardDiv(divId, pokemon) + pokemonCards.appendChild(card); + newDiv.appendChild(pokemonCards) + document.body.appendChild(newDiv) + return newDiv +} + +function deleteWrapperDivs() { + try { + ['allies', 'enemies'].forEach((divId) => { + const div = document.getElementById(divId) + wrapperDivPositions[divId].top = div.style.top + wrapperDivPositions[divId].left = div.style.left + document.body.removeChild(div) + }) + } catch (e) { + console.error(e) + } + +} + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + console.log("Got message:", message, "from", sender, "current message:", document.getElementById('touchControls').getAttribute('data-ui-mode')) + const uiMode = touchControlsElement.getAttribute('data-ui-mode') + console.log("Current ui mode: ", uiMode) + if (message.type === 'UPDATE_ENEMIES_DIV' || message.type === 'UPDATE_ALLIES_DIV') { + slotId = message.slotId + if ( uiMode === 'TITLE' || uiMode === 'SAVE_SLOT') return sendResponde({ success: true }) + let divId = message.type === 'UPDATE_ENEMIES_DIV' ? 'enemies' : 'allies' + if (message.type === 'UPDATE_ENEMIES_DIV') { + enemiesPokemon = message.pokemon + } + else { + alliesPokemon = message.pokemon + } + weather = message.weather; + if (weather.turnsLeft === 0) weather.turnsLeft = 'N/A' + createCardsDiv(divId) + sendResponse({ success: true }); + } +}); + +const touchControlsElement = document.getElementById('touchControls') +if (touchControlsElement) { + const observer = new MutationObserver((mutations) => { + mutations.forEach(async (mutation) => { + if (mutation.type === 'attributes' && mutation.attributeName === 'data-ui-mode') { + const newValue = touchControlsElement.getAttribute('data-ui-mode'); + console.log('New data-ui-mode:', newValue); + if(newValue === "MESSAGE" || newValue === "COMMAND" || newValue === "CONFIRM") { + let currentSessionData = {} + for (key in localStorage) { + if ((slotId > 0 && key.includes(`sessionData${slotId}`)) || key.includes('sessionData')) { + currentSessionData = localStorage.getItem(key) + break + } + } + currentSessionData = JSON.parse(CryptoJS.AES.decrypt(currentSessionData, saveKey).toString(CryptoJS.enc.Utf8)) + console.log("Got session data", currentSessionData, "for slot id", slotId) + browserApi.runtime.sendMessage({ type: 'BG_GET_SAVEDATA', data: currentSessionData, slotId: slotId }) + } + if(newValue === "SAVE_SLOT") { + setTimeout(function() { + for (key in localStorage) { + if (key.includes('sessionData')) localStorage.removeItem(key) + } + }, 1000) + } + if(newValue === "SAVE_SLOT" || newValue === "TITLE" || newValue === "MODIFIER_SELECT" || newValue === "STARTER_SELECT") { + deleteWrapperDivs() + } + } + }); + }); + + observer.observe(touchControlsElement, { attributes: true }); +} \ No newline at end of file diff --git a/roguedex_chrome/inject.js b/roguedex_chrome/inject.js new file mode 100644 index 0000000..d5f8af6 --- /dev/null +++ b/roguedex_chrome/inject.js @@ -0,0 +1,24 @@ +console.log('content script start'); + +const browserApi = typeof browser !== "undefined" ? browser : chrome; + +// inject injected script +var s = document.createElement('script'); +s.src = browserApi.runtime.getURL('injected.js'); +s.onload = function () { + this.remove(); +}; +(document.head || document.documentElement).appendChild(s); + +// receive message from injected script +window.addEventListener('message', function (e) { + if (e.data.type === 'GET_SAVEDATA') { + browserApi.runtime.sendMessage({ type: 'BG_GET_SAVEDATA', data: e.data.data, slotId: e.data.slotId }, function(response) { + if (response && response.success) { + console.log('Successfully updated game info'); + } else { + console.error('Failed to update game info'); + } + }); + } +}); \ No newline at end of file diff --git a/roguedex_chrome/injected.js b/roguedex_chrome/injected.js new file mode 100644 index 0000000..4dd20f6 --- /dev/null +++ b/roguedex_chrome/injected.js @@ -0,0 +1,45 @@ +// This is a hack because in background.js we cannot read web request response's body. +// When we need to do that, we intercept the web request here, and send a message to background.js with the response data, elaborate there and send back to content.js +(function (xhr) { + + var XHR = XMLHttpRequest.prototype; + + var open = XHR.open; + var send = XHR.send; + + XHR.open = function (method, url) { + this._method = method; + this._url = url; + return open.apply(this, arguments); + }; + + XHR.send = function (postData) { + //console.log('injected script xhr request:', this._method, this._url, this.getAllResponseHeaders(), postData); + this.addEventListener('load', function () { + //window.postMessage({ type: 'xhr', data: this.response }, '*'); // send to content script + }); + return send.apply(this, arguments); + }; +})(XMLHttpRequest); + +const { fetch: origFetch } = window; +window.fetch = async (...args) => { + const response = await origFetch(...args); + if (!response.url.includes('api.pokerogue.net/savedata/session?slot') && + !response.url.includes('api.pokerogue.net/savedata/updateall')) return response + + let sessionSlotRegex = /.*\/session\?slot=(\d+).*/ + let slotId = -1 + if (sessionSlotRegex.test(response.url)){ + slotId = sessionSlotRegex.exec(response.url)[1] + } + response + .clone() + .json() // maybe json(), text(), blob() + .then(data => { + window.postMessage({ type: 'GET_SAVEDATA', data: data, slotId: slotId }, '*'); // send to content script + //window.postMessage({ type: 'fetch', data: URL.createObjectURL(data) }, '*'); // if a big media file, can createObjectURL before send to content script + }) + .catch(err => console.error(err)); + return response; +}; \ No newline at end of file diff --git a/roguedex_chrome/libs/crypto-js.min.js b/roguedex_chrome/libs/crypto-js.min.js new file mode 100644 index 0000000..20b3099 --- /dev/null +++ b/roguedex_chrome/libs/crypto-js.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports?module.exports=exports=e():"function"==typeof define&&define.amd?define([],e):t.CryptoJS=e()}(this,function(){var n,o,s,a,h,t,e,l,r,i,c,f,d,u,p,S,x,b,A,H,z,_,v,g,y,B,w,k,m,C,D,E,R,M,F,P,W,O,I,U=U||function(h){var i;if("undefined"!=typeof window&&window.crypto&&(i=window.crypto),"undefined"!=typeof self&&self.crypto&&(i=self.crypto),!(i=!(i=!(i="undefined"!=typeof globalThis&&globalThis.crypto?globalThis.crypto:i)&&"undefined"!=typeof window&&window.msCrypto?window.msCrypto:i)&&"undefined"!=typeof global&&global.crypto?global.crypto:i)&&"function"==typeof require)try{i=require("crypto")}catch(t){}var r=Object.create||function(t){return e.prototype=t,t=new e,e.prototype=null,t};function e(){}var t={},n=t.lib={},o=n.Base={extend:function(t){var e=r(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),(e.init.prototype=e).$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},l=n.WordArray=o.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var e=this.words,r=t.words,i=this.sigBytes,n=t.sigBytes;if(this.clamp(),i%4)for(var o=0;o>>2]>>>24-o%4*8&255;e[i+o>>>2]|=s<<24-(i+o)%4*8}else for(var c=0;c>>2]=r[c>>>2];return this.sigBytes+=n,this},clamp:function(){var t=this.words,e=this.sigBytes;t[e>>>2]&=4294967295<<32-e%4*8,t.length=h.ceil(e/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new l.init(r,e/2)}},a=s.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new l.init(r,e)}},f=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(a.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return a.parse(unescape(encodeURIComponent(t)))}},d=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new l.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=f.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var e,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,s=n/(4*o),c=(s=t?h.ceil(s):h.max((0|s)-this._minBufferSize,0))*o,n=h.min(4*c,n);if(c){for(var a=0;a>>32-e}function j(t,e,r,i){var n,o=this._iv;o?(n=o.slice(0),this._iv=void 0):n=this._prevBlock,i.encryptBlock(n,0);for(var s=0;s>24&255)?(r=t>>8&255,i=255&t,255===(e=t>>16&255)?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t+=e<<16,t+=r<<8,t+=i):t+=1<<24,t}function N(){for(var t=this._X,e=this._C,r=0;r<8;r++)E[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16;R[r]=((n*n>>>17)+n*o>>>15)+o*o^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=R[0]+(R[7]<<16|R[7]>>>16)+(R[6]<<16|R[6]>>>16)|0,t[1]=R[1]+(R[0]<<8|R[0]>>>24)+R[7]|0,t[2]=R[2]+(R[1]<<16|R[1]>>>16)+(R[0]<<16|R[0]>>>16)|0,t[3]=R[3]+(R[2]<<8|R[2]>>>24)+R[1]|0,t[4]=R[4]+(R[3]<<16|R[3]>>>16)+(R[2]<<16|R[2]>>>16)|0,t[5]=R[5]+(R[4]<<8|R[4]>>>24)+R[3]|0,t[6]=R[6]+(R[5]<<16|R[5]>>>16)+(R[4]<<16|R[4]>>>16)|0,t[7]=R[7]+(R[6]<<8|R[6]>>>24)+R[5]|0}function q(){for(var t=this._X,e=this._C,r=0;r<8;r++)O[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16;I[r]=((n*n>>>17)+n*o>>>15)+o*o^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=I[0]+(I[7]<<16|I[7]>>>16)+(I[6]<<16|I[6]>>>16)|0,t[1]=I[1]+(I[0]<<8|I[0]>>>24)+I[7]|0,t[2]=I[2]+(I[1]<<16|I[1]>>>16)+(I[0]<<16|I[0]>>>16)|0,t[3]=I[3]+(I[2]<<8|I[2]>>>24)+I[1]|0,t[4]=I[4]+(I[3]<<16|I[3]>>>16)+(I[2]<<16|I[2]>>>16)|0,t[5]=I[5]+(I[4]<<8|I[4]>>>24)+I[3]|0,t[6]=I[6]+(I[5]<<16|I[5]>>>16)+(I[4]<<16|I[4]>>>16)|0,t[7]=I[7]+(I[6]<<8|I[6]>>>24)+I[5]|0}return F=(M=U).lib,n=F.Base,o=F.WordArray,(M=M.x64={}).Word=n.extend({init:function(t,e){this.high=t,this.low=e}}),M.WordArray=n.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:8*t.length},toX32:function(){for(var t=this.words,e=t.length,r=[],i=0;i>>2]|=t[i]<<24-i%4*8;s.call(this,r,e)}else s.apply(this,arguments)}).prototype=P),function(){var t=U,n=t.lib.WordArray,t=t.enc;t.Utf16=t.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=t.charCodeAt(i)<<16-i%2*16;return n.create(r,2*e)}};function s(t){return t<<8&4278255360|t>>>8&16711935}t.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535);i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=s(t.charCodeAt(i)<<16-i%2*16);return n.create(r,2*e)}}}(),a=(w=U).lib.WordArray,w.enc.Base64={stringify:function(t){var e=t.words,r=t.sigBytes,i=this._map;t.clamp();for(var n=[],o=0;o>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c>>6*(3-c)&63));var a=i.charAt(64);if(a)for(;n.length%4;)n.push(a);return n.join("")},parse:function(t){var e=t.length,r=this._map;if(!(i=this._reverseMap))for(var i=this._reverseMap=[],n=0;n>>6-o%4*2,c=s|c,i[n>>>2]|=c<<24-n%4*8,n++)}return a.create(i,n)}(t,e,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},h=(F=U).lib.WordArray,F.enc.Base64url={stringify:function(t,e=!0){var r=t.words,i=t.sigBytes,n=e?this._safe_map:this._map;t.clamp();for(var o=[],s=0;s>>2]>>>24-s%4*8&255)<<16|(r[s+1>>>2]>>>24-(s+1)%4*8&255)<<8|r[s+2>>>2]>>>24-(s+2)%4*8&255,a=0;a<4&&s+.75*a>>6*(3-a)&63));var h=n.charAt(64);if(h)for(;o.length%4;)o.push(h);return o.join("")},parse:function(t,e=!0){var r=t.length,i=e?this._safe_map:this._map;if(!(n=this._reverseMap))for(var n=this._reverseMap=[],o=0;o>>6-o%4*2,c=s|c,i[n>>>2]|=c<<24-n%4*8,n++)}return h.create(i,n)}(t,r,n)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",_safe_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"},function(a){var t=U,e=t.lib,r=e.WordArray,i=e.Hasher,e=t.algo,A=[];!function(){for(var t=0;t<64;t++)A[t]=4294967296*a.abs(a.sin(t+1))|0}();e=e.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o=this._hash.words,s=t[e+0],c=t[e+1],a=t[e+2],h=t[e+3],l=t[e+4],f=t[e+5],d=t[e+6],u=t[e+7],p=t[e+8],_=t[e+9],y=t[e+10],v=t[e+11],g=t[e+12],B=t[e+13],w=t[e+14],k=t[e+15],m=H(m=o[0],b=o[1],x=o[2],S=o[3],s,7,A[0]),S=H(S,m,b,x,c,12,A[1]),x=H(x,S,m,b,a,17,A[2]),b=H(b,x,S,m,h,22,A[3]);m=H(m,b,x,S,l,7,A[4]),S=H(S,m,b,x,f,12,A[5]),x=H(x,S,m,b,d,17,A[6]),b=H(b,x,S,m,u,22,A[7]),m=H(m,b,x,S,p,7,A[8]),S=H(S,m,b,x,_,12,A[9]),x=H(x,S,m,b,y,17,A[10]),b=H(b,x,S,m,v,22,A[11]),m=H(m,b,x,S,g,7,A[12]),S=H(S,m,b,x,B,12,A[13]),x=H(x,S,m,b,w,17,A[14]),m=z(m,b=H(b,x,S,m,k,22,A[15]),x,S,c,5,A[16]),S=z(S,m,b,x,d,9,A[17]),x=z(x,S,m,b,v,14,A[18]),b=z(b,x,S,m,s,20,A[19]),m=z(m,b,x,S,f,5,A[20]),S=z(S,m,b,x,y,9,A[21]),x=z(x,S,m,b,k,14,A[22]),b=z(b,x,S,m,l,20,A[23]),m=z(m,b,x,S,_,5,A[24]),S=z(S,m,b,x,w,9,A[25]),x=z(x,S,m,b,h,14,A[26]),b=z(b,x,S,m,p,20,A[27]),m=z(m,b,x,S,B,5,A[28]),S=z(S,m,b,x,a,9,A[29]),x=z(x,S,m,b,u,14,A[30]),m=C(m,b=z(b,x,S,m,g,20,A[31]),x,S,f,4,A[32]),S=C(S,m,b,x,p,11,A[33]),x=C(x,S,m,b,v,16,A[34]),b=C(b,x,S,m,w,23,A[35]),m=C(m,b,x,S,c,4,A[36]),S=C(S,m,b,x,l,11,A[37]),x=C(x,S,m,b,u,16,A[38]),b=C(b,x,S,m,y,23,A[39]),m=C(m,b,x,S,B,4,A[40]),S=C(S,m,b,x,s,11,A[41]),x=C(x,S,m,b,h,16,A[42]),b=C(b,x,S,m,d,23,A[43]),m=C(m,b,x,S,_,4,A[44]),S=C(S,m,b,x,g,11,A[45]),x=C(x,S,m,b,k,16,A[46]),m=D(m,b=C(b,x,S,m,a,23,A[47]),x,S,s,6,A[48]),S=D(S,m,b,x,u,10,A[49]),x=D(x,S,m,b,w,15,A[50]),b=D(b,x,S,m,f,21,A[51]),m=D(m,b,x,S,g,6,A[52]),S=D(S,m,b,x,h,10,A[53]),x=D(x,S,m,b,y,15,A[54]),b=D(b,x,S,m,c,21,A[55]),m=D(m,b,x,S,p,6,A[56]),S=D(S,m,b,x,k,10,A[57]),x=D(x,S,m,b,d,15,A[58]),b=D(b,x,S,m,B,21,A[59]),m=D(m,b,x,S,l,6,A[60]),S=D(S,m,b,x,v,10,A[61]),x=D(x,S,m,b,a,15,A[62]),b=D(b,x,S,m,_,21,A[63]),o[0]=o[0]+m|0,o[1]=o[1]+b|0,o[2]=o[2]+x|0,o[3]=o[3]+S|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32;var n=a.floor(r/4294967296),r=r;e[15+(64+i>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,o=e.words,s=0;s<4;s++){var c=o[s];o[s]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return e},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function H(t,e,r,i,n,o,s){s=t+(e&r|~e&i)+n+s;return(s<>>32-o)+e}function z(t,e,r,i,n,o,s){s=t+(e&i|r&~i)+n+s;return(s<>>32-o)+e}function C(t,e,r,i,n,o,s){s=t+(e^r^i)+n+s;return(s<>>32-o)+e}function D(t,e,r,i,n,o,s){s=t+(r^(e|~i))+n+s;return(s<>>32-o)+e}t.MD5=i._createHelper(e),t.HmacMD5=i._createHmacHelper(e)}(Math),P=(M=U).lib,t=P.WordArray,e=P.Hasher,P=M.algo,l=[],P=P.SHA1=e.extend({_doReset:function(){this._hash=new t.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=0;a<80;a++){a<16?l[a]=0|t[e+a]:(h=l[a-3]^l[a-8]^l[a-14]^l[a-16],l[a]=h<<1|h>>>31);var h=(i<<5|i>>>27)+c+l[a];h+=a<20?1518500249+(n&o|~n&s):a<40?1859775393+(n^o^s):a<60?(n&o|n&s|o&s)-1894007588:(n^o^s)-899497514,c=s,s=o,o=n<<30|n>>>2,n=i,i=h}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t}}),M.SHA1=e._createHelper(P),M.HmacSHA1=e._createHmacHelper(P),function(n){var t=U,e=t.lib,r=e.WordArray,i=e.Hasher,e=t.algo,o=[],p=[];!function(){function t(t){return 4294967296*(t-(0|t))|0}for(var e=2,r=0;r<64;)!function(t){for(var e=n.sqrt(t),r=2;r<=e;r++)if(!(t%r))return;return 1}(e)||(r<8&&(o[r]=t(n.pow(e,.5))),p[r]=t(n.pow(e,1/3)),r++),e++}();var _=[],e=e.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=0;f<64;f++){f<16?_[f]=0|t[e+f]:(d=_[f-15],u=_[f-2],_[f]=((d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3)+_[f-7]+((u<<15|u>>>17)^(u<<13|u>>>19)^u>>>10)+_[f-16]);var d=i&n^i&o^n&o,u=l+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&a^~c&h)+p[f]+_[f],l=h,h=a,a=c,c=s+u|0,s=o,o=n,n=i,i=u+(((i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22))+d)|0}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0,r[5]=r[5]+a|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=n.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA256=i._createHelper(e),t.HmacSHA256=i._createHmacHelper(e)}(Math),r=(w=U).lib.WordArray,F=w.algo,i=F.SHA256,F=F.SHA224=i.extend({_doReset:function(){this._hash=new r.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=i._doFinalize.call(this);return t.sigBytes-=4,t}}),w.SHA224=i._createHelper(F),w.HmacSHA224=i._createHmacHelper(F),function(){var t=U,e=t.lib.Hasher,r=t.x64,i=r.Word,n=r.WordArray,r=t.algo;function o(){return i.create.apply(i,arguments)}var t1=[o(1116352408,3609767458),o(1899447441,602891725),o(3049323471,3964484399),o(3921009573,2173295548),o(961987163,4081628472),o(1508970993,3053834265),o(2453635748,2937671579),o(2870763221,3664609560),o(3624381080,2734883394),o(310598401,1164996542),o(607225278,1323610764),o(1426881987,3590304994),o(1925078388,4068182383),o(2162078206,991336113),o(2614888103,633803317),o(3248222580,3479774868),o(3835390401,2666613458),o(4022224774,944711139),o(264347078,2341262773),o(604807628,2007800933),o(770255983,1495990901),o(1249150122,1856431235),o(1555081692,3175218132),o(1996064986,2198950837),o(2554220882,3999719339),o(2821834349,766784016),o(2952996808,2566594879),o(3210313671,3203337956),o(3336571891,1034457026),o(3584528711,2466948901),o(113926993,3758326383),o(338241895,168717936),o(666307205,1188179964),o(773529912,1546045734),o(1294757372,1522805485),o(1396182291,2643833823),o(1695183700,2343527390),o(1986661051,1014477480),o(2177026350,1206759142),o(2456956037,344077627),o(2730485921,1290863460),o(2820302411,3158454273),o(3259730800,3505952657),o(3345764771,106217008),o(3516065817,3606008344),o(3600352804,1432725776),o(4094571909,1467031594),o(275423344,851169720),o(430227734,3100823752),o(506948616,1363258195),o(659060556,3750685593),o(883997877,3785050280),o(958139571,3318307427),o(1322822218,3812723403),o(1537002063,2003034995),o(1747873779,3602036899),o(1955562222,1575990012),o(2024104815,1125592928),o(2227730452,2716904306),o(2361852424,442776044),o(2428436474,593698344),o(2756734187,3733110249),o(3204031479,2999351573),o(3329325298,3815920427),o(3391569614,3928383900),o(3515267271,566280711),o(3940187606,3454069534),o(4118630271,4000239992),o(116418474,1914138554),o(174292421,2731055270),o(289380356,3203993006),o(460393269,320620315),o(685471733,587496836),o(852142971,1086792851),o(1017036298,365543100),o(1126000580,2618297676),o(1288033470,3409855158),o(1501505948,4234509866),o(1607167915,987167468),o(1816402316,1246189591)],e1=[];!function(){for(var t=0;t<80;t++)e1[t]=o()}();r=r.SHA512=e.extend({_doReset:function(){this._hash=new n.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=i.high,d=i.low,u=n.high,p=n.low,_=o.high,y=o.low,v=s.high,g=s.low,B=c.high,w=c.low,k=a.high,m=a.low,S=h.high,x=h.low,b=l.high,r=l.low,A=f,H=d,z=u,C=p,D=_,E=y,R=v,M=g,F=B,P=w,W=k,O=m,I=S,U=x,K=b,X=r,L=0;L<80;L++){var j,T,N=e1[L];L<16?(T=N.high=0|t[e+2*L],j=N.low=0|t[e+2*L+1]):($=(q=e1[L-15]).high,J=q.low,G=(Q=e1[L-2]).high,V=Q.low,Z=(Y=e1[L-7]).high,q=Y.low,Y=(Q=e1[L-16]).high,T=(T=(($>>>1|J<<31)^($>>>8|J<<24)^$>>>7)+Z+((j=(Z=(J>>>1|$<<31)^(J>>>8|$<<24)^(J>>>7|$<<25))+q)>>>0>>0?1:0))+((G>>>19|V<<13)^(G<<3|V>>>29)^G>>>6)+((j+=J=(V>>>19|G<<13)^(V<<3|G>>>29)^(V>>>6|G<<26))>>>0>>0?1:0),j+=$=Q.low,N.high=T=T+Y+(j>>>0<$>>>0?1:0),N.low=j);var q=F&W^~F&I,Z=P&O^~P&U,V=A&z^A&D^z&D,G=(H>>>28|A<<4)^(H<<30|A>>>2)^(H<<25|A>>>7),J=t1[L],Q=J.high,Y=J.low,$=X+((P>>>14|F<<18)^(P>>>18|F<<14)^(P<<23|F>>>9)),N=K+((F>>>14|P<<18)^(F>>>18|P<<14)^(F<<23|P>>>9))+($>>>0>>0?1:0),J=G+(H&C^H&E^C&E),K=I,X=U,I=W,U=O,W=F,O=P,F=R+(N=(N=(N=N+q+(($=$+Z)>>>0>>0?1:0))+Q+(($=$+Y)>>>0>>0?1:0))+T+(($=$+j)>>>0>>0?1:0))+((P=M+$|0)>>>0>>0?1:0)|0,R=D,M=E,D=z,E=C,z=A,C=H,A=N+(((A>>>28|H<<4)^(A<<30|H>>>2)^(A<<25|H>>>7))+V+(J>>>0>>0?1:0))+((H=$+J|0)>>>0<$>>>0?1:0)|0}d=i.low=d+H,i.high=f+A+(d>>>0>>0?1:0),p=n.low=p+C,n.high=u+z+(p>>>0>>0?1:0),y=o.low=y+E,o.high=_+D+(y>>>0>>0?1:0),g=s.low=g+M,s.high=v+R+(g>>>0>>0?1:0),w=c.low=w+P,c.high=B+F+(w>>>0

>>0?1:0),m=a.low=m+O,a.high=k+W+(m>>>0>>0?1:0),x=h.low=x+U,h.high=S+I+(x>>>0>>0?1:0),r=l.low=r+X,l.high=b+K+(r>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(r),t.HmacSHA512=e._createHmacHelper(r)}(),P=(M=U).x64,c=P.Word,f=P.WordArray,P=M.algo,d=P.SHA512,P=P.SHA384=d.extend({_doReset:function(){this._hash=new f.init([new c.init(3418070365,3238371032),new c.init(1654270250,914150663),new c.init(2438529370,812702999),new c.init(355462360,4144912697),new c.init(1731405415,4290775857),new c.init(2394180231,1750603025),new c.init(3675008525,1694076839),new c.init(1203062813,3204075428)])},_doFinalize:function(){var t=d._doFinalize.call(this);return t.sigBytes-=16,t}}),M.SHA384=d._createHelper(P),M.HmacSHA384=d._createHmacHelper(P),function(l){var t=U,e=t.lib,f=e.WordArray,i=e.Hasher,d=t.x64.Word,e=t.algo,A=[],H=[],z=[];!function(){for(var t=1,e=0,r=0;r<24;r++){A[t+5*e]=(r+1)*(r+2)/2%64;var i=(2*t+3*e)%5;t=e%5,e=i}for(t=0;t<5;t++)for(e=0;e<5;e++)H[t+5*e]=e+(2*t+3*e)%5*5;for(var n=1,o=0;o<24;o++){for(var s,c=0,a=0,h=0;h<7;h++)1&n&&((s=(1<>>24)|4278255360&(o<<24|o>>>8);(m=r[n]).high^=s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),m.low^=o}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++)h^=(m=r[a+5*f]).high,l^=m.low;var d=C[a];d.high=h,d.low=l}for(a=0;a<5;a++)for(var u=C[(a+4)%5],p=C[(a+1)%5],_=p.high,p=p.low,h=u.high^(_<<1|p>>>31),l=u.low^(p<<1|_>>>31),f=0;f<5;f++)(m=r[a+5*f]).high^=h,m.low^=l;for(var y=1;y<25;y++){var v=(m=r[y]).high,g=m.low,B=A[y];l=B<32?(h=v<>>32-B,g<>>32-B):(h=g<>>64-B,v<>>64-B);B=C[H[y]];B.high=h,B.low=l}var w=C[0],k=r[0];w.high=k.high,w.low=k.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var m=r[y=a+5*f],S=C[y],x=C[(a+1)%5+5*f],b=C[(a+2)%5+5*f];m.high=S.high^~x.high&b.high,m.low=S.low^~x.low&b.low}m=r[0],k=z[c];m.high^=k.high,m.low^=k.low}},_doFinalize:function(){var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;e[r>>>5]|=1<<24-r%32,e[(l.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process();for(var n=this._state,e=this.cfg.outputLength/8,o=e/8,s=[],c=0;c>>24)|4278255360&(h<<24|h>>>8);s.push(a=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)),s.push(h)}return new f.init(s,e)},clone:function(){for(var t=i.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});t.SHA3=i._createHelper(e),t.HmacSHA3=i._createHmacHelper(e)}(Math),Math,F=(w=U).lib,u=F.WordArray,p=F.Hasher,F=w.algo,S=u.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),x=u.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),b=u.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),A=u.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),H=u.create([0,1518500249,1859775393,2400959708,2840853838]),z=u.create([1352829926,1548603684,1836072691,2053994217,0]),F=F.RIPEMD160=p.extend({_doReset:function(){this._hash=u.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}for(var o,s,c,a,h,l,f=this._hash.words,d=H.words,u=z.words,p=S.words,_=x.words,y=b.words,v=A.words,g=o=f[0],B=s=f[1],w=c=f[2],k=a=f[3],m=h=f[4],r=0;r<80;r+=1)l=o+t[e+p[r]]|0,l+=r<16?(s^c^a)+d[0]:r<32?K(s,c,a)+d[1]:r<48?((s|~c)^a)+d[2]:r<64?X(s,c,a)+d[3]:(s^(c|~a))+d[4],l=(l=L(l|=0,y[r]))+h|0,o=h,h=a,a=L(c,10),c=s,s=l,l=g+t[e+_[r]]|0,l+=r<16?(B^(w|~k))+u[0]:r<32?X(B,w,k)+u[1]:r<48?((B|~w)^k)+u[2]:r<64?K(B,w,k)+u[3]:(B^w^k)+u[4],l=(l=L(l|=0,v[r]))+m|0,g=m,m=k,k=L(w,10),w=B,B=l;l=f[1]+c+k|0,f[1]=f[2]+a+m|0,f[2]=f[3]+h+g|0,f[3]=f[4]+o+B|0,f[4]=f[0]+s+w|0,f[0]=l},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,n=e.words,o=0;o<5;o++){var s=n[o];n[o]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}return e},clone:function(){var t=p.clone.call(this);return t._hash=this._hash.clone(),t}}),w.RIPEMD160=p._createHelper(F),w.HmacRIPEMD160=p._createHmacHelper(F),P=(M=U).lib.Base,_=M.enc.Utf8,M.algo.HMAC=P.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=_.parse(e));var r=t.blockSize,i=4*r;(e=e.sigBytes>i?t.finalize(e):e).clamp();for(var t=this._oKey=e.clone(),e=this._iKey=e.clone(),n=t.words,o=e.words,s=0;s>>2];t.sigBytes-=e}},d=(e.BlockCipher=a.extend({cfg:a.cfg.extend({mode:n,padding:l}),reset:function(){var t;a.reset.call(this);var e=this.cfg,r=e.iv,e=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=e.createEncryptor:(t=e.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(e,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),e.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),l=(t.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,t=t.salt,e=t?s.create([1398893684,1701076831]).concat(t).concat(e):e;return e.toString(o)},parse:function(t){var e,r=o.parse(t),t=r.words;return 1398893684==t[0]&&1701076831==t[1]&&(e=s.create(t.slice(2,4)),t.splice(0,4),r.sigBytes-=16),d.create({ciphertext:r,salt:e})}},u=e.SerializableCipher=r.extend({cfg:r.extend({format:l}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),e=n.finalize(e),n=n.cfg;return d.create({ciphertext:e,key:r,iv:n.iv,algorithm:t,mode:n.mode,padding:n.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),t=(t.kdf={}).OpenSSL={execute:function(t,e,r,i){i=i||s.random(8);t=c.create({keySize:e+r}).compute(t,i),r=s.create(t.words.slice(e),4*r);return t.sigBytes=4*e,d.create({key:t,iv:r,salt:i})}},p=e.PasswordBasedCipher=u.extend({cfg:u.cfg.extend({kdf:t}),encrypt:function(t,e,r,i){r=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=r.iv;i=u.encrypt.call(this,t,e,r.key,i);return i.mixIn(r),i},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);r=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=r.iv,u.decrypt.call(this,t,e,r.key,i)}})}(),U.mode.CFB=((F=U.lib.BlockCipherMode.extend()).Encryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;j.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),F.Decryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);j.call(this,t,e,i,r),this._prevBlock=n}}),F),U.mode.CTR=(M=U.lib.BlockCipherMode.extend(),P=M.Encryptor=M.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var c=0;c>>2]|=e<<24-r%4*8,t.sigBytes+=e},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso10126={pad:function(t,e){e*=4,e-=t.sigBytes%e;t.concat(U.lib.WordArray.random(e-1)).concat(U.lib.WordArray.create([e<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso97971={pad:function(t,e){t.concat(U.lib.WordArray.create([2147483648],1)),U.pad.ZeroPadding.pad(t,e)},unpad:function(t){U.pad.ZeroPadding.unpad(t),t.sigBytes--}},U.pad.ZeroPadding={pad:function(t,e){e*=4;t.clamp(),t.sigBytes+=e-(t.sigBytes%e||e)},unpad:function(t){for(var e=t.words,r=t.sigBytes-1,r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},U.pad.NoPadding={pad:function(){},unpad:function(){}},m=(P=U).lib.CipherParams,C=P.enc.Hex,P.format.Hex={stringify:function(t){return t.ciphertext.toString(C)},parse:function(t){t=C.parse(t);return m.create({ciphertext:t})}},function(){var t=U,e=t.lib.BlockCipher,r=t.algo,h=[],l=[],f=[],d=[],u=[],p=[],_=[],y=[],v=[],g=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;for(var r=0,i=0,e=0;e<256;e++){var n=i^i<<1^i<<2^i<<3^i<<4;h[r]=n=n>>>8^255&n^99;var o=t[l[n]=r],s=t[o],c=t[s],a=257*t[n]^16843008*n;f[r]=a<<24|a>>>8,d[r]=a<<16|a>>>16,u[r]=a<<8|a>>>24,p[r]=a,_[n]=(a=16843009*c^65537*s^257*o^16843008*r)<<24|a>>>8,y[n]=a<<16|a>>>16,v[n]=a<<8|a>>>24,g[n]=a,r?(r=o^t[t[t[c^o]]],i^=t[t[i]]):r=i=1}}();var B=[0,1,2,4,8,16,32,64,128,27,54],r=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),n=this._keySchedule=[],o=0;o>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a]):(a=h[(a=a<<8|a>>>24)>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a],a^=B[o/r|0]<<24),n[o]=n[o-r]^a);for(var s=this._invKeySchedule=[],c=0;c>>24]]^y[h[a>>>16&255]]^v[h[a>>>8&255]]^g[h[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,f,d,u,p,h)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,_,y,v,g,l);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&d]^r[u++],y=i[l>>>24]^n[f>>>16&255]^o[d>>>8&255]^s[255&h]^r[u++],v=i[f>>>24]^n[d>>>16&255]^o[h>>>8&255]^s[255&l]^r[u++],g=i[d>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[u++],h=_,l=y,f=v,d=g;_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],y=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],v=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],g=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=y,t[e+2]=v,t[e+3]=g},keySize:8});t.AES=e._createHelper(r)}(),function(){var t=U,e=t.lib,i=e.WordArray,r=e.BlockCipher,e=t.algo,h=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],l=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],f=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],u=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],n=e.DES=r.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=h[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],o=0;o<16;o++){for(var s=n[o]=[],c=f[o],r=0;r<24;r++)s[r/6|0]|=e[(l[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(l[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}for(var a=this._invSubKeys=[],r=0;r<16;r++)a[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],p.call(this,4,252645135),p.call(this,16,65535),_.call(this,2,858993459),_.call(this,8,16711935),p.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=d[a][((s^n[a])&u[a])>>>0];this._lBlock=s,this._rBlock=o^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,p.call(this,1,1431655765),_.call(this,8,16711935),_.call(this,2,858993459),p.call(this,16,65535),p.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function p(t,e){e=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=e,this._lBlock^=e<>>t^this._lBlock)&e;this._lBlock^=e,this._rBlock^=e<192.");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),t=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=n.createEncryptor(i.create(e)),this._des2=n.createEncryptor(i.create(r)),this._des3=n.createEncryptor(i.create(t))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=r._createHelper(e)}(),function(){var t=U,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;for(var n=0,o=0;n<256;n++){var s=n%r,s=e[s>>>2]>>>24-s%4*8&255,o=(o+i[n]+s)%256,s=i[n];i[n]=i[o],i[o]=s}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){var r=(r+t[e=(e+1)%256])%256,o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);r=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;0>>24)|4278255360&(t[r]<<24|t[r]>>>8);for(var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],r=this._b=0;r<4;r++)N.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],c=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),s=e>>>16|4294901760&o,c=o<<16|65535&e;n[0]^=e,n[1]^=s,n[2]^=o,n[3]^=c,n[4]^=e,n[5]^=s,n[6]^=o,n[7]^=c;for(r=0;r<4;r++)N.call(this)}},_doProcessBlock:function(t,e){var r=this._X;N.call(this),D[0]=r[0]^r[5]>>>16^r[3]<<16,D[1]=r[2]^r[7]>>>16^r[5]<<16,D[2]=r[4]^r[1]>>>16^r[7]<<16,D[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)D[i]=16711935&(D[i]<<8|D[i]>>>24)|4278255360&(D[i]<<24|D[i]>>>8),t[e+i]^=D[i]},blockSize:4,ivSize:2}),M.Rabbit=F._createHelper(P),F=(M=U).lib.StreamCipher,P=M.algo,W=[],O=[],I=[],P=P.RabbitLegacy=F.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],n=this._b=0;n<4;n++)q.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],t=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(t<<8|t>>>24)|4278255360&(t<<24|t>>>8),s=e>>>16|4294901760&o,t=o<<16|65535&e;i[0]^=e,i[1]^=s,i[2]^=o,i[3]^=t,i[4]^=e,i[5]^=s,i[6]^=o,i[7]^=t;for(n=0;n<4;n++)q.call(this)}},_doProcessBlock:function(t,e){var r=this._X;q.call(this),W[0]=r[0]^r[5]>>>16^r[3]<<16,W[1]=r[2]^r[7]>>>16^r[5]<<16,W[2]=r[4]^r[1]>>>16^r[7]<<16,W[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)W[i]=16711935&(W[i]<<8|W[i]>>>24)|4278255360&(W[i]<<24|W[i]>>>8),t[e+i]^=W[i]},blockSize:4,ivSize:2}),M.RabbitLegacy=F._createHelper(P),U}); \ No newline at end of file diff --git a/roguedex_chrome/styles.css b/roguedex_chrome/styles.css new file mode 100644 index 0000000..f2b2b62 --- /dev/null +++ b/roguedex_chrome/styles.css @@ -0,0 +1,175 @@ +:root { + --font-size: min(3vh, 2vw); + --icon-size: min(10vh, 6vw); +} + +.allies-team { + margin: 0 auto; + padding: 0 auto; + position: absolute; + top: 0; + right: 0; + z-index: 1; + display: flex; +} + +.enemy-team { + margin: 0 auto; + padding: 0 auto; + position: absolute; + top: 0; + z-index: 1; + display: flex; +} + +.pokemon-cards { + display: flex; + flex-wrap: nowrap; + overflow: hidden; +} + +.pokemon-card { + background-color: #333333b8; + border: 2px solid #555; + border-radius: 8px; + flex: 0 0 auto; + display:flex; + flex-direction: column; +} + +.pokemon-icon img { + width: min(var(--icon-size), 100px); + height: min(var(--icon-size), 100px); +} + +.pokemon-info { + margin-top: 10px; +} + +.pokemon-types { + display: flex; + justify-content: center; + margin-bottom: 10px; +} + +.type-icon { + --width: min(calc(var(--icon-size) / 2), 30px); + --height: min(calc(var(--icon-size) / 2), 30px); + width: var(--width); + height: var(--height); + background-size: cover; + background-repeat: no-repeat; + background-position: left; + background-position-x: min(-0.03em, -1.15px); + border-radius: 50%; + margin: 0 5px; +} + +.pokemon-weaknesses, +.pokemon-resistances, +.pokemon-immunities { + min-width: min(calc(var(--icon-size) / 2 + 1vh), 30px); + display: flex; + justify-content: center; +} + +.pokemon-weaknesses { + background-color: #6a1f1f; + border: 2px solid red; + border-radius: 10px; +} + +.pokemon-resistances { + background-color: #216a1f; + border: 2px solid green; + border-radius: 10px; +} + +.pokemon-immunities { + background-color: #484848; + border: 2px solid white; + border-radius: 10px; +} + +.pokemon-weaknesses .type-icon, +.pokemon-resistances .type-icon, +.pokemon-immunities .type-icon { + opacity: 1; +} + +.text-base { + display: flex; + font-family: 'emerald'; + font-size: min(var(--font-size), 18px); + text-shadow: 2px 0 #fff, -2px 0 #fff, 0 2px #fff, 0 -2px #fff, 1px 1px #fff, -1px -1px #fff, 1px -1px #fff, -1px 1px #fff; + color: black; +} + +.arrow-button-wrapper { + display: grid; +} +.arrow-button { + font-size: min(8vh, 45px) +} + +.tooltip .tooltiptext { + visibility: hidden; + text-align: center; + border-radius: 6px; + padding: 5px 0; + font-size: var(--font-size); + position: absolute; + z-index: 1; +} + +.tooltip:hover .tooltiptext { + visibility: visible; +} + +/* Slider settings */ +@media screen and (-webkit-min-device-pixel-ratio:0) { + input[type='range'] { + overflow: hidden; + width: 20vh; + -webkit-appearance: none; + } + + input[type='range']::-webkit-slider-runnable-track { + height: 1vh; + -webkit-appearance: none; + color: #13bba4; + margin-top: -1px; + } + + input[type='range']::-webkit-slider-thumb { + width: 1vh; + -webkit-appearance: none; + height: 1vh; + cursor: ew-resize; + box-shadow: -8vh 0 0 8vh #b3462c; + } + +} +/** FF*/ +input[type="range"]::-moz-range-progress { + background-color: #b3462c; +} +input[type="range"]::-moz-range-track { + background-color: #fff; +} +input[type="range"] { + background-color:transparent +} + +.slider-wrapper { + display: flex; +} + +.running-status { + position: absolute; + width: 100%; + justify-content: center; + text-align: center; + color: blue; + background-color: #ffffff50; +} \ No newline at end of file