summaryrefslogtreecommitdiff
path: root/ffxiv
diff options
context:
space:
mode:
Diffstat (limited to 'ffxiv')
-rw-r--r--ffxiv/bg-tile.pngbin0 -> 1231 bytes
-rw-r--r--ffxiv/character-frame.pngbin0 -> 11107 bytes
-rw-r--r--ffxiv/character-frame1.pngbin0 -> 8036 bytes
-rw-r--r--ffxiv/data/gc_adder.csv23
-rw-r--r--ffxiv/data/gc_flames.csv23
-rw-r--r--ffxiv/data/gc_maelstrom.csv23
-rw-r--r--ffxiv/data/grandcompanies.csv7
-rw-r--r--ffxiv/data/races.csv9
-rw-r--r--ffxiv/data/titles.csv598
-rw-r--r--ffxiv/data/tribes.csv20
-rw-r--r--ffxiv/ffxiv_core.py506
-rw-r--r--ffxiv/grandcompany/immortal_flames/1.pngbin0 -> 8443 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/10.pngbin0 -> 11318 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/11.pngbin0 -> 11931 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/12.pngbin0 -> 13039 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/13.pngbin0 -> 13147 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/14.pngbin0 -> 13780 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/15.pngbin0 -> 13372 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/16.pngbin0 -> 13625 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/17.pngbin0 -> 13796 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/18.pngbin0 -> 14461 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/19.pngbin0 -> 15111 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/2.pngbin0 -> 8880 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/3.pngbin0 -> 9170 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/4.pngbin0 -> 9357 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/5.pngbin0 -> 9763 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/6.pngbin0 -> 10425 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/7.pngbin0 -> 10785 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/8.pngbin0 -> 11365 bytes
-rw-r--r--ffxiv/grandcompany/immortal_flames/9.pngbin0 -> 10853 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/1.pngbin0 -> 8470 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/10.pngbin0 -> 9734 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/11.pngbin0 -> 9933 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/12.pngbin0 -> 10955 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/13.pngbin0 -> 11254 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/14.pngbin0 -> 11534 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/15.pngbin0 -> 14064 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/16.pngbin0 -> 14318 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/17.pngbin0 -> 14783 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/18.pngbin0 -> 14920 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/19.pngbin0 -> 14730 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/2.pngbin0 -> 8702 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/3.pngbin0 -> 8753 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/4.pngbin0 -> 8861 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/5.pngbin0 -> 9222 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/6.pngbin0 -> 9268 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/7.pngbin0 -> 9229 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/8.pngbin0 -> 9352 bytes
-rw-r--r--ffxiv/grandcompany/maelstrom/9.pngbin0 -> 9743 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/1.pngbin0 -> 7533 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/10.pngbin0 -> 10226 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/11.pngbin0 -> 10670 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/12.pngbin0 -> 11948 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/13.pngbin0 -> 12085 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/14.pngbin0 -> 12201 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/15.pngbin0 -> 13209 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/16.pngbin0 -> 13304 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/17.pngbin0 -> 13661 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/18.pngbin0 -> 13847 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/19.pngbin0 -> 13893 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/2.pngbin0 -> 7653 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/3.pngbin0 -> 7660 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/4.pngbin0 -> 7957 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/5.pngbin0 -> 8984 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/6.pngbin0 -> 9241 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/7.pngbin0 -> 9466 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/8.pngbin0 -> 9922 bytes
-rw-r--r--ffxiv/grandcompany/twin_adder/9.pngbin0 -> 9872 bytes
-rw-r--r--ffxiv/icons/alchemist.pngbin0 -> 13670 bytes
-rw-r--r--ffxiv/icons/arcanist.pngbin0 -> 13271 bytes
-rw-r--r--ffxiv/icons/archer.pngbin0 -> 13323 bytes
-rw-r--r--ffxiv/icons/armorer.pngbin0 -> 13361 bytes
-rw-r--r--ffxiv/icons/astrologian.pngbin0 -> 12192 bytes
-rw-r--r--ffxiv/icons/bard.pngbin0 -> 12833 bytes
-rw-r--r--ffxiv/icons/blackmage.pngbin0 -> 14085 bytes
-rw-r--r--ffxiv/icons/blacksmith.pngbin0 -> 11688 bytes
-rw-r--r--ffxiv/icons/bluemage(limitedjob).pngbin0 -> 7480 bytes
-rw-r--r--ffxiv/icons/botanist.pngbin0 -> 11929 bytes
-rw-r--r--ffxiv/icons/carpenter.pngbin0 -> 11778 bytes
-rw-r--r--ffxiv/icons/conjurer.pngbin0 -> 14150 bytes
-rw-r--r--ffxiv/icons/culinarian.pngbin0 -> 12429 bytes
-rw-r--r--ffxiv/icons/dancer.pngbin0 -> 7905 bytes
-rw-r--r--ffxiv/icons/darkknight.pngbin0 -> 12959 bytes
-rw-r--r--ffxiv/icons/dragoon.pngbin0 -> 12273 bytes
-rw-r--r--ffxiv/icons/fisher.pngbin0 -> 12209 bytes
-rw-r--r--ffxiv/icons/gladiator.pngbin0 -> 13382 bytes
-rw-r--r--ffxiv/icons/goldsmith.pngbin0 -> 12287 bytes
-rw-r--r--ffxiv/icons/gunbreaker.pngbin0 -> 8500 bytes
-rw-r--r--ffxiv/icons/lancer.pngbin0 -> 11134 bytes
-rw-r--r--ffxiv/icons/leatherworker.pngbin0 -> 14613 bytes
-rw-r--r--ffxiv/icons/machinist.pngbin0 -> 12497 bytes
-rw-r--r--ffxiv/icons/marauder.pngbin0 -> 13823 bytes
-rw-r--r--ffxiv/icons/miner.pngbin0 -> 11568 bytes
-rw-r--r--ffxiv/icons/monk.pngbin0 -> 13291 bytes
-rw-r--r--ffxiv/icons/ninja.pngbin0 -> 9551 bytes
-rw-r--r--ffxiv/icons/paladin.pngbin0 -> 13261 bytes
-rw-r--r--ffxiv/icons/pugilist.pngbin0 -> 13213 bytes
-rw-r--r--ffxiv/icons/redmage.pngbin0 -> 11851 bytes
-rw-r--r--ffxiv/icons/rogue.pngbin0 -> 647246 bytes
-rw-r--r--ffxiv/icons/role_dps_magic.pngbin0 -> 2072 bytes
-rw-r--r--ffxiv/icons/role_dps_melee.pngbin0 -> 2046 bytes
-rw-r--r--ffxiv/icons/role_dps_ranged.pngbin0 -> 1763 bytes
-rw-r--r--ffxiv/icons/role_hand.pngbin0 -> 2081 bytes
-rw-r--r--ffxiv/icons/role_healer.pngbin0 -> 2072 bytes
-rw-r--r--ffxiv/icons/role_land.pngbin0 -> 2207 bytes
-rw-r--r--ffxiv/icons/role_tank.pngbin0 -> 2052 bytes
-rw-r--r--ffxiv/icons/samurai.pngbin0 -> 14138 bytes
-rw-r--r--ffxiv/icons/scholar.pngbin0 -> 12701 bytes
-rw-r--r--ffxiv/icons/summoner.pngbin0 -> 12583 bytes
-rw-r--r--ffxiv/icons/thaumaturge.pngbin0 -> 14281 bytes
-rw-r--r--ffxiv/icons/warrior.pngbin0 -> 13849 bytes
-rw-r--r--ffxiv/icons/weaver.pngbin0 -> 13035 bytes
-rw-r--r--ffxiv/icons/whitemage.pngbin0 -> 11252 bytes
-rw-r--r--ffxiv/jobs/alchemist.pngbin0 -> 13670 bytes
-rw-r--r--ffxiv/jobs/arcanist.pngbin0 -> 13271 bytes
-rw-r--r--ffxiv/jobs/archer.pngbin0 -> 13323 bytes
-rw-r--r--ffxiv/jobs/armorer.pngbin0 -> 13361 bytes
-rw-r--r--ffxiv/jobs/astrologian.pngbin0 -> 12192 bytes
-rw-r--r--ffxiv/jobs/bard.pngbin0 -> 12833 bytes
-rw-r--r--ffxiv/jobs/blackmage.pngbin0 -> 14085 bytes
-rw-r--r--ffxiv/jobs/blacksmith.pngbin0 -> 11688 bytes
-rw-r--r--ffxiv/jobs/bluemage(limitedjob).pngbin0 -> 7480 bytes
-rw-r--r--ffxiv/jobs/bluemage.pngbin0 -> 7480 bytes
-rw-r--r--ffxiv/jobs/botanist.pngbin0 -> 11929 bytes
-rw-r--r--ffxiv/jobs/carpenter.pngbin0 -> 11778 bytes
-rw-r--r--ffxiv/jobs/conjurer.pngbin0 -> 14150 bytes
-rw-r--r--ffxiv/jobs/culinarian.pngbin0 -> 12429 bytes
-rw-r--r--ffxiv/jobs/dancer.pngbin0 -> 7905 bytes
-rw-r--r--ffxiv/jobs/darkknight.pngbin0 -> 12959 bytes
-rw-r--r--ffxiv/jobs/dragoon.pngbin0 -> 12273 bytes
-rw-r--r--ffxiv/jobs/fisher.pngbin0 -> 12209 bytes
-rw-r--r--ffxiv/jobs/gladiator.pngbin0 -> 13382 bytes
-rw-r--r--ffxiv/jobs/goldsmith.pngbin0 -> 12287 bytes
-rw-r--r--ffxiv/jobs/gunbreaker.pngbin0 -> 8500 bytes
-rw-r--r--ffxiv/jobs/lancer.pngbin0 -> 11134 bytes
-rw-r--r--ffxiv/jobs/leatherworker.pngbin0 -> 14613 bytes
-rw-r--r--ffxiv/jobs/machinist.pngbin0 -> 12497 bytes
-rw-r--r--ffxiv/jobs/marauder.pngbin0 -> 13823 bytes
-rw-r--r--ffxiv/jobs/miner.pngbin0 -> 11568 bytes
-rw-r--r--ffxiv/jobs/monk.pngbin0 -> 13291 bytes
-rw-r--r--ffxiv/jobs/ninja.pngbin0 -> 9551 bytes
-rw-r--r--ffxiv/jobs/paladin.pngbin0 -> 13261 bytes
-rw-r--r--ffxiv/jobs/pugilist.pngbin0 -> 13213 bytes
-rw-r--r--ffxiv/jobs/reaper.pngbin0 -> 7602 bytes
-rw-r--r--ffxiv/jobs/redmage.pngbin0 -> 11851 bytes
-rw-r--r--ffxiv/jobs/rogue.pngbin0 -> 647246 bytes
-rw-r--r--ffxiv/jobs/sage.pngbin0 -> 7713 bytes
-rw-r--r--ffxiv/jobs/samurai.pngbin0 -> 14138 bytes
-rw-r--r--ffxiv/jobs/scholar.pngbin0 -> 12701 bytes
-rw-r--r--ffxiv/jobs/summoner.pngbin0 -> 12583 bytes
-rw-r--r--ffxiv/jobs/thaumaturge.pngbin0 -> 14281 bytes
-rw-r--r--ffxiv/jobs/warrior.pngbin0 -> 13849 bytes
-rw-r--r--ffxiv/jobs/weaver.pngbin0 -> 13035 bytes
-rw-r--r--ffxiv/jobs/whitemage.pngbin0 -> 11252 bytes
-rw-r--r--ffxiv/jobs_plain/alchemist.pngbin0 -> 31931 bytes
-rw-r--r--ffxiv/jobs_plain/arcanist.pngbin0 -> 37543 bytes
-rw-r--r--ffxiv/jobs_plain/archer.pngbin0 -> 32093 bytes
-rw-r--r--ffxiv/jobs_plain/armorer.pngbin0 -> 27836 bytes
-rw-r--r--ffxiv/jobs_plain/astrologian.pngbin0 -> 19804 bytes
-rw-r--r--ffxiv/jobs_plain/bard.pngbin0 -> 18703 bytes
-rw-r--r--ffxiv/jobs_plain/black mage.pngbin0 -> 38268 bytes
-rw-r--r--ffxiv/jobs_plain/blackmage.pngbin0 -> 38268 bytes
-rw-r--r--ffxiv/jobs_plain/blacksmith.pngbin0 -> 14857 bytes
-rw-r--r--ffxiv/jobs_plain/blue mage (limited job).pngbin0 -> 25709 bytes
-rw-r--r--ffxiv/jobs_plain/bluemage(limitedjob).pngbin0 -> 25709 bytes
-rw-r--r--ffxiv/jobs_plain/botanist.pngbin0 -> 30856 bytes
-rw-r--r--ffxiv/jobs_plain/carpenter.pngbin0 -> 19003 bytes
-rw-r--r--ffxiv/jobs_plain/conjurer.pngbin0 -> 44654 bytes
-rw-r--r--ffxiv/jobs_plain/culinarian.pngbin0 -> 17055 bytes
-rw-r--r--ffxiv/jobs_plain/dancer.pngbin0 -> 27944 bytes
-rw-r--r--ffxiv/jobs_plain/dark knight.pngbin0 -> 25049 bytes
-rw-r--r--ffxiv/jobs_plain/darkknight.pngbin0 -> 25049 bytes
-rw-r--r--ffxiv/jobs_plain/dragoon.pngbin0 -> 22822 bytes
-rw-r--r--ffxiv/jobs_plain/fisher.pngbin0 -> 24487 bytes
-rw-r--r--ffxiv/jobs_plain/gladiator.pngbin0 -> 34758 bytes
-rw-r--r--ffxiv/jobs_plain/goldsmith.pngbin0 -> 36094 bytes
-rw-r--r--ffxiv/jobs_plain/gunbreaker.pngbin0 -> 31882 bytes
-rw-r--r--ffxiv/jobs_plain/lancer.pngbin0 -> 20054 bytes
-rw-r--r--ffxiv/jobs_plain/machinist.pngbin0 -> 27794 bytes
-rw-r--r--ffxiv/jobs_plain/marauder.pngbin0 -> 35937 bytes
-rw-r--r--ffxiv/jobs_plain/miner.pngbin0 -> 22390 bytes
-rw-r--r--ffxiv/jobs_plain/monk.pngbin0 -> 25109 bytes
-rw-r--r--ffxiv/jobs_plain/ninja.pngbin0 -> 29569 bytes
-rw-r--r--ffxiv/jobs_plain/paladin.pngbin0 -> 20158 bytes
-rw-r--r--ffxiv/jobs_plain/pugilist.pngbin0 -> 29725 bytes
-rw-r--r--ffxiv/jobs_plain/reaper.pngbin0 -> 5590 bytes
-rw-r--r--ffxiv/jobs_plain/red mage.pngbin0 -> 24099 bytes
-rw-r--r--ffxiv/jobs_plain/redmage.pngbin0 -> 24099 bytes
-rw-r--r--ffxiv/jobs_plain/rogue.pngbin0 -> 28786 bytes
-rw-r--r--ffxiv/jobs_plain/sage.pngbin0 -> 5544 bytes
-rw-r--r--ffxiv/jobs_plain/samurai.pngbin0 -> 35931 bytes
-rw-r--r--ffxiv/jobs_plain/scholar.pngbin0 -> 23853 bytes
-rw-r--r--ffxiv/jobs_plain/summoner.pngbin0 -> 26823 bytes
-rw-r--r--ffxiv/jobs_plain/warrior.pngbin0 -> 31815 bytes
-rw-r--r--ffxiv/jobs_plain/weaver.pngbin0 -> 30341 bytes
-rw-r--r--ffxiv/jobs_plain/white mage.pngbin0 -> 16988 bytes
-rw-r--r--ffxiv/jobs_plain/whitemage.pngbin0 -> 16988 bytes
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/LICENSE24
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/README.md26
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/cwls/cwls.json9
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/cwls/members.json51
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/freecompany/focus.json131
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/freecompany/freecompany.json80
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/freecompany/members.json44
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/freecompany/reputation.json41
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/freecompany/seeking.json75
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/linkshell/ls.json5
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/linkshell/members.json51
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/meta.json35
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/profile/achievements.json45
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/profile/attributes.json62
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/profile/character.json114
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/profile/classjob.json550
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/profile/gearset.json527
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/profile/minion.json18
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/profile/mount.json18
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/pvpteam/members.json39
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/pvpteam/pvpteam.json26
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/search/character.json50
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/search/cwls.json36
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/search/freecompany.json69
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/search/linkshell.json37
-rw-r--r--ffxiv/lodestone-css-selectors-0.46.0/search/pvpteam.json47
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/LICENSE24
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/README.md26
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/cwls/cwls.json9
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/cwls/members.json51
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/freecompany/focus.json131
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/freecompany/freecompany.json80
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/freecompany/members.json51
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/freecompany/reputation.json41
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/freecompany/seeking.json75
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/linkshell/ls.json5
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/linkshell/members.json51
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/meta.json35
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/profile/achievements.json45
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/profile/attributes.json62
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/profile/character.json110
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/profile/classjob.json550
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/profile/classjob_original.json398
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/profile/gearset.json527
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/profile/minion.json18
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/profile/mount.json18
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/pvpteam/members.json39
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/pvpteam/pvpteam.json26
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/search/character.json50
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/search/cwls.json36
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/search/freecompany.json69
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/search/linkshell.json37
-rw-r--r--ffxiv/lodestone-css-selectors-0.52.0/search/pvpteam.json47
-rw-r--r--ffxiv/pystone/__init__.py0
-rw-r--r--ffxiv/pystone/character.py20
-rw-r--r--ffxiv/pystone/cli/client.py6
-rw-r--r--ffxiv/pystone/definition.py161
-rw-r--r--ffxiv/pystone/free_company.py5
-rw-r--r--ffxiv/pystone/lodestone.py39
-rw-r--r--ffxiv/pystone/types.py11
-rw-r--r--ffxiv/roles/hand.pngbin0 -> 2081 bytes
-rw-r--r--ffxiv/roles/healer.pngbin0 -> 2072 bytes
-rw-r--r--ffxiv/roles/land.pngbin0 -> 2207 bytes
-rw-r--r--ffxiv/roles/magic.pngbin0 -> 2072 bytes
-rw-r--r--ffxiv/roles/melee.pngbin0 -> 2046 bytes
-rw-r--r--ffxiv/roles/ranged.pngbin0 -> 1763 bytes
-rw-r--r--ffxiv/roles/tank.pngbin0 -> 2052 bytes
264 files changed, 6272 insertions, 0 deletions
diff --git a/ffxiv/bg-tile.png b/ffxiv/bg-tile.png
new file mode 100644
index 0000000..cd1f769
--- /dev/null
+++ b/ffxiv/bg-tile.png
Binary files differ
diff --git a/ffxiv/character-frame.png b/ffxiv/character-frame.png
new file mode 100644
index 0000000..5512a73
--- /dev/null
+++ b/ffxiv/character-frame.png
Binary files differ
diff --git a/ffxiv/character-frame1.png b/ffxiv/character-frame1.png
new file mode 100644
index 0000000..e6a6b4d
--- /dev/null
+++ b/ffxiv/character-frame1.png
Binary files differ
diff --git a/ffxiv/data/gc_adder.csv b/ffxiv/data/gc_adder.csv
new file mode 100644
index 0000000..54b713a
--- /dev/null
+++ b/ffxiv/data/gc_adder.csv
@@ -0,0 +1,23 @@
+key,0,1,2,3,4,5,6,7,8,9
+#,Singular,Adjective,Plural,PossessivePronoun,StartsWithVowel,,Pronoun,Article,Name{Rank},
+int32,str,sbyte,str,sbyte,sbyte,sbyte,sbyte,sbyte,str,str
+0,"",0,"",0,0,0,0,0,"",""
+1,"Serpent Private Third Class",0,"Serpent Privates Third Class",0,0,0,0,0,"private",""
+2,"Serpent Private Second Class",0,"Serpent Privates Second Class",0,0,0,0,0,"private",""
+3,"Serpent Private First Class",0,"Serpent Privates First Class",0,0,0,0,0,"private",""
+4,"Serpent Corporal",0,"Serpent Corporals",0,0,0,0,0,"corporal",""
+5,"Serpent Sergeant Third Class",0,"Serpent Sergeants Third Class",0,0,0,0,0,"sergeant",""
+6,"Serpent Sergeant Second Class",0,"Serpent Sergeants Second Class",0,0,0,0,0,"sergeant",""
+7,"Serpent Sergeant First Class",0,"Serpent Sergeants First Class",0,0,0,0,0,"sergeant",""
+8,"Chief Serpent Sergeant",0,"Chief Serpent Sergeants",0,0,0,0,0,"sergeant",""
+9,"Second Serpent Lieutenant",0,"Second Serpent Lieutenants",0,0,0,0,0,"lieutenant",""
+10,"First Serpent Lieutenant",0,"First Serpent Lieutenants",0,0,0,0,0,"lieutenant",""
+11,"Serpent Captain",0,"Serpent Captains",0,0,0,0,0,"captain",""
+12,"Second Serpent Commander",0,"Second Serpent Commanders",0,0,0,0,0,"commander",""
+13,"First Serpent Commander",0,"First Serpent Commanders",0,0,0,0,0,"commander",""
+14,"High Serpent Commander",0,"High Serpent Commanders",0,0,0,0,0,"commander",""
+15,"Rear Serpent Marshal",0,"Rear Serpent Marshals",0,0,0,0,0,"rear marshal",""
+16,"Vice Serpent Marshal",0,"Vice Serpent Marshals",0,0,0,0,0,"vice marshal",""
+17,"Serpent Marshal",0,"Serpent Marshals",0,0,0,0,0,"marshal",""
+18,"Grand Serpent Marshal",0,"Grand Serpent Marshals",0,0,0,0,0,"grand marshal",""
+19,"Serpent Champion",0,"Serpent Champions",0,0,0,0,0,"champion",""
diff --git a/ffxiv/data/gc_flames.csv b/ffxiv/data/gc_flames.csv
new file mode 100644
index 0000000..3417b9d
--- /dev/null
+++ b/ffxiv/data/gc_flames.csv
@@ -0,0 +1,23 @@
+key,0,1,2,3,4,5,6,7,8,9
+#,Singular,Adjective,Plural,PossessivePronoun,StartsWithVowel,,Pronoun,Article,Name{Rank},
+int32,str,sbyte,str,sbyte,sbyte,sbyte,sbyte,sbyte,str,str
+0,"",0,"",0,0,0,0,0,"",""
+1,"Flame Private Third Class",0,"Flame Privates Third Class",0,0,0,0,0,"private",""
+2,"Flame Private Second Class",0,"Flame Privates Second Class",0,0,0,0,0,"private",""
+3,"Flame Private First Class",0,"Flame Privates First Class",0,0,0,0,0,"private",""
+4,"Flame Corporal",0,"Flame Corporals",0,0,0,0,0,"corporal",""
+5,"Flame Sergeant Third Class",0,"Flame Sergeants Third Class",0,0,0,0,0,"sergeant",""
+6,"Flame Sergeant Second Class",0,"Flame Sergeants Second Class",0,0,0,0,0,"sergeant",""
+7,"Flame Sergeant First Class",0,"Flame Sergeants First Class",0,0,0,0,0,"sergeant",""
+8,"Chief Flame Sergeant",0,"Chief Flame Sergeants",0,0,0,0,0,"sergeant",""
+9,"Second Flame Lieutenant",0,"Second Flame Lieutenants",0,0,0,0,0,"lieutenant",""
+10,"First Flame Lieutenant",0,"First Flame Lieutenants",0,0,0,0,0,"lieutenant",""
+11,"Flame Captain",0,"Flame Captains",0,0,0,0,0,"captain",""
+12,"Second Flame Commander",0,"Second Flame Commanders",0,0,0,0,0,"commander",""
+13,"First Flame Commander",0,"First Flame Commanders",0,0,0,0,0,"commander",""
+14,"High Flame Commander",0,"High Flame Commanders",0,0,0,0,0,"commander",""
+15,"Rear Flame Marshal",0,"Rear Flame Marshals",0,0,0,0,0,"rear marshal",""
+16,"Vice Flame Marshal",0,"Vice Flame Marshals",0,0,0,0,0,"vice marshal",""
+17,"Flame Marshal",0,"Flame Marshals",0,0,0,0,0,"marshal",""
+18,"Grand Flame Marshal",0,"Grand Flame Marshals",0,0,0,0,0,"grand marshal",""
+19,"Flame Champion",0,"Flame Champions",0,0,0,0,0,"champion","" \ No newline at end of file
diff --git a/ffxiv/data/gc_maelstrom.csv b/ffxiv/data/gc_maelstrom.csv
new file mode 100644
index 0000000..52e0e89
--- /dev/null
+++ b/ffxiv/data/gc_maelstrom.csv
@@ -0,0 +1,23 @@
+key,0,1,2,3,4,5,6,7,8,9
+#,Singular,Adjective,Plural,PossessivePronoun,StartsWithVowel,,Pronoun,Article,Name{Rank},
+int32,str,sbyte,str,sbyte,sbyte,sbyte,sbyte,sbyte,str,str
+0,"",0,"",0,0,0,0,0,"",""
+1,"Storm Private Third Class",0,"Storm Privates Third Class",0,0,0,0,0,"private",""
+2,"Storm Private Second Class",0,"Storm Privates Second Class",0,0,0,0,0,"private",""
+3,"Storm Private First Class",0,"Storm Privates First Class",0,0,0,0,0,"private",""
+4,"Storm Corporal",0,"Storm Corporals",0,0,0,0,0,"corporal",""
+5,"Storm Sergeant Third Class",0,"Storm Sergeants Third Class",0,0,0,0,0,"sergeant",""
+6,"Storm Sergeant Second Class",0,"Storm Sergeants Second Class",0,0,0,0,0,"sergeant",""
+7,"Storm Sergeant First Class",0,"Storm Sergeants First Class",0,0,0,0,0,"sergeant",""
+8,"Chief Storm Sergeant",0,"Chief Storm Sergeants",0,0,0,0,0,"sergeant",""
+9,"Second Storm Lieutenant",0,"Second Storm Lieutenants",0,0,0,0,0,"lieutenant",""
+10,"First Storm Lieutenant",0,"First Storm Lieutenants",0,0,0,0,0,"lieutenant",""
+11,"Storm Captain",0,"Storm Captains",0,0,0,0,0,"captain",""
+12,"Second Storm Commander",0,"Second Storm Commanders",0,0,0,0,0,"commander",""
+13,"First Storm Commander",0,"First Storm Commanders",0,0,0,0,0,"commander",""
+14,"High Storm Commander",0,"High Storm Commanders",0,0,0,0,0,"commander",""
+15,"Rear Storm Marshal",0,"Rear Storm Marshals",0,0,0,0,0,"rear marshal",""
+16,"Vice Storm Marshal",0,"Vice Storm Marshals",0,0,0,0,0,"vice marshal",""
+17,"Storm Marshal",0,"Storm Marshals",0,0,0,0,0,"marshal",""
+18,"Grand Storm Marshal",0,"Grand Storm Marshals",0,0,0,0,0,"grand marshal",""
+19,"Storm Champion",0,"Storm Champions",0,0,0,0,0,"champion",""
diff --git a/ffxiv/data/grandcompanies.csv b/ffxiv/data/grandcompanies.csv
new file mode 100644
index 0000000..b787cd3
--- /dev/null
+++ b/ffxiv/data/grandcompanies.csv
@@ -0,0 +1,7 @@
+key,0,1,2,3,4,5,6,7,8,9
+#,Name,,,,,,,,,
+int32,str,sbyte,str,sbyte,sbyte,sbyte,sbyte,sbyte,str,sbyte
+0,"None",0,"",0,0,0,0,0,"",127
+1,"Maelstrom",0,"",0,0,0,0,0,"",8
+2,"Order of the Twin Adder",0,"",0,0,0,0,0,"",9
+3,"Immortal Flames",0,"",0,0,0,0,0,"",10
diff --git a/ffxiv/data/races.csv b/ffxiv/data/races.csv
new file mode 100644
index 0000000..a25472b
--- /dev/null
+++ b/ffxiv/data/races.csv
@@ -0,0 +1,9 @@
+ID,Icon,Name,Url
+1,,Hyur,/Race/1
+2,,Elezen,/Race/2
+3,,Lalafell,/Race/3
+4,,Miqo'te,/Race/4
+5,,Roegadyn,/Race/5
+6,,Au Ra,/Race/6
+7,,Hrothgar,/Race/7
+8,,Viera,/Race/8 \ No newline at end of file
diff --git a/ffxiv/data/titles.csv b/ffxiv/data/titles.csv
new file mode 100644
index 0000000..183900a
--- /dev/null
+++ b/ffxiv/data/titles.csv
@@ -0,0 +1,598 @@
+key,0,1,2,3
+#,Masculine,Feminine,IsPrefix,Order
+int32,str,str,bit&01,uint16
+0,"","",False,0
+1,"The Insatiable","The Insatiable",False,1
+2,"The True","The True",False,2
+3,"Coeurlfist","Coeurlfist",True,3
+4,"Ironeater","Ironeater",True,4
+5,"Of the Vengeful Lance","Of the Vengeful Lance",False,5
+6,"The Godsbow","The Godsbow",False,6
+7,"The White","The White",False,7
+8,"Starcaller","Starcaller",True,8
+9,"The Exterminator","The Exterminator",False,50
+10,"Notorious Monster Hunter","Notorious Monster Hunter",True,60
+11,"Honest Gillionaire","Honest Gillionaire",True,80
+12,"Ruthless Gillionaire","Ruthless Gillionaire",True,80
+13,"Warmonger","Warmonger",True,100
+14,"Archmage","Archmage",True,101
+15,"Builder of the Realm","Builder of the Realm",False,102
+16,"Provider of the Realm","Provider of the Realm",False,103
+17,"Of the Golden Saw","Of the Golden Saw",False,150
+18,"Of the Golden Anvil","Of the Golden Anvil",False,151
+19,"Of the Golden Hammer","Of the Golden Hammer",False,152
+20,"Of the Golden Leaf","Of the Golden Leaf",False,153
+21,"Of the Golden Hide","Of the Golden Hide",False,154
+22,"Of the Golden Needle","Of the Golden Needle",False,155
+23,"Of the Golden Lead","Of the Golden Lead",False,156
+24,"Of the Golden Ladle","Of the Golden Ladle",False,157
+25,"Meadowbreaker","Meadowbreaker",True,200
+26,"Forestbreaker","Forestbreaker",True,201
+27,"Desertbreaker","Desertbreaker",True,202
+28,"Of the Meadow Mines","Of the Meadow Mines",False,203
+29,"Of the Forest Mines","Of the Forest Mines",False,204
+30,"Of the Desert Mines","Of the Desert Mines",False,205
+31,"Meadowreaper","Meadowreaper",True,206
+32,"Forestreaper","Forestreaper",True,207
+33,"Desertreaper","Desertreaper",True,208
+34,"Of the Meadow Grasses","Of the Meadow Grasses",False,209
+35,"Of the Forest Grasses","Of the Forest Grasses",False,210
+36,"Of the Desert Grasses","Of the Desert Grasses",False,211
+37,"Meadowcaster","Meadowcaster",True,212
+38,"Forestcaster","Forestcaster",True,213
+39,"Desertcaster","Desertcaster",True,214
+40,"Of the Meadow Pools","Of the Meadow Pools",False,215
+41,"Of the Forest Pools","Of the Forest Pools",False,216
+42,"Of the Desert Pools","Of the Desert Pools",False,217
+43,"Carrier of the Cauldron","Carrier of the Cauldron",False,250
+44,"The Assimilator","The Assimilator",False,251
+45,"Seeker of Blood","Seeker of Blood",False,300
+46,"Seeker of Truth","Seeker of Truth",False,301
+47,"Seeker of Skill","Seeker of Skill",False,302
+48,"Seeker of Bounty","Seeker of Bounty",False,303
+49,"Sidestepper","Sidestepper",True,350
+50,"Lord Protector","Lady Protector",True,351
+51,"Lord Creator","Lady Creator",True,352
+52,"Peacemaker","Peacemaker",True,353
+53,"The Last Resort","The Last Resort",False,354
+54,"The Sword of La Noscea","The Sword of La Noscea",False,355
+55,"The Sword of the Shroud","The Sword of the Shroud",False,356
+56,"The Sword of Thanalan","The Sword of Thanalan",False,357
+57,"The Sword of Eorzea","The Sword of Eorzea",False,358
+58,"The Shield of La Noscea","The Shield of La Noscea",False,359
+59,"The Shield of the Shroud","The Shield of the Shroud",False,360
+60,"The Shield of Thanalan","The Shield of Thanalan",False,361
+61,"The Shield of Eorzea","The Shield of Eorzea",False,362
+62,"Brother of the Broken Blade","Sister of the Broken Blade",True,363
+63,"The Warden's Wall","The Warden's Wall",False,364
+64,"Bearer of the Horn","Bearer of the Horn",True,365
+65,"The Uncommitted","The Uncommitted",False,366
+66,"The Professional","The Professional",False,400
+67,"Inquisitor","Inquisitor",True,450
+68,"Divine Crusher","Divine Crusher",True,451
+69,"Stonesplitter","Stonesplitter",True,452
+70,"A Kobold's Worst Nightmare","A Kobold's Worst Nightmare",False,453
+71,"An Ixal's Worst Nightmare","An Ixal's Worst Nightmare",False,454
+72,"An Amalj'aa's Worst Nightmare","An Amalj'aa's Worst Nightmare",False,455
+73,"The Guardian of Aleport","The Guardian of Aleport",False,456
+74,"The Guardian of Hyrstmill","The Guardian of Hyrstmill",False,457
+75,"The Guardian of the Golden Bazaar","The Guardian of the Golden Bazaar",False,458
+76,"The Wind of Aleport","The Wind of Aleport",False,459
+77,"The Wind of Hyrstmill","The Wind of Hyrstmill",False,460
+78,"The Wind of the Golden Bazaar","The Wind of the Golden Bazaar",False,461
+79,"The Hand of Aleport","The Hand of Aleport",False,462
+80,"The Hand of Hyrstmill","The Hand of Hyrstmill",False,463
+81,"The Hand of the Golden Bazaar","The Hand of the Golden Bazaar",False,464
+82,"Wild Thing","Wild Thing",True,500
+83,"The Winter Wyrm","The Winter Wyrm",False,501
+84,"Messenger of Love","Messenger of Love",True,502
+85,"Royal Seneschal","Princess for a Day",True,503
+86,"Dreamseeker","Dreamseeker",True,504
+87,"Cascadier","Cascadier",True,505
+88,"Crystal Bearer","Crystal Bearer",True,506
+89,"Stormlord","Stormlady",True,550
+90,"Serpentlord","Serpentlady",True,551
+91,"Flamelord","Flamelady",True,552
+92,"The Stormsworn","The Stormsworn",False,553
+93,"The Serpentsworn","The Serpentsworn",False,554
+94,"The Flamesworn","The Flamesworn",False,555
+95,"Stormcarrier","Stormcarrier",True,556
+96,"Serpentcarrier","Serpentcarrier",True,557
+97,"Flamecarrier","Flamecarrier",True,558
+98,"Stormbringer","Stormbringer",True,559
+99,"Serpentbringer","Serpentbringer",True,560
+100,"Flamebringer","Flamebringer",True,561
+101,"Featherfoot","Featherfoot",True,600
+102,"A Bo's Best Friend","A Bo's Best Friend",True,601
+103,"Lightning","Lightning",True,602
+104,"Cavalier","Cavalier",True,603
+105,"The Wanderer's Shadow","The Wanderer's Shadow",False,604
+106,"Green Eyes","Green Eyes",False,605
+107,"The Strategist","The Strategist",False,606
+108,"The Reaper","The Reaper",False,607
+109,"Dungeon Master","Dungeon Master",True,608
+110,"Tempter of Fate","Temptress of Fate",False,609
+111,"Elite Cascadier","Elite Cascadier",True,610
+112,"Storm Puppy","Storm Puppy",True,650
+113,"Storm Howler","Storm Howler",True,651
+114,"Storm Growler","Storm Growler",True,652
+115,"Storm Hound","Storm Hound",True,653
+116,"Storm Stalker","Storm Stalker",True,654
+117,"Storm Chaser","Storm Chaser",True,655
+118,"Naago's Friend","Naago's Friend",True,1448
+119,"Naago's Partner","Naago's Partner",True,1449
+120,"Wings of Steel","Wings of Steel",False,1450
+121,"Wings of Fire","Wings of Fire",False,1451
+122,"Serpent Puppy","Serpent Puppy",True,660
+123,"Serpent Howler","Serpent Howler",True,661
+124,"Serpent Growler","Serpent Growler",True,662
+125,"Serpent Hound","Serpent Hound",True,663
+126,"Serpent Stalker","Serpent Stalker",True,664
+127,"Serpent Chaser","Serpent Chaser",True,665
+128,"Deep Canal Raider","Deep Canal Raider",True,1452
+129,"Deep Canal Dweller","Deep Canal Dweller",True,1453
+130,"The Luckiest of Lords","The Luckiest of Ladies",False,1454
+131,"Crimson Explorer","Crimson Explorer",True,1455
+132,"Flame Puppy","Flame Puppy",True,670
+133,"Flame Howler","Flame Howler",True,671
+134,"Flame Growler","Flame Growler",True,672
+135,"Flame Hound","Flame Hound",True,673
+136,"Flame Stalker","Flame Stalker",True,674
+137,"Flame Chaser","Flame Chaser",True,675
+138,"The Legend","The Legend",False,1456
+139,"Raubahn's Left Arm","Raubahn's Left Arm",True,1457
+140,"Of the Blue","Of the Blue",False,1458
+141,"Fashion Leader","Fashion Leader",False,1459
+142,"The Ravenous Wolf","The Ravenous Wolf",False,700
+143,"The Alpha Wolf","The Alpha Wolf",False,701
+144,"The Heart of the Party","The Heart of the Party",False,750
+145,"Brother of Ash","Sister of Ash",True,751
+146,"Sylph-Friend","Sylph-Friend",True,752
+147,"Treasure Hunter","Treasure Hunter",True,753
+148,"789th Order Champion","789th Order Champion",True,754
+149,"Novv Clutchmate","Novv Clutchmate",True,755
+150,"The Ambitious Angler","The Ambitious Angler",False,756
+151,"The Meat Shield","The Meat Shield",False,757
+152,"The Meat Axe","The Meat Axe",False,758
+153,"Of the Stalwart Shield","Of the Stalwart Shield",False,759
+154,"Of the Stalwart Axe","Of the Stalwart Axe",False,760
+155,"Frontline Forerunner","Frontline Forerunner",True,761
+156,"Storm Forerunner","Storm Forerunner",True,762
+157,"Flame Forerunner","Flame Forerunner",True,764
+158,"Serpent Forerunner","Serpent Forerunner",True,763
+159,"Drone Sniper","Drone Sniper",True,765
+160,"Heliodrome Hero","Heliodrome Hero",True,766
+161,"Hunter for Hire","Hunter for Hire",True,800
+162,"Seeker of Fortune","Seeker of Fortune",True,801
+163,"Seasoned Tracker","Seasoned Tracker",True,802
+164,"Bounty Hunter","Bounty Hunter",True,803
+165,"Soldier of Fortune","Soldier of Fortune",True,804
+166,"Captain of the Hunt","Captain of the Hunt",False,805
+167,"Rafflesia Reaper","Rafflesia Reaper",True,850
+168,"Melusine Mauler","Melusine Mauler",True,851
+169,"The Avatar","The Avatar",False,852
+170,"Domitor","Domitrix",False,853
+171,"The Disassembler","The Disassembler",True,900
+172,"Eversharp","Eversharp",False,1460
+173,"Bearer of the Coffer","Bearer of the Coffer",True,902
+174,"Defender of Eorzea","Defender of Eorzea",False,950
+175,"The Postman","The Postwoman",False,951
+176,"Ehcatl Blackguard","Ehcatl Blackguard",True,952
+177,"The Negotiator","The Negotiator",False,953
+178,"The Final Witness","The Final Witness",False,954
+179,"Of Dragons Deep","Of Dragons Deep",False,955
+180,"Master Caster","Master Caster",True,956
+181,"The New Sun","The New Sun",False,1461
+182,"The Shadow","The Shadow",False,958
+183,"Icebreaker","Icebreaker",True,959
+184,"Of the Silver Lining","Of the Silver Lining",False,960
+185,"Gentleman","Gentlewoman",True,961
+186,"Cupid","Cupid",True,962
+187,"Tamer of Steeds","Tamer of Steeds",False,963
+188,"The Unsevered","The Unsevered",False,964
+189,"Slaughterhouse","Slaughterhouse",True,965
+190,"The Hand of Mercy","The Hand of Mercy",False,966
+191,"The Light in Hand","The Light in Hand",False,967
+192,"The Light of the Land","The Light of the Land",False,968
+193,"Z","Z",False,969
+194,"Golemancer","Golemancer",True,970
+195,"Gambler","Gambler",True,1000
+196,"High Roller","High Roller",True,1001
+197,"Chocobo Breeder","Chocobo Breeder",True,1002
+198,"Chocobo Trainer","Chocobo Trainer",True,1003
+199,"Bug Boy","Bug Girl",True,1004
+200,"Senior Jockey","Senior Jockey",True,1005
+201,"Veteran Jockey","Veteran Jockey",True,1006
+202,"The First Across","The First Across",False,1007
+203,"Deck Holder","Deck Holder",True,1008
+204,"Deck Hoarder","Deck Hoarder",True,1009
+205,"The Trinity","The Trinity",False,1010
+206,"Duelist","Duelist",True,1011
+207,"Keymaster","Gatekeeper",True,1012
+208,"The Fungah","The Fungah",False,1013
+209,"Moneybags","Moneybags",True,1014
+210,"Raiser of Mountains","Raiser of Mountains",False,1015
+211,"Bearer of the Torch","Bearer of the Torch",False,1050
+212,"Postmaster","Postmaster",True,1051
+213,"Half-boiled Hero","Half-boiled Heroine",True,1052
+214,"Unbeliever","Unbeliever",True,1053
+215,"The Redeemed","The Redeemed",False,1054
+216,"Nidhogg Slayer","Nidhogg Slayer",True,1055
+217,"Of the Silver Fuller","Of the Silver Fuller",False,1056
+218,"Imperial Nuisance","Imperial Nuisance",False,1057
+219,"Under-archon","Under-archon",True,1058
+220,"The End of Ascalon","The End of Ascalon",True,1059
+221,"Snake in the Grass","Snake in the Grass",True,1462
+222,"The Oathkeeper","The Oathkeeper",False,1100
+223,"Of the 14th Chakra","Of the 14th Chakra",False,1101
+224,"The Mythril Heart","The Mythril Heart",False,1102
+225,"The Azure Dragoon","The Azure Dragoon",False,1103
+226,"Skysinger","Skysinger",False,1104
+227,"Pure White","Pure White",True,1105
+228,"Annihilator","Annihilator",True,1106
+229,"Dreadspawn","Dreadspawn",False,1107
+230,"Nymian Marine","Nymian Marine",True,1108
+231,"The Darkest Shadow","The Darkest Shadow",False,1109
+232,"Blackblood","Blackblood",False,1110
+233,"Liberator","Liberator",True,1111
+234,"Stargazer","Stargazer",True,1112
+235,"Illuminati Quencher","Illuminati Quencher",True,1150
+236,"Finder of False Gods","Finder of False Gods",False,1151
+237,"Lighter than Air","Lighter than Air",True,1152
+238,"","",False,0
+239,"Grandmaster of War","Grandmaster of War",True,1200
+240,"Grandmaster of Magic","Grandmaster of Magic",True,1201
+241,"Dark Driver","Dark Driver",True,1202
+242,"Of the Stalwart Sword","Of the Stalwart Sword",False,1203
+243,"Keeper of Knowledge","Keeper of Knowledge",True,1204
+244,"Canal Dweller","Canal Dweller",True,1445
+245,"Canal Lord","Canal Lady",True,1446
+246,"The Necromancer","The Necromancer",False,1447
+247,"","",False,0
+248,"Grandmaster of the Hand","Grandmaster of the Hand",True,1209
+249,"Grandmaster of the Land","Grandmaster of the Land",True,1210
+250,"Molder of Masterpieces","Molder of Masterpieces",True,1211
+251,"Amasser of Masterpieces","Amasser of Masterpieces",True,1212
+252,"Business Associate","Business Associate",True,1213
+253,"Master Carpenter","Master Carpenter",True,1214
+254,"Master Blacksmith","Master Blacksmith",True,1215
+255,"Master Armorer","Master Armorer",True,1216
+256,"Master Goldsmith","Master Goldsmith",True,1217
+257,"Master Leatherworker","Master Leatherworker",True,1218
+258,"Master Weaver","Master Weaver",True,1219
+259,"Master Alchemist","Master Alchemist",True,1220
+260,"Master Culinarian","Master Culinarian",True,1221
+261,"Master Miner","Master Miner",True,1222
+262,"Master Botanist","Master Botanist",True,1223
+263,"Master Fisher","Master Fisher",True,1224
+264,"The Fortunate","The Fortunate",False,1225
+265,"Good Samaritan","Good Samaritan",True,1226
+266,"Minion Collector","Minion Collector",True,1227
+267,"Minion Master","Minion Master",True,1228
+268,"Mammeteer","Mammeteer",True,1229
+269,"Prince of Verminion","Princess of Verminion",False,1230
+270,"Lord of Verminion","Lady of Verminion",False,1231
+271,"House Fortemps Knight","House Fortemps Knight",False,1232
+272,"Sky Pirate","Sky Pirate",True,1233
+273,"The Noumenon","The Noumenon",False,1234
+274,"Sundrop Dancer","Sundrop Dancer",True,1235
+275,"Myth Breaker","Myth Breaker",True,1236
+276,"Veteran Explorer","Veteran Explorer",True,1237
+277,"Special Advisor","Special Advisor",True,1238
+278,"Notorious Monster Slayer","Notorious Monster Slayer",True,1239
+279,"Hungry Wolf","Hungry Wolf",True,1240
+280,"The Devourer","The Devourer",False,1241
+281,"The Unmoving","The Unmoving",False,1242
+282,"The Unrelenting","The Unrelenting",False,1243
+283,"The Unseen","The Unseen",False,1244
+284,"The Unleashed","The Unleashed",False,1245
+285,"The Undamaged","The Undamaged",False,1246
+286,"Mentor","Mentor",True,1247
+287,"Mentor of Mentors","Mentor of Mentors",True,1248
+288,"Carrier of the Kettle","Carrier of the Kettle",True,1249
+289,"The Gear of Change","The Gear of Change",False,1250
+290,"Allthoughts","Allthoughts",False,1251
+291,"The Newmind","The Newmind",False,1252
+292,"The Dragonsong","The Dragonsong",False,1253
+293,"Polis Raider","Polis Raider",True,1254
+294,"Polis Dweller","Polis Dweller",True,1255
+295,"Polis Lord","Polis Lady",True,1256
+296,"Pom Friend","Pom Friend",True,1257
+297,"Leader of the Pack","Leader of the Pack",True,1258
+298,"Beta Wolf","Beta Wolf",True,1259
+299,"Hunter Wolf","Hunter Wolf",True,1260
+300,"Bronze Wolf","Bronze Wolf",True,1261
+301,"Silver Wolf","Silver Wolf",True,1262
+302,"Gold Wolf","Gold Wolf",True,1263
+303,"Platinum Wolf","Platinum Wolf",True,1264
+304,"Diamond Wolf","Diamond Wolf",True,1265
+305,"Of the First Pack","Of the First Pack",False,1266
+306,"Of the Second Pack","Of the Second Pack",False,1267
+307,"Of the Hungry Pack","Of the Hungry Pack",False,1268
+308,"Of the Bronze Pack","Of the Bronze Pack",False,1269
+309,"Of the Silver Pack","Of the Silver Pack",False,1270
+310,"Of the Gold Pack","Of the Gold Pack",False,1271
+311,"Of the Platinum Pack","Of the Platinum Pack",False,1272
+312,"Of the Diamond Pack","Of the Diamond Pack",False,1273
+313,"The Knight of Glory","The Knight of Glory",False,1300
+314,"The Chief Mourner","The Chief Mourner",False,1310
+315,"The Wings of Time","The Wings of Time",False,1311
+316,"Surrenderer of Souls","Surrenderer of Souls",False,1312
+317,"Khloe's Friend","Khloe's Friend",True,1313
+318,"Khloe's Best Friend","Khloe's Best Friend",True,1314
+319,"Hero of Gelmorra","Hero of Gelmorra",False,1315
+320,"Lightbringer","Lightbringer",False,1316
+321,"Lonely Explorer","Lonely Explorer",True,1317
+322,"The Lucky","The Lucky",False,1318
+323,"Of the Sixth Sense","Of the Sixth Sense",False,1319
+324,"Corpse Dancer","Corpse Dancer",True,1320
+325,"Makai Master","Makai Master",True,1350
+326,"Garo","Garo",True,1351
+327,"Makai Monk","Makai Monk",True,1352
+328,"Barago","Barago",True,1353
+329,"Dan","Dan",True,1354
+330,"Makai Bard","Makai Bard",True,1355
+331,"Makai Black Mage","Makai Black Mage",True,1356
+332,"Makai White Mage","Makai White Mage",True,1357
+333,"Zero","Zero",True,1358
+334,"Makai Summoner","Makai Summoner",True,1359
+335,"Makai Scholar","Makai Scholar",True,1360
+336,"Kiba","Kiba",True,1361
+337,"Makai Machinist","Makai Machinist",True,1362
+338,"Makai Astrologian","Makai Astrologian",True,1363
+339,"Moonlifter","Moonlifter",True,1400
+340,"The Finest Pupil's Ally","The Finest Pupil's Ally",False,1401
+341,"Fatewalker","Fatewalker",True,1402
+342,"Of the Holy Body","Of the Holy Body",False,1403
+343,"Gigi's Best Friend","Gigi's Best Friend",True,1404
+344,"Tamer of the Undying Flame","Tamer of the Undying Flame",False,1405
+345,"Mortal Fist","Mortal Fist",True,1406
+346,"Rhalgr's Right Fist","Rhalgr's Right Fist",False,1407
+347,"Tablesetter","Tablesetter",True,1408
+348,"Halone's Cup Bearer","Halone's Cup Bearer",False,1409
+349,"Zhloe's Friend","Zhloe's Friend",True,1410
+350,"Zhloe's Best Friend","Zhloe's Best Friend",True,1411
+351,"Survivor of the Song","Survivor of the Song",False,1412
+352,"Ijin Traveler","Ijin Traveler",True,1413
+353,"Confederate","Confederate",True,1414
+354,"Adversary","Adversary",True,1415
+355,"Steppe Warrior","Steppe Warrior",True,1416
+356,"The Returned","The Returned",False,1417
+357,"Lyse's Right Fist","Lyse's Right Fist",True,1418
+358,"The Liberator","The Liberator",False,1419
+359,"Deltascape Deleter","Deltascape Deleter",True,1420
+360,"Ul Cup Champion","Ul Cup Champion",True,1421
+361,"The Fistful","The Fistful",False,1422
+362,"Loved by the Axe","Loved by the Axe",False,1423
+363,"The Blood Dragoon","The Blood Dragoon",False,1424
+364,"Of the True Autumn","Of the True Autumn",False,1425
+365,"Padjal Protector","Padjal Protector",True,1426
+366,"Gembreaker","Gembreaker",True,1427
+367,"The First Caller","The First Caller",False,1428
+368,"Keeper of the Lilacs","Keeper of the Lilacs",True,1429
+369,"Eorzean Ninja","Eorzean Ninja",True,1430
+370,"Of the Swirling Abyss","Of the Swirling Abyss",False,1431
+371,"The Howler","The Howler",False,1432
+372,"Of the Eastern Skies","Of the Eastern Skies",False,1433
+373,"The Red","The Red",False,1434
+374,"Muso","Muso",False,1435
+375,"God of War","Goddess of War",True,1436
+376,"God of Magic","Goddess of Magic",True,1437
+377,"God of the Hand","Goddess of the Hand",True,1438
+378,"God of the Land","Goddess of the Land",True,1439
+379,"Of the Longest Hunt","Of the Longest Hunt",False,1440
+380,"Of the Endless Hunt","Of the Endless Hunt",False,1441
+381,"Thrillseeker","Thrillseeker",True,1442
+382,"Ultimate Thrillseeker","Ultimate Thrillseeker",True,1443
+383,"Canal Raider","Canal Raider",True,1444
+384,"Hiruko Hunter","Hiruko Hunter",True,1472
+385,"Heavenly Gate Crasher","Heavenly Gate Crasher",True,1473
+386,"True Hero","True Hero",True,1474
+387,"Lone Hero","Lone Hero",True,1475
+388,"Hoarder","Hoarder",True,1476
+389,"Vanguard","Vanguard",True,1466
+390,"Kurenai's Best Friend","Kurenai's Best Friend",True,1467
+391,"Kurenai's Partner","Kurenai's Partner",True,1468
+392,"Under the Moonlight","Under the Moonlight",False,1469
+393,"Siltwater Socialite","Siltwater Socialite",True,1463
+394,"Matchmaker","Matchmaker",True,1464
+395,"Eorzean Ninja Warrior","Eorzean Ninja Warrior",True,1465
+396,"Calamatologist","Calamatologist",True,1471
+397,"The Ultimate Legend","The Ultimate Legend",False,1470
+398,"Monster Hunter","Monster Hunter",True,1477
+399,"FRC 2018 Champion","FRC 2018 Champion",True,0
+400,"FRC 2018 Finalist","FRC 2018 Finalist",True,0
+401,"FRC 2018 Ranker","FRC 2018 Ranker",True,0
+402,"Prelude in Violet","Prelude in Violet",True,1478
+403,"Philanthropist","Philanthropist",False,1479
+404,"Altar Boy","Altar Girl",True,1480
+405,"The Devout","The Devout",False,1481
+406,"Invoker of Gods","Invoker of Gods",True,1482
+407,"Grandmaster Caster","Grandmaster Caster",True,1497
+408,"Kyubi Tamer","Kyubi Tamer",False,1483
+409,"Mahjong Enthusiast","Mahjong Enthusiast",True,1484
+410,"Mahjong Master","Mahjong Master",True,1485
+411,"Little Piggy","Little Piggy",True,1486
+412,"Tough Customer","Tough Customer",True,1487
+413,"Blue Blood","Blue Blood",True,1488
+414,"Mask of the Blue","Mask of the Blue",False,1489
+415,"Perfect Blue","Perfect Blue",True,1490
+416,"Eurekan Explorer","Eurekan Explorer",True,1491
+417,"A Requiem For Heroes","A Requiem For Heroes",False,1492
+418,"The Soboro","The Soboro",False,1493
+419,"Kageyama Killer","Kageyama Killer",False,1494
+420,"Kingsglaive","Kingsglaive",True,1495
+421,"Lord of the Fetch","Lady of the Fetch",False,1496
+422,"Soul of War","Soul of War",True,1498
+423,"Soul of Magic","Soul of Magic",True,1499
+424,"Soul of the Craft","Soul of the Craft",True,1500
+425,"Soul of the Harvest","Soul of the Harvest",True,1501
+426,"Outlander","Outlander",True,1502
+427,"The Fae-touched","The Fae-touched",False,1503
+428,"Seeker of Hidden Truths","Seeker of Hidden Truths",True,1504
+429,"Of the Sunless Sea","Of the Sunless Sea",False,1505
+430,"Enemy of Innocence","Enemy of Innocence",True,1506
+431,"Shadowbringer","Shadowbringer",True,1507
+432,"Sworn Protector","Sworn Protector",True,1508
+433,"The Heart's Beat","The Heart's Beat",False,1509
+434,"Living Memory","Living Memory",True,1510
+435,"Bulwark between Worlds","Bulwark between Worlds",True,1511
+436,"The Transcendent","The Transcendent",False,1512
+437,"Worldcleaver","Worldcleaver",True,1513
+438,"Bolt from the Black","Bolt from the Black",True,1514
+439,"The Song upon the Wind","The Song upon the Wind",False,1515
+440,"Firstblessed","Firstblessed",True,1516
+441,"Of Stranger Shadow","Of Stranger Shadow",False,1517
+442,"Farcaller","Farcaller",True,1518
+443,"Knower of Twin Worlds","Knower of Twin Worlds",True,1519
+444,"Shadow of the Other","Shadow of the Other",True,1520
+445,"The Boundless Dark","The Boundless Dark",False,1521
+446,"The Shot Heard Across Worlds","The Shot Heard Across Worlds",False,1522
+447,"Distant Stargazer","Distant Stargazer",True,1523
+448,"Dualistic Duelist","Dualistic Duelist",True,1524
+449,"Samurai in a Strange Land","Samurai in a Strange Land",True,1525
+450,"Wandering Vanguard","Wandering Vanguard",True,1526
+451,"Riftdancer","Riftdancer",True,1527
+452,"Otherworld Smith","Otherworld Smith",True,1528
+453,"Otherworld Artisan","Otherworld Artisan",True,1529
+454,"Otherworld Apothecary","Otherworld Apothecary",True,1530
+455,"Otherworld Seeker","Otherworld Seeker",True,1531
+456,"Otherworld Angler","Otherworld Angler",True,1532
+457,"The Multifaceted","The Multifaceted",False,1533
+458,"Trusted Friend","Trusted Friend",True,1534
+459,"The Invisible Hand","The Invisible Hand",False,1535
+460,"Charming Brute","Charming Brute",True,1536
+461,"The Fabulously Feral","The Fabulously Feral",False,1537
+462,"Of Unyielding Oath","Of Unyielding Oath",False,1538
+463,"Of Unyielding Steel","Of Unyielding Steel",False,1539
+464,"Of Unyielding Principle","Of Unyielding Principle",False,1540
+465,"Of Unyielding Lealty","Of Unyielding Lealty",False,1541
+466,"Dungeon Raider","Dungeon Raider",True,1542
+467,"Dungeon Dweller","Dungeon Dweller",True,1543
+468,"Dungeon Lord","Dungeon Lady",True,1544
+469,"Kindred Sword","Kindred Sword",True,1545
+470,"","",False,0
+471,"","",False,0
+472,"","",False,0
+473,"","",False,0
+474,"","",False,0
+475,"","",False,0
+476,"Of Virtuous Deeds","Of Virtuous Deeds",False,1546
+477,"Kai-Shirr's Best Mate","Kai-Shirr's Best Mate",True,1547
+478,"Honeybee","Honeybee",True,1548
+479,"Sweet Dreamer","Sweet Dreamer",True,1549
+480,"The Perfect Legend","The Perfect Legend",False,1550
+481,"Blue to the Bone","Blue to the Bone",True,1551
+482,"Blue Luminary","Blue Luminary",True,1552
+483,"Masked of the Round","Masked of the Round",True,1553
+484,"Unbound Blue","Unbound Blue",True,1554
+485,"Blue Justice","Blue Justice",True,1555
+486,"The Battleforged","The Battleforged",False,1556
+487,"Champion of the Blue","Champion of the Blue",True,1557
+488,"Saint of the Firmament","Saint of the Firmament",True,10000
+489,"Beatus of the Firmament","Beata of the Firmament",True,10010
+490,"Frame of the Firmament","Frame of the Firmament",True,1560
+491,"Forge of the Firmament","Forge of the Firmament",True,1561
+492,"Hammer of the Firmament","Hammer of the Firmament",True,1562
+493,"Jewel of the Firmament","Jewel of the Firmament",True,1563
+494,"Knife of the Firmament","Knife of the Firmament",True,1564
+495,"Weave of the Firmament","Weave of the Firmament",True,1565
+496,"Panacea of the Firmament","Panacea of the Firmament",True,1566
+497,"Pan of the Firmament","Pan of the Firmament",True,1567
+498,"Pick of the Firmament","Pick of the Firmament",True,1568
+499,"Hatchet of the Firmament","Hatchet of the Firmament",True,1569
+500,"Rod of the Firmament","Rod of the Firmament",True,1570
+501,"The Hand of Creation","The Hand of Creation",False,1571
+502,"Divine Provider","Divine Provider",True,1572
+503,"The Nest's Own Carpenter","The Nest's Own Carpenter",False,1573
+504,"The Nest's Own Blacksmith","The Nest's Own Blacksmith",False,1574
+505,"The Nest's Own Armorer","The Nest's Own Armorer",False,1575
+506,"The Nest's Own Goldsmith","The Nest's Own Goldsmith",False,1576
+507,"The Nest's Own Leatherworker","The Nest's Own Leatherworker",False,1577
+508,"The Nest's Own Weaver","The Nest's Own Weaver",False,1578
+509,"The Nest's Own Alchemist","The Nest's Own Alchemist",False,1579
+510,"The Nest's Own Culinarian","The Nest's Own Culinarian",False,1580
+511,"The Nest's Own Miner","The Nest's Own Miner",False,1581
+512,"The Nest's Own Botanist","The Nest's Own Botanist",False,1582
+513,"The Nest's Own Fisher","The Nest's Own Fisher",False,1583
+514,"Fortune's Favored Kupo","Fortune's Favored Kupo",True,1584
+515,"Ocean Fisher","Ocean Fisher",True,1585
+516,"Octopus Traveler","Octopus Traveler",True,1586
+517,"Shark Hunter","Shark Hunter",True,1587
+518,"Jellyfish Fanatic","Jellyfish Fanatic",True,1588
+519,"Sea Dragoon","Sea Dragoon",True,1589
+520,"Echo of a Fallen Star","Echo of a Fallen Star",True,1590
+521,"Ronkan Historian","Ronkan Historian",True,1591
+522,"A Dragon's Best Friend","A Dragon's Best Friend",True,1592
+523,"Tinker Tutor","Tinker Tutor",True,1593
+524,"Partner in Teatime","Partner in Teatime",True,1594
+525,"Vrai Ami","Vraie Amie",True,1595
+526,"Tank Technician","Tank Technician",True,1596
+527,"Shepherd to the Stars","Shepherd to the Stars",True,1597
+528,"Featherfall's Finest Carpenter","Featherfall's Finest Carpenter",True,1598
+529,"Featherfall's Finest Blacksmith","Featherfall's Finest Blacksmith",True,1599
+530,"Featherfall's Finest Armorer","Featherfall's Finest Armorer",True,1600
+531,"Featherfall's Finest Goldsmith","Featherfall's Finest Goldsmith",True,1601
+532,"Featherfall's Finest Leatherworker","Featherfall's Finest Leatherworker",True,1602
+533,"Featherfall's Finest Weaver","Featherfall's Finest Weaver",True,1603
+534,"Featherfall's Finest Alchemist","Featherfall's Finest Alchemist",True,1604
+535,"Featherfall's Finest Culinarian","Featherfall's Finest Culinarian",True,1605
+536,"Featherfall's Finest Miner","Featherfall's Finest Miner",True,1606
+537,"Featherfall's Finest Botanist","Featherfall's Finest Botanist",True,1607
+538,"Featherfall's Finest Fisher","Featherfall's Finest Fisher",True,1608
+539,"The Decisive Blow","The Decisive Blow",False,1609
+540,"Skirmisher","Skirmisher",True,1610
+541,"Siege Liege","Siege Liege",True,1611
+542,"Gabriel's Downfall","Gabriel's Downfall",True,1612
+543,"Queller of Beasts","Queller of Beasts",True,1613
+544,"The Death of Flame","The Death of Flame",False,1614
+545,"Sword of the South","Sword of the South",True,1615
+546,"Guardian Angel","Guardian Angel",True,1616
+547,"Saint of the Firmament","Saint of the Firmament",True,10001
+548,"Beatus of the Firmament","Beata of the Firmament",True,10011
+549,"Writer of Histories","Writer of Histories",True,1617
+550,"Of the Truest Blue","Of the Truest Blue",False,1618
+551,"Blue Ranger","Blue Ranger",True,1619
+552,"The Azure and Omega","The Azure and Omega",False,1620
+553,"Balloon Catcher","Balloon Catcher",True,1621
+554,"Deadliest Catcher","Deadliest Catcher",True,1622
+555,"Manta Maniac","Manta Maniac",True,1623
+556,"World-class Troller","World-class Troller",True,1624
+557,"Saint of the Firmament","Saint of the Firmament",True,10002
+558,"Beatus of the Firmament","Beata of the Firmament",True,10012
+559,"Tournament Leader","Tournament Leader",True,1625
+560,"Secret Finder","Secret Finder",True,1626
+561,"Secret Keeper","Secret Keeper",True,1627
+562,"Gaolbreaker","Gaolbreaker",True,1628
+563,"Master of the Sea","Master of the Sea",True,1629
+564,"Delubrum Delver","Delubrum Delver",True,1630
+565,"The Risensung Carpenter","The Risensung Carpenter",False,1631
+566,"The Risensung Blacksmith","The Risensung Blacksmith",False,1632
+567,"The Risensung Armorer","The Risensung Armorer",False,1633
+568,"The Risensung Goldsmith","The Risensung Goldsmith",False,1634
+569,"The Risensung Leatherworker","The Risensung Leatherworker",False,1635
+570,"The Risensung Weaver","The Risensung Weaver",False,1636
+571,"The Risensung Alchemist","The Risensung Alchemist",False,1637
+572,"The Risensung Culinarian","The Risensung Culinarian",False,1638
+573,"The Risensung Miner","The Risensung Miner",False,1639
+574,"The Risensung Botanist","The Risensung Botanist",False,1640
+575,"The Risensung Fisher","The Risensung Fisher",False,1641
+576,"Jack of All Cards","Jack of All Cards",True,1642
+577,"Speed Demon","Speed Demon",True,1643
+578,"The Indefatigable","The Indefatigable",False,1644
+579,"Lord of Far Waters","Lady of Far Waters",True,1645
+580,"Big Fish","Big Fish",True,1646
+581,"Charlemend's Angel","Charlemend's Angel",True,1647
+582,"Lifesaver","Lifesaver",True,1648
+583,"Dawn Treader","Dawn Treader",True,1649
+584,"Witness to the Dark Apocalypse","Witness to the Dark Apocalypse",True,1650
+585,"Dalriada Raider","Dalriada Raider",True,1651
+586,"The Hypertuned","The Hypertuned",False,1652
+587,"Commander Conqueror","Commander Conqueror",True,1653
+588,"Lyon Tamer","Lyon Tamer",True,1654
+589,"Hero of Zadnor","Hero of Zadnor",True,1655
+590,"Gunnhildr's Blade","Gunnhildr's Blade",True,1656
+591,"The Emblazoned","The Emblazoned",False,1657
+592,"Queen's Elect","Queen's Elect",True,1658
+593,"","",False,0
+594,"","",False,0
diff --git a/ffxiv/data/tribes.csv b/ffxiv/data/tribes.csv
new file mode 100644
index 0000000..5a3a88a
--- /dev/null
+++ b/ffxiv/data/tribes.csv
@@ -0,0 +1,20 @@
+key,0,1,2,3,4,5,6,7,8,9
+#,Masculine,Feminine,Hp,Mp,STR,VIT,DEX,INT,MND,PIE
+int32,str,str,sbyte,sbyte,sbyte,sbyte,sbyte,sbyte,sbyte,sbyte
+0,"","",0,0,0,0,0,0,0,0
+1,"Midlander","Midlander",0,0,2,0,-1,3,-1,0
+2,"Highlander","Highlander",0,0,3,2,0,-2,0,0
+3,"Wildwood","Wildwood",0,0,0,-1,3,2,-1,0
+4,"Duskwight","Duskwight",0,0,0,-1,0,3,1,0
+5,"Plainsfolk","Plainsfolk",0,0,-1,-1,3,2,0,0
+6,"Dunesfolk","Dunesfolk",0,0,-1,-2,1,2,3,0
+7,"Seeker of the Sun","Seeker of the Sun",0,0,2,0,3,-1,-1,0
+8,"Keeper of the Moon","Keeper of the Moon",0,0,-1,-2,2,1,3,0
+9,"Sea Wolf","Sea Wolf",0,0,2,3,-1,-2,1,0
+10,"Hellsguard","Hellsguard",0,0,0,3,-2,0,2,0
+11,"Raen","Raen",0,0,-1,-1,2,0,3,0
+12,"Xaela","Xaela",0,0,3,2,0,0,-2,0
+13,"Helions","Helions",0,0,3,3,-3,-3,3,0
+14,"The Lost","The Lost",0,0,3,3,-3,-3,3,0
+15,"Rava","Rava",0,0,0,-2,3,1,1,0
+16,"Veena","Veena",0,0,-1,-1,0,3,2,0
diff --git a/ffxiv/ffxiv_core.py b/ffxiv/ffxiv_core.py
new file mode 100644
index 0000000..92e87e6
--- /dev/null
+++ b/ffxiv/ffxiv_core.py
@@ -0,0 +1,506 @@
+import json
+import os
+import time
+from datetime import datetime, timedelta
+
+import psycopg2
+from PIL import Image, ImageFont, ImageDraw
+from io import BytesIO
+import csv
+import requests
+from pathlib import Path
+
+from psycopg2.extras import RealDictRow
+# from ratelimit import sleep_and_retry, limits
+
+from ffxiv.pystone.definition import Definition
+
+
+class ScrapeLodestone:
+ def __init__(self, character_id):
+ self.character_id = character_id
+
+ @staticmethod
+ def scrape_data(filename, player_id):
+ # argv1 = 'lodestone-css-selectors-0.46.0'
+ argv1 = 'lodestone-css-selectors-0.52.0'
+ region = 'eu'
+
+ definition_file = f'profile/{filename}.json'
+ base = Path(argv1)
+ path = base / definition_file
+
+ with open(os.path.dirname(__file__) / base / 'meta.json') as f:
+ meta = json.loads(f.read())
+
+ definition = Definition(
+ os.path.dirname(__file__) / path,
+ meta['applicableUris'][definition_file]
+ )
+
+ definition.process((region, player_id))
+ # character_definition.process({'region': region, 'id': player_id})
+ return definition.to_json()
+
+ def character(self):
+ char = self.scrape_data('character', self.character_id)
+ char['character']['classjobs'] = self.scrape_data('classjob', self.character_id)
+ char['character']['gender'] = 'm' if char['character']['gender'] == '♂' else 'f'
+ return char
+
+
+class FFXIVCharacter:
+ def __init__(self, character_id):
+ self.character_id = character_id
+ self.name = None
+ self.gender = None
+ self.title = None
+ self.race = None
+ self.free_company = None
+ self.clan = None
+ self.race_clan_gender = None
+ self.portrait = None
+ self.server = None
+ self.image = None
+ self.grand_company = None
+ self.title_is_prefix = None
+ self.get_grand_company()
+
+ self.combat_levels_earned = 0
+ self.combat_levels_max = 0
+ self.crafter_levels_earned = 0
+ self.crafter_levels_max = 0
+
+ self.db_con = psycopg2.connect(database=os.environ.get('db_name'),
+ user=os.environ.get('db_user'),
+ password=os.environ.get('db_pass'),
+ host=os.environ.get('db_host'),
+ port=os.environ.get('db_port'))
+ self.db_cur = self.db_con.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor)
+
+ self.paladin = None
+ self.warrior = None
+ self.darkknight = None
+ self.gunbreaker = None
+ self.whitemage = None
+ self.scholar = None
+ self.astrologian = None
+ self.sage = None
+ self.monk = None
+ self.dragoon = None
+ self.ninja = None
+ self.samurai = None
+ self.reaper = None
+ self.bard = None
+ self.machinist = None
+ self.dancer = None
+ self.blackmage = None
+ self.summoner = None
+ self.redmage = None
+ self.bluemage = None
+ self.carpenter = None
+ self.blacksmith = None
+ self.armorer = None
+ self.goldsmith = None
+ self.leatherworker = None
+ self.weaver = None
+ self.alchemist = None
+ self.culinarian = None
+ self.miner = None
+ self.botanist = None
+ self.fisher = None
+ self.achievements = None
+ self.mounts_max = 219
+ self.mounts_owned = None
+ self.minion_max = 442
+ self.minion_owned = None
+
+ self.font_job_level = ImageFont.truetype("./fonts/steelfish/steelfish bd.ttf", 33)
+ self.font_job_name = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 16)
+ self.font_job_experience = ImageFont.truetype("./fonts/calibri/calibri.ttf", 35)
+
+ self.font_character_name = ImageFont.truetype("./fonts/calibri/calibri.ttf", 35)
+ self.font_character_title_name = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 22)
+
+ self.font_character_label = ImageFont.truetype("./fonts/calibri/calibrib.ttf", 15)
+ self.font_character_value = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 16)
+
+ self.font_footer_label = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 13)
+ self.font_footer_value = ImageFont.truetype("./fonts/roboto/Roboto-Regular.ttf", 12)
+
+ self.font_colour_maxed = (240, 142, 55, 255)
+ self.font_colour_job_specialist = (170, 128, 255, 255)
+ self.font_colour_standard = (204, 204, 204, 255)
+ self.font_colour_darkgrey = (90, 90, 90, 255)
+ self.font_colour_lightblue = (170, 253, 255, 255)
+ self.font_colour_text_title = (202, 175, 117, 255)
+ self.font_colour_text_label = (160, 160, 160, 255)
+ self.font_colour_text_value = (238, 225, 197, 255)
+
+ async def build_character_view(self):
+ # response_image = requests.get(self.portrait)
+ self.base_image()
+ self.image_header()
+ self.image_information()
+ self.image_classjobs()
+ self.image_footer()
+
+ self.image.save('character.png')
+
+ def base_image(self):
+ """Generates the base image, with character portait."""
+ self.image = Image.new('RGBA', (1050, 873), color='#000000')
+ img_tile = Image.open("./ffxiv/bg-tile.png")
+ img_tile_x, img_tile_y = img_tile.size
+
+ cur_x, cur_y = 0, 0
+ img_x, img_y = self.image.size
+ while cur_x < img_x and cur_y < img_y:
+ self.image.paste(img_tile, (cur_x, cur_y))
+
+ cur_x += img_tile_x
+ if cur_x > img_x and cur_y > img_y:
+ break
+
+ elif cur_x > img_x:
+ cur_x = 0
+ cur_y += img_tile_y
+
+ # Place portrait onto character view
+ response_image = requests.get(self.portrait)
+ img_portait = Image.open(BytesIO(response_image.content))
+ self.image.paste(img_portait)
+
+ # Place frame over image
+ img_frame = Image.open(f'./ffxiv/character-frame.png')
+ self.image.paste(img_frame, mask=img_frame)
+
+ self.add_corners(self.image, 24)
+
+ @staticmethod
+ def add_corners(im, rad):
+ circle = Image.new('L', (rad * 2, rad * 2), 0)
+ draw = ImageDraw.Draw(circle)
+ draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
+ alpha = Image.new('L', im.size, 255)
+ w, h = im.size
+ alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
+ alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
+ alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
+ alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
+ im.putalpha(alpha)
+ return im
+
+ def image_header(self):
+ """Add character name, title and server"""
+ d = ImageDraw.Draw(self.image)
+
+ name_w, name_h = d.textsize(self.name, font=self.font_character_name)
+ title_w, title_h = d.textsize(self.title, font=self.font_character_title_name)
+ realm_w, realm_h = d.textsize(self.server, font=self.font_character_value)
+
+ # Determine title/name heights
+ if self.title_is_prefix:
+ char_name_offset = 23
+ title_name_offset = 0
+ else:
+ char_name_offset = 0
+ title_name_offset = 29
+
+ x_offset = 0
+ # Add text
+ d.text((645 + x_offset + (376-name_w)/2, 10 + char_name_offset), self.name, font=self.font_character_name, fill=self.font_colour_text_value)
+ d.text((645 + x_offset + (376-title_w)/2, 10 + title_name_offset), self.title, font=self.font_character_title_name, fill=self.font_colour_text_title)
+ d.text((645 + x_offset + (376-realm_w)/2, 65), self.server, font=self.font_character_value, fill=self.font_colour_text_label)
+
+ def image_information(self):
+ """Adds characters information to image"""
+ x_offset = 19
+ label_offset_y = 95
+
+ # grand_company_rank = ""
+
+ ffxiv_races = ["Hyur", "Elezen", "Lalafell", "Miqo'te", "Roegadyn", "Au Ra", "Viera", "Hrothgar"]
+ for ffxiv_race in ffxiv_races:
+ if ffxiv_race in self.race_clan_gender:
+ self.race = ffxiv_race
+ self.clan = self.race_clan_gender.split(ffxiv_race)[1]
+
+ d = ImageDraw.Draw(self.image)
+
+ d.text((650 + x_offset, 0 + label_offset_y), "Race", font=self.font_character_label, fill=self.font_colour_text_label)
+ d.text((660 + x_offset, 15 + label_offset_y), f"{self.race}, {self.clan}", font=self.font_character_value, fill=self.font_colour_text_value)
+
+ d.text((650 + x_offset, 50 + label_offset_y), "Free Company", font=self.font_character_label, fill=self.font_colour_text_label)
+ d.text((660 + x_offset, 65 + label_offset_y), self.free_company, font=self.font_character_value, fill=self.font_colour_text_value)
+
+ d.text((650 + x_offset, 100 + label_offset_y), "Grand Company", font=self.font_character_label, fill=self.font_colour_text_label)
+ d.text((660 + x_offset, 115 + label_offset_y), self.grand_company, font=self.font_character_value, fill=self.font_colour_text_value)
+ # d.text((660 + x_offset, 135 + label_offset_y), self.grand_company, font=font_character_value, fill=font_colour_text_value)+
+
+ label_offset_x_col_r = -20
+ d.text((890 + x_offset + label_offset_x_col_r, 0 + label_offset_y), "Mounts", font=self.font_character_label, fill=self.font_colour_text_label)
+ d.text((900 + x_offset + label_offset_x_col_r, 15 + label_offset_y), f"{self.mounts_owned} / {self.mounts_max}", font=self.font_character_value, fill=self.font_colour_text_value)
+
+ d.text((890 + x_offset + label_offset_x_col_r, 50 + label_offset_y), "Minions", font=self.font_character_label, fill=self.font_colour_text_label)
+ d.text((900 + x_offset + label_offset_x_col_r, 65 + label_offset_y), f"{self.minion_owned} / {self.minion_max}", font=self.font_character_value, fill=self.font_colour_text_value)
+
+ d.text((890 + x_offset + label_offset_x_col_r, 100 + label_offset_y), "Achievement Points", font=self.font_character_label, fill=self.font_colour_text_label)
+ d.text((900 + x_offset + label_offset_x_col_r, 115 + label_offset_y), self.achievements, font=self.font_character_value, fill=self.font_colour_text_value)
+
+ def image_classjobs(self):
+ """Adds character class/jobs to image"""
+ # Buddy up the jobs into groups for image modularity
+ tank_jobs = [self.paladin, self.warrior, self.darkknight, self.gunbreaker]
+ healer_jobs = [self.whitemage, self.scholar, self.astrologian, self.sage]
+ dps_jobs = [self.monk, self.dragoon, self.ninja, self.samurai, self.reaper]
+ rdps_jobs = [self.bard, self.machinist, self.dancer]
+ mdps_jobs = [self.blackmage, self.summoner, self.redmage, self.bluemage]
+ hand_jobs = [self.carpenter, self.blacksmith, self.armorer, self.goldsmith, self.leatherworker, self.weaver, self.alchemist, self.culinarian]
+ land_jobs = [self.miner, self.botanist, self.fisher]
+ # extra_jobs = [self.eureka, self.bozja]
+
+ self.assemble_jobs(tank_jobs, 668, 250, True)
+ self.assemble_jobs(healer_jobs, 668, 400, True)
+
+ self.assemble_jobs(dps_jobs, 860, 250, True)
+ self.assemble_jobs(rdps_jobs, 860, 433, True)
+ self.assemble_jobs(mdps_jobs, 860, 550, True)
+
+ self.assemble_jobs(land_jobs, 860, 715, False)
+ self.assemble_jobs(hand_jobs, 668, 550, False)
+
+ def image_footer(self):
+ """Adds footer level totals to image"""
+ x_offset = 0
+ x_pos = 710
+ ldata = [{"label": "DoW/DoM", "value": f"{self.combat_levels_earned}/{self.combat_levels_max} - {round((self.combat_levels_earned*100)/self.combat_levels_max, 2)}%"},
+ {"label": "DoL/DoH", "value": f"{self.crafter_levels_earned}/{self.crafter_levels_max} - {round((self.crafter_levels_earned*100)/self.crafter_levels_max, 2)}%"},
+ {"label": "Total", "value": f"{self.combat_levels_earned+self.crafter_levels_earned}/{self.combat_levels_max+self.crafter_levels_max} - {round(((self.combat_levels_earned+self.crafter_levels_earned)*100)/(self.combat_levels_max+self.crafter_levels_max), 2)}%"}]
+
+ for l in ldata:
+ label_w, label_h = self.draw.textsize(l['label'], font=self.font_footer_label)
+ value_w, value_h = self.draw.textsize(l['value'], font=self.font_footer_value)
+
+ # if "100.0%" in l['value']:
+ # font_colour = self.font_colour_maxed
+ # else:
+ # font_colour = self.font_colour_standard
+
+ self.draw.text((x_pos + x_offset + (0-label_w)/2, 836), l['label'], font=self.font_footer_label, fill=self.font_colour_text_label)
+ self.draw.text((x_pos + x_offset + (0-value_w)/2, 850), l['value'], font=self.font_footer_value, fill=self.font_colour_standard)
+ x_offset += 130
+
+ def assemble_jobs(self, jobs: list, increment_x=0, increment_y=0, is_combat=True):
+ # total_level_max = 0
+ for job in jobs:
+ # print(f"working on {job}")
+ if job['unlockstate'] in ['bozja', 'eureka']:
+ continue
+
+ # Get job image
+ job_icon = Image.open(f'./ffxiv/jobs/{job["unlockstate"].replace(" ", "").lower()}.png',)
+ job_icon = job_icon.resize((30, 30))
+
+ # Job XP
+ job_xp = 0 if job["exp"] in ['-', '--'] else ((int(job["exp"].replace(",", "")) * 100) / int(job["exp_max"].replace(",", ""))) / 100
+ # job['level'] = "0" if job["level"] == '-' else job['level']
+
+ # Determine levels at max, and acquire total levels data
+ if is_combat:
+ self.combat_levels_max += int(job['max_level'])
+ if job["level"] in ['-', '--']:
+ level_maxed = False
+ elif str(job['level']).isnumeric() and int(job['level']) == job['max_level']:
+ self.combat_levels_earned += int(job['max_level'])
+ level_maxed = True
+ else:
+ self.combat_levels_earned += int(job['level'])
+ level_maxed = False
+
+ elif not is_combat:
+ self.crafter_levels_max += int(job['max_level'])
+ if job["level"] in ['-', '--']:
+ level_maxed = False
+ elif int(job['level']) == job['max_level']:
+ self.crafter_levels_earned += int(job['max_level'])
+ level_maxed = True
+ else:
+ self.crafter_levels_earned += int(job['level'])
+ level_maxed = False
+
+ if 'specialist' in job and job['specialist']:
+ job_colour = self.font_colour_job_specialist
+ else:
+ job_colour = self.font_colour_standard
+
+ self.draw = ImageDraw.Draw(self.image)
+
+ job_level_w, job_level_h = self.draw.textsize(job["level"], font=self.font_job_level)
+
+ # Job Icon
+ self.image.paste(job_icon, (increment_x, increment_y), mask=job_icon)
+ # Job Level
+ self.draw.text((increment_x + 42 - (job_level_w/2), increment_y - 7), job["level"], font=self.font_job_level, fill=self.font_colour_maxed if level_maxed else self.font_colour_standard)
+ # Job Name
+ self.draw.text((increment_x + 55, increment_y - 1), job['unlockstate'], font=self.font_job_name, fill=job_colour)
+ # Job XP Meter
+ self.draw_progress_bar(self.draw, increment_x + 53, increment_y + 20, w=110, h=5, progress=job_xp)
+ increment_y += 33
+
+ def draw_progress_bar(self, draw, x, y, w: int, h: int, progress):
+ # draw background bar and progress bar
+ draw.rectangle((x+(h/2), y, x+w+(h/2), y+h), fill=self.font_colour_darkgrey)
+ if progress > 0:
+ w *= progress
+ draw.rectangle((x+(h/2), y, x+w+(h/2), y+h), fill=self.font_colour_standard)
+ return draw
+
+ def get_title(self):
+ with open("./ffxiv/data/titles.csv", "r") as file:
+ data = csv.reader(file, delimiter=',', quotechar='"')
+ for title in data:
+ if title[1] == self.title:
+ self.title_is_prefix = True if title[3] == "True" else False
+ if self.gender == 'm':
+ self.title = title[1]
+
+ elif self.gender == 'f':
+ self.title = title[2]
+ return
+ return
+
+ def get_grand_company(self):
+ with open("./ffxiv/data/grandcompanies.csv", "r") as file:
+ data = csv.reader(file, delimiter=',', quotechar='"')
+ for row in data:
+ if self.grand_company in ['Maelstrom', 'Adder', 'Flames'] and self.grand_company in row[1]:
+ self.grand_company = row[1]
+ return
+
+ async def obtain_character_data(self):
+ cur = self.db_con.cursor(cursor_factory=psycopg2.extras.NamedTupleCursor)
+ cur.execute('SELECT * FROM database1.synthy.ffxiv WHERE id = %s', (self.character_id,))
+ character = cur.fetchone()
+
+ if character.character_data is None or (character.character_epoch is not None and (int(time.time()) - character.character_epoch) > timedelta(hours=2).seconds):
+ await self.update_character_data()
+ if character.classjob_data is None or (character.classjob_epoch is not None and (int(time.time()) - character.classjob_epoch) > timedelta(hours=2).seconds):
+ await self.update_classjob_data()
+ if character.minion_data is None or (character.minion_epoch is not None and (int(time.time()) - character.minion_epoch) > timedelta(hours=23).seconds):
+ await self.update_minion_data()
+ if character.mount_data is None or (character.mount_epoch is not None and (int(time.time()) - character.mount_epoch) > timedelta(hours=23).seconds):
+ await self.update_mount_data()
+ if character.achievement_data is None or (character.achievement_epoch is not None and (int(time.time()) - character.achievement_epoch) > timedelta(hours=23).seconds):
+ await self.update_achievement_data()
+
+ await self.read_character_data()
+ await self.read_classjob_data()
+ await self.read_minion_data()
+ await self.read_mount_data()
+ await self.read_achievement_data()
+
+ async def update_character_data(self):
+ data_scraped = ScrapeLodestone.scrape_data('character', self.character_id)
+ self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET character_data = %s, character_epoch = %s WHERE id = %s', (json.dumps(data_scraped['character']), int(time.time()), self.character_id,))
+ self.db_con.commit()
+
+ async def update_classjob_data(self):
+ data_scraped = ScrapeLodestone.scrape_data('classjob', self.character_id)
+ self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET classjob_data = %s, classjob_epoch = %s WHERE id = %s', (json.dumps(data_scraped), int(time.time()), self.character_id,))
+ self.db_con.commit()
+
+ async def update_minion_data(self):
+ data_scraped = ScrapeLodestone.scrape_data('minion', self.character_id)
+ self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET minion_data = %s, minion_epoch = %s WHERE id = %s', (json.dumps(data_scraped['minion']), int(time.time()), self.character_id,))
+ self.db_con.commit()
+
+ async def update_mount_data(self):
+ try:
+ data_scraped = ScrapeLodestone.scrape_data('mount', self.character_id)
+ data = json.dumps(data_scraped['mount'])
+ except:
+ data = json.dumps({"total": "Not Unlocked"})
+ self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET mount_data = %s, mount_epoch = %s WHERE id = %s', (data, int(time.time()), self.character_id,))
+ self.db_con.commit()
+
+ async def update_achievement_data(self):
+ try:
+ data_scraped = ScrapeLodestone.scrape_data('achievements', self.character_id)
+ data = json.dumps(data_scraped['achievements'])
+ except:
+ data = json.dumps({"total_achievements": "Private", "achievement_points": "Private"})
+ self.db_cur.execute('UPDATE "database1".synthy.ffxiv SET achievement_data = %s, achievement_epoch = %s WHERE id = %s', (data, int(time.time()), self.character_id,))
+ self.db_con.commit()
+
+ async def update_data_titles(self):
+ d = requests.get('https://raw.githubusercontent.com/xivapi/ffxiv-datamining/master/csv/Title.csv')
+ d = d.content.decode()
+ with open("./ffxiv/data/titles.csv", "w") as file:
+ file.write(d)
+
+ async def read_character_data(self):
+ self.db_cur.execute('SELECT character_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,))
+ data = json.loads(self.db_cur.fetchone()[0])
+ self.name = data['name']
+ self.gender = 'm' if data['gender'] == '♂' else 'f'
+ self.title = data['title']
+ self.free_company = "N/A" if data['free_company']['free_company']['name'] == '' else data['free_company']['free_company']['name']
+ self.race_clan_gender = data['race_clan_gender']
+ self.server = data['server']
+ self.grand_company = data['grand_company']
+ self.portrait = data['portrait']
+
+ self.get_title()
+ self.get_grand_company()
+
+ async def read_classjob_data(self):
+ self.db_cur.execute('SELECT classjob_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,))
+ data = json.loads(self.db_cur.fetchone()[0])
+
+ self.paladin = {**data['classjob']['paladin']['paladin'], **{'max_level': 90}}
+ self.warrior = {**data['classjob']['warrior']['warrior'], **{'max_level': 90}}
+ self.darkknight = {**data['classjob']['darkknight']['darkknight'], **{'max_level': 90}}
+ self.gunbreaker = {**data['classjob']['gunbreaker']['gunbreaker'], **{'max_level': 90}}
+ self.whitemage = {**data['classjob']['whitemage']['whitemage'], **{'max_level': 90}}
+ self.scholar = {**data['classjob']['scholar']['scholar'], **{'max_level': 90}}
+ self.astrologian = {**data['classjob']['astrologian']['astrologian'], **{'max_level': 90}}
+ self.sage = {**data['classjob']['sage']['sage'], **{'max_level': 90}}
+ self.monk = {**data['classjob']['monk']['monk'], **{'max_level': 90}}
+ self.dragoon = {**data['classjob']['dragoon']['dragoon'], **{'max_level': 90}}
+ self.ninja = {**data['classjob']['ninja']['ninja'], **{'max_level': 90}}
+ self.samurai = {**data['classjob']['samurai']['samurai'], **{'max_level': 90}}
+ self.reaper = {**data['classjob']['reaper']['reaper'], **{'max_level': 90}}
+ self.bard = {**data['classjob']['bard']['bard'], **{'max_level': 90}}
+ self.machinist = {**data['classjob']['machinist']['machinist'], **{'max_level': 90}}
+ self.dancer = {**data['classjob']['dancer']['dancer'], **{'max_level': 90}}
+ self.blackmage = {**data['classjob']['blackmage']['blackmage'], **{'max_level': 90}}
+ self.summoner = {**data['classjob']['summoner']['summoner'], **{'max_level': 90}}
+ self.redmage = {**data['classjob']['redmage']['redmage'], **{'max_level': 90}}
+ self.bluemage = {**data['classjob']['bluemage']['bluemage'], **{'max_level': 70}}
+ self.carpenter = {**data['classjob']['carpenter']['carpenter'], **{'max_level': 90}}
+ self.blacksmith = {**data['classjob']['blacksmith']['blacksmith'], **{'max_level': 90}}
+ self.armorer = {**data['classjob']['armorer']['armorer'], **{'max_level': 90}}
+ self.goldsmith = {**data['classjob']['goldsmith']['goldsmith'], **{'max_level': 90}}
+ self.leatherworker = {**data['classjob']['leatherworker']['leatherworker'], **{'max_level': 90}}
+ self.weaver = {**data['classjob']['weaver']['weaver'], **{'max_level': 90}}
+ self.alchemist = {**data['classjob']['alchemist']['alchemist'], **{'max_level': 90}}
+ self.culinarian = {**data['classjob']['culinarian']['culinarian'], **{'max_level': 90}}
+ self.miner = {**data['classjob']['miner']['miner'], **{'max_level': 90}}
+ self.botanist = {**data['classjob']['botanist']['botanist'], **{'max_level': 90}}
+ self.fisher = {**data['classjob']['fisher']['fisher'], **{'max_level': 90}}
+
+ async def read_minion_data(self):
+ self.db_cur.execute('SELECT minion_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,))
+ data = json.loads(self.db_cur.fetchone()[0])
+ self.minion_owned = data['total']
+
+ async def read_mount_data(self):
+ self.db_cur.execute('SELECT mount_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,))
+ data = json.loads(self.db_cur.fetchone()[0])
+ self.mounts_owned = data['total']
+
+ async def read_achievement_data(self):
+ self.db_cur.execute('SELECT achievement_data from "database1".synthy.ffxiv WHERE id = %s', (self.character_id,))
+ data = json.loads(self.db_cur.fetchone()[0])
+ self.achievements = data['achievement_points']
diff --git a/ffxiv/grandcompany/immortal_flames/1.png b/ffxiv/grandcompany/immortal_flames/1.png
new file mode 100644
index 0000000..63edb16
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/1.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/10.png b/ffxiv/grandcompany/immortal_flames/10.png
new file mode 100644
index 0000000..cf85208
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/10.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/11.png b/ffxiv/grandcompany/immortal_flames/11.png
new file mode 100644
index 0000000..48998ec
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/11.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/12.png b/ffxiv/grandcompany/immortal_flames/12.png
new file mode 100644
index 0000000..1b4a9d1
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/12.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/13.png b/ffxiv/grandcompany/immortal_flames/13.png
new file mode 100644
index 0000000..d54407e
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/13.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/14.png b/ffxiv/grandcompany/immortal_flames/14.png
new file mode 100644
index 0000000..291c6ee
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/14.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/15.png b/ffxiv/grandcompany/immortal_flames/15.png
new file mode 100644
index 0000000..73937cb
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/15.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/16.png b/ffxiv/grandcompany/immortal_flames/16.png
new file mode 100644
index 0000000..ed1c076
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/16.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/17.png b/ffxiv/grandcompany/immortal_flames/17.png
new file mode 100644
index 0000000..f8032b8
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/17.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/18.png b/ffxiv/grandcompany/immortal_flames/18.png
new file mode 100644
index 0000000..e65c826
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/18.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/19.png b/ffxiv/grandcompany/immortal_flames/19.png
new file mode 100644
index 0000000..2b4c7b1
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/19.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/2.png b/ffxiv/grandcompany/immortal_flames/2.png
new file mode 100644
index 0000000..1bbd7da
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/2.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/3.png b/ffxiv/grandcompany/immortal_flames/3.png
new file mode 100644
index 0000000..cd765b5
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/3.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/4.png b/ffxiv/grandcompany/immortal_flames/4.png
new file mode 100644
index 0000000..59dc695
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/4.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/5.png b/ffxiv/grandcompany/immortal_flames/5.png
new file mode 100644
index 0000000..5bd9b35
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/5.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/6.png b/ffxiv/grandcompany/immortal_flames/6.png
new file mode 100644
index 0000000..c187830
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/6.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/7.png b/ffxiv/grandcompany/immortal_flames/7.png
new file mode 100644
index 0000000..955b1ee
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/7.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/8.png b/ffxiv/grandcompany/immortal_flames/8.png
new file mode 100644
index 0000000..a8cf5b3
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/8.png
Binary files differ
diff --git a/ffxiv/grandcompany/immortal_flames/9.png b/ffxiv/grandcompany/immortal_flames/9.png
new file mode 100644
index 0000000..82e44ee
--- /dev/null
+++ b/ffxiv/grandcompany/immortal_flames/9.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/1.png b/ffxiv/grandcompany/maelstrom/1.png
new file mode 100644
index 0000000..257ffb3
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/1.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/10.png b/ffxiv/grandcompany/maelstrom/10.png
new file mode 100644
index 0000000..14ceb82
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/10.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/11.png b/ffxiv/grandcompany/maelstrom/11.png
new file mode 100644
index 0000000..604ad4f
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/11.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/12.png b/ffxiv/grandcompany/maelstrom/12.png
new file mode 100644
index 0000000..33c6db7
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/12.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/13.png b/ffxiv/grandcompany/maelstrom/13.png
new file mode 100644
index 0000000..068fbf0
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/13.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/14.png b/ffxiv/grandcompany/maelstrom/14.png
new file mode 100644
index 0000000..92d0f00
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/14.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/15.png b/ffxiv/grandcompany/maelstrom/15.png
new file mode 100644
index 0000000..1d7ab11
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/15.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/16.png b/ffxiv/grandcompany/maelstrom/16.png
new file mode 100644
index 0000000..ab48546
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/16.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/17.png b/ffxiv/grandcompany/maelstrom/17.png
new file mode 100644
index 0000000..d3e758a
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/17.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/18.png b/ffxiv/grandcompany/maelstrom/18.png
new file mode 100644
index 0000000..5ed7fe8
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/18.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/19.png b/ffxiv/grandcompany/maelstrom/19.png
new file mode 100644
index 0000000..c4cadb1
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/19.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/2.png b/ffxiv/grandcompany/maelstrom/2.png
new file mode 100644
index 0000000..a1ab5a4
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/2.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/3.png b/ffxiv/grandcompany/maelstrom/3.png
new file mode 100644
index 0000000..70d810c
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/3.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/4.png b/ffxiv/grandcompany/maelstrom/4.png
new file mode 100644
index 0000000..9c46bb9
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/4.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/5.png b/ffxiv/grandcompany/maelstrom/5.png
new file mode 100644
index 0000000..dcabb02
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/5.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/6.png b/ffxiv/grandcompany/maelstrom/6.png
new file mode 100644
index 0000000..40601cf
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/6.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/7.png b/ffxiv/grandcompany/maelstrom/7.png
new file mode 100644
index 0000000..7d9042a
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/7.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/8.png b/ffxiv/grandcompany/maelstrom/8.png
new file mode 100644
index 0000000..227c16f
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/8.png
Binary files differ
diff --git a/ffxiv/grandcompany/maelstrom/9.png b/ffxiv/grandcompany/maelstrom/9.png
new file mode 100644
index 0000000..9e235e0
--- /dev/null
+++ b/ffxiv/grandcompany/maelstrom/9.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/1.png b/ffxiv/grandcompany/twin_adder/1.png
new file mode 100644
index 0000000..2c26e53
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/1.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/10.png b/ffxiv/grandcompany/twin_adder/10.png
new file mode 100644
index 0000000..f97b638
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/10.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/11.png b/ffxiv/grandcompany/twin_adder/11.png
new file mode 100644
index 0000000..21b430f
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/11.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/12.png b/ffxiv/grandcompany/twin_adder/12.png
new file mode 100644
index 0000000..2a03655
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/12.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/13.png b/ffxiv/grandcompany/twin_adder/13.png
new file mode 100644
index 0000000..10c04a9
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/13.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/14.png b/ffxiv/grandcompany/twin_adder/14.png
new file mode 100644
index 0000000..d1768ac
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/14.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/15.png b/ffxiv/grandcompany/twin_adder/15.png
new file mode 100644
index 0000000..bdf6aa8
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/15.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/16.png b/ffxiv/grandcompany/twin_adder/16.png
new file mode 100644
index 0000000..9aeee5b
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/16.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/17.png b/ffxiv/grandcompany/twin_adder/17.png
new file mode 100644
index 0000000..68c74dd
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/17.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/18.png b/ffxiv/grandcompany/twin_adder/18.png
new file mode 100644
index 0000000..488bc32
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/18.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/19.png b/ffxiv/grandcompany/twin_adder/19.png
new file mode 100644
index 0000000..4d4ea82
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/19.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/2.png b/ffxiv/grandcompany/twin_adder/2.png
new file mode 100644
index 0000000..8071382
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/2.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/3.png b/ffxiv/grandcompany/twin_adder/3.png
new file mode 100644
index 0000000..061cb1b
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/3.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/4.png b/ffxiv/grandcompany/twin_adder/4.png
new file mode 100644
index 0000000..ac0ed49
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/4.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/5.png b/ffxiv/grandcompany/twin_adder/5.png
new file mode 100644
index 0000000..15ab299
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/5.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/6.png b/ffxiv/grandcompany/twin_adder/6.png
new file mode 100644
index 0000000..afe37fc
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/6.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/7.png b/ffxiv/grandcompany/twin_adder/7.png
new file mode 100644
index 0000000..6c4fddb
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/7.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/8.png b/ffxiv/grandcompany/twin_adder/8.png
new file mode 100644
index 0000000..a00d446
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/8.png
Binary files differ
diff --git a/ffxiv/grandcompany/twin_adder/9.png b/ffxiv/grandcompany/twin_adder/9.png
new file mode 100644
index 0000000..1cb7189
--- /dev/null
+++ b/ffxiv/grandcompany/twin_adder/9.png
Binary files differ
diff --git a/ffxiv/icons/alchemist.png b/ffxiv/icons/alchemist.png
new file mode 100644
index 0000000..7f561ae
--- /dev/null
+++ b/ffxiv/icons/alchemist.png
Binary files differ
diff --git a/ffxiv/icons/arcanist.png b/ffxiv/icons/arcanist.png
new file mode 100644
index 0000000..667dba7
--- /dev/null
+++ b/ffxiv/icons/arcanist.png
Binary files differ
diff --git a/ffxiv/icons/archer.png b/ffxiv/icons/archer.png
new file mode 100644
index 0000000..f0efe42
--- /dev/null
+++ b/ffxiv/icons/archer.png
Binary files differ
diff --git a/ffxiv/icons/armorer.png b/ffxiv/icons/armorer.png
new file mode 100644
index 0000000..6b02c6e
--- /dev/null
+++ b/ffxiv/icons/armorer.png
Binary files differ
diff --git a/ffxiv/icons/astrologian.png b/ffxiv/icons/astrologian.png
new file mode 100644
index 0000000..0a27df2
--- /dev/null
+++ b/ffxiv/icons/astrologian.png
Binary files differ
diff --git a/ffxiv/icons/bard.png b/ffxiv/icons/bard.png
new file mode 100644
index 0000000..4c5abd5
--- /dev/null
+++ b/ffxiv/icons/bard.png
Binary files differ
diff --git a/ffxiv/icons/blackmage.png b/ffxiv/icons/blackmage.png
new file mode 100644
index 0000000..1761143
--- /dev/null
+++ b/ffxiv/icons/blackmage.png
Binary files differ
diff --git a/ffxiv/icons/blacksmith.png b/ffxiv/icons/blacksmith.png
new file mode 100644
index 0000000..792949b
--- /dev/null
+++ b/ffxiv/icons/blacksmith.png
Binary files differ
diff --git a/ffxiv/icons/bluemage(limitedjob).png b/ffxiv/icons/bluemage(limitedjob).png
new file mode 100644
index 0000000..d0f442a
--- /dev/null
+++ b/ffxiv/icons/bluemage(limitedjob).png
Binary files differ
diff --git a/ffxiv/icons/botanist.png b/ffxiv/icons/botanist.png
new file mode 100644
index 0000000..4d0fcb5
--- /dev/null
+++ b/ffxiv/icons/botanist.png
Binary files differ
diff --git a/ffxiv/icons/carpenter.png b/ffxiv/icons/carpenter.png
new file mode 100644
index 0000000..81e2442
--- /dev/null
+++ b/ffxiv/icons/carpenter.png
Binary files differ
diff --git a/ffxiv/icons/conjurer.png b/ffxiv/icons/conjurer.png
new file mode 100644
index 0000000..8403d1f
--- /dev/null
+++ b/ffxiv/icons/conjurer.png
Binary files differ
diff --git a/ffxiv/icons/culinarian.png b/ffxiv/icons/culinarian.png
new file mode 100644
index 0000000..47a412e
--- /dev/null
+++ b/ffxiv/icons/culinarian.png
Binary files differ
diff --git a/ffxiv/icons/dancer.png b/ffxiv/icons/dancer.png
new file mode 100644
index 0000000..8a24468
--- /dev/null
+++ b/ffxiv/icons/dancer.png
Binary files differ
diff --git a/ffxiv/icons/darkknight.png b/ffxiv/icons/darkknight.png
new file mode 100644
index 0000000..335dac6
--- /dev/null
+++ b/ffxiv/icons/darkknight.png
Binary files differ
diff --git a/ffxiv/icons/dragoon.png b/ffxiv/icons/dragoon.png
new file mode 100644
index 0000000..3dd0f8c
--- /dev/null
+++ b/ffxiv/icons/dragoon.png
Binary files differ
diff --git a/ffxiv/icons/fisher.png b/ffxiv/icons/fisher.png
new file mode 100644
index 0000000..e44bdd2
--- /dev/null
+++ b/ffxiv/icons/fisher.png
Binary files differ
diff --git a/ffxiv/icons/gladiator.png b/ffxiv/icons/gladiator.png
new file mode 100644
index 0000000..d7d91e9
--- /dev/null
+++ b/ffxiv/icons/gladiator.png
Binary files differ
diff --git a/ffxiv/icons/goldsmith.png b/ffxiv/icons/goldsmith.png
new file mode 100644
index 0000000..fcfe48f
--- /dev/null
+++ b/ffxiv/icons/goldsmith.png
Binary files differ
diff --git a/ffxiv/icons/gunbreaker.png b/ffxiv/icons/gunbreaker.png
new file mode 100644
index 0000000..66a8937
--- /dev/null
+++ b/ffxiv/icons/gunbreaker.png
Binary files differ
diff --git a/ffxiv/icons/lancer.png b/ffxiv/icons/lancer.png
new file mode 100644
index 0000000..f88670e
--- /dev/null
+++ b/ffxiv/icons/lancer.png
Binary files differ
diff --git a/ffxiv/icons/leatherworker.png b/ffxiv/icons/leatherworker.png
new file mode 100644
index 0000000..c69175e
--- /dev/null
+++ b/ffxiv/icons/leatherworker.png
Binary files differ
diff --git a/ffxiv/icons/machinist.png b/ffxiv/icons/machinist.png
new file mode 100644
index 0000000..2f8898a
--- /dev/null
+++ b/ffxiv/icons/machinist.png
Binary files differ
diff --git a/ffxiv/icons/marauder.png b/ffxiv/icons/marauder.png
new file mode 100644
index 0000000..013169b
--- /dev/null
+++ b/ffxiv/icons/marauder.png
Binary files differ
diff --git a/ffxiv/icons/miner.png b/ffxiv/icons/miner.png
new file mode 100644
index 0000000..01f6453
--- /dev/null
+++ b/ffxiv/icons/miner.png
Binary files differ
diff --git a/ffxiv/icons/monk.png b/ffxiv/icons/monk.png
new file mode 100644
index 0000000..9b57649
--- /dev/null
+++ b/ffxiv/icons/monk.png
Binary files differ
diff --git a/ffxiv/icons/ninja.png b/ffxiv/icons/ninja.png
new file mode 100644
index 0000000..95ecde9
--- /dev/null
+++ b/ffxiv/icons/ninja.png
Binary files differ
diff --git a/ffxiv/icons/paladin.png b/ffxiv/icons/paladin.png
new file mode 100644
index 0000000..3833f61
--- /dev/null
+++ b/ffxiv/icons/paladin.png
Binary files differ
diff --git a/ffxiv/icons/pugilist.png b/ffxiv/icons/pugilist.png
new file mode 100644
index 0000000..9570442
--- /dev/null
+++ b/ffxiv/icons/pugilist.png
Binary files differ
diff --git a/ffxiv/icons/redmage.png b/ffxiv/icons/redmage.png
new file mode 100644
index 0000000..cd7a53a
--- /dev/null
+++ b/ffxiv/icons/redmage.png
Binary files differ
diff --git a/ffxiv/icons/rogue.png b/ffxiv/icons/rogue.png
new file mode 100644
index 0000000..05af990
--- /dev/null
+++ b/ffxiv/icons/rogue.png
Binary files differ
diff --git a/ffxiv/icons/role_dps_magic.png b/ffxiv/icons/role_dps_magic.png
new file mode 100644
index 0000000..01cebf8
--- /dev/null
+++ b/ffxiv/icons/role_dps_magic.png
Binary files differ
diff --git a/ffxiv/icons/role_dps_melee.png b/ffxiv/icons/role_dps_melee.png
new file mode 100644
index 0000000..3a4af90
--- /dev/null
+++ b/ffxiv/icons/role_dps_melee.png
Binary files differ
diff --git a/ffxiv/icons/role_dps_ranged.png b/ffxiv/icons/role_dps_ranged.png
new file mode 100644
index 0000000..e331709
--- /dev/null
+++ b/ffxiv/icons/role_dps_ranged.png
Binary files differ
diff --git a/ffxiv/icons/role_hand.png b/ffxiv/icons/role_hand.png
new file mode 100644
index 0000000..db60614
--- /dev/null
+++ b/ffxiv/icons/role_hand.png
Binary files differ
diff --git a/ffxiv/icons/role_healer.png b/ffxiv/icons/role_healer.png
new file mode 100644
index 0000000..224a383
--- /dev/null
+++ b/ffxiv/icons/role_healer.png
Binary files differ
diff --git a/ffxiv/icons/role_land.png b/ffxiv/icons/role_land.png
new file mode 100644
index 0000000..d0c2b49
--- /dev/null
+++ b/ffxiv/icons/role_land.png
Binary files differ
diff --git a/ffxiv/icons/role_tank.png b/ffxiv/icons/role_tank.png
new file mode 100644
index 0000000..fd80c75
--- /dev/null
+++ b/ffxiv/icons/role_tank.png
Binary files differ
diff --git a/ffxiv/icons/samurai.png b/ffxiv/icons/samurai.png
new file mode 100644
index 0000000..1b3d843
--- /dev/null
+++ b/ffxiv/icons/samurai.png
Binary files differ
diff --git a/ffxiv/icons/scholar.png b/ffxiv/icons/scholar.png
new file mode 100644
index 0000000..62a151c
--- /dev/null
+++ b/ffxiv/icons/scholar.png
Binary files differ
diff --git a/ffxiv/icons/summoner.png b/ffxiv/icons/summoner.png
new file mode 100644
index 0000000..f5d35dc
--- /dev/null
+++ b/ffxiv/icons/summoner.png
Binary files differ
diff --git a/ffxiv/icons/thaumaturge.png b/ffxiv/icons/thaumaturge.png
new file mode 100644
index 0000000..c34456f
--- /dev/null
+++ b/ffxiv/icons/thaumaturge.png
Binary files differ
diff --git a/ffxiv/icons/warrior.png b/ffxiv/icons/warrior.png
new file mode 100644
index 0000000..c928b75
--- /dev/null
+++ b/ffxiv/icons/warrior.png
Binary files differ
diff --git a/ffxiv/icons/weaver.png b/ffxiv/icons/weaver.png
new file mode 100644
index 0000000..1b0e815
--- /dev/null
+++ b/ffxiv/icons/weaver.png
Binary files differ
diff --git a/ffxiv/icons/whitemage.png b/ffxiv/icons/whitemage.png
new file mode 100644
index 0000000..c63e504
--- /dev/null
+++ b/ffxiv/icons/whitemage.png
Binary files differ
diff --git a/ffxiv/jobs/alchemist.png b/ffxiv/jobs/alchemist.png
new file mode 100644
index 0000000..7f561ae
--- /dev/null
+++ b/ffxiv/jobs/alchemist.png
Binary files differ
diff --git a/ffxiv/jobs/arcanist.png b/ffxiv/jobs/arcanist.png
new file mode 100644
index 0000000..667dba7
--- /dev/null
+++ b/ffxiv/jobs/arcanist.png
Binary files differ
diff --git a/ffxiv/jobs/archer.png b/ffxiv/jobs/archer.png
new file mode 100644
index 0000000..f0efe42
--- /dev/null
+++ b/ffxiv/jobs/archer.png
Binary files differ
diff --git a/ffxiv/jobs/armorer.png b/ffxiv/jobs/armorer.png
new file mode 100644
index 0000000..6b02c6e
--- /dev/null
+++ b/ffxiv/jobs/armorer.png
Binary files differ
diff --git a/ffxiv/jobs/astrologian.png b/ffxiv/jobs/astrologian.png
new file mode 100644
index 0000000..0a27df2
--- /dev/null
+++ b/ffxiv/jobs/astrologian.png
Binary files differ
diff --git a/ffxiv/jobs/bard.png b/ffxiv/jobs/bard.png
new file mode 100644
index 0000000..4c5abd5
--- /dev/null
+++ b/ffxiv/jobs/bard.png
Binary files differ
diff --git a/ffxiv/jobs/blackmage.png b/ffxiv/jobs/blackmage.png
new file mode 100644
index 0000000..1761143
--- /dev/null
+++ b/ffxiv/jobs/blackmage.png
Binary files differ
diff --git a/ffxiv/jobs/blacksmith.png b/ffxiv/jobs/blacksmith.png
new file mode 100644
index 0000000..792949b
--- /dev/null
+++ b/ffxiv/jobs/blacksmith.png
Binary files differ
diff --git a/ffxiv/jobs/bluemage(limitedjob).png b/ffxiv/jobs/bluemage(limitedjob).png
new file mode 100644
index 0000000..d0f442a
--- /dev/null
+++ b/ffxiv/jobs/bluemage(limitedjob).png
Binary files differ
diff --git a/ffxiv/jobs/bluemage.png b/ffxiv/jobs/bluemage.png
new file mode 100644
index 0000000..d0f442a
--- /dev/null
+++ b/ffxiv/jobs/bluemage.png
Binary files differ
diff --git a/ffxiv/jobs/botanist.png b/ffxiv/jobs/botanist.png
new file mode 100644
index 0000000..4d0fcb5
--- /dev/null
+++ b/ffxiv/jobs/botanist.png
Binary files differ
diff --git a/ffxiv/jobs/carpenter.png b/ffxiv/jobs/carpenter.png
new file mode 100644
index 0000000..81e2442
--- /dev/null
+++ b/ffxiv/jobs/carpenter.png
Binary files differ
diff --git a/ffxiv/jobs/conjurer.png b/ffxiv/jobs/conjurer.png
new file mode 100644
index 0000000..8403d1f
--- /dev/null
+++ b/ffxiv/jobs/conjurer.png
Binary files differ
diff --git a/ffxiv/jobs/culinarian.png b/ffxiv/jobs/culinarian.png
new file mode 100644
index 0000000..47a412e
--- /dev/null
+++ b/ffxiv/jobs/culinarian.png
Binary files differ
diff --git a/ffxiv/jobs/dancer.png b/ffxiv/jobs/dancer.png
new file mode 100644
index 0000000..8a24468
--- /dev/null
+++ b/ffxiv/jobs/dancer.png
Binary files differ
diff --git a/ffxiv/jobs/darkknight.png b/ffxiv/jobs/darkknight.png
new file mode 100644
index 0000000..335dac6
--- /dev/null
+++ b/ffxiv/jobs/darkknight.png
Binary files differ
diff --git a/ffxiv/jobs/dragoon.png b/ffxiv/jobs/dragoon.png
new file mode 100644
index 0000000..3dd0f8c
--- /dev/null
+++ b/ffxiv/jobs/dragoon.png
Binary files differ
diff --git a/ffxiv/jobs/fisher.png b/ffxiv/jobs/fisher.png
new file mode 100644
index 0000000..e44bdd2
--- /dev/null
+++ b/ffxiv/jobs/fisher.png
Binary files differ
diff --git a/ffxiv/jobs/gladiator.png b/ffxiv/jobs/gladiator.png
new file mode 100644
index 0000000..d7d91e9
--- /dev/null
+++ b/ffxiv/jobs/gladiator.png
Binary files differ
diff --git a/ffxiv/jobs/goldsmith.png b/ffxiv/jobs/goldsmith.png
new file mode 100644
index 0000000..fcfe48f
--- /dev/null
+++ b/ffxiv/jobs/goldsmith.png
Binary files differ
diff --git a/ffxiv/jobs/gunbreaker.png b/ffxiv/jobs/gunbreaker.png
new file mode 100644
index 0000000..66a8937
--- /dev/null
+++ b/ffxiv/jobs/gunbreaker.png
Binary files differ
diff --git a/ffxiv/jobs/lancer.png b/ffxiv/jobs/lancer.png
new file mode 100644
index 0000000..f88670e
--- /dev/null
+++ b/ffxiv/jobs/lancer.png
Binary files differ
diff --git a/ffxiv/jobs/leatherworker.png b/ffxiv/jobs/leatherworker.png
new file mode 100644
index 0000000..c69175e
--- /dev/null
+++ b/ffxiv/jobs/leatherworker.png
Binary files differ
diff --git a/ffxiv/jobs/machinist.png b/ffxiv/jobs/machinist.png
new file mode 100644
index 0000000..2f8898a
--- /dev/null
+++ b/ffxiv/jobs/machinist.png
Binary files differ
diff --git a/ffxiv/jobs/marauder.png b/ffxiv/jobs/marauder.png
new file mode 100644
index 0000000..013169b
--- /dev/null
+++ b/ffxiv/jobs/marauder.png
Binary files differ
diff --git a/ffxiv/jobs/miner.png b/ffxiv/jobs/miner.png
new file mode 100644
index 0000000..01f6453
--- /dev/null
+++ b/ffxiv/jobs/miner.png
Binary files differ
diff --git a/ffxiv/jobs/monk.png b/ffxiv/jobs/monk.png
new file mode 100644
index 0000000..9b57649
--- /dev/null
+++ b/ffxiv/jobs/monk.png
Binary files differ
diff --git a/ffxiv/jobs/ninja.png b/ffxiv/jobs/ninja.png
new file mode 100644
index 0000000..95ecde9
--- /dev/null
+++ b/ffxiv/jobs/ninja.png
Binary files differ
diff --git a/ffxiv/jobs/paladin.png b/ffxiv/jobs/paladin.png
new file mode 100644
index 0000000..3833f61
--- /dev/null
+++ b/ffxiv/jobs/paladin.png
Binary files differ
diff --git a/ffxiv/jobs/pugilist.png b/ffxiv/jobs/pugilist.png
new file mode 100644
index 0000000..9570442
--- /dev/null
+++ b/ffxiv/jobs/pugilist.png
Binary files differ
diff --git a/ffxiv/jobs/reaper.png b/ffxiv/jobs/reaper.png
new file mode 100644
index 0000000..b3dfafc
--- /dev/null
+++ b/ffxiv/jobs/reaper.png
Binary files differ
diff --git a/ffxiv/jobs/redmage.png b/ffxiv/jobs/redmage.png
new file mode 100644
index 0000000..cd7a53a
--- /dev/null
+++ b/ffxiv/jobs/redmage.png
Binary files differ
diff --git a/ffxiv/jobs/rogue.png b/ffxiv/jobs/rogue.png
new file mode 100644
index 0000000..05af990
--- /dev/null
+++ b/ffxiv/jobs/rogue.png
Binary files differ
diff --git a/ffxiv/jobs/sage.png b/ffxiv/jobs/sage.png
new file mode 100644
index 0000000..dbceb24
--- /dev/null
+++ b/ffxiv/jobs/sage.png
Binary files differ
diff --git a/ffxiv/jobs/samurai.png b/ffxiv/jobs/samurai.png
new file mode 100644
index 0000000..1b3d843
--- /dev/null
+++ b/ffxiv/jobs/samurai.png
Binary files differ
diff --git a/ffxiv/jobs/scholar.png b/ffxiv/jobs/scholar.png
new file mode 100644
index 0000000..62a151c
--- /dev/null
+++ b/ffxiv/jobs/scholar.png
Binary files differ
diff --git a/ffxiv/jobs/summoner.png b/ffxiv/jobs/summoner.png
new file mode 100644
index 0000000..f5d35dc
--- /dev/null
+++ b/ffxiv/jobs/summoner.png
Binary files differ
diff --git a/ffxiv/jobs/thaumaturge.png b/ffxiv/jobs/thaumaturge.png
new file mode 100644
index 0000000..c34456f
--- /dev/null
+++ b/ffxiv/jobs/thaumaturge.png
Binary files differ
diff --git a/ffxiv/jobs/warrior.png b/ffxiv/jobs/warrior.png
new file mode 100644
index 0000000..c928b75
--- /dev/null
+++ b/ffxiv/jobs/warrior.png
Binary files differ
diff --git a/ffxiv/jobs/weaver.png b/ffxiv/jobs/weaver.png
new file mode 100644
index 0000000..1b0e815
--- /dev/null
+++ b/ffxiv/jobs/weaver.png
Binary files differ
diff --git a/ffxiv/jobs/whitemage.png b/ffxiv/jobs/whitemage.png
new file mode 100644
index 0000000..c63e504
--- /dev/null
+++ b/ffxiv/jobs/whitemage.png
Binary files differ
diff --git a/ffxiv/jobs_plain/alchemist.png b/ffxiv/jobs_plain/alchemist.png
new file mode 100644
index 0000000..1c2f9cc
--- /dev/null
+++ b/ffxiv/jobs_plain/alchemist.png
Binary files differ
diff --git a/ffxiv/jobs_plain/arcanist.png b/ffxiv/jobs_plain/arcanist.png
new file mode 100644
index 0000000..1c9e9a0
--- /dev/null
+++ b/ffxiv/jobs_plain/arcanist.png
Binary files differ
diff --git a/ffxiv/jobs_plain/archer.png b/ffxiv/jobs_plain/archer.png
new file mode 100644
index 0000000..be2a860
--- /dev/null
+++ b/ffxiv/jobs_plain/archer.png
Binary files differ
diff --git a/ffxiv/jobs_plain/armorer.png b/ffxiv/jobs_plain/armorer.png
new file mode 100644
index 0000000..451ea5c
--- /dev/null
+++ b/ffxiv/jobs_plain/armorer.png
Binary files differ
diff --git a/ffxiv/jobs_plain/astrologian.png b/ffxiv/jobs_plain/astrologian.png
new file mode 100644
index 0000000..f639782
--- /dev/null
+++ b/ffxiv/jobs_plain/astrologian.png
Binary files differ
diff --git a/ffxiv/jobs_plain/bard.png b/ffxiv/jobs_plain/bard.png
new file mode 100644
index 0000000..fd5a952
--- /dev/null
+++ b/ffxiv/jobs_plain/bard.png
Binary files differ
diff --git a/ffxiv/jobs_plain/black mage.png b/ffxiv/jobs_plain/black mage.png
new file mode 100644
index 0000000..1774842
--- /dev/null
+++ b/ffxiv/jobs_plain/black mage.png
Binary files differ
diff --git a/ffxiv/jobs_plain/blackmage.png b/ffxiv/jobs_plain/blackmage.png
new file mode 100644
index 0000000..1774842
--- /dev/null
+++ b/ffxiv/jobs_plain/blackmage.png
Binary files differ
diff --git a/ffxiv/jobs_plain/blacksmith.png b/ffxiv/jobs_plain/blacksmith.png
new file mode 100644
index 0000000..6a5cefa
--- /dev/null
+++ b/ffxiv/jobs_plain/blacksmith.png
Binary files differ
diff --git a/ffxiv/jobs_plain/blue mage (limited job).png b/ffxiv/jobs_plain/blue mage (limited job).png
new file mode 100644
index 0000000..8feadf3
--- /dev/null
+++ b/ffxiv/jobs_plain/blue mage (limited job).png
Binary files differ
diff --git a/ffxiv/jobs_plain/bluemage(limitedjob).png b/ffxiv/jobs_plain/bluemage(limitedjob).png
new file mode 100644
index 0000000..8feadf3
--- /dev/null
+++ b/ffxiv/jobs_plain/bluemage(limitedjob).png
Binary files differ
diff --git a/ffxiv/jobs_plain/botanist.png b/ffxiv/jobs_plain/botanist.png
new file mode 100644
index 0000000..023b75f
--- /dev/null
+++ b/ffxiv/jobs_plain/botanist.png
Binary files differ
diff --git a/ffxiv/jobs_plain/carpenter.png b/ffxiv/jobs_plain/carpenter.png
new file mode 100644
index 0000000..4e459bc
--- /dev/null
+++ b/ffxiv/jobs_plain/carpenter.png
Binary files differ
diff --git a/ffxiv/jobs_plain/conjurer.png b/ffxiv/jobs_plain/conjurer.png
new file mode 100644
index 0000000..8b7bc3d
--- /dev/null
+++ b/ffxiv/jobs_plain/conjurer.png
Binary files differ
diff --git a/ffxiv/jobs_plain/culinarian.png b/ffxiv/jobs_plain/culinarian.png
new file mode 100644
index 0000000..4aeef51
--- /dev/null
+++ b/ffxiv/jobs_plain/culinarian.png
Binary files differ
diff --git a/ffxiv/jobs_plain/dancer.png b/ffxiv/jobs_plain/dancer.png
new file mode 100644
index 0000000..29f1e20
--- /dev/null
+++ b/ffxiv/jobs_plain/dancer.png
Binary files differ
diff --git a/ffxiv/jobs_plain/dark knight.png b/ffxiv/jobs_plain/dark knight.png
new file mode 100644
index 0000000..4aa7220
--- /dev/null
+++ b/ffxiv/jobs_plain/dark knight.png
Binary files differ
diff --git a/ffxiv/jobs_plain/darkknight.png b/ffxiv/jobs_plain/darkknight.png
new file mode 100644
index 0000000..4aa7220
--- /dev/null
+++ b/ffxiv/jobs_plain/darkknight.png
Binary files differ
diff --git a/ffxiv/jobs_plain/dragoon.png b/ffxiv/jobs_plain/dragoon.png
new file mode 100644
index 0000000..9d826b9
--- /dev/null
+++ b/ffxiv/jobs_plain/dragoon.png
Binary files differ
diff --git a/ffxiv/jobs_plain/fisher.png b/ffxiv/jobs_plain/fisher.png
new file mode 100644
index 0000000..70ad8a5
--- /dev/null
+++ b/ffxiv/jobs_plain/fisher.png
Binary files differ
diff --git a/ffxiv/jobs_plain/gladiator.png b/ffxiv/jobs_plain/gladiator.png
new file mode 100644
index 0000000..1daa67f
--- /dev/null
+++ b/ffxiv/jobs_plain/gladiator.png
Binary files differ
diff --git a/ffxiv/jobs_plain/goldsmith.png b/ffxiv/jobs_plain/goldsmith.png
new file mode 100644
index 0000000..96afc1b
--- /dev/null
+++ b/ffxiv/jobs_plain/goldsmith.png
Binary files differ
diff --git a/ffxiv/jobs_plain/gunbreaker.png b/ffxiv/jobs_plain/gunbreaker.png
new file mode 100644
index 0000000..022e9c3
--- /dev/null
+++ b/ffxiv/jobs_plain/gunbreaker.png
Binary files differ
diff --git a/ffxiv/jobs_plain/lancer.png b/ffxiv/jobs_plain/lancer.png
new file mode 100644
index 0000000..a331f3f
--- /dev/null
+++ b/ffxiv/jobs_plain/lancer.png
Binary files differ
diff --git a/ffxiv/jobs_plain/machinist.png b/ffxiv/jobs_plain/machinist.png
new file mode 100644
index 0000000..96b5331
--- /dev/null
+++ b/ffxiv/jobs_plain/machinist.png
Binary files differ
diff --git a/ffxiv/jobs_plain/marauder.png b/ffxiv/jobs_plain/marauder.png
new file mode 100644
index 0000000..6f6c546
--- /dev/null
+++ b/ffxiv/jobs_plain/marauder.png
Binary files differ
diff --git a/ffxiv/jobs_plain/miner.png b/ffxiv/jobs_plain/miner.png
new file mode 100644
index 0000000..c2e823a
--- /dev/null
+++ b/ffxiv/jobs_plain/miner.png
Binary files differ
diff --git a/ffxiv/jobs_plain/monk.png b/ffxiv/jobs_plain/monk.png
new file mode 100644
index 0000000..21f33b3
--- /dev/null
+++ b/ffxiv/jobs_plain/monk.png
Binary files differ
diff --git a/ffxiv/jobs_plain/ninja.png b/ffxiv/jobs_plain/ninja.png
new file mode 100644
index 0000000..7437214
--- /dev/null
+++ b/ffxiv/jobs_plain/ninja.png
Binary files differ
diff --git a/ffxiv/jobs_plain/paladin.png b/ffxiv/jobs_plain/paladin.png
new file mode 100644
index 0000000..46c4906
--- /dev/null
+++ b/ffxiv/jobs_plain/paladin.png
Binary files differ
diff --git a/ffxiv/jobs_plain/pugilist.png b/ffxiv/jobs_plain/pugilist.png
new file mode 100644
index 0000000..52b25a2
--- /dev/null
+++ b/ffxiv/jobs_plain/pugilist.png
Binary files differ
diff --git a/ffxiv/jobs_plain/reaper.png b/ffxiv/jobs_plain/reaper.png
new file mode 100644
index 0000000..19dd72e
--- /dev/null
+++ b/ffxiv/jobs_plain/reaper.png
Binary files differ
diff --git a/ffxiv/jobs_plain/red mage.png b/ffxiv/jobs_plain/red mage.png
new file mode 100644
index 0000000..3d23aae
--- /dev/null
+++ b/ffxiv/jobs_plain/red mage.png
Binary files differ
diff --git a/ffxiv/jobs_plain/redmage.png b/ffxiv/jobs_plain/redmage.png
new file mode 100644
index 0000000..3d23aae
--- /dev/null
+++ b/ffxiv/jobs_plain/redmage.png
Binary files differ
diff --git a/ffxiv/jobs_plain/rogue.png b/ffxiv/jobs_plain/rogue.png
new file mode 100644
index 0000000..a3979b8
--- /dev/null
+++ b/ffxiv/jobs_plain/rogue.png
Binary files differ
diff --git a/ffxiv/jobs_plain/sage.png b/ffxiv/jobs_plain/sage.png
new file mode 100644
index 0000000..72750df
--- /dev/null
+++ b/ffxiv/jobs_plain/sage.png
Binary files differ
diff --git a/ffxiv/jobs_plain/samurai.png b/ffxiv/jobs_plain/samurai.png
new file mode 100644
index 0000000..9b66bfc
--- /dev/null
+++ b/ffxiv/jobs_plain/samurai.png
Binary files differ
diff --git a/ffxiv/jobs_plain/scholar.png b/ffxiv/jobs_plain/scholar.png
new file mode 100644
index 0000000..9eb4bc6
--- /dev/null
+++ b/ffxiv/jobs_plain/scholar.png
Binary files differ
diff --git a/ffxiv/jobs_plain/summoner.png b/ffxiv/jobs_plain/summoner.png
new file mode 100644
index 0000000..29720a1
--- /dev/null
+++ b/ffxiv/jobs_plain/summoner.png
Binary files differ
diff --git a/ffxiv/jobs_plain/warrior.png b/ffxiv/jobs_plain/warrior.png
new file mode 100644
index 0000000..ea6b984
--- /dev/null
+++ b/ffxiv/jobs_plain/warrior.png
Binary files differ
diff --git a/ffxiv/jobs_plain/weaver.png b/ffxiv/jobs_plain/weaver.png
new file mode 100644
index 0000000..c7ce479
--- /dev/null
+++ b/ffxiv/jobs_plain/weaver.png
Binary files differ
diff --git a/ffxiv/jobs_plain/white mage.png b/ffxiv/jobs_plain/white mage.png
new file mode 100644
index 0000000..0fa86b9
--- /dev/null
+++ b/ffxiv/jobs_plain/white mage.png
Binary files differ
diff --git a/ffxiv/jobs_plain/whitemage.png b/ffxiv/jobs_plain/whitemage.png
new file mode 100644
index 0000000..0fa86b9
--- /dev/null
+++ b/ffxiv/jobs_plain/whitemage.png
Binary files differ
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/LICENSE b/ffxiv/lodestone-css-selectors-0.46.0/LICENSE
new file mode 100644
index 0000000..fdddb29
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/LICENSE
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/README.md b/ffxiv/lodestone-css-selectors-0.46.0/README.md
new file mode 100644
index 0000000..da1fd4b
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/README.md
@@ -0,0 +1,26 @@
+# lodestone-css-selectors
+CSS selectors for The Lodestone. These selectors are all made for non-browser clients; they may break in various browsers
+due to DOM elements being injected by the browser itself. Please test them in a parser before reporting any errors.
+
+## Character Profile
+Do note that in Firefox, some page elements are slightly different from in other browsers. Use no user agent or try the provided ones in `meta.json`.
+
+### Character info (`profile/character.json`)
+Basic character data is on the main profile page.
+
+### Attributes (`profile/attributes.json`)
+Attribute data is on the main profile page.
+
+### Gearset (`profile/gearset.json`)
+Gearset data is on the main profile page.
+
+### Classjobs (`profile/classjob.json`)
+Classjob data is on the `/class_job` endpoint.
+
+### Mounts/Minions (`profile/minion.json` and `profile/mount.json`)
+Mount and minion data are on their own `/mount` and `/minion` endpoints, and need to be scraped using a mobile user agent. With a desktop UA, the mount/minion names are
+injected into the page with AJAX, and separate requests need to be made to get every single one.
+
+### Achievements (`profile/achievements.json`)
+Achievements are on the `/achievement` endpoint. Use the list selector to get the list of achievements on the page, and then get their IDs from the `href` attribute
+of the link. Use the next button's selector to request the next page and scrape the next set of achievements until the href is `javascript:void(0);`.
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/cwls/cwls.json b/ffxiv/lodestone-css-selectors-0.46.0/cwls/cwls.json
new file mode 100644
index 0000000..4c4b007
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/cwls/cwls.json
@@ -0,0 +1,9 @@
+{
+ "NAME": {
+ "selector": ".heading__linkshell__name",
+ "regex": "\\s*(?P<Name>\\S*)"
+ },
+ "DC": {
+ "selector": ".heading__cwls__dcname"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/cwls/members.json b/ffxiv/lodestone-css-selectors-0.46.0/cwls/members.json
new file mode 100644
index 0000000..4c86578
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/cwls/members.json
@@ -0,0 +1,51 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__link",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "RANK": {
+ "selector": ".entry__chara_info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__chara_info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "LINKSHELL_RANK": {
+ "selector": ".entry__chara_info__linkshell > span"
+ },
+ "LINKSHELL_RANK_ICON": {
+ "selector": ".entry__chara_info__linkshell > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(5) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager:nth-child(5) > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/focus.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/focus.json
new file mode 100644
index 0000000..44850be
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/focus.json
@@ -0,0 +1,131 @@
+{
+ "NOT_SPECIFIED": {
+ "selector": "p.freecompany__text:nth-child(7)"
+ },
+ "RP": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "LEVELING": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(2) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "CASUAL": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "HARDCORE": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "DUNGEONS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "GUILDHESTS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "TRIALS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "RAIDS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "PVP": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/freecompany.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/freecompany.json
new file mode 100644
index 0000000..2ac1048
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/freecompany.json
@@ -0,0 +1,80 @@
+{
+ "ACTIVE_STATE": {
+ "selector": "p.freecompany__text:nth-child(3)",
+ "regex": "\\s*(?P<ActiveState>\\S+\\s?\\S*)"
+ },
+ "ACTIVE_MEMBER_COUNT": {
+ "selector": "p.freecompany__text:nth-child(12)"
+ },
+ "CREST_LAYERS": {
+ "BOTTOM": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(3)",
+ "attribute": "src"
+ }
+ },
+ "ESTATE": {
+ "NO_ESTATE": {
+ "selector": ".freecompany__estate__none"
+ },
+ "GREETING": {
+ "selector": ".freecompany__estate__greeting"
+ },
+ "NAME": {
+ "selector": ".freecompany__estate__name"
+ },
+ "PLOT": {
+ "selector": ".freecompany__estate__text"
+ }
+ },
+ "FORMED": {
+ "selector": "p.freecompany__text:nth-child(10) > script",
+ "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)"
+ },
+ "GRAND_COMPANY": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(2) > p:nth-child(1)",
+ "regex": "(?P<Name>\\w.*)<(?P<Rank>\\w*)>"
+ },
+ "ID": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1)",
+ "attribute": "href",
+ "regex": "/lodestone/freecompany/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".freecompany__text__name"
+ },
+ "RANK": {
+ "selector": "p.freecompany__text:nth-child(14)"
+ },
+ "RANKING": {
+ "WEEKLY": {
+ "selector": ".character__ranking__data tr:nth-child(1) > th:nth-child(1)",
+ "regex": "Weekly Rank:(?P<Rank>.+) \\(previous week\\)"
+ },
+ "MONTHLY": {
+ "selector": ".character__ranking__data tr:nth-child(2) > th:nth-child(1)",
+ "regex": "Monthly Rank:(?P<Rank>.*) \\(previous month\\)"
+ }
+ },
+ "RECRUITMENT": {
+ "selector": "p.freecompany__text:nth-child(5)",
+ "regex": "\\s*(?P<ActiveState>\\S*)"
+ },
+ "SERVER": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(2) > p:nth-child(3)",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ },
+ "SLOGAN": {
+ "selector": ".freecompany__text__message"
+ },
+ "TAG": {
+ "selector": ".freecompany__text.freecompany__text__tag"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/members.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/members.json
new file mode 100644
index 0000000..0723bc5
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/members.json
@@ -0,0 +1,44 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "li.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face > img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__bg",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "RANK": {
+ "selector": ".entry__freecompany__info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__freecompany__info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(4) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager:nth-child(4) > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/reputation.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/reputation.json
new file mode 100644
index 0000000..c88df40
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/reputation.json
@@ -0,0 +1,41 @@
+{
+ "MAELSTROM": {
+ "NAME": {
+ "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > p:nth-child(1)"
+ },
+ "PROGRESS": {
+ "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)",
+ "attribute": "style",
+ "regex": "width:(?P<Progress>\\d+)%;"
+ },
+ "RANK": {
+ "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > p:nth-child(2)"
+ }
+ },
+ "ADDERS": {
+ "NAME": {
+ "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > p:nth-child(1)"
+ },
+ "PROGRESS": {
+ "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)",
+ "attribute": "style",
+ "regex": "width:(?P<Progress>\\d+)%;"
+ },
+ "RANK": {
+ "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > p:nth-child(2)"
+ }
+ },
+ "FLAMES": {
+ "NAME": {
+ "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > p:nth-child(1)"
+ },
+ "PROGRESS": {
+ "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)",
+ "attribute": "style",
+ "regex": "width:(?P<Progress>\\d+)%;"
+ },
+ "RANK": {
+ "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > p:nth-child(2)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/freecompany/seeking.json b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/seeking.json
new file mode 100644
index 0000000..164c01a
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/freecompany/seeking.json
@@ -0,0 +1,75 @@
+{
+ "NOT_SPECIFIED": {
+ "selector": "p.parts__text:nth-child(9)"
+ },
+ "TANK": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ },
+ "HEALER": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ },
+ "DPS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ },
+ "CRAFTER": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ },
+ "GATHERER": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/linkshell/ls.json b/ffxiv/lodestone-css-selectors-0.46.0/linkshell/ls.json
new file mode 100644
index 0000000..c33ccb5
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/linkshell/ls.json
@@ -0,0 +1,5 @@
+{
+ "NAME": {
+ "selector": ".heading__linkshell__name"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/linkshell/members.json b/ffxiv/lodestone-css-selectors-0.46.0/linkshell/members.json
new file mode 100644
index 0000000..4c86578
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/linkshell/members.json
@@ -0,0 +1,51 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__link",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "RANK": {
+ "selector": ".entry__chara_info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__chara_info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "LINKSHELL_RANK": {
+ "selector": ".entry__chara_info__linkshell > span"
+ },
+ "LINKSHELL_RANK_ICON": {
+ "selector": ".entry__chara_info__linkshell > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(5) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager:nth-child(5) > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/meta.json b/ffxiv/lodestone-css-selectors-0.46.0/meta.json
new file mode 100644
index 0000000..1ed21fd
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/meta.json
@@ -0,0 +1,35 @@
+{
+ "version": "0.45.0",
+ "userAgentDesktop": "curl/7.73.0",
+ "userAgentMobile": "Mozilla/5.0 (iPhone; CPU OS 10_15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/14E304 Safari/605.1.15",
+ "applicableUris": {
+ "freecompany/focus.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/",
+ "freecompany/freecompany.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/",
+ "freecompany/members.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/member/",
+ "freecompany/reputation.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/",
+ "freecompany/seeking.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/%s/",
+
+ "cwls/cwls.json": "https://{region}.finalfantasyxiv.com/lodestone/crossworld_linkshell/%s/",
+ "cwls/members.json": "https://{region}.finalfantasyxiv.com/lodestone/crossworld_linkshell/%s/",
+
+ "linkshell/ls.json": "https://{region}.finalfantasyxiv.com/lodestone/linkshell/%s/",
+ "linkshell/members.json": "https://{region}.finalfantasyxiv.com/lodestone/linkshell/%s/",
+
+ "profile/achievements.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/achievement/",
+ "profile/attributes.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/",
+ "profile/character.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/",
+ "profile/classjob.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/class_job/",
+ "profile/gearset.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/",
+ "profile/minion.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/",
+ "profile/mount.json": "https://{region}.finalfantasyxiv.com/lodestone/character/{id}/",
+
+ "pvpteam/members.json": "https://{region}.finalfantasyxiv.com/lodestone/pvpteam/%s/",
+ "pvpteam/pvpteam.json": "https://{region}.finalfantasyxiv.com/lodestone/pvpteam/%s/",
+
+ "search/character.json": "https://{region}.finalfantasyxiv.com/lodestone/character/",
+ "search/cwls.json": "https://{region}.finalfantasyxiv.com/lodestone/crossworld_linkshell/",
+ "search/freecompany.json": "https://{region}.finalfantasyxiv.com/lodestone/freecompany/",
+ "search/linkshell.json": "https://{region}.finalfantasyxiv.com/lodestone/linkshell/",
+ "search/pvpteam.json": "https://{region}.finalfantasyxiv.com/lodestone/pvpteam/"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/achievements.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/achievements.json
new file mode 100644
index 0000000..532c5b5
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/achievements.json
@@ -0,0 +1,45 @@
+{
+ "ROOT": {
+ "selector": ".ldst__achievement"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": ".entry",
+ "multiple": true
+ },
+ "NAME": {
+ "selector": ".entry__activity__txt",
+ "regex": "(?P<NameDE>.*) aus der Kategorie „|.*[\\\"「](?P<Name>.*)[\\\"」]"
+ },
+ "ID": {
+ "selector": ".entry__achievement",
+ "attribute": "href",
+ "regex": "/lodestone/character/\\d*/achievement/detail/(?P<ID>\\d*)/"
+ },
+ "TIME": {
+ "selector": ".entry__activity__time > script",
+ "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(2) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager:nth-child(2) > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ },
+ "TOTAL_ACHIEVEMENTS": {
+ "selector": ".parts__total",
+ "regex": "(?P<TotalAchievements>[0-9]*) \\D+"
+ },
+ "ACHIEVEMENT_POINTS": {
+ "selector": ".achievement__point"
+ },
+ "ACTIVITY_DESCRIPTION": {
+ "selector": ".entry__activity__txt"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/attributes.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/attributes.json
new file mode 100644
index 0000000..c031c20
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/attributes.json
@@ -0,0 +1,62 @@
+{
+ "STRENGTH": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "DEXTERITY": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "VITALITY": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(3) > td:nth-child(2)"
+ },
+ "INTELLIGENCE": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(4) > td:nth-child(2)"
+ },
+ "MIND": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(5) > td:nth-child(2)"
+ },
+ "CRITICAL_HIT_RATE": {
+ "selector": "table.character__param__list:nth-child(4) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "DETERMINATION": {
+ "selector": "table.character__param__list:nth-child(4) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "DIRECT_HIT_RATE": {
+ "selector": "table.character__param__list:nth-child(4) tr:nth-child(3) > td:nth-child(2)"
+ },
+ "DEFENSE": {
+ "selector": "table.character__param__list:nth-child(6) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "MAGIC_DEFENSE": {
+ "selector": "table.character__param__list:nth-child(6) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "ATTACK_POWER": {
+ "selector": "table.character__param__list:nth-child(8) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "SKILL_SPEED": {
+ "selector": "table.character__param__list:nth-child(8) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "ATTACK_MAGIC_POTENCY": {
+ "selector": "table.character__param__list:nth-child(10) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "HEALING_MAGIC_POTENCY": {
+ "selector": "table.character__param__list:nth-child(10) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "SPELL_SPEED": {
+ "selector": "table.character__param__list:nth-child(10) tr:nth-child(3) > td:nth-child(2)"
+ },
+ "TENACITY": {
+ "selector": "table.character__param__list:nth-child(12) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "PIETY": {
+ "selector": "table.character__param__list:nth-child(12) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "HP": {
+ "selector": ".character__param > ul:nth-child(1) > li:nth-child(1) > div:nth-child(1) > span:nth-child(2)"
+ },
+ "MP_GP_CP": {
+ "selector": ".character__param > ul:nth-child(1) > li:nth-child(2) > div:nth-child(1) > span:nth-child(2)"
+ },
+ "MP_GP_CP_PARAMETER_NAME": {
+ "selector": ".character__param > ul > li:nth-child(2) .character__param__text"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/character.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/character.json
new file mode 100644
index 0000000..8a65066
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/character.json
@@ -0,0 +1,114 @@
+{
+ "ACTIVE_CLASSJOB": {
+ "selector": ".character__class_icon > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "ACTIVE_CLASSJOB_LEVEL": {
+ "selector": ".character__class__data > p:nth-child(1)",
+ "regex": "LEVEL (?P<Level>\\d*)"
+ },
+ "AVATAR": {
+ "selector": ".frame__chara__face > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "BIO": {
+ "selector": ".character__selfintroduction"
+ },
+ "CLASSJOB_ICONS": {
+ "ROOT": {
+ "selector": "li",
+ "multiple": true
+ },
+ "ICON": {
+ "selector": "div.character__class_icon > img",
+ "attribute": "src"
+ }
+ },
+ "FREE_COMPANY": {
+ "NAME": {
+ "selector": ".character__freecompany__name > h4:nth-child(2) > a:nth-child(1)"
+ },
+ "ICON_LAYERS": {
+ "BOTTOM": {
+ "selector": "div.character__freecompany__crest > div > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": "div.character__freecompany__crest > div > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": "div.character__freecompany__crest > div > img:nth-child(1)",
+ "attribute": "src"
+ }
+ }
+ },
+ "GRAND_COMPANY": {
+ "selector": "div.character-block:nth-child(4) > div:nth-child(2) > p:nth-child(2)",
+ "regex": "(?P<Name>\\S*) \/ (?P<Rank>.*)"
+ },
+ "GUARDIAN_DEITY": {
+ "NAME": {
+ "selector": "p.character-block__name:nth-child(4)"
+ },
+ "ICON": {
+ "selector": "#character > div.character__content.selected > div.character__profile.clearfix > div.character__profile__data > div:nth-child(1) > div > div:nth-child(2) > img",
+ "attribute": "src"
+ }
+ },
+ "GENDER": {
+ "selector": "p.character-block__name:nth-child(2)",
+ "regex": "(.$)"
+ },
+ "NAME": {
+ "selector": "div.frame__chara__box:nth-child(2) > .frame__chara__name"
+ },
+ "NAMEDAY": {
+ "selector": ".character-block__birth"
+ },
+ "PORTRAIT": {
+ "selector": ".js__image_popup > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "PVP_TEAM": {
+ "NAME": {
+ "selector": ".character__pvpteam__name > h4:nth-child(2) > a:nth-child(1)",
+ "attribute": "href",
+ "regex": "/lodestone/pvpteam/(?P<ID>.+)/"
+ },
+ "ICON_LAYERS": {
+ "BOTTOM": {
+ "selector": ".character__pvpteam__crest__image img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": ".character__pvpteam__crest__image img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": ".character__pvpteam__crest__image img:nth-child(3)",
+ "attribute": "src"
+ }
+ }
+ },
+ "RACE_CLAN_GENDER": {
+ "selector": "div.character-block:nth-child(1) > div:nth-child(2) > p:nth-child(2)",
+ "regex": "(?P<Race>.*)(?P<Tribe>.*) \\/ (?P<Gender>.)"
+ },
+ "SERVER": {
+ "selector": "p.frame__chara__world:last-of-type",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ },
+ "TITLE": {
+ "selector": ".frame__chara__title"
+ },
+ "TOWN": {
+ "NAME": {
+ "selector": "div.character-block:nth-child(3) > div:nth-child(2) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "#character > div.character__content.selected > div.character__profile.clearfix > div.character__profile__data > div:nth-child(1) > div > div:nth-child(3) > img",
+ "attribute": "src"
+ }
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/classjob.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/classjob.json
new file mode 100644
index 0000000..9a0c80a
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/classjob.json
@@ -0,0 +1,550 @@
+{
+ "BOZJA": {
+ "LEVEL": {
+ "selector": "div.character__content > div:nth-child(7) > div.character__job__level"
+ },
+ "NAME": {
+ "selector": "div.character__content > div:nth-child(7) > div.character__job__name"
+ },
+ "METTLE": {
+ "selector": "div.character__content > div:nth-child(7) > div.character__job__exp",
+ "regex": "(?P<Mettle>\\S+) \\/"
+ }
+ },
+ "EUREKA": {
+ "LEVEL": {
+ "selector": "div.character__content > div:nth-child(9) > div.character__job__level"
+ },
+ "NAME": {
+ "selector": "div.character__content > div:nth-child(9) > div.character__job__name"
+ },
+ "EXP": {
+ "selector": "div.character__content > div:nth-child(9) > div.character__job__exp",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.character__content > div:nth-child(9) > div.character__job__exp",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "PALADIN": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "WARRIOR": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DARKKNIGHT": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "GUNBREAKER": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "MONK": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DRAGOON": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "NINJA": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SAMURAI": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "REAPER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "WHITEMAGE": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SCHOLAR": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "ASTROLOGIAN": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SAGE": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BARD": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "MACHINIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DANCER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BLACKMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SUMMONER": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "REDMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BLUEMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "CARPENTER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "BLACKSMITH": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "ARMORER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "GOLDSMITH": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "LEATHERWORKER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "WEAVER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "ALCHEMIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "CULINARIAN": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "MINER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BOTANIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "FISHER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/gearset.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/gearset.json
new file mode 100644
index 0000000..9488f7d
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/gearset.json
@@ -0,0 +1,527 @@
+{
+ "MAINHAND": {
+ "NAME": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "OFFHAND": {
+ "NAME": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "HEAD": {
+ "NAME": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "BODY": {
+ "NAME": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "HANDS": {
+ "NAME": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "WAIST": {
+ "NAME": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "LEGS": {
+ "NAME": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "FEET": {
+ "NAME": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "EARRINGS": {
+ "NAME": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "NECKLACE": {
+ "NAME": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "BRACELETS": {
+ "NAME": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "RING1": {
+ "NAME": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "RING2": {
+ "NAME": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "SOULCRYSTAL": {
+ "NAME": {
+ "selector": ".icon-c--13 > div:nth-child(3) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/minion.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/minion.json
new file mode 100644
index 0000000..05e22de
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/minion.json
@@ -0,0 +1,18 @@
+{
+ "MINIONS": {
+ "ROOT": {
+ "selector": ".minion__list__item",
+ "multiple": true
+ },
+ "NAME": {
+ "selector": ".minion__name"
+ },
+ "ICON": {
+ "selector": ".minion__list__icon__image",
+ "attribute": "src"
+ }
+ },
+ "TOTAL": {
+ "selector": ".minion__sort__total > span:nth-child(1)"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/profile/mount.json b/ffxiv/lodestone-css-selectors-0.46.0/profile/mount.json
new file mode 100644
index 0000000..5bca606
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/profile/mount.json
@@ -0,0 +1,18 @@
+{
+ "MOUNTS": {
+ "ROOT": {
+ "selector": ".mount__list__item",
+ "multiple": true
+ },
+ "NAME": {
+ "selector": ".mount__name"
+ },
+ "ICON": {
+ "selector": ".mount__list__icon__image",
+ "attribute": "src"
+ }
+ },
+ "TOTAL": {
+ "selector": ".minion__sort__total > span:nth-child(1)"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/members.json b/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/members.json
new file mode 100644
index 0000000..202b4d8
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/members.json
@@ -0,0 +1,39 @@
+{
+ "ROOT": {
+ "selector": ".pvpteam__member"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__bg",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "MATCHES": {
+ "selector": ".entry__freecompany__info > li:last-of-type > span"
+ },
+ "RANK": {
+ "selector": ".entry__freecompany__info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__freecompany__info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/pvpteam.json b/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/pvpteam.json
new file mode 100644
index 0000000..6bb7cf8
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/pvpteam/pvpteam.json
@@ -0,0 +1,26 @@
+{
+ "NAME": {
+ "selector": ".entry__pvpteam__name--team"
+ },
+ "DC": {
+ "selector": ".entry__pvpteam__name--dc"
+ },
+ "FORMED": {
+ "selector": ".entry__pvpteam__data--formed > script",
+ "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)"
+ },
+ "CREST_LAYERS": {
+ "BOTTOM": {
+ "selector": ".entry__pvpteam__crest__image > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": ".entry__pvpteam__crest__image > img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": ".entry__pvpteam__crest__image > img:nth-child(3)",
+ "attribute": "src"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/character.json b/ffxiv/lodestone-css-selectors-0.46.0/search/character.json
new file mode 100644
index 0000000..119e679
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/search/character.json
@@ -0,0 +1,50 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face > img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__link",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "LANG": {
+ "selector": ".entry__chara__lang"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "RANK": {
+ "selector": ".entry__chara_info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__chara_info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ }
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/cwls.json b/ffxiv/lodestone-css-selectors-0.46.0/search/cwls.json
new file mode 100644
index 0000000..7efe25a
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/search/cwls.json
@@ -0,0 +1,36 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "ID": {
+ "selector": ".entry__link--line",
+ "attribute": "href",
+ "regex": "/lodestone/crossworld_linkshell/(?P<ID>\\w*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "DC": {
+ "selector": ".entry__world"
+ },
+ "ACTIVE_MEMBERS": {
+ "selector": ".entry__linkshell__member > div > span"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/freecompany.json b/ffxiv/lodestone-css-selectors-0.46.0/search/freecompany.json
new file mode 100644
index 0000000..0d93137
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/search/freecompany.json
@@ -0,0 +1,69 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "CREST_LAYERS": {
+ "BOTTOM": {
+ "selector": ".entry__freecompany__crest__image > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": ".entry__freecompany__crest__image > img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": ".entry__freecompany__crest__image > img:nth-child(3)",
+ "attribute": "src"
+ }
+ },
+ "ID": {
+ "selector": ".entry__block",
+ "attribute": "href",
+ "regex": "/lodestone/freecompany/(?P<ID>\\d*)/"
+ },
+ "GRAND_COMPANY": {
+ "selector": ".entry__world:nth-child(1)"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "SERVER": {
+ "selector": ".entry__world:nth-child(3)",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ },
+ "ACTIVE": {
+ "selector": "li.entry__freecompany__fc-active:nth-child(4)",
+ "regex": "Active:\\s+(?P<State>\\w*)"
+ },
+ "ACTIVE_MEMBERS": {
+ "selector": ".entry__freecompany__fc-member"
+ },
+ "RECRUITMENT_OPEN": {
+ "selector": "li.entry__freecompany__fc-active:nth-child(5)",
+ "regex": "Recruitment:\\s+(?P<State>\\w*)"
+ },
+ "ESTATE_BUILT": {
+ "selector": ".entry__freecompany__fc-housing"
+ },
+ "FORMED": {
+ "selector": ".entry__freecompany__fc-day > script",
+ "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/linkshell.json b/ffxiv/lodestone-css-selectors-0.46.0/search/linkshell.json
new file mode 100644
index 0000000..5ff2015
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/search/linkshell.json
@@ -0,0 +1,37 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "ID": {
+ "selector": ".entry__link--line",
+ "attribute": "href",
+ "regex": "/lodestone/linkshell/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\((?P<DC>\\w*)\\)"
+ },
+ "ACTIVE_MEMBERS": {
+ "selector": ".entry__linkshell__member > div > span"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.46.0/search/pvpteam.json b/ffxiv/lodestone-css-selectors-0.46.0/search/pvpteam.json
new file mode 100644
index 0000000..ae1c51d
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.46.0/search/pvpteam.json
@@ -0,0 +1,47 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "CREST_LAYERS": {
+ "BOTTOM": {
+ "selector": ".entry__pvpteam__search__crest__image > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": ".entry__pvpteam__search__crest__image > img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": ".entry__pvpteam__search__crest__image > img:nth-child(3)",
+ "attribute": "src"
+ }
+ },
+ "ID": {
+ "selector": ".entry__block",
+ "attribute": "href",
+ "regex": "/lodestone/pvpteam/(?P<ID>\\w*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "DC": {
+ "selector": ".entry__world"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/LICENSE b/ffxiv/lodestone-css-selectors-0.52.0/LICENSE
new file mode 100644
index 0000000..fdddb29
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/LICENSE
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/README.md b/ffxiv/lodestone-css-selectors-0.52.0/README.md
new file mode 100644
index 0000000..da1fd4b
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/README.md
@@ -0,0 +1,26 @@
+# lodestone-css-selectors
+CSS selectors for The Lodestone. These selectors are all made for non-browser clients; they may break in various browsers
+due to DOM elements being injected by the browser itself. Please test them in a parser before reporting any errors.
+
+## Character Profile
+Do note that in Firefox, some page elements are slightly different from in other browsers. Use no user agent or try the provided ones in `meta.json`.
+
+### Character info (`profile/character.json`)
+Basic character data is on the main profile page.
+
+### Attributes (`profile/attributes.json`)
+Attribute data is on the main profile page.
+
+### Gearset (`profile/gearset.json`)
+Gearset data is on the main profile page.
+
+### Classjobs (`profile/classjob.json`)
+Classjob data is on the `/class_job` endpoint.
+
+### Mounts/Minions (`profile/minion.json` and `profile/mount.json`)
+Mount and minion data are on their own `/mount` and `/minion` endpoints, and need to be scraped using a mobile user agent. With a desktop UA, the mount/minion names are
+injected into the page with AJAX, and separate requests need to be made to get every single one.
+
+### Achievements (`profile/achievements.json`)
+Achievements are on the `/achievement` endpoint. Use the list selector to get the list of achievements on the page, and then get their IDs from the `href` attribute
+of the link. Use the next button's selector to request the next page and scrape the next set of achievements until the href is `javascript:void(0);`.
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/cwls/cwls.json b/ffxiv/lodestone-css-selectors-0.52.0/cwls/cwls.json
new file mode 100644
index 0000000..4c4b007
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/cwls/cwls.json
@@ -0,0 +1,9 @@
+{
+ "NAME": {
+ "selector": ".heading__linkshell__name",
+ "regex": "\\s*(?P<Name>\\S*)"
+ },
+ "DC": {
+ "selector": ".heading__cwls__dcname"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/cwls/members.json b/ffxiv/lodestone-css-selectors-0.52.0/cwls/members.json
new file mode 100644
index 0000000..05e7e41
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/cwls/members.json
@@ -0,0 +1,51 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__link",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "RANK": {
+ "selector": ".entry__chara_info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__chara_info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "LINKSHELL_RANK": {
+ "selector": ".entry__chara_info__linkshell > span"
+ },
+ "LINKSHELL_RANK_ICON": {
+ "selector": ".entry__chara_info__linkshell > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(5) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager:nth-child(5) > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/focus.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/focus.json
new file mode 100644
index 0000000..44850be
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/focus.json
@@ -0,0 +1,131 @@
+{
+ "NOT_SPECIFIED": {
+ "selector": "p.freecompany__text:nth-child(7)"
+ },
+ "RP": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(1)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "LEVELING": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(2) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "CASUAL": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(3)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "HARDCORE": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(4)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "DUNGEONS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(5)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "GUILDHESTS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(6)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "TRIALS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(7)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "RAIDS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(8)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ },
+ "PVP": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(7) > li:nth-child(9)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/freecompany.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/freecompany.json
new file mode 100644
index 0000000..63cc831
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/freecompany.json
@@ -0,0 +1,80 @@
+{
+ "ACTIVE_STATE": {
+ "selector": "p.freecompany__text:nth-child(3)",
+ "regex": "\\s*(?P<ActiveState>\\S+\\s?\\S*)"
+ },
+ "ACTIVE_MEMBER_COUNT": {
+ "selector": "p.freecompany__text:nth-child(12)"
+ },
+ "CREST_LAYERS": {
+ "BOTTOM": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > img:nth-child(3)",
+ "attribute": "src"
+ }
+ },
+ "ESTATE": {
+ "NO_ESTATE": {
+ "selector": ".freecompany__estate__none"
+ },
+ "GREETING": {
+ "selector": ".freecompany__estate__greeting"
+ },
+ "NAME": {
+ "selector": ".freecompany__estate__name"
+ },
+ "PLOT": {
+ "selector": ".freecompany__estate__text"
+ }
+ },
+ "FORMED": {
+ "selector": "p.freecompany__text:nth-child(10) > script",
+ "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)"
+ },
+ "GRAND_COMPANY": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(2) > p:nth-child(1)",
+ "regex": "(?P<Name>\\w.*)<(?P<Rank>\\w*)>"
+ },
+ "ID": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1)",
+ "attribute": "href",
+ "regex": "/lodestone/freecompany/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".freecompany__text__name"
+ },
+ "RANK": {
+ "selector": "p.freecompany__text:nth-child(14)"
+ },
+ "RANKING": {
+ "WEEKLY": {
+ "selector": ".character__ranking__data tr:nth-child(1) > th:nth-child(1)",
+ "regex": "Weekly Rank:(?P<Rank>.+) \\(previous week\\)"
+ },
+ "MONTHLY": {
+ "selector": ".character__ranking__data tr:nth-child(2) > th:nth-child(1)",
+ "regex": "Monthly Rank:(?P<Rank>.*) \\(previous month\\)"
+ }
+ },
+ "RECRUITMENT": {
+ "selector": "p.freecompany__text:nth-child(5)",
+ "regex": "\\s*(?P<ActiveState>\\S*)"
+ },
+ "SERVER": {
+ "selector": "div.ldst__window:nth-child(1) > div:nth-child(2) > a:nth-child(1) > div:nth-child(2) > p:nth-child(3)",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ },
+ "SLOGAN": {
+ "selector": ".freecompany__text__message"
+ },
+ "TAG": {
+ "selector": ".freecompany__text.freecompany__text__tag"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/members.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/members.json
new file mode 100644
index 0000000..aa7c897
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/members.json
@@ -0,0 +1,51 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "li.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face > img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__bg",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "FC_RANK": {
+ "selector": ".entry__freecompany__info > li:nth-child(1) > span"
+ },
+ "FC_RANK_ICON": {
+ "selector": ".entry__freecompany__info > li:nth-child(1) > img",
+ "attribute": "src"
+ },
+ "RANK": {
+ "selector": ".entry__freecompany__info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__freecompany__info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(4) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager:nth-child(4) > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/reputation.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/reputation.json
new file mode 100644
index 0000000..c88df40
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/reputation.json
@@ -0,0 +1,41 @@
+{
+ "MAELSTROM": {
+ "NAME": {
+ "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > p:nth-child(1)"
+ },
+ "PROGRESS": {
+ "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)",
+ "attribute": "style",
+ "regex": "width:(?P<Progress>\\d+)%;"
+ },
+ "RANK": {
+ "selector": "div.freecompany__reputation:nth-child(16) > div:nth-child(2) > p:nth-child(2)"
+ }
+ },
+ "ADDERS": {
+ "NAME": {
+ "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > p:nth-child(1)"
+ },
+ "PROGRESS": {
+ "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)",
+ "attribute": "style",
+ "regex": "width:(?P<Progress>\\d+)%;"
+ },
+ "RANK": {
+ "selector": "div.freecompany__reputation:nth-child(17) > div:nth-child(2) > p:nth-child(2)"
+ }
+ },
+ "FLAMES": {
+ "NAME": {
+ "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > p:nth-child(1)"
+ },
+ "PROGRESS": {
+ "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1)",
+ "attribute": "style",
+ "regex": "width:(?P<Progress>\\d+)%;"
+ },
+ "RANK": {
+ "selector": "div.freecompany__reputation:nth-child(18) > div:nth-child(2) > p:nth-child(2)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/freecompany/seeking.json b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/seeking.json
new file mode 100644
index 0000000..164c01a
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/freecompany/seeking.json
@@ -0,0 +1,75 @@
+{
+ "NOT_SPECIFIED": {
+ "selector": "p.parts__text:nth-child(9)"
+ },
+ "TANK": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(1) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ },
+ "HEALER": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(2) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ },
+ "DPS": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(3) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ },
+ "CRAFTER": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(4) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ },
+ "GATHERER": {
+ "NAME": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5) > p:nth-child(2)"
+ },
+ "STATUS": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5)",
+ "attribute": "class",
+ "regex": "freecompany__focus_icon--(?P<Status>off)"
+ },
+ "ICON": {
+ "selector": "ul.freecompany__focus_icon:nth-child(9) > li:nth-child(5) > div:nth-child(1) > img:nth-child(1)",
+ "attribute": "src"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/linkshell/ls.json b/ffxiv/lodestone-css-selectors-0.52.0/linkshell/ls.json
new file mode 100644
index 0000000..c33ccb5
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/linkshell/ls.json
@@ -0,0 +1,5 @@
+{
+ "NAME": {
+ "selector": ".heading__linkshell__name"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/linkshell/members.json b/ffxiv/lodestone-css-selectors-0.52.0/linkshell/members.json
new file mode 100644
index 0000000..05e7e41
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/linkshell/members.json
@@ -0,0 +1,51 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__link",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "RANK": {
+ "selector": ".entry__chara_info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__chara_info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "LINKSHELL_RANK": {
+ "selector": ".entry__chara_info__linkshell > span"
+ },
+ "LINKSHELL_RANK_ICON": {
+ "selector": ".entry__chara_info__linkshell > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(5) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager:nth-child(5) > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/meta.json b/ffxiv/lodestone-css-selectors-0.52.0/meta.json
new file mode 100644
index 0000000..4b40bd8
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/meta.json
@@ -0,0 +1,35 @@
+{
+ "version": "0.45.0",
+ "userAgentDesktop": "curl/7.73.0",
+ "userAgentMobile": "Mozilla/5.0 (iPhone; CPU OS 10_15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/14E304 Safari/605.1.15",
+ "applicableUris": {
+ "freecompany/focus.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/",
+ "freecompany/freecompany.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/",
+ "freecompany/members.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/member/",
+ "freecompany/reputation.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/",
+ "freecompany/seeking.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/%s/",
+
+ "cwls/cwls.json": "https://%s.finalfantasyxiv.com/lodestone/crossworld_linkshell/%s/",
+ "cwls/members.json": "https://%s.finalfantasyxiv.com/lodestone/crossworld_linkshell/%s/",
+
+ "linkshell/ls.json": "https://%s.finalfantasyxiv.com/lodestone/linkshell/%s/",
+ "linkshell/members.json": "https://%s.finalfantasyxiv.com/lodestone/linkshell/%s/",
+
+ "profile/achievements.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/achievement/",
+ "profile/attributes.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/",
+ "profile/character.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/",
+ "profile/classjob.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/class_job/",
+ "profile/gearset.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/",
+ "profile/minion.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/minion/",
+ "profile/mount.json": "https://%s.finalfantasyxiv.com/lodestone/character/%d/mount/",
+
+ "pvpteam/members.json": "https://%s.finalfantasyxiv.com/lodestone/pvpteam/%s/",
+ "pvpteam/pvpteam.json": "https://%s.finalfantasyxiv.com/lodestone/pvpteam/%s/",
+
+ "search/character.json": "https://%s.finalfantasyxiv.com/lodestone/character/",
+ "search/cwls.json": "https://%s.finalfantasyxiv.com/lodestone/crossworld_linkshell/",
+ "search/freecompany.json": "https://%s.finalfantasyxiv.com/lodestone/freecompany/",
+ "search/linkshell.json": "https://%s.finalfantasyxiv.com/lodestone/linkshell/",
+ "search/pvpteam.json": "https://%s.finalfantasyxiv.com/lodestone/pvpteam/"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/achievements.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/achievements.json
new file mode 100644
index 0000000..5db2e02
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/achievements.json
@@ -0,0 +1,45 @@
+{
+ "ROOT": {
+ "selector": ".ldst__achievement"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": ".entry",
+ "multiple": true
+ },
+ "NAME": {
+ "selector": ".entry__activity__txt",
+ "regex": "(?P<NameEU>.*)"
+ },
+ "ID": {
+ "selector": ".entry__achievement",
+ "attribute": "href",
+ "regex": "/lodestone/character/\\d*/achievement/detail/(?P<ID>\\d*)/"
+ },
+ "TIME": {
+ "selector": ".entry__activity__time > script",
+ "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(2) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager:nth-child(2) > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ },
+ "TOTAL_ACHIEVEMENTS": {
+ "selector": ".parts__total",
+ "regex": "(?P<TotalAchievements>[0-9]*) \\D+"
+ },
+ "ACHIEVEMENT_POINTS": {
+ "selector": ".achievement__point"
+ },
+ "ACTIVITY_DESCRIPTION": {
+ "selector": ".entry__activity__txt"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/attributes.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/attributes.json
new file mode 100644
index 0000000..c031c20
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/attributes.json
@@ -0,0 +1,62 @@
+{
+ "STRENGTH": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "DEXTERITY": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "VITALITY": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(3) > td:nth-child(2)"
+ },
+ "INTELLIGENCE": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(4) > td:nth-child(2)"
+ },
+ "MIND": {
+ "selector": "table.character__param__list:nth-child(2) tr:nth-child(5) > td:nth-child(2)"
+ },
+ "CRITICAL_HIT_RATE": {
+ "selector": "table.character__param__list:nth-child(4) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "DETERMINATION": {
+ "selector": "table.character__param__list:nth-child(4) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "DIRECT_HIT_RATE": {
+ "selector": "table.character__param__list:nth-child(4) tr:nth-child(3) > td:nth-child(2)"
+ },
+ "DEFENSE": {
+ "selector": "table.character__param__list:nth-child(6) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "MAGIC_DEFENSE": {
+ "selector": "table.character__param__list:nth-child(6) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "ATTACK_POWER": {
+ "selector": "table.character__param__list:nth-child(8) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "SKILL_SPEED": {
+ "selector": "table.character__param__list:nth-child(8) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "ATTACK_MAGIC_POTENCY": {
+ "selector": "table.character__param__list:nth-child(10) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "HEALING_MAGIC_POTENCY": {
+ "selector": "table.character__param__list:nth-child(10) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "SPELL_SPEED": {
+ "selector": "table.character__param__list:nth-child(10) tr:nth-child(3) > td:nth-child(2)"
+ },
+ "TENACITY": {
+ "selector": "table.character__param__list:nth-child(12) tr:nth-child(1) > td:nth-child(2)"
+ },
+ "PIETY": {
+ "selector": "table.character__param__list:nth-child(12) tr:nth-child(2) > td:nth-child(2)"
+ },
+ "HP": {
+ "selector": ".character__param > ul:nth-child(1) > li:nth-child(1) > div:nth-child(1) > span:nth-child(2)"
+ },
+ "MP_GP_CP": {
+ "selector": ".character__param > ul:nth-child(1) > li:nth-child(2) > div:nth-child(1) > span:nth-child(2)"
+ },
+ "MP_GP_CP_PARAMETER_NAME": {
+ "selector": ".character__param > ul > li:nth-child(2) .character__param__text"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/character.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/character.json
new file mode 100644
index 0000000..6d2ab92
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/character.json
@@ -0,0 +1,110 @@
+{
+ "ACTIVE_CLASSJOB": {
+ "selector": ".character__class_icon > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "ACTIVE_CLASSJOB_LEVEL": {
+ "selector": ".character__class__data > p:nth-child(1)",
+ "regex": "LEVEL (?P<Level>\\d*)"
+ },
+ "AVATAR": {
+ "selector": ".frame__chara__face > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "BIO": {
+ "selector": ".character__selfintroduction"
+ },
+ "CLASSJOB_ICONS": {
+ "ROOT": {
+ "selector": "li",
+ "multiple": true
+ }
+ },
+ "FREE_COMPANY": {
+ "NAME": {
+ "selector": ".character__freecompany__name > h4:nth-child(2)"
+ },
+ "ICON_LAYERS": {
+ "BOTTOM": {
+ "selector": "div.character__freecompany__crest > div > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": "div.character__freecompany__crest > div > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": "div.character__freecompany__crest > div > img:nth-child(1)",
+ "attribute": "src"
+ }
+ }
+ },
+ "GRAND_COMPANY": {
+ "selector": "div.character-block:nth-child(4) > div:nth-child(2) > p:nth-child(2)",
+ "regex": "(?P<Name>\\S*) \/ (?P<Rank>.*)"
+ },
+ "GUARDIAN_DEITY": {
+ "NAME": {
+ "selector": "p.character-block__name:nth-child(4)"
+ },
+ "ICON": {
+ "selector": "#character > div.character__content.selected > div.character__profile.clearfix > div.character__profile__data > div:nth-child(1) > div > div:nth-child(2) > img",
+ "attribute": "src"
+ }
+ },
+ "GENDER": {
+ "selector": "p.character-block__name:nth-child(2)",
+ "regex": "(.$)"
+ },
+ "NAME": {
+ "selector": "div.frame__chara__box:nth-child(2) > .frame__chara__name"
+ },
+ "NAMEDAY": {
+ "selector": ".character-block__birth"
+ },
+ "PORTRAIT": {
+ "selector": ".js__image_popup > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "PVP_TEAM": {
+ "NAME": {
+ "selector": ".character__pvpteam__name > h4:nth-child(2) > a:nth-child(1)",
+ "attribute": "href",
+ "regex": "/lodestone/pvpteam/(?P<ID>.+)/"
+ },
+ "ICON_LAYERS": {
+ "BOTTOM": {
+ "selector": ".character__pvpteam__crest__image img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": ".character__pvpteam__crest__image img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": ".character__pvpteam__crest__image img:nth-child(3)",
+ "attribute": "src"
+ }
+ }
+ },
+ "RACE_CLAN_GENDER": {
+ "selector": "div.character-block:nth-child(1) > div:nth-child(2) > p:nth-child(2)",
+ "regex": "(?P<Race>.*)(?P<Tribe>.*) \\/ (?P<Gender>.)"
+ },
+ "SERVER": {
+ "selector": "p.frame__chara__world:last-of-type",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ },
+ "TITLE": {
+ "selector": ".frame__chara__title"
+ },
+ "TOWN": {
+ "NAME": {
+ "selector": "div.character-block:nth-child(3) > div:nth-child(2) > p:nth-child(2)"
+ },
+ "ICON": {
+ "selector": "#character > div.character__content.selected > div.character__profile.clearfix > div.character__profile__data > div:nth-child(1) > div > div:nth-child(3) > img",
+ "attribute": "src"
+ }
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob.json
new file mode 100644
index 0000000..9a0c80a
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob.json
@@ -0,0 +1,550 @@
+{
+ "BOZJA": {
+ "LEVEL": {
+ "selector": "div.character__content > div:nth-child(7) > div.character__job__level"
+ },
+ "NAME": {
+ "selector": "div.character__content > div:nth-child(7) > div.character__job__name"
+ },
+ "METTLE": {
+ "selector": "div.character__content > div:nth-child(7) > div.character__job__exp",
+ "regex": "(?P<Mettle>\\S+) \\/"
+ }
+ },
+ "EUREKA": {
+ "LEVEL": {
+ "selector": "div.character__content > div:nth-child(9) > div.character__job__level"
+ },
+ "NAME": {
+ "selector": "div.character__content > div:nth-child(9) > div.character__job__name"
+ },
+ "EXP": {
+ "selector": "div.character__content > div:nth-child(9) > div.character__job__exp",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.character__content > div:nth-child(9) > div.character__job__exp",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "PALADIN": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "WARRIOR": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DARKKNIGHT": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "GUNBREAKER": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "MONK": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DRAGOON": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "NINJA": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SAMURAI": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "REAPER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "WHITEMAGE": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SCHOLAR": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "ASTROLOGIAN": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SAGE": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BARD": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "MACHINIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DANCER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BLACKMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SUMMONER": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "REDMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BLUEMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "CARPENTER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "BLACKSMITH": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "ARMORER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "GOLDSMITH": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "LEATHERWORKER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "WEAVER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "ALCHEMIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "CULINARIAN": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ },
+ "SPECIALIST": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3).character__job__name--meister"
+ }
+ },
+ "MINER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BOTANIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "FISHER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "EXP_MAX": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "\\/ (?P<MaxEXP>\\S+)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob_original.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob_original.json
new file mode 100644
index 0000000..3c8f537
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/classjob_original.json
@@ -0,0 +1,398 @@
+{
+ "BOZJA": {
+ "LEVEL": {
+ "selector": "div.character__job__list:nth-child(7) > div:nth-child(2)"
+ },
+ "METTLE": {
+ "selector": "div.character__job__list:nth-child(7) > div:nth-child(4)",
+ "regex": "(?P<Mettle>\\S+) \\/"
+ },
+ "NAME": {
+ "selector": "div.character__job__list:nth-child(7) > div:nth-child(3)"
+ }
+ },
+ "EUREKA": {
+ "EXP": {
+ "selector": "div.character__job__list:nth-child(9) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ },
+ "LEVEL": {
+ "selector": "div.character__job__list:nth-child(9) > div:nth-child(2)"
+ },
+ "NAME": {
+ "selector": "div.character__job__list:nth-child(9) > div:nth-child(3)"
+ }
+ },
+ "PALADIN": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "WARRIOR": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DARKKNIGHT": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "GUNBREAKER": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "WHITEMAGE": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SCHOLAR": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "ASTROLOGIAN": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SAGE": {
+ "LEVEL": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": ".character__content > div:nth-child(2) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "MONK": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DRAGOON": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "NINJA": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SAMURAI": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "REAPER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BARD": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "MACHINIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "DANCER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(3) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BLACKMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "SUMMONER": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "REDMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BLUEMAGE": {
+ "LEVEL": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "ul.character__job:nth-child(4) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "CARPENTER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BLACKSMITH": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "ARMORER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "GOLDSMITH": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(4) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "LEATHERWORKER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(5) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "WEAVER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(6) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "ALCHEMIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(7) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "CULINARIAN": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(1) > ul:nth-child(2) > li:nth-child(8) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "MINER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "BOTANIST": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(2) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ },
+ "FISHER": {
+ "LEVEL": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(2)"
+ },
+ "UNLOCKSTATE": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(3)"
+ },
+ "EXP": {
+ "selector": "div.clearfix:nth-child(5) > div:nth-child(2) > ul:nth-child(2) > li:nth-child(3) > div:nth-child(4)",
+ "regex": "(?P<CurrentEXP>\\S+) \\/ (?P<MaxEXP>\\S+)"
+ }
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/gearset.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/gearset.json
new file mode 100644
index 0000000..9488f7d
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/gearset.json
@@ -0,0 +1,527 @@
+{
+ "MAINHAND": {
+ "NAME": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--0 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "OFFHAND": {
+ "NAME": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--1 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "HEAD": {
+ "NAME": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--2 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "BODY": {
+ "NAME": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--3 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "HANDS": {
+ "NAME": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--4 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "WAIST": {
+ "NAME": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--5 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "LEGS": {
+ "NAME": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--6 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "FEET": {
+ "NAME": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--7 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "EARRINGS": {
+ "NAME": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--8 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "NECKLACE": {
+ "NAME": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--9 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "BRACELETS": {
+ "NAME": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--10 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "RING1": {
+ "NAME": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--11 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "RING2": {
+ "NAME": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ },
+ "DB_LINK": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > a:nth-child(1)"
+ },
+ "MIRAGE_NAME": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2)"
+ },
+ "MIRAGE_DB_LINK": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > p:nth-child(2) > a:nth-child(1)"
+ },
+ "STAIN": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1)"
+ },
+ "MATERIA_1": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(1) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_2": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(2) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_3": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(3) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_4": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(4) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "MATERIA_5": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > ul:nth-child(7) > li:nth-child(5) > div:nth-child(2)",
+ "regex": "(?P<Name>.*)<br/>"
+ },
+ "CREATOR_NAME": {
+ "selector": ".icon-c--12 > .db-tooltip > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > a:nth-child(1)"
+ }
+ },
+ "SOULCRYSTAL": {
+ "NAME": {
+ "selector": ".icon-c--13 > div:nth-child(3) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > h2:nth-child(2)"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/minion.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/minion.json
new file mode 100644
index 0000000..05e22de
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/minion.json
@@ -0,0 +1,18 @@
+{
+ "MINIONS": {
+ "ROOT": {
+ "selector": ".minion__list__item",
+ "multiple": true
+ },
+ "NAME": {
+ "selector": ".minion__name"
+ },
+ "ICON": {
+ "selector": ".minion__list__icon__image",
+ "attribute": "src"
+ }
+ },
+ "TOTAL": {
+ "selector": ".minion__sort__total > span:nth-child(1)"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/profile/mount.json b/ffxiv/lodestone-css-selectors-0.52.0/profile/mount.json
new file mode 100644
index 0000000..5bca606
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/profile/mount.json
@@ -0,0 +1,18 @@
+{
+ "MOUNTS": {
+ "ROOT": {
+ "selector": ".mount__list__item",
+ "multiple": true
+ },
+ "NAME": {
+ "selector": ".mount__name"
+ },
+ "ICON": {
+ "selector": ".mount__list__icon__image",
+ "attribute": "src"
+ }
+ },
+ "TOTAL": {
+ "selector": ".minion__sort__total > span:nth-child(1)"
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/members.json b/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/members.json
new file mode 100644
index 0000000..2dd507f
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/members.json
@@ -0,0 +1,39 @@
+{
+ "ROOT": {
+ "selector": ".pvpteam__member"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__bg",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "MATCHES": {
+ "selector": ".entry__freecompany__info > li:last-of-type > span"
+ },
+ "RANK": {
+ "selector": ".entry__freecompany__info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__freecompany__info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ }
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/pvpteam.json b/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/pvpteam.json
new file mode 100644
index 0000000..6bb7cf8
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/pvpteam/pvpteam.json
@@ -0,0 +1,26 @@
+{
+ "NAME": {
+ "selector": ".entry__pvpteam__name--team"
+ },
+ "DC": {
+ "selector": ".entry__pvpteam__name--dc"
+ },
+ "FORMED": {
+ "selector": ".entry__pvpteam__data--formed > script",
+ "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)"
+ },
+ "CREST_LAYERS": {
+ "BOTTOM": {
+ "selector": ".entry__pvpteam__crest__image > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": ".entry__pvpteam__crest__image > img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": ".entry__pvpteam__crest__image > img:nth-child(3)",
+ "attribute": "src"
+ }
+ }
+} \ No newline at end of file
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/character.json b/ffxiv/lodestone-css-selectors-0.52.0/search/character.json
new file mode 100644
index 0000000..7ae9c00
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/search/character.json
@@ -0,0 +1,50 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "AVATAR": {
+ "selector": ".entry__chara__face > img",
+ "attribute": "src"
+ },
+ "ID": {
+ "selector": ".entry__link",
+ "attribute": "href",
+ "regex": "/lodestone/character/(?P<ID>\\d*)/"
+ },
+ "LANG": {
+ "selector": ".entry__chara__lang"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "RANK": {
+ "selector": ".entry__chara_info > .js__tooltip",
+ "attribute": "data-tooltip",
+ "regex": "/ (?P<RankName>.+)"
+ },
+ "RANK_ICON": {
+ "selector": ".entry__chara_info > .js__tooltip > img",
+ "attribute": "src"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ }
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/cwls.json b/ffxiv/lodestone-css-selectors-0.52.0/search/cwls.json
new file mode 100644
index 0000000..7efe25a
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/search/cwls.json
@@ -0,0 +1,36 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "ID": {
+ "selector": ".entry__link--line",
+ "attribute": "href",
+ "regex": "/lodestone/crossworld_linkshell/(?P<ID>\\w*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "DC": {
+ "selector": ".entry__world"
+ },
+ "ACTIVE_MEMBERS": {
+ "selector": ".entry__linkshell__member > div > span"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/freecompany.json b/ffxiv/lodestone-css-selectors-0.52.0/search/freecompany.json
new file mode 100644
index 0000000..90f0bbe
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/search/freecompany.json
@@ -0,0 +1,69 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "CREST_LAYERS": {
+ "BOTTOM": {
+ "selector": ".entry__freecompany__crest__image > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": ".entry__freecompany__crest__image > img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": ".entry__freecompany__crest__image > img:nth-child(3)",
+ "attribute": "src"
+ }
+ },
+ "ID": {
+ "selector": ".entry__block",
+ "attribute": "href",
+ "regex": "/lodestone/freecompany/(?P<ID>\\d*)/"
+ },
+ "GRAND_COMPANY": {
+ "selector": ".entry__world:nth-child(1)"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "SERVER": {
+ "selector": ".entry__world:nth-child(3)",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ },
+ "ACTIVE": {
+ "selector": "li.entry__freecompany__fc-active:nth-child(4)",
+ "regex": "Active:\\s+(?P<State>\\w*)"
+ },
+ "ACTIVE_MEMBERS": {
+ "selector": ".entry__freecompany__fc-member"
+ },
+ "RECRUITMENT_OPEN": {
+ "selector": "li.entry__freecompany__fc-active:nth-child(5)",
+ "regex": "Recruitment:\\s+(?P<State>\\w*)"
+ },
+ "ESTATE_BUILT": {
+ "selector": ".entry__freecompany__fc-housing"
+ },
+ "FORMED": {
+ "selector": ".entry__freecompany__fc-day > script",
+ "regex": ".*ldst_strftime\\((?P<Timestamp>\\d*)"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/linkshell.json b/ffxiv/lodestone-css-selectors-0.52.0/search/linkshell.json
new file mode 100644
index 0000000..f9c6bc0
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/search/linkshell.json
@@ -0,0 +1,37 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "ID": {
+ "selector": ".entry__link--line",
+ "attribute": "href",
+ "regex": "/lodestone/linkshell/(?P<ID>\\d*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "SERVER": {
+ "selector": ".entry__world",
+ "regex": "(?P<World>\\w*)\\s+\\[(?P<DC>\\w*)\\]"
+ },
+ "ACTIVE_MEMBERS": {
+ "selector": ".entry__linkshell__member > div > span"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/lodestone-css-selectors-0.52.0/search/pvpteam.json b/ffxiv/lodestone-css-selectors-0.52.0/search/pvpteam.json
new file mode 100644
index 0000000..ae1c51d
--- /dev/null
+++ b/ffxiv/lodestone-css-selectors-0.52.0/search/pvpteam.json
@@ -0,0 +1,47 @@
+{
+ "ROOT": {
+ "selector": ".ldst__window"
+ },
+ "ENTRY": {
+ "ROOT": {
+ "selector": "div.entry",
+ "multiple": true
+ },
+ "CREST_LAYERS": {
+ "BOTTOM": {
+ "selector": ".entry__pvpteam__search__crest__image > img:nth-child(1)",
+ "attribute": "src"
+ },
+ "MIDDLE": {
+ "selector": ".entry__pvpteam__search__crest__image > img:nth-child(2)",
+ "attribute": "src"
+ },
+ "TOP": {
+ "selector": ".entry__pvpteam__search__crest__image > img:nth-child(3)",
+ "attribute": "src"
+ }
+ },
+ "ID": {
+ "selector": ".entry__block",
+ "attribute": "href",
+ "regex": "/lodestone/pvpteam/(?P<ID>\\w*)/"
+ },
+ "NAME": {
+ "selector": ".entry__name"
+ },
+ "DC": {
+ "selector": ".entry__world"
+ }
+ },
+ "PAGE_INFO": {
+ "selector": "ul.btn__pager:nth-child(6) > li:nth-child(3)",
+ "regex": "\\D*(?P<CurrentPage>\\d+)\\D*(?P<NumPages>\\d+)"
+ },
+ "LIST_NEXT_BUTTON": {
+ "selector": "ul.btn__pager > li:nth-child(4) > a:nth-child(1)",
+ "attribute": "href"
+ },
+ "NO_RESULTS_FOUND": {
+ "selector": ".parts__zero"
+ }
+}
diff --git a/ffxiv/pystone/__init__.py b/ffxiv/pystone/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ffxiv/pystone/__init__.py
diff --git a/ffxiv/pystone/character.py b/ffxiv/pystone/character.py
new file mode 100644
index 0000000..200baeb
--- /dev/null
+++ b/ffxiv/pystone/character.py
@@ -0,0 +1,20 @@
+from typing import List, Optional, Tuple
+
+from requests import Session
+
+from pystone.definition import Definition
+
+
+class Character:
+ def __init__(self, *, definitions: List[Definition]):
+ self.definitions = {(x.name): x for x in definitions}
+
+ def __getattr__(self, name):
+ if name in self.definitions:
+ return self.definitions[name]
+
+ def to_json(self):
+ json = {}
+ for definition in self.definitions.values():
+ json.update(definition.to_json())
+ return json
diff --git a/ffxiv/pystone/cli/client.py b/ffxiv/pystone/cli/client.py
new file mode 100644
index 0000000..1f31f58
--- /dev/null
+++ b/ffxiv/pystone/cli/client.py
@@ -0,0 +1,6 @@
+# from sys import argv
+
+import pystone
+
+if __name__ == '__main__':
+ print(dir(pystone))
diff --git a/ffxiv/pystone/definition.py b/ffxiv/pystone/definition.py
new file mode 100644
index 0000000..3b4c5eb
--- /dev/null
+++ b/ffxiv/pystone/definition.py
@@ -0,0 +1,161 @@
+from pathlib import Path
+from typing import Dict, Union, Generic, TypeVar, Optional
+from json import loads
+from re import compile
+
+from bs4 import BeautifulSoup
+from requests import Session
+
+T = TypeVar('T')
+
+
+class Reference(Generic[T]):
+ """Represents a reference to something which may not exist yet."""
+ def __init__(self, initial_value: Optional[T] = None):
+ self._value = initial_value
+
+ @property
+ def value(self) -> Optional[T]:
+ return self._value
+
+ @value.setter
+ def value(self, new_value: T):
+ self._value = new_value
+
+
+class Element:
+ """An element is something that has a selector property with other optional properties that refine that selection"""
+ def __init__(self, name: str, data: Dict[str, str]):
+ self.name = name
+ self.selector = data['selector'] # I want this to error
+ self.regex = None
+ self.attribute = None
+
+ if 'regex' in data:
+ self.regex = compile(data['regex'])
+ elif 'attribute' in data:
+ self.attribute = data['attribute']
+
+ def process(self, soup: BeautifulSoup) -> str:
+ selection = soup.select_one(self.selector)
+ if self.attribute is not None:
+ # TODO: this is fragile; fix
+ try:
+ text = selection[self.attribute]
+ except TypeError: # NoneType
+ text = ''
+ else:
+ try:
+ text = selection.text
+ except AttributeError: # NoneType
+ text = ''
+
+ if self.regex is not None:
+ # TODO: this is fragile; fix
+ try:
+ return self.regex.search(text).group(1)
+ except AttributeError: # NoneType
+ return ''
+ else:
+ return text
+
+ def __repr__(self):
+ return f'<Element:{self.name}>'
+
+
+class Container:
+ """A container contains multiple elements or even other containers"""
+ def __init__(self, name: str, soup_ref: Reference[BeautifulSoup] = Reference()):
+ self.name = name
+ self.entries = {}
+ self.soup_ref = soup_ref
+ self.selector_root = None
+
+ def add(self, name: str, data: Union['Container', Element]):
+ # TODO: raise error on overwriting key
+ self.entries[name] = data
+
+ def __getattr__(self, name):
+ if name in self.entries:
+ entry = self.entries[name]
+ if isinstance(entry, Element):
+ return entry.process(self.soup_ref.value)
+ return self.entries[name]
+
+ def __iter__(self):
+ def internal_iterator():
+ for entry in self.entries:
+ yield entry
+ return internal_iterator()
+
+ def to_json(self):
+ json = {self.name: {}}
+ for entry in self.entries.values():
+ if isinstance(entry, Element):
+ json[self.name].update({entry.name: entry.process(self.soup_ref.value)})
+ else: # container
+ json[self.name].update({entry.name: entry.to_json()})
+
+ return json
+
+ def set_selector_root(self, root):
+ self.selector_root = root
+
+ def contains(self):
+ """returns a list of everything this container contains"""
+ return self.entries.keys()
+
+ def __dir__(self):
+ return self.entries.keys()
+
+ def __repr__(self):
+ return f'<Container:{self.name}>'
+
+
+class Definition:
+ """Takes in a json definition file and stores its name/definition"""
+ def __init__(self, path: Union[str, Path], fmt_url: str, *, session: Optional[Session] = Session()):
+ if isinstance(path, str):
+ path = Path(path)
+ if path.suffix != '.json':
+ raise Exception('something is wrong.. why is this loading a non-json file?')
+ self.fmt_url = fmt_url
+ self.name = path.stem
+ self.tree = Container(self.name)
+ self.session = session
+
+ with open(path.expanduser()) as f:
+ json_data = loads(f.read())
+ self._build_tree(json_data, self.tree)
+
+ def _build_tree(self, json_data, root: Container):
+ for k, v in json_data.items():
+ if 'selector' in v:
+ # we're making an element to add to our container
+ root.add(k.lower(), Element(
+ k.lower(),
+ v
+ ))
+ else:
+ # build a new Container and recurse
+ c = Container(k.lower())
+ # if 'ROOT' in k:
+ # selector_root = k['ROOT']['selector']
+
+ self._build_tree(v, root=c)
+ root.add(k.lower(), c)
+
+ def process(self, vars: Dict[str, str]):
+ response = self.session.get(
+ self.fmt_url % vars
+ )
+ response.raise_for_status()
+ with open(self.name + '.html', 'w', encoding='utf-8') as f:
+ f.write(response.text)
+ self.tree.soup_ref.value = BeautifulSoup(response.text, features="html.parser")
+
+ def to_json(self):
+ return self.tree.to_json()
+
+ def __getattr__(self, name):
+ return getattr(self.tree, name)
diff --git a/ffxiv/pystone/free_company.py b/ffxiv/pystone/free_company.py
new file mode 100644
index 0000000..4560fb3
--- /dev/null
+++ b/ffxiv/pystone/free_company.py
@@ -0,0 +1,5 @@
+from pystone.definition import Definition
+
+class FCDefinition(Definition):
+ """FC-specific implementation of a definition"""
+ # don't make me do this Kara \ No newline at end of file
diff --git a/ffxiv/pystone/lodestone.py b/ffxiv/pystone/lodestone.py
new file mode 100644
index 0000000..3f48c2b
--- /dev/null
+++ b/ffxiv/pystone/lodestone.py
@@ -0,0 +1,39 @@
+from typing import Union, List
+from pathlib import Path
+from json import loads
+
+from requests_cache import CachedSession as Session
+# from requests import Session
+
+from pystone.types import MetaDict
+from pystone.definition import Definition
+from pystone.character import Character
+
+LODESTONE_BASE_URL = 'finalfantasyxiv.com/lodestone'
+
+
+class Lodestone:
+ def __init__(self, *, json_base: Union[str, Path]):
+ if isinstance(json_base, str):
+ json_base = Path(json_base)
+ self.json_base: Path = json_base
+
+ # read meta.json
+ with open(json_base / 'meta.json') as f:
+ self.meta: MetaDict = loads(f.read())
+ self.session = Session()
+ # self.session.headers.update({
+ # 'User-Agent': self.meta['userAgentDesktop']
+ # })
+
+ def get_character_by_id(self, id: Union[str, int]) -> None:
+ profile_json_files = (self.json_base / 'profile').expanduser().glob('*.json')
+ definitions: List[Definition] = []
+
+ for profile in profile_json_files:
+ url = self.meta['applicableUris'][f'profile/{profile.name}']
+ d = Definition(profile, url, session=self.session)
+ d.process({'id': str(id)})
+ definitions.append(d)
+
+ return Character(definitions=definitions)
diff --git a/ffxiv/pystone/types.py b/ffxiv/pystone/types.py
new file mode 100644
index 0000000..5fa7da6
--- /dev/null
+++ b/ffxiv/pystone/types.py
@@ -0,0 +1,11 @@
+from typing import Dict, Literal, Union, TypedDict
+
+LangOptions = Literal['en']
+Definition = Dict[str, Union[str, Dict[str, str]]]
+
+
+class MetaDict(TypedDict):
+ version: str
+ userAgentDesktop: str
+ userAgentMobile: str
+ applicableUris: Dict[str, str]
diff --git a/ffxiv/roles/hand.png b/ffxiv/roles/hand.png
new file mode 100644
index 0000000..db60614
--- /dev/null
+++ b/ffxiv/roles/hand.png
Binary files differ
diff --git a/ffxiv/roles/healer.png b/ffxiv/roles/healer.png
new file mode 100644
index 0000000..224a383
--- /dev/null
+++ b/ffxiv/roles/healer.png
Binary files differ
diff --git a/ffxiv/roles/land.png b/ffxiv/roles/land.png
new file mode 100644
index 0000000..d0c2b49
--- /dev/null
+++ b/ffxiv/roles/land.png
Binary files differ
diff --git a/ffxiv/roles/magic.png b/ffxiv/roles/magic.png
new file mode 100644
index 0000000..01cebf8
--- /dev/null
+++ b/ffxiv/roles/magic.png
Binary files differ
diff --git a/ffxiv/roles/melee.png b/ffxiv/roles/melee.png
new file mode 100644
index 0000000..3a4af90
--- /dev/null
+++ b/ffxiv/roles/melee.png
Binary files differ
diff --git a/ffxiv/roles/ranged.png b/ffxiv/roles/ranged.png
new file mode 100644
index 0000000..e331709
--- /dev/null
+++ b/ffxiv/roles/ranged.png
Binary files differ
diff --git a/ffxiv/roles/tank.png b/ffxiv/roles/tank.png
new file mode 100644
index 0000000..fd80c75
--- /dev/null
+++ b/ffxiv/roles/tank.png
Binary files differ