' % self.username
29 |
30 |
--------------------------------------------------------------------------------
/pokedex.py:
--------------------------------------------------------------------------------
1 | import json
2 | from collections import defaultdict
3 |
4 | class NationalDex:
5 | def __init__(self, pathToNationalDex):
6 | dexfile = open(pathToNationalDex, 'r')
7 | self.dexdata = json.load(dexfile)
8 | self.numberOfPokemon = len(self.dexdata.keys())
9 | self.pokemonNames = []
10 | self.pokemonSlugs = []
11 | self.pokemonForms = defaultdict(list)
12 |
13 | for i in range (1, self.numberOfPokemon+1):
14 | dexKey = str(i).zfill(3)
15 | name = self.dexdata[dexKey]['name']['eng']
16 | slug = self.dexdata[dexKey]['slug']['eng']
17 | forms = self.dexdata[dexKey]['icons']
18 |
19 | self.pokemonNames.append(name)
20 | self.pokemonSlugs.append(slug)
21 |
22 | for form in forms:
23 | if form == '.':
24 | if 'has_female' in forms['.'].keys():
25 | self.pokemonForms[dexKey].append('female')
26 | continue
27 | self.pokemonForms[dexKey].append(form)
28 |
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | # LivingDex
2 |
3 | In Pokémon, a [Pokédex](https://en.wikipedia.org/wiki/Pokedex") is a device given to a player early on in the game. It's used to keep track of how many Pokémon are seen, and how many the player has caught.
4 |
5 | For some players of Pokémon, simply seeing (or catching) all the Pokémon is not enough. Some players want to have one of every Pokémon. This is called a [living Pokédex](http://bulbapedia.bulbagarden.net/wiki/Living_Pokédex)
6 |
7 | LivingDex is a website to help players track their living Pokédex.
8 |
9 | If you're looking for the website, you can find it at [www.livingdex.xyz](http://www.livingdex.xyz).
10 |
11 | ## Getting Started
12 |
13 | See the `working_on.md` file in teh root of the repository for instructions on getting started.
14 |
15 | ## Libraries Used
16 |
17 | LivingDex is written in Python, using the [Flask](http://flask.pocoo.org) web framework.
18 |
19 | For the Pokémon sprites and data, LivingDex relies on the [pokesprite](https://github.com/msikma/pokesprite) library.
20 |
21 | ## License
22 |
23 | BSD. Check the `license` file at the root of the project directory.
24 |
--------------------------------------------------------------------------------
/static/userdata_as_csv.js:
--------------------------------------------------------------------------------
1 | function prepareCSVLink()
2 | {
3 | var pokemonCells = document.getElementsByClassName('pokemonCell');
4 |
5 | var csvString = 'Number, Name, Caught\n'
6 |
7 | for(var i = 0; i < pokemonCells.length; i++)
8 | {
9 | var pokemonCell = pokemonCells[i];
10 | var number = pokemonCell.getElementsByClassName("pokemonCellNumber")[0].innerHTML;
11 | var name = pokemonCell.getElementsByClassName("pokemonCellName")[0].innerHTML;
12 | var caughtState = pokemonCell.className.split(/\s+/)[1];
13 |
14 | csvString+=number;
15 | csvString+=', ';
16 | csvString+=name;
17 | csvString+=', ';
18 | csvString+=caughtState;
19 | csvString+='\n';
20 | }
21 |
22 | var downloadLink = document.createElement("a");
23 | var csvURI = 'data:text/csv;charset=utf-8,' + csvString;
24 | downloadLink.href = csvURI;
25 | downloadLink.download = 'dex.csv';
26 | downloadLink.innerHTML = "Download as CSV (experimental)";
27 |
28 | var container = document.getElementsByClassName("csvDownloadLinkContainer")[0];
29 | container.appendChild(downloadLink);
30 | }
31 |
--------------------------------------------------------------------------------
/license:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014, Peter Hajas
2 | All rights reserved.
3 |
4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
5 |
6 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7 |
8 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
9 |
10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
11 |
--------------------------------------------------------------------------------
/templates/home.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% block title %}LivingDex{% endblock %}
3 | {% block content %}
4 |
5 | Welcome to LivingDex
6 |
7 |
8 | A website to help you manage your Living Pokedex
9 |
10 |
11 |
12 | What's a Living Pokedex?
13 |
14 |
15 |
16 | In Pokémon , a Pokédex is a device given to a player early on in the game. It's used to keep track of how many Pokémon are seen, and how many the player has caught.
17 |
18 |
19 |
20 | For some players of Pokémon, simply seeing (or catching) all the Pokémon is not enough. Some players want to have one of every Pokémon. This is called a Living Pokédex .
21 |
22 |
23 |
24 | Interested in starting your own Living Pokédex? LivingDex is here to help! Register an account for free, and get on your way to Catching them All!
25 |
26 |
27 |
28 | LivingDex is open source software. Patches, bug reports, feature ideas, and more are encouraged. Check out the repository on Github .
29 |
30 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/static/editdex.js:
--------------------------------------------------------------------------------
1 | $('ul').click
2 | (
3 | function (event)
4 | {
5 | var clickedElement = event.target;
6 |
7 | if(!$(clickedElement).hasClass('pokemonCell'))
8 | {
9 | while(true)
10 | {
11 | if($(clickedElement).hasClass('pokemonCell'))
12 | {
13 | break;
14 | }
15 | var parentElement = clickedElement.parentNode;
16 | if(parentElement != null)
17 | {
18 | clickedElement = parentElement;
19 | }
20 | else
21 | {
22 | // No clicked pokemon here. Return.
23 | return;
24 | }
25 | }
26 | }
27 |
28 |
29 | pokemon = clickedElement.id;
30 |
31 | var requestContents = {username : user, pokemon : pokemon};
32 | var requestURL = '/uncatchPokemon'
33 |
34 | if($(clickedElement).hasClass('uncaught'))
35 | {
36 | requestURL = '/catchPokemon'
37 | }
38 |
39 | $.post(requestURL, requestContents);
40 |
41 | $(clickedElement).toggleClass('uncaught');
42 | $(clickedElement).toggleClass('caught');
43 |
44 | updateProgressBar();
45 | }
46 | );
47 |
--------------------------------------------------------------------------------
/static/progressbar.js:
--------------------------------------------------------------------------------
1 | function progressBarRGBAString(percentage)
2 | {
3 | var unitPercentage = percentage / 100.0;
4 | var distanceFromHalf = 2 * Math.abs(Math.abs(unitPercentage) - 0.5);
5 | var nonFullComponent = 255 * distanceFromHalf;
6 | nonFullComponent = 255 - nonFullComponent;
7 | nonFullComponent = Math.round(nonFullComponent);
8 | var redComponent;
9 | var greenComponent;
10 |
11 | if (unitPercentage <= 0.5)
12 | {
13 | redComponent = 255;
14 | greenComponent = nonFullComponent;
15 | }
16 | else
17 | {
18 | greenComponent = 255;
19 | redComponent = nonFullComponent;
20 | }
21 |
22 | return 'rgba(' + redComponent + ',' + greenComponent + ',0,1)'
23 | }
24 |
25 | function updateProgressBar()
26 | {
27 | var allPokemon = document.getElementsByClassName('valid').length;
28 | var capturedPokemon = document.getElementsByClassName('caught valid').length;
29 |
30 | var progressBarFilledElement = document.getElementsByClassName('filledBar')[0];
31 | var progressBarText = document.getElementsByClassName('progressBarText')[0];
32 |
33 | var percentComplete = capturedPokemon / allPokemon;
34 | percentComplete *= 100;
35 |
36 | var percentCompleteText = (percentComplete).toFixed(1) + '%';
37 | var percentCompleteFilledWidth = percentComplete + '%';
38 | var percentCompleteRGBA = progressBarRGBAString(percentComplete);
39 |
40 | progressBarText.innerHTML = percentCompleteText;
41 | progressBarFilledElement.style.width = percentCompleteFilledWidth;
42 | progressBarFilledElement.style.backgroundColor = percentCompleteRGBA;
43 | }
44 |
--------------------------------------------------------------------------------
/static/style_mobile.css:
--------------------------------------------------------------------------------
1 | @media (max-width: 520px)
2 | {
3 | #header a
4 | {
5 | padding: 16px 2px;
6 | font-size: 14pt;
7 | }
8 |
9 | #content
10 | {
11 | padding-top:0px;
12 | }
13 |
14 | .headerLink
15 | {
16 | border-left: solid 1px black;
17 | }
18 |
19 | .headerCircleContainer
20 | {
21 | display:none;
22 | }
23 |
24 | .headerSwoopContainer
25 | {
26 | display:none;
27 | }
28 |
29 | .headerSwoopLine
30 | {
31 | height:1px;
32 | }
33 |
34 | #topLine
35 | {
36 | left:0px;
37 | }
38 |
39 | .friendCode
40 | {
41 | font-size:14pt;
42 | width:90%;
43 | display:block;
44 | margin:auto;
45 | }
46 |
47 | .friendCodeForm
48 | {
49 | display:block;
50 | }
51 |
52 | .submitButton
53 | {
54 | display: block;
55 | margin:auto;
56 | }
57 |
58 | .progressBar
59 | {
60 | margin-top:50px;
61 | height: 30pt;
62 | }
63 |
64 | .progressBarText
65 | {
66 | font-size: 20pt;
67 | color: white;
68 | bottom: 30pt;
69 | }
70 |
71 | .csvDownloadLinkContainer
72 | {
73 | display: none;
74 | }
75 |
76 | .pokemonCellNumber
77 | {
78 | font-size:12pt;
79 | }
80 |
81 | .pokemonCellName
82 | {
83 | font-size:6pt;
84 | line-height:20px;
85 | }
86 |
87 | .boxTitle
88 | {
89 | font-size:18pt;
90 | margin-top:6px;
91 | margin-bottom:6px;
92 | }
93 |
94 | .dexPickerDexTitle
95 | {
96 | font-size:12pt;
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/templates/login.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% block title %}Login{% endblock %}
3 | {% block content %}
4 |
5 | {% if error %}
6 |
{{ error }}
7 | {% endif %}
8 |
14 |
21 |
An important note on security.
22 |
23 |
24 | You may have noticed that your password is not obscured with bullets. This is because your password is stored in plain text on LivingDex
25 |
26 |
27 | To protect the security of your other accounts online, use a different password for every site , especially LivingDex.
28 |
29 |
30 |
31 | {% endblock %}
32 |
--------------------------------------------------------------------------------
/static/dexpicker.js:
--------------------------------------------------------------------------------
1 | function arrayCount(array) // what
2 | {
3 | var count = array.filter(function(value) { return value !== undefined }).length;
4 | return count;
5 | }
6 |
7 | function updateDisplayForDex(dexName)
8 | {
9 | var allDexItems = document.getElementsByClassName('dexPickerDexTitle');
10 |
11 | for(var i = 0; i < allDexItems.length; i++)
12 | {
13 | var dexItem = allDexItems[i];
14 | $(dexItem).removeClass('selected');
15 | }
16 |
17 | var selectedDexElement = document.getElementById(dexName);
18 |
19 | $(selectedDexElement).addClass('selected');
20 |
21 | var pokemonInDex = dexes[dexName];
22 |
23 | var allPokemon = document.getElementsByClassName('pokemonCell');
24 |
25 | for(var i = 0; i < allPokemon.length; i++)
26 | {
27 | var pokemonElement = allPokemon[i];
28 | var pokemonNumber = pokemonElement.id;
29 | var pokemonNumber = Math.round(pokemonNumber);
30 |
31 | if(pokemonInDex.indexOf(pokemonNumber) == -1)
32 | {
33 | $(pokemonElement).removeClass('valid');
34 | $(pokemonElement).addClass('invalid');
35 | }
36 | else
37 | {
38 | $(pokemonElement).removeClass('invalid');
39 | $(pokemonElement).addClass('valid');
40 | }
41 | }
42 |
43 | updateProgressBar();
44 | }
45 |
46 | function populateDexPicker()
47 | {
48 | var dexNames = Object.keys(dexes);
49 | var numberOfDexes = arrayCount(dexNames);
50 |
51 | for(var i = 0; i < numberOfDexes; i++)
52 | {
53 | var dexName = dexNames[i];
54 | console.log(dexName);
55 |
56 | var dexPickerContainerElement = document.getElementsByClassName('dexPicker')[0];
57 | var dexPickerDexTitleElement = document.createElement('div');
58 | dexPickerDexTitleElement.innerHTML = dexName;
59 | dexPickerDexTitleElement.className = 'dexPickerDexTitle';
60 |
61 | $(dexPickerDexTitleElement).click(function() {
62 | updateDisplayForDex(this.innerHTML);
63 | });
64 |
65 | dexPickerDexTitleElement.id = dexName;
66 | dexPickerContainerElement.appendChild(dexPickerDexTitleElement);
67 | }
68 | }
69 |
70 |
--------------------------------------------------------------------------------
/templates/compare.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% block head %}
3 | {{ super ()}}
4 |
5 |
6 | {% endblock %}
7 |
8 | {% block title %}LivingDex: Comparing {{ username1 }} and {{ username2 }}{% endblock %}
9 | {% block content %}
10 |
11 |
12 |
13 | Comparing the LivingDex of
14 |
15 |
16 |
17 | {{ username1 }}
18 |
19 |
20 | {{ friendCode1 }}
21 |
22 |
23 |
24 | and
25 |
26 |
27 |
28 | {{ username2 }}
29 |
30 |
31 | {{ friendCode2 }}
32 |
33 |
34 |
35 |
36 |
37 | {% if session.username == username1 or session.username == username2 %}
38 |
39 | Caught by neither - Caught by {{ username1 }} - Caught by {{ username2 }} - Caught by both
40 |
41 | {% endif %}
42 |
43 |
44 | {% for pokemon in comparedDex %}
45 |
46 | {% if loop.index0 % 30 == 0 %}
47 |
48 | {% set boxStartIndex = loop.index %}
49 | {% set boxEndIndex = loop.index0 + 30 %}
50 | {{("%03d")|format(boxStartIndex)}} - {{("%03d")|format(boxEndIndex)}}
51 |
52 | {% endif %}
53 |
65 | {{ ("%03d")|format(loop.index) }}
66 |
67 | {{ pokemonNames[loop.index - 1] }}
68 |
69 |
70 | {% endfor %}
71 |
72 |
73 |
76 | {% endblock %}
77 |
--------------------------------------------------------------------------------
/templates/layout.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {% block head %}
5 |
6 |
7 |
8 |
9 | LivingDex
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | {% endblock %}
18 |
19 |
20 |
50 |
51 | {% block content %}
52 | {% endblock %}
53 |
54 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/templates/user.html:
--------------------------------------------------------------------------------
1 | {% extends "layout.html" %}
2 | {% block head %}
3 | {{ super ()}}
4 |
5 |
6 |
7 |
8 |
9 |
10 | {% endblock %}
11 |
12 | {% block title %}{{ username }}'s Living Dex{% endblock %}
13 | {% block content %}
14 |
15 | {% set isCurrentUser = (session.username == username) %}
16 |
17 |
30 | {% else %}
31 |
32 | {{ friendCode }}
33 |
34 | {% endif %}
35 |
36 |
37 |
45 |
46 | {% if isCurrentUser %}
47 |
48 | This is your LivingDex! It keeps track of how many Pokémon you currently have in your PC Box in game. It helps you name and lay out your boxes - each section is the same size as a PC Box.
49 |
50 |
51 | To mark a Pokémon as caught, click it so that it turns green. Catch ´Em All!
52 |
53 | {% elif session.username %}
54 |
59 | {% endif %}
60 |
61 |
62 |
63 |
64 |
65 |
66 | {% for pokemon in dex %}
67 |
68 | {% if loop.index0 % 30 == 0 %}
69 |
70 | {% set boxStartIndex = loop.index %}
71 | {% set boxEndIndex = loop.index0 + 30 %}
72 | {{("%03d")|format(boxStartIndex)}} - {{("%03d")|format(boxEndIndex)}}
73 |
74 | {% endif %}
75 |
83 | {{ ("%03d")|format(loop.index) }}
84 |
85 | {{ pokemonNames[loop.index - 1] }}
86 |
87 |
88 | {% endfor %}
89 |
90 |
91 |
92 | {% if session.username == username%}
93 |
94 | {% endif %}
95 |
102 | {% endblock %}
103 |
--------------------------------------------------------------------------------
/static/pokesprite.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";/*!
2 | * PokéSprite 1.0
3 | * (C) 2014, Michiel Sikma and PokéSprite contributors
4 | * (C) 1995-2014 Nintendo/Creatures Inc./GAME FREAK Inc.
5 | * For a full list of contributors, view the project commit history.
6 | * Generated on 2014-08-12 22:56:37.
7 | */.pkspr{display:inline-block;position:relative;vertical-align:baseline}.pkspr>i{background-image:url("pokesprite.png");content:' ';display:block}.pksprspan{display:inline-block}.pksprblock{display:block}.pksprspan.display-over{height:1px;vertical-align:middle}.pksprspan.display-over>i{position:absolute;top:-20px;left:0}.pkspr.pkspr-faux-right{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);filter:FlipH;-ms-filter:'FlipH';transform:scaleX(-1)}.pkspr[class*='pkmn-'],.pkspr[class*='pkmn-']>i{width:40px}.pkspr[class*='pkmn-'],.pkspr[class*='pkmn-']>i{height:30px}.pkspr[class*='body-style-'],.pkspr[class*='body-style-']>i{width:32px}.pkspr[class*='body-style-'],.pkspr[class*='body-style-']>i{height:32px}.pkspr[class*='apricorn-'],.pkspr[class*='apricorn-']>i{width:30px}.pkspr[class*='apricorn-'],.pkspr[class*='apricorn-']>i{height:30px}.pkspr[class*='battle-item-'],.pkspr[class*='battle-item-']>i{width:30px}.pkspr[class*='battle-item-'],.pkspr[class*='battle-item-']>i{height:30px}.pkspr[class*='berry-'],.pkspr[class*='berry-']>i{width:30px}.pkspr[class*='berry-'],.pkspr[class*='berry-']>i{height:30px}.pkspr[class*='ev-item-'],.pkspr[class*='ev-item-']>i{width:30px}.pkspr[class*='ev-item-'],.pkspr[class*='ev-item-']>i{height:30px}.pkspr[class*='evo-item-'],.pkspr[class*='evo-item-']>i{width:30px}.pkspr[class*='evo-item-'],.pkspr[class*='evo-item-']>i{height:30px}.pkspr[class*='flute-'],.pkspr[class*='flute-']>i{width:30px}.pkspr[class*='flute-'],.pkspr[class*='flute-']>i{height:30px}.pkspr[class*='fossil-'],.pkspr[class*='fossil-']>i{width:30px}.pkspr[class*='fossil-'],.pkspr[class*='fossil-']>i{height:30px}.pkspr[class*='gem-'],.pkspr[class*='gem-']>i{width:30px}.pkspr[class*='gem-'],.pkspr[class*='gem-']>i{height:30px}.pkspr[class*='hm-'],.pkspr[class*='hm-']>i{width:30px}.pkspr[class*='hm-'],.pkspr[class*='hm-']>i{height:30px}.pkspr[class*='hold-item-'],.pkspr[class*='hold-item-']>i{width:30px}.pkspr[class*='hold-item-'],.pkspr[class*='hold-item-']>i{height:30px}.pkspr[class*='incense-'],.pkspr[class*='incense-']>i{width:30px}.pkspr[class*='incense-'],.pkspr[class*='incense-']>i{height:30px}.pkspr[class*='other-item-'],.pkspr[class*='other-item-']>i{width:30px}.pkspr[class*='other-item-'],.pkspr[class*='other-item-']>i{height:30px}.pkspr[class*='key-item-'],.pkspr[class*='key-item-']>i{width:30px}.pkspr[class*='key-item-'],.pkspr[class*='key-item-']>i{height:30px}.pkspr[class*='mail-'],.pkspr[class*='mail-']>i{width:30px}.pkspr[class*='mail-'],.pkspr[class*='mail-']>i{height:30px}.pkspr[class*='medicine-'],.pkspr[class*='medicine-']>i{width:30px}.pkspr[class*='medicine-'],.pkspr[class*='medicine-']>i{height:30px}.pkspr[class*='mega-stone-'],.pkspr[class*='mega-stone-']>i{width:30px}.pkspr[class*='mega-stone-'],.pkspr[class*='mega-stone-']>i{height:30px}.pkspr[class*='mulch-'],.pkspr[class*='mulch-']>i{width:30px}.pkspr[class*='mulch-'],.pkspr[class*='mulch-']>i{height:30px}.pkspr[class*='plate-'],.pkspr[class*='plate-']>i{width:30px}.pkspr[class*='plate-'],.pkspr[class*='plate-']>i{height:30px}.pkspr[class*='pokeball-'],.pkspr[class*='pokeball-']>i{width:30px}.pkspr[class*='pokeball-'],.pkspr[class*='pokeball-']>i{height:30px}.pkspr[class*='scarf-'],.pkspr[class*='scarf-']>i{width:30px}.pkspr[class*='scarf-'],.pkspr[class*='scarf-']>i{height:30px}.pkspr[class*='shard-'],.pkspr[class*='shard-']>i{width:30px}.pkspr[class*='shard-'],.pkspr[class*='shard-']>i{height:30px}.pkspr[class*='tm-'],.pkspr[class*='tm-']>i{width:30px}.pkspr[class*='tm-'],.pkspr[class*='tm-']>i{height:30px}.pkspr[class*='valuable-item-'],.pkspr[class*='valuable-item-']>i{width:30px}.pkspr[class*='valuable-item-'],.pkspr[class*='valuable-item-']>i{height:30px}.pkspr[class*='wonder-launcher-'],.pkspr[class*='wonder-launcher-']>i{width:30px}.pkspr[class*='wonder-launcher-'],.pkspr[class*='wonder-launcher-']>i{height:30px}.pkspr[class*='status-'],.pkspr[class*='status-']>i{width:10px}.pkspr[class*='status-'],.pkspr[class*='status-']>i{height:10px}
8 |
--------------------------------------------------------------------------------
/test_user_operations.py:
--------------------------------------------------------------------------------
1 | import unittest
2 | import user
3 | from users import UserDatabase
4 | from users import CapturedState
5 | from users import ComparisonResult
6 |
7 | class FakeDatabaseSession:
8 | def __init__(self):
9 | self.didCommit = False
10 | self.things = [ ]
11 | def commit(self):
12 | self.didCommit = True
13 | def add(self, thingToAdd):
14 | self.things.append(thingToAdd)
15 |
16 | class FakeDatabase:
17 | def __init__(self):
18 | self.session = FakeDatabaseSession()
19 |
20 | class TestUserOperations(unittest.TestCase):
21 | def setUp(self):
22 | self.userDB = UserDatabase()
23 | self.appDB = FakeDatabase()
24 | self.appDBSession = self.appDB.session
25 |
26 | self.register_ash()
27 | self.register_misty()
28 | def tearDown(self):
29 | self.userDB = None
30 | self.appDB = None
31 | self.appDBSession = None
32 |
33 | # Convenience
34 | def register_ash(self):
35 | self.userDB.registerUser("AshKetchum", "pallettown123", "000000000000", self.appDB)
36 | def register_misty(self):
37 | self.userDB.registerUser("Misty", "cerulean456", "111111111111", self.appDB)
38 | def ash_user(self):
39 | return self.appDBSession.things[0]
40 | def misty_user(self):
41 | return self.appDBSession.things[1]
42 |
43 | # Registration
44 | def test_registration(self):
45 | user = self.ash_user()
46 | self.assertEqual(user.username, "AshKetchum")
47 | self.assertTrue(self.appDB.session.didCommit)
48 |
49 | # Catching / Releasing
50 | def test_catching_pokemon_works(self):
51 | user = self.ash_user()
52 | # Catch Pikachu
53 | self.userDB.catchPokemonForUser(user, 25, self.appDB)
54 | # Grab the state of the Pokemon @ 25
55 | state = self.userDB._stateOfPokemonForUser(user, 25)
56 | self.assertEqual(state, CapturedState.Caught)
57 | def test_new_user_hasnt_caught_pokemon(self):
58 | user = self.ash_user()
59 | # Grab the state of the Pokemon @ 25
60 | # It should be 0
61 | state = self.userDB._stateOfPokemonForUser(user, 25)
62 | self.assertEqual(state, CapturedState.Uncaught)
63 | def test_catching_then_releasing_pokemon_works(self):
64 | user = self.ash_user()
65 | # Catch Pikachu
66 | self.userDB.catchPokemonForUser(user, 25, self.appDB)
67 | # Release Pikachu :-(
68 | self.userDB.uncatchPokemonForUser(user, 25, self.appDB)
69 | # Grab the state of the Pokemon @ 25
70 | state = self.userDB._stateOfPokemonForUser(user, 25)
71 | self.assertEqual(state, CapturedState.Uncaught)
72 |
73 | # Comparison
74 | ## Keep in mind that comparisonResultBetweenUsers() accepts a 0-indexed
75 | ## Pokedex index
76 | def test_comparing_user_without_pokemon_and_user_without_pokemon_returns_neither_having_pokemon(self):
77 | ash = self.ash_user()
78 | misty = self.misty_user()
79 | state_of_pikachu = self.userDB.comparisonResultBetweenUsers(ash, misty, 24)
80 | self.assertEqual(state_of_pikachu, ComparisonResult.NeitherCaught)
81 | def test_comparing_user_with_pokemon_and_user_without_pokemon_returns_first_having_pokemon(self):
82 | ash = self.ash_user()
83 | misty = self.misty_user()
84 | self.userDB.catchPokemonForUser(ash, 25, self.appDB)
85 | state_of_pikachu = self.userDB.comparisonResultBetweenUsers(ash, misty, 24)
86 | self.assertEqual(state_of_pikachu, ComparisonResult.FirstCaught)
87 | def test_comparing_user_without_pokemon_and_user_with_pokemon_returns_second_having_pokemon(self):
88 | ash = self.ash_user()
89 | misty = self.misty_user()
90 | self.userDB.catchPokemonForUser(misty, 116, self.appDB)
91 | state_of_horsea = self.userDB.comparisonResultBetweenUsers(ash, misty, 115)
92 | self.assertEqual(state_of_horsea, ComparisonResult.SecondCaught)
93 | def test_comparing_user_with_pokemon_and_user_with_pokemon_returns_both_having_pokemon(self):
94 | ash = self.ash_user()
95 | misty = self.misty_user()
96 | self.userDB.catchPokemonForUser(ash, 128, self.appDB)
97 | self.userDB.catchPokemonForUser(misty, 128, self.appDB)
98 | state_of_tauros = self.userDB.comparisonResultBetweenUsers(ash, misty, 127)
99 | self.assertEqual(state_of_tauros, ComparisonResult.BothCaught)
100 |
101 | if __name__ == '__main__':
102 | unittest.main()
103 |
--------------------------------------------------------------------------------
/livingdex.py:
--------------------------------------------------------------------------------
1 | import sys, os
2 |
3 | from flask import Flask
4 | from flask import render_template
5 | from flask import request
6 | from flask import url_for
7 | from flask import redirect
8 |
9 | from flask.ext.sqlalchemy import SQLAlchemy
10 |
11 | from usersession import *
12 | from pokedex import *
13 |
14 | app = Flask(__name__)
15 | app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get(
16 | 'DATABASE_URL', 'sqlite:////tmp/test.db')
17 |
18 | if app.config['SQLALCHEMY_DATABASE_URI'] == 'sqlite:////tmp/test.db':
19 | app.config['DEBUG'] = True
20 |
21 | db = SQLAlchemy(app)
22 |
23 | import user
24 |
25 | from users import *
26 |
27 | db.create_all()
28 | db.session.commit()
29 |
30 | database = UserDatabase()
31 | nationalDex = NationalDex('pokesprite/data/pkmn.json')
32 |
33 | app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
34 |
35 | @app.route('/')
36 | def home():
37 | return render_template('home.html')
38 |
39 | @app.route('/user/')
40 | def user(username):
41 | if database.userExists(username):
42 | user = database.userForUsername(username)
43 | friendCode = user.friendCode
44 | friendCode = database.displayFriendlyFriendCodeForFriendCode(friendCode)
45 | dex = database.dexForUser(user, nationalDex.numberOfPokemon)
46 | pokemonNames = nationalDex.pokemonNames
47 | pokemonSlugs = nationalDex.pokemonSlugs
48 |
49 | return render_template('user.html', username=username, friendCode=friendCode, dex=dex, pokemonNames=pokemonNames, pokemonSlugs=pokemonSlugs)
50 | else:
51 | return render_template('baduser.html', username=username)
52 |
53 | @app.route('/compare//')
54 | def compareUsers(username1, username2):
55 | if database.userExists(username1) and database.userExists(username2):
56 | user1 = database.userForUsername(username1)
57 | user2 = database.userForUsername(username2)
58 |
59 | friendCode1 = database.displayFriendlyFriendCodeForFriendCode(user1.friendCode)
60 | friendCode2 = database.displayFriendlyFriendCodeForFriendCode(user2.friendCode)
61 |
62 | comparedDex = database.comparedDexBetweenUsers(user1, user2, nationalDex.numberOfPokemon)
63 |
64 | pokemonNames = nationalDex.pokemonNames
65 | pokemonSlugs = nationalDex.pokemonSlugs
66 |
67 | return render_template('compare.html', username1=username1, username2=username2, friendCode1=friendCode1, friendCode2=friendCode2, comparedDex=comparedDex, pokemonNames=pokemonNames, pokemonSlugs=pokemonSlugs)
68 | else:
69 | return render_template('badusersforcompare.html', username1=username1, username2=username2)
70 |
71 | @app.route('/catchPokemon', methods=['POST'])
72 | def catchPokemon():
73 | username = request.form['username']
74 | if username == currentUser():
75 | pokemon = request.form['pokemon']
76 | user = database.userForUsername(username)
77 | database.catchPokemonForUser(user, int(pokemon), db)
78 | return 'OK'
79 |
80 | @app.route('/uncatchPokemon', methods=['POST'])
81 | def uncatchPokemon():
82 | username = request.form['username']
83 | if username == currentUser():
84 | pokemon = request.form['pokemon']
85 | user = database.userForUsername(username)
86 | database.uncatchPokemonForUser(user, int(pokemon), db)
87 | return 'OK'
88 |
89 | @app.route('/editFriendCode', methods=['POST'])
90 | def editFriendCode():
91 | currentUsername = currentUser()
92 | friendCode = request.form['friendCode']
93 | database.changeFriendCodeForUser(currentUsername, friendCode, db)
94 | return redirect(url_for('user', username=currentUsername))
95 |
96 | @app.route('/register', methods=['POST', 'GET'])
97 | def register():
98 | if request.method == 'GET':
99 | return redirect(url_for('login'))
100 | registerUsername = request.form['registerUsername']
101 | registerUsername = registerUsername.lower()
102 | registerPassword = request.form['registerPassword']
103 | registerFriendCode = request.form['registerFriendCode']
104 |
105 | usernameIsValid, usernameError = database.verifyNewUsername(registerUsername)
106 | passwordIsValid, passwordError = database.verifyNewPassword(registerPassword)
107 | friendCodeIsValid, friendCodeError = database.verifyNewFriendCode(registerFriendCode)
108 |
109 | if not usernameIsValid:
110 | return render_template('login.html', error=usernameError)
111 | elif not passwordIsValid:
112 | return render_template('login.html', error=passwordError)
113 | elif not friendCodeIsValid:
114 | return render_template('login.html', error=friendCodeError)
115 | else:
116 | database.registerUser(registerUsername, registerPassword, registerFriendCode, db)
117 | logInUser(registerUsername)
118 | return redirect(url_for('user', username=registerUsername))
119 |
120 | @app.route('/login', methods=['POST', 'GET'])
121 | def login():
122 | error = None
123 | if request.method == 'POST':
124 | loginUsername = request.form['loginUsername']
125 | loginPassword = request.form['loginPassword']
126 |
127 | if len(loginUsername) > 0:
128 | if not database.userExists(loginUsername):
129 | error = 'User {} does not exist'.format(loginUsername)
130 | elif database.userHasPassword(loginUsername, loginPassword):
131 | logInUser(loginUsername)
132 | return redirect(url_for('user', username=loginUsername))
133 | else:
134 | error = 'Incorrect username / password'
135 | else:
136 | error = 'You need to enter in a username and password to register or log in as.'
137 |
138 | return render_template('login.html', error=error)
139 |
140 | @app.route('/logout')
141 | def logoutAndGoHome():
142 | logout()
143 | return home()
144 |
145 |
--------------------------------------------------------------------------------
/static/dexes.js:
--------------------------------------------------------------------------------
1 | function dexListInRange(start, end)
2 | {
3 | var dexList = [];
4 | for(var i = start; i <= end; i++)
5 | {
6 | dexList.push(i);
7 | }
8 |
9 | return dexList;
10 | }
11 |
12 | var dexes = {};
13 |
14 | dexes['Kanto'] = dexListInRange(1,151);
15 |
16 | dexes['Johto'] = dexListInRange(1,251);
17 | dexes['Johto'] = dexes['Johto'].concat([424, 463, 465, 469, 473]);
18 |
19 | dexes['Hoenn'] = [25, 26, 27, 28, 37, 38, 39, 40, 41, 42, 43, 44, 45, 54, 55, 63, 64, 65, 66, 67, 68, 72, 73, 74, 75, 76, 81, 82, 84, 85, 88, 89, 100, 101, 109, 110, 111, 112, 116, 117, 118, 119, 120, 121, 127, 129, 130, 169, 170, 171, 172, 174, 177, 178, 182, 183, 184, 202, 203, 214, 218, 219, 222, 227, 230, 231, 232, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 386, 386, 386, 406, 407, 433, 462, 464, 475, 476, 477, 478]
20 |
21 | dexes['Sinnoh'] = [25, 26, 35, 36, 41, 42, 54, 55, 63, 64, 65, 66, 67, 68, 72, 73, 74, 75, 76, 77, 78, 81, 82, 92, 93, 94, 95, 108, 111, 112, 113, 114, 118, 119, 122, 123, 125, 126, 129, 130, 133, 134, 135, 136, 137, 143, 163, 164, 169, 172, 173, 175, 176, 183, 184, 185, 190, 193, 194, 195, 196, 197, 198, 200, 201, 203, 207, 208, 212, 214, 215, 220, 221, 223, 224, 226, 228, 229, 233, 239, 240, 242, 265, 266, 267, 268, 269, 278, 279, 280, 281, 282, 298, 299, 307, 308, 315, 333, 334, 339, 340, 349, 350, 355, 356, 357, 358, 359, 361, 362, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 487, 490]
22 |
23 | dexes['Unova'] = [19, 20, 27, 28, 35, 36, 37, 38, 39, 40, 41, 42, 54, 55, 58, 59, 81, 82, 86, 87, 88, 89, 95, 108, 109, 110, 114, 120, 121, 125, 126, 127, 131, 132, 133, 134, 135, 136, 169, 173, 174, 179, 180, 181, 183, 184, 191, 192, 193, 196, 197, 206, 207, 208, 213, 214, 215, 220, 221, 222, 223, 224, 225, 226, 227, 239, 240, 246, 247, 248, 278, 279, 287, 288, 289, 298, 299, 300, 301, 304, 305, 306, 315, 320, 321, 322, 323, 325, 326, 328, 329, 330, 333, 334, 335, 336, 337, 338, 341, 342, 343, 344, 351, 353, 354, 357, 359, 363, 364, 365, 374, 375, 376, 406, 407, 415, 416, 418, 419, 425, 426, 427, 428, 436, 437, 447, 448, 451, 452, 453, 454, 455, 458, 461, 462, 463, 465, 466, 467, 469, 470, 471, 472, 473, 476, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649]
24 |
25 | dexes['Kalos'] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 39, 40, 41, 42, 43, 44, 45, 50, 51, 54, 55, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 79, 80, 81, 82, 83, 84, 85, 90, 91, 92, 93, 94, 95, 100, 101, 102, 103, 104, 105, 108, 111, 112, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 142, 143, 144, 145, 146, 147, 148, 149, 150, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 193, 194, 195, 196, 197, 198, 199, 202, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 235, 238, 241, 246, 247, 248, 261, 262, 263, 264, 270, 271, 272, 276, 277, 278, 279, 280, 281, 282, 283, 284, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 324, 325, 326, 327, 328, 329, 330, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 352, 353, 354, 358, 359, 360, 366, 367, 368, 369, 370, 371, 372, 373, 396, 397, 398, 399, 400, 406, 407, 412, 413, 414, 415, 416, 417, 418, 419, 425, 426, 430, 433, 434, 435, 438, 439, 441, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 458, 459, 460, 461, 462, 463, 464, 469, 470, 471, 472, 473, 475, 476, 479, 504, 505, 509, 510, 511, 512, 513, 514, 515, 516, 524, 525, 526, 527, 528, 531, 532, 533, 534, 538, 539, 543, 544, 545, 550, 551, 552, 553, 557, 558, 559, 560, 561, 568, 569, 570, 571, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 587, 588, 589, 590, 591, 594, 597, 598, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 631, 632, 633, 634, 635, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719]
26 |
27 | dexes['All'] = dexListInRange(1,721);
28 |
--------------------------------------------------------------------------------
/users.py:
--------------------------------------------------------------------------------
1 | import string
2 | import sys
3 | import user
4 |
5 | def enum(**enums):
6 | return type('Enum', (), enums)
7 |
8 | # This enum specifies the captured state of a Pokemon
9 | # 0 is the user hasn't caught the Pokemon
10 | # 1 is the user has caught the Pokemon
11 |
12 | CapturedState = enum(Uncaught = 0, Caught = 1)
13 |
14 | # This enum specifies the comparison state (between two users) of a Pokemon
15 | # 0 means neither user has caught the Pokemon
16 | # 1 means the first user has caught the Pokemon
17 | # 2 means the second user has caught the Pokemon
18 | # 3 means both users have caught the Pokemon
19 |
20 | ComparisonResult = enum(NeitherCaught = 0, FirstCaught = 1, SecondCaught = 2, BothCaught = 3)
21 |
22 | class UserDatabase:
23 | def __init__(self):
24 | pass
25 |
26 | ''' Adding Users '''
27 |
28 | def _verifyStringContainsCharactersFromList(self, stringToVerify, validCharacters):
29 | for character in stringToVerify:
30 | if character not in validCharacters:
31 | return False
32 | return True
33 |
34 | def _verifyStringisASCII(self, stringToVerify):
35 | validCharacters = string.ascii_letters + string.digits
36 | return self._verifyStringContainsCharactersFromList(stringToVerify, validCharacters)
37 |
38 |
39 | def verifyNewUsername(self, username):
40 | if self.userExists(username):
41 | return (False, "That username is already taken")
42 | elif len(username) == 0:
43 | return (False, "Username can't be empty")
44 | elif len(username) > 20:
45 | return (False, "Username is too long. Must be 20 characters or less")
46 | elif not self._verifyStringisASCII(username):
47 | return (False, "A username may only contain uppercase, lowercase and digits")
48 | else:
49 | return (True, None)
50 |
51 | def verifyNewPassword(self, password):
52 | if not self._verifyStringisASCII(password):
53 | return (False, "A password may only contain uppercase, lowercase and digits")
54 | if len(password) == 0:
55 | return (False, "You need to have a password that's at least one character. But don't make it just one character, that's insecure.")
56 | elif len(password) > 20:
57 | return (False, "Password is too long. Must be 20 characters or less")
58 | else:
59 | return (True, None)
60 |
61 | def verifyNewFriendCode(self, friendCode):
62 | friendCode = self._validatedFriendCode(friendCode)
63 | validCharacters = string.digits
64 | if not self._verifyStringContainsCharactersFromList(friendCode, validCharacters):
65 | return (False, "A friend code may only contain digits")
66 | elif len(friendCode) > 16:
67 | return (False, "A friend code is 16 numbers")
68 | else:
69 | return (True, None)
70 |
71 | def _validatedFriendCode(self, friendCode):
72 | friendCode = friendCode.encode('ascii', 'ignore')
73 | return friendCode.translate(None, ' -')
74 |
75 | def displayFriendlyFriendCodeForFriendCode(self, friendCode):
76 | displayFriendlyFriendCode = ''
77 |
78 | for i in range(len(friendCode)):
79 | if i % 4 == 0 and i is not 0:
80 | displayFriendlyFriendCode = displayFriendlyFriendCode + '-'
81 | displayFriendlyFriendCode = displayFriendlyFriendCode + friendCode[i]
82 |
83 | return displayFriendlyFriendCode
84 |
85 | def registerUser(self, username, password, friendCode, db):
86 | newuser = user.User()
87 | newuser.username = username
88 | newuser.password = password
89 | newuser.friendCode = self._validatedFriendCode(friendCode)
90 |
91 | db.session.add(newuser)
92 | db.session.commit()
93 |
94 | ''' User Access and Query '''
95 |
96 | def userForUsername(self, username):
97 | foundUser = user.User.query.filter_by(username=username).first()
98 | return foundUser
99 |
100 | def userExists(self, username):
101 | return self.userForUsername(username) is not None
102 |
103 | def pokemonCaughtForUser(self, user):
104 | unicodePokemon = user.pokemon
105 | return unicodePokemon
106 |
107 | def dexForUser(self, user, pokemonCount):
108 | dex = self.pokemonCaughtForUser(user)
109 | dex = dex[:pokemonCount]
110 | return dex
111 |
112 | def comparisonResultBetweenUsers(self, user1, user2, pokemonIndex):
113 | # Why +1? Because these indexes are 0-indexed, but
114 | # _stateOfPokemonForUser assumes logical indices
115 | logicalPokemonIndex = pokemonIndex+1
116 | stateForUser1 = self._stateOfPokemonForUser(user1, logicalPokemonIndex)
117 | stateForUser2 = self._stateOfPokemonForUser(user2, logicalPokemonIndex)
118 |
119 | if stateForUser1 == CapturedState.Uncaught:
120 | if stateForUser2 == CapturedState.Uncaught:
121 | return ComparisonResult.NeitherCaught
122 | else:
123 | return ComparisonResult.SecondCaught
124 | if stateForUser1 == CapturedState.Caught:
125 | if stateForUser2 == CapturedState.Uncaught:
126 | return ComparisonResult.FirstCaught
127 | else:
128 | return ComparisonResult.BothCaught
129 |
130 | # We need a better error case, but -1 will do for now
131 | return -1
132 |
133 | def comparedDexBetweenUsers(self, user1, user2, pokemonCount):
134 | comparedDex = []
135 |
136 | for i in range(pokemonCount):
137 | comparisonResult = self.comparisonResultBetweenUsers(user1, user2, i)
138 |
139 | newStatus = unicode(comparisonResult)
140 | comparedDex.append(newStatus)
141 |
142 | comparedDex = "".join(comparedDex)
143 |
144 | return comparedDex
145 |
146 | def _setStateForPokemonForUser(self, user, pokemon, state, db):
147 | pokemon = pokemon - 1
148 | dex = self.pokemonCaughtForUser(user)
149 | dex = list(dex)
150 |
151 | dex[pokemon] = state
152 |
153 | dex = "".join(dex)
154 | user.pokemon = dex
155 |
156 | db.session.commit()
157 |
158 | def _stateOfPokemonForUser(self, user, pokemon):
159 | pokemon = pokemon - 1
160 | dex = self.pokemonCaughtForUser(user)
161 | dex = list(dex)
162 | dexState = dex[pokemon]
163 |
164 | if int(dexState) == 0:
165 | return CapturedState.Uncaught
166 | else:
167 | return CapturedState.Caught
168 |
169 | def catchPokemonForUser(self, user, pokemon, db):
170 | self._setStateForPokemonForUser(user, pokemon, u'1', db)
171 |
172 | def uncatchPokemonForUser(self, user, pokemon, db):
173 | self._setStateForPokemonForUser(user, pokemon, u'0', db)
174 |
175 | def changeFriendCodeForUser(self, username, friendCode, db):
176 | friendCode = self._validatedFriendCode(friendCode)
177 | if self.verifyNewFriendCode(friendCode)[0] is not False:
178 | user = self.userForUsername(username)
179 | user.friendCode = friendCode
180 | db.session.commit()
181 |
182 | def userHasPassword(self, username, password):
183 | if self.userExists(username):
184 | return password == self.userForUsername(username).password
185 | else:
186 | return False
187 |
188 |
--------------------------------------------------------------------------------
/static/style.css:
--------------------------------------------------------------------------------
1 | .welcomeHeading
2 | {
3 | text-align: center;
4 | font-family: "HelveticaNeue", sans-serif;
5 | font-weight: lighter;
6 | }
7 |
8 | h2
9 | {
10 | text-align: center;
11 | font-family: "HelveticaNeue", sans-serif;
12 | }
13 |
14 | p
15 | {
16 | font-size: 12pt;
17 | font-family: "HelveticaNeue", sans-serif;
18 | }
19 |
20 | a
21 | {
22 | text-decoration: none;
23 | color: red;
24 | }
25 |
26 | form
27 | {
28 | text-align: center;
29 | }
30 |
31 | .colorKey
32 | {
33 | text-align: center;
34 | }
35 |
36 | #header a
37 | {
38 | display: inline-block;
39 | padding: 12px 10px;
40 | font-family: "HelveticaNeue", sans-serif;
41 | font-size: 19pt;
42 | color: white;
43 | }
44 |
45 | #content
46 | {
47 | margin-left:auto;
48 | margin-right:auto;
49 | padding-left:5px;
50 | padding-right:5px;
51 | padding-top:36px;
52 | max-width: 600px;
53 | }
54 |
55 | body
56 | {
57 | margin: 0;
58 | padding-top:40px;
59 | }
60 |
61 | #header
62 | {
63 | width:100%;
64 | height:56px;
65 | position:fixed;
66 | top:0;
67 | background-color: #ec1d1d;
68 | z-index: 100;
69 | }
70 |
71 | .headerNavigation
72 | {
73 | margin-right:10px;
74 | float:right;
75 | }
76 |
77 | .headerLink
78 | {
79 | border-left: solid 2px black;
80 | }
81 |
82 | .headerCircleContainer
83 | {
84 | margin-left:10px;
85 | padding-top:9px;
86 | float:left;
87 | }
88 |
89 | .headerCircle
90 | {
91 | border:solid 3px black;
92 | width:15px;
93 | height:15px;
94 | border-radius:50%;
95 | display:inline-block;
96 | vertical-align:top;
97 | }
98 |
99 | #redCircle
100 | {
101 | background-color:red;
102 | }
103 |
104 | #yellowCircle
105 | {
106 | background-color:yellow;
107 | }
108 |
109 | #greenCircle
110 | {
111 | background-color:green;
112 | }
113 |
114 | .headerCircle#bigCircle
115 | {
116 | border-color:#eee;
117 | width:30px;
118 | height:30px;
119 | background-color:rgb(64, 89, 219);
120 | }
121 |
122 | .headerSwoopContainer
123 | {
124 | top:0;
125 | left:0;
126 | bottom:0;
127 | position:absolute;
128 | }
129 |
130 | .headerSwoopLine
131 | {
132 | padding:0px;
133 | height:2px;
134 | background-color:black;
135 | position:absolute;
136 | }
137 |
138 | #bottomLine
139 | {
140 | width:100%;
141 | bottom:0;
142 | }
143 |
144 | #topLine
145 | {
146 | left:206px;
147 | width:5000px;
148 | top:0;
149 | }
150 |
151 | .headerSwoopCircle
152 | {
153 | height:28px;
154 | width:28px;
155 | margin-left: -4px;
156 | border-style:solid;
157 | border-width:2px;
158 | border-color:black;
159 | background-color:#ec1d1d;
160 | position:absolute;
161 | }
162 |
163 | #leftCircle
164 | {
165 | bottom:0;
166 | left:150px;
167 | border-radius:0 0 56px 0;
168 | }
169 |
170 | #rightCircle
171 | {
172 | top:0;
173 | left:180px;
174 | border-radius:56px 0 0 0;
175 | }
176 |
177 | .headerSwoopCircle.coverup
178 | {
179 | width:32px;
180 | height:32px;
181 | border-width:0px;
182 | background-color:red;
183 | }
184 |
185 | .headerSwoopCircle.coverup#leftCircle
186 | {
187 | left:148px;
188 | bottom:2px;
189 | }
190 |
191 | .headerSwoopCircle.coverup#rightCircle
192 | {
193 | left:182px;
194 | top:2px;
195 | }
196 |
197 | #footer
198 | {
199 | text-align:center;
200 | width:100%;
201 | position:fixed;
202 | bottom:0;
203 | }
204 |
205 | /* User-specific CSS */
206 |
207 | .userInfoHeader
208 | {
209 | height: 40px;
210 | }
211 |
212 | .usernameHeading
213 | {
214 | font-family:"HelveticaNeue", sans-serif;
215 | font-weight:lighter;
216 | font-size:20pt;
217 | }
218 |
219 | .friendCode
220 | {
221 | font-family:"Menlo", "Lucida Console", Monaco, monospace;
222 | font-weight:lighter;
223 | font-size:24pt;
224 | text-align:center;
225 | width:370px;
226 | }
227 |
228 | .friendCode.label
229 | {
230 | font-family:"Helvetica", sans-serif;
231 | font-weight:lighter;
232 | font-size:36pt;
233 | display:inline-block;
234 | color:#555;
235 | }
236 |
237 | .friendCodeForm
238 | {
239 | display:inline-block;
240 | }
241 |
242 | .submitButton
243 | {
244 | padding: 0px;
245 | border: 0px;
246 | background-color: rgba(0, 0, 0, 0.0);
247 | color: red;
248 | font-size: 14pt;
249 | }
250 |
251 | .dexPickerProgressContainer
252 | {
253 | margin: auto;
254 | }
255 |
256 |
257 |
258 | .dexPicker
259 | {
260 | width:100%;
261 | height:20pt;
262 | vertical-align:top;
263 | text-align: left;
264 | margin: auto;
265 | background-color: #ddd;
266 | }
267 |
268 | .dexPickerDexTitle
269 | {
270 | font-family:"Menlo", "Lucida Console", Monaco, monospace;
271 | font-size:16pt;
272 | display: inline-block;
273 | width: 14.28%;
274 | height: 100%;
275 | text-align: center;
276 | line-height: 30px;
277 | }
278 |
279 | .selected
280 | {
281 | background-color: blue;
282 | color: white;
283 | }
284 |
285 | .progressBar
286 | {
287 | background-color: #777;
288 | text-align: left;
289 | margin: auto;
290 | width: 100%;
291 | height: 55pt;
292 | display: inline-block;
293 | }
294 |
295 | .filledBar
296 | {
297 | background-color: green;
298 | height: 100%;
299 | }
300 |
301 | .progressBarText
302 | {
303 | text-align: right;
304 | font-size: 29pt;
305 | font-family: monospace;
306 | margin-top: 14px;
307 | margin-right: 14px;
308 | color: white;
309 | bottom: 55pt;
310 | position: relative;
311 | }
312 |
313 | .csvDownloadLinkContainer
314 | {
315 | text-align: center;
316 | font-size: 12pt;
317 | }
318 |
319 | .caught
320 | {
321 | background-color: rgba(0, 255, 0, 0.35);
322 | }
323 |
324 | .uncaught
325 | {
326 | opacity: 0.65;
327 | }
328 |
329 | .invalid
330 | {
331 | opacity: 0.15;
332 | }
333 |
334 | .caughtByOther
335 | {
336 | background-color: rgba(255, 0, 0, 0.35);
337 | }
338 |
339 | .caughtByBoth
340 | {
341 | background-color: rgba(0, 255, 0, 0.7);
342 | }
343 |
344 | .pokemonCell
345 | {
346 | display:inline-block;
347 | margin-left: -4px;
348 | width: 16.66%;
349 | text-align: center;
350 | padding: 5px 0;
351 | }
352 |
353 | .pokemonCellNumber
354 | {
355 | font-family:"Menlo", "Lucida Console", Monaco, monospace;
356 | font-size:24pt;
357 | }
358 |
359 | .pokemonCellName
360 | {
361 | font-family:"Helvetica", sans-serif;
362 | font-weight:lighter;
363 | font-size:10pt;
364 | line-height:20px;
365 | white-space: nowrap;
366 | overflow:hidden;
367 | text-overflow:ellipsis;
368 | }
369 |
370 | .boxTitle
371 | {
372 | text-align: center;
373 | font-family:"Menlo", "Lucida Console", Monaco, monospace;
374 | font-size:24pt;
375 | margin-top:12px;
376 | margin-bottom:12px;
377 | }
378 |
379 | ul
380 | {
381 | list-style-type: none;
382 | padding:0px;
383 | padding-left:6px;
384 | }
385 |
386 | /* Compare-specific CSS */
387 |
388 | .compareDexHeader
389 | {
390 | text-align: center;
391 | }
392 |
393 | /* Login-specific CSS */
394 |
395 | .loginContainer
396 | {
397 | max-width:300px;
398 | margin-left:auto;
399 | margin-right:auto;
400 | }
401 |
402 | .loginLabel
403 | {
404 | font-family:"HelveticaNeue", sans-serif;
405 | font-weight: lighter;
406 | text-align:center;
407 | }
408 |
409 | .error
410 | {
411 | font-family:"HelveticaNeue", sans-serif;
412 | font-size:22pt;
413 | }
414 |
415 | input.textBox
416 | {
417 | font-size:24pt;
418 | font-family:"HelveticaNeue", sans-serif;
419 | font-style: lighter;
420 | display:block;
421 | width:100%;
422 | }
423 |
424 | input.textBox#registerUsername
425 | {
426 | text-transform:lowercase;
427 | }
428 |
429 | input.textBox#loginUsername
430 | {
431 | text-transform:lowercase;
432 | }
433 |
434 | input.textBox#registerFriendCode
435 | {
436 | font-family:"Menlo", "Lucida Console", Monaco, monospace;
437 | font-size:19pt;
438 | text-align:center;
439 | height:38px;
440 | }
441 |
442 | .securityText
443 | {
444 | font-size:14pt;
445 | font-family:"HelveticaNeue", sans-serif;
446 | }
447 |
448 | .securityWarning
449 | {
450 | color: red;
451 | font-weight: bold;
452 | }
453 |
--------------------------------------------------------------------------------
/static/pokesprite.min.js:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | PokéSprite 1.0
4 | (C) 2014, Michiel Sikma and PokéSprite contributors
5 | (C) 1995-2014 Nintendo/Creatures Inc./GAME FREAK Inc.
6 | For a full list of contributors, view the project commit history.
7 | Generated on 2014-08-12 22:56:37.
8 |
9 | */
10 | window.PkSpr=function(){var a=this;a.A="pkspr";a.B={pkmn:{w:40,h:30},etc:{},"body-style":{w:32,h:32},apricorn:{w:30,h:30},"battle-item":{w:30,h:30},berry:{w:30,h:30},"ev-item":{w:30,h:30},"evo-item":{w:30,h:30},flute:{w:30,h:30},fossil:{w:30,h:30},gem:{w:30,h:30},hm:{w:30,h:30},"hold-item":{w:30,h:30},incense:{w:30,h:30},"other-item":{w:30,h:30},"key-item":{w:30,h:30},mail:{w:30,h:30},medicine:{w:30,h:30},"mega-stone":{w:30,h:30},mulch:{w:30,h:30},plate:{w:30,h:30},pokeball:{w:30,h:30},scarf:{w:30,
11 | h:30},shard:{w:30,h:30},tm:{w:30,h:30},"valuable-item":{w:30,h:30},"wonder-launcher":{w:30,h:30},status:{w:10,h:10}};a.J={pkmn:{bulbasaur:{".":{".":{regular:{x:0,y:0},shiny:{x:40,y:0}}}},ivysaur:{".":{".":{regular:{x:80,y:0},shiny:{x:120,y:0}}}},venusaur:{".":{".":{regular:{x:160,y:0},shiny:{x:200,y:0}}},mega:{".":{regular:{x:240,y:0},shiny:{x:280,y:0}}}},charmander:{".":{".":{regular:{x:320,y:0},shiny:{x:360,y:0}}}},charmeleon:{".":{".":{regular:{x:400,y:0},shiny:{x:440,y:0}}}},charizard:{".":{".":{regular:{x:480,
12 | y:0},shiny:{x:520,y:0}}},"mega-x":{".":{regular:{x:560,y:0},shiny:{x:600,y:0}}},"mega-y":{".":{regular:{x:640,y:0},shiny:{x:680,y:0}}}},squirtle:{".":{".":{regular:{x:720,y:0},shiny:{x:760,y:0}}}},wartortle:{".":{".":{regular:{x:800,y:0},shiny:{x:840,y:0}}}},blastoise:{".":{".":{regular:{x:880,y:0},shiny:{x:920,y:0}}},mega:{".":{regular:{x:960,y:0},shiny:{x:1E3,y:0}}}},caterpie:{".":{".":{regular:{x:1040,y:0},shiny:{x:1080,y:0}}}},metapod:{".":{".":{regular:{x:1120,y:0},shiny:{x:1160,y:0}}}},butterfree:{".":{".":{regular:{x:1200,
13 | y:0},shiny:{x:1240,y:0}}}},weedle:{".":{".":{regular:{x:0,y:30},shiny:{x:40,y:30}}}},kakuna:{".":{".":{regular:{x:80,y:30},shiny:{x:120,y:30}}}},beedrill:{".":{".":{regular:{x:160,y:30},shiny:{x:200,y:30}}}},pidgey:{".":{".":{regular:{x:240,y:30},shiny:{x:280,y:30}}}},pidgeotto:{".":{".":{regular:{x:320,y:30},shiny:{x:360,y:30}}}},pidgeot:{".":{".":{regular:{x:400,y:30},shiny:{x:440,y:30}}}},rattata:{".":{".":{regular:{x:480,y:30},shiny:{x:520,y:30}}}},raticate:{".":{".":{regular:{x:560,y:30},shiny:{x:600,
14 | y:30}}}},spearow:{".":{".":{regular:{x:640,y:30},shiny:{x:680,y:30}}}},fearow:{".":{".":{regular:{x:720,y:30},shiny:{x:760,y:30}}}},ekans:{".":{".":{regular:{x:800,y:30},shiny:{x:840,y:30}}}},arbok:{".":{".":{regular:{x:880,y:30},shiny:{x:920,y:30}}}},pikachu:{".":{".":{regular:{x:960,y:30},shiny:{x:1E3,y:30}}}},raichu:{".":{".":{regular:{x:1040,y:30},shiny:{x:1080,y:30}}}},sandshrew:{".":{".":{regular:{x:1120,y:30},shiny:{x:1160,y:30}}}},sandslash:{".":{".":{regular:{x:1200,y:30},shiny:{x:1240,y:30}}}},
15 | "nidoran-f":{".":{".":{regular:{x:0,y:60},shiny:{x:40,y:60}}}},nidorina:{".":{".":{regular:{x:80,y:60},shiny:{x:120,y:60}}}},nidoqueen:{".":{".":{regular:{x:160,y:60},shiny:{x:200,y:60}}}},"nidoran-m":{".":{".":{regular:{x:240,y:60},shiny:{x:280,y:60}}}},nidorino:{".":{".":{regular:{x:320,y:60},shiny:{x:360,y:60}}}},nidoking:{".":{".":{regular:{x:400,y:60},shiny:{x:440,y:60}}}},clefairy:{".":{".":{regular:{x:480,y:60},shiny:{x:560,y:60}},right:{regular:{x:520,y:60},shiny:{x:600,y:60}}}},clefable:{".":{".":{regular:{x:640,
16 | y:60},shiny:{x:720,y:60}},right:{regular:{x:680,y:60},shiny:{x:760,y:60}}}},vulpix:{".":{".":{regular:{x:800,y:60},shiny:{x:840,y:60}}}},ninetales:{".":{".":{regular:{x:880,y:60},shiny:{x:920,y:60}}}},jigglypuff:{".":{".":{regular:{x:960,y:60},shiny:{x:1040,y:60}},right:{regular:{x:1E3,y:60},shiny:{x:1080,y:60}}}},wigglytuff:{".":{".":{regular:{x:1120,y:60},shiny:{x:1200,y:60}},right:{regular:{x:1160,y:60},shiny:{x:1240,y:60}}}},zubat:{".":{".":{regular:{x:0,y:90},shiny:{x:40,y:90}}}},golbat:{".":{".":{regular:{x:80,
17 | y:90},shiny:{x:120,y:90}}}},oddish:{".":{".":{regular:{x:160,y:90},shiny:{x:200,y:90}}}},gloom:{".":{".":{regular:{x:240,y:90},shiny:{x:280,y:90}}}},vileplume:{".":{".":{regular:{x:320,y:90},shiny:{x:360,y:90}}}},paras:{".":{".":{regular:{x:400,y:90},shiny:{x:440,y:90}}}},parasect:{".":{".":{regular:{x:480,y:90},shiny:{x:520,y:90}}}},venonat:{".":{".":{regular:{x:560,y:90},shiny:{x:600,y:90}}}},venomoth:{".":{".":{regular:{x:640,y:90},shiny:{x:680,y:90}}}},diglett:{".":{".":{regular:{x:720,y:90},
18 | shiny:{x:760,y:90}}}},dugtrio:{".":{".":{regular:{x:800,y:90},shiny:{x:840,y:90}}}},meowth:{".":{".":{regular:{x:880,y:90},shiny:{x:920,y:90}}}},persian:{".":{".":{regular:{x:960,y:90},shiny:{x:1E3,y:90}}}},psyduck:{".":{".":{regular:{x:1040,y:90},shiny:{x:1080,y:90}}}},golduck:{".":{".":{regular:{x:1120,y:90},shiny:{x:1160,y:90}}}},mankey:{".":{".":{regular:{x:1200,y:90},shiny:{x:1240,y:90}}}},primeape:{".":{".":{regular:{x:0,y:120},shiny:{x:40,y:120}}}},growlithe:{".":{".":{regular:{x:80,y:120},
19 | shiny:{x:120,y:120}}}},arcanine:{".":{".":{regular:{x:160,y:120},shiny:{x:200,y:120}}}},poliwag:{".":{".":{regular:{x:240,y:120},shiny:{x:280,y:120}}}},poliwhirl:{".":{".":{regular:{x:320,y:120},shiny:{x:400,y:120}},right:{regular:{x:360,y:120},shiny:{x:440,y:120}}}},poliwrath:{".":{".":{regular:{x:480,y:120},shiny:{x:560,y:120}},right:{regular:{x:520,y:120},shiny:{x:600,y:120}}}},abra:{".":{".":{regular:{x:640,y:120},shiny:{x:680,y:120}}}},kadabra:{".":{".":{regular:{x:720,y:120},shiny:{x:760,y:120}}}},
20 | alakazam:{".":{".":{regular:{x:800,y:120},shiny:{x:840,y:120}}},mega:{".":{regular:{x:880,y:120},shiny:{x:920,y:120}}}},machop:{".":{".":{regular:{x:960,y:120},shiny:{x:1E3,y:120}}}},machoke:{".":{".":{regular:{x:1040,y:120},shiny:{x:1080,y:120}}}},machamp:{".":{".":{regular:{x:1120,y:120},shiny:{x:1160,y:120}}}},bellsprout:{".":{".":{regular:{x:1200,y:120},shiny:{x:1240,y:120}}}},weepinbell:{".":{".":{regular:{x:0,y:150},shiny:{x:40,y:150}}}},victreebel:{".":{".":{regular:{x:80,y:150},shiny:{x:120,
21 | y:150}}}},tentacool:{".":{".":{regular:{x:160,y:150},shiny:{x:200,y:150}}}},tentacruel:{".":{".":{regular:{x:240,y:150},shiny:{x:280,y:150}}}},geodude:{".":{".":{regular:{x:320,y:150},shiny:{x:360,y:150}}}},graveler:{".":{".":{regular:{x:400,y:150},shiny:{x:440,y:150}}}},golem:{".":{".":{regular:{x:480,y:150},shiny:{x:520,y:150}}}},ponyta:{".":{".":{regular:{x:560,y:150},shiny:{x:600,y:150}}}},rapidash:{".":{".":{regular:{x:640,y:150},shiny:{x:680,y:150}}}},slowpoke:{".":{".":{regular:{x:720,y:150},
22 | shiny:{x:760,y:150}}}},slowbro:{".":{".":{regular:{x:800,y:150},shiny:{x:840,y:150}}}},magnemite:{".":{".":{regular:{x:880,y:150},shiny:{x:920,y:150}}}},magneton:{".":{".":{regular:{x:960,y:150},shiny:{x:1E3,y:150}}}},farfetchd:{".":{".":{regular:{x:1040,y:150},shiny:{x:1080,y:150}}}},doduo:{".":{".":{regular:{x:1120,y:150},shiny:{x:1160,y:150}}}},dodrio:{".":{".":{regular:{x:1200,y:150},shiny:{x:1240,y:150}}}},seel:{".":{".":{regular:{x:0,y:180},shiny:{x:40,y:180}}}},dewgong:{".":{".":{regular:{x:80,
23 | y:180},shiny:{x:120,y:180}}}},grimer:{".":{".":{regular:{x:160,y:180},shiny:{x:200,y:180}}}},muk:{".":{".":{regular:{x:240,y:180},shiny:{x:280,y:180}}}},shellder:{".":{".":{regular:{x:320,y:180},shiny:{x:360,y:180}}}},cloyster:{".":{".":{regular:{x:400,y:180},shiny:{x:440,y:180}}}},gastly:{".":{".":{regular:{x:480,y:180},shiny:{x:520,y:180}}}},haunter:{".":{".":{regular:{x:560,y:180},shiny:{x:600,y:180}}}},gengar:{".":{".":{regular:{x:640,y:180},shiny:{x:680,y:180}}},mega:{".":{regular:{x:720,y:180},
24 | shiny:{x:760,y:180}}}},onix:{".":{".":{regular:{x:800,y:180},shiny:{x:840,y:180}}}},drowzee:{".":{".":{regular:{x:880,y:180},shiny:{x:920,y:180}}}},hypno:{".":{".":{regular:{x:960,y:180},shiny:{x:1E3,y:180}}}},krabby:{".":{".":{regular:{x:1040,y:180},shiny:{x:1080,y:180}}}},kingler:{".":{".":{regular:{x:1120,y:180},shiny:{x:1200,y:180}},right:{regular:{x:1160,y:180},shiny:{x:1240,y:180}}}},voltorb:{".":{".":{regular:{x:0,y:210},shiny:{x:40,y:210}}}},electrode:{".":{".":{regular:{x:80,y:210},shiny:{x:120,
25 | y:210}}}},exeggcute:{".":{".":{regular:{x:160,y:210},shiny:{x:200,y:210}}}},exeggutor:{".":{".":{regular:{x:240,y:210},shiny:{x:280,y:210}}}},cubone:{".":{".":{regular:{x:320,y:210},shiny:{x:360,y:210}}}},marowak:{".":{".":{regular:{x:400,y:210},shiny:{x:440,y:210}}}},hitmonlee:{".":{".":{regular:{x:480,y:210},shiny:{x:520,y:210}}}},hitmonchan:{".":{".":{regular:{x:560,y:210},shiny:{x:600,y:210}}}},lickitung:{".":{".":{regular:{x:640,y:210},shiny:{x:680,y:210}}}},koffing:{".":{".":{regular:{x:720,
26 | y:210},shiny:{x:760,y:210}}}},weezing:{".":{".":{regular:{x:800,y:210},shiny:{x:840,y:210}}}},rhyhorn:{".":{".":{regular:{x:880,y:210},shiny:{x:920,y:210}}}},rhydon:{".":{".":{regular:{x:960,y:210},shiny:{x:1E3,y:210}}}},chansey:{".":{".":{regular:{x:1040,y:210},shiny:{x:1080,y:210}}}},tangela:{".":{".":{regular:{x:1120,y:210},shiny:{x:1160,y:210}}}},kangaskhan:{".":{".":{regular:{x:1200,y:210},shiny:{x:1240,y:210}}},mega:{".":{regular:{x:0,y:240},shiny:{x:40,y:240}}}},horsea:{".":{".":{regular:{x:80,
27 | y:240},shiny:{x:120,y:240}}}},seadra:{".":{".":{regular:{x:160,y:240},shiny:{x:200,y:240}}}},goldeen:{".":{".":{regular:{x:240,y:240},shiny:{x:280,y:240}}}},seaking:{".":{".":{regular:{x:320,y:240},shiny:{x:360,y:240}}}},staryu:{".":{".":{regular:{x:400,y:240},shiny:{x:440,y:240}}}},starmie:{".":{".":{regular:{x:480,y:240},shiny:{x:520,y:240}}}},"mr-mime":{".":{".":{regular:{x:560,y:240},shiny:{x:600,y:240}}}},scyther:{".":{".":{regular:{x:640,y:240},shiny:{x:680,y:240}}}},jynx:{".":{".":{regular:{x:720,
28 | y:240},shiny:{x:760,y:240}}}},electabuzz:{".":{".":{regular:{x:800,y:240},shiny:{x:840,y:240}}}},magmar:{".":{".":{regular:{x:880,y:240},shiny:{x:920,y:240}}}},pinsir:{".":{".":{regular:{x:960,y:240},shiny:{x:1E3,y:240}}},mega:{".":{regular:{x:1040,y:240},shiny:{x:1080,y:240}}}},tauros:{".":{".":{regular:{x:1120,y:240},shiny:{x:1160,y:240}}}},magikarp:{".":{".":{regular:{x:1200,y:240},shiny:{x:1240,y:240}}}},gyarados:{".":{".":{regular:{x:0,y:270},shiny:{x:40,y:270}}},mega:{".":{regular:{x:80,y:270},
29 | shiny:{x:120,y:270}}}},lapras:{".":{".":{regular:{x:160,y:270},shiny:{x:200,y:270}}}},ditto:{".":{".":{regular:{x:240,y:270},shiny:{x:280,y:270}}}},eevee:{".":{".":{regular:{x:320,y:270},shiny:{x:360,y:270}}}},vaporeon:{".":{".":{regular:{x:400,y:270},shiny:{x:440,y:270}}}},jolteon:{".":{".":{regular:{x:480,y:270},shiny:{x:520,y:270}}}},flareon:{".":{".":{regular:{x:560,y:270},shiny:{x:600,y:270}}}},porygon:{".":{".":{regular:{x:640,y:270},shiny:{x:680,y:270}}}},omanyte:{".":{".":{regular:{x:720,
30 | y:270},shiny:{x:760,y:270}}}},omastar:{".":{".":{regular:{x:800,y:270},shiny:{x:840,y:270}}}},kabuto:{".":{".":{regular:{x:880,y:270},shiny:{x:920,y:270}}}},kabutops:{".":{".":{regular:{x:960,y:270},shiny:{x:1E3,y:270}}}},aerodactyl:{".":{".":{regular:{x:1040,y:270},shiny:{x:1080,y:270}}},mega:{".":{regular:{x:1120,y:270},shiny:{x:1160,y:270}}}},snorlax:{".":{".":{regular:{x:1200,y:270},shiny:{x:1240,y:270}}}},articuno:{".":{".":{regular:{x:0,y:300},shiny:{x:40,y:300}}}},zapdos:{".":{".":{regular:{x:80,
31 | y:300},shiny:{x:120,y:300}}}},moltres:{".":{".":{regular:{x:160,y:300},shiny:{x:200,y:300}}}},dratini:{".":{".":{regular:{x:240,y:300},shiny:{x:280,y:300}}}},dragonair:{".":{".":{regular:{x:320,y:300},shiny:{x:360,y:300}}}},dragonite:{".":{".":{regular:{x:400,y:300},shiny:{x:440,y:300}}}},mewtwo:{".":{".":{regular:{x:480,y:300},shiny:{x:520,y:300}}},"mega-x":{".":{regular:{x:560,y:300},shiny:{x:600,y:300}}},"mega-y":{".":{regular:{x:640,y:300},shiny:{x:680,y:300}}}},mew:{".":{".":{regular:{x:720,
32 | y:300},shiny:{x:760,y:300}}}},chikorita:{".":{".":{regular:{x:800,y:300},shiny:{x:840,y:300}}}},bayleef:{".":{".":{regular:{x:880,y:300},shiny:{x:920,y:300}}}},meganium:{".":{".":{regular:{x:960,y:300},shiny:{x:1E3,y:300}}}},cyndaquil:{".":{".":{regular:{x:1040,y:300},shiny:{x:1080,y:300}}}},quilava:{".":{".":{regular:{x:1120,y:300},shiny:{x:1160,y:300}}}},typhlosion:{".":{".":{regular:{x:1200,y:300},shiny:{x:1240,y:300}}}},totodile:{".":{".":{regular:{x:0,y:330},shiny:{x:40,y:330}}}},croconaw:{".":{".":{regular:{x:80,
33 | y:330},shiny:{x:160,y:330}},right:{regular:{x:120,y:330},shiny:{x:200,y:330}}}},feraligatr:{".":{".":{regular:{x:240,y:330},shiny:{x:280,y:330}}}},sentret:{".":{".":{regular:{x:320,y:330},shiny:{x:360,y:330}}}},furret:{".":{".":{regular:{x:400,y:330},shiny:{x:440,y:330}}}},hoothoot:{".":{".":{regular:{x:480,y:330},shiny:{x:520,y:330}}}},noctowl:{".":{".":{regular:{x:560,y:330},shiny:{x:600,y:330}}}},ledyba:{".":{".":{regular:{x:640,y:330},shiny:{x:680,y:330}}}},ledian:{".":{".":{regular:{x:720,y:330},
34 | shiny:{x:760,y:330}}}},spinarak:{".":{".":{regular:{x:800,y:330},shiny:{x:840,y:330}}}},ariados:{".":{".":{regular:{x:880,y:330},shiny:{x:920,y:330}}}},crobat:{".":{".":{regular:{x:960,y:330},shiny:{x:1E3,y:330}}}},chinchou:{".":{".":{regular:{x:1040,y:330},shiny:{x:1080,y:330}}}},lanturn:{".":{".":{regular:{x:1120,y:330},shiny:{x:1160,y:330}}}},pichu:{".":{".":{regular:{x:1200,y:330},shiny:{x:1240,y:330}}}},cleffa:{".":{".":{regular:{x:0,y:360},shiny:{x:80,y:360}},right:{regular:{x:40,y:360},shiny:{x:120,
35 | y:360}}}},igglybuff:{".":{".":{regular:{x:160,y:360},shiny:{x:240,y:360}},right:{regular:{x:200,y:360},shiny:{x:280,y:360}}}},togepi:{".":{".":{regular:{x:320,y:360},shiny:{x:360,y:360}}}},togetic:{".":{".":{regular:{x:400,y:360},shiny:{x:440,y:360}}}},natu:{".":{".":{regular:{x:480,y:360},shiny:{x:520,y:360}}}},xatu:{".":{".":{regular:{x:560,y:360},shiny:{x:600,y:360}}}},mareep:{".":{".":{regular:{x:640,y:360},shiny:{x:680,y:360}}}},flaaffy:{".":{".":{regular:{x:720,y:360},shiny:{x:760,y:360}}}},
36 | ampharos:{".":{".":{regular:{x:800,y:360},shiny:{x:840,y:360}}},mega:{".":{regular:{x:880,y:360},shiny:{x:920,y:360}}}},bellossom:{".":{".":{regular:{x:960,y:360},shiny:{x:1E3,y:360}}}},marill:{".":{".":{regular:{x:1040,y:360},shiny:{x:1080,y:360}}}},azumarill:{".":{".":{regular:{x:1120,y:360},shiny:{x:1160,y:360}}}},sudowoodo:{".":{".":{regular:{x:1200,y:360},shiny:{x:1240,y:360}}}},politoed:{".":{".":{regular:{x:0,y:390},shiny:{x:80,y:390}},right:{regular:{x:40,y:390},shiny:{x:120,y:390}}}},hoppip:{".":{".":{regular:{x:160,
37 | y:390},shiny:{x:200,y:390}}}},skiploom:{".":{".":{regular:{x:240,y:390},shiny:{x:280,y:390}}}},jumpluff:{".":{".":{regular:{x:320,y:390},shiny:{x:360,y:390}}}},aipom:{".":{".":{regular:{x:400,y:390},shiny:{x:440,y:390}}}},sunkern:{".":{".":{regular:{x:480,y:390},shiny:{x:520,y:390}}}},sunflora:{".":{".":{regular:{x:560,y:390},shiny:{x:600,y:390}}}},yanma:{".":{".":{regular:{x:640,y:390},shiny:{x:680,y:390}}}},wooper:{".":{".":{regular:{x:720,y:390},shiny:{x:760,y:390}}}},quagsire:{".":{".":{regular:{x:800,
38 | y:390},shiny:{x:840,y:390}}}},espeon:{".":{".":{regular:{x:880,y:390},shiny:{x:920,y:390}}}},umbreon:{".":{".":{regular:{x:960,y:390},shiny:{x:1E3,y:390}}}},murkrow:{".":{".":{regular:{x:1040,y:390},shiny:{x:1080,y:390}}}},slowking:{".":{".":{regular:{x:1120,y:390},shiny:{x:1160,y:390}}}},misdreavus:{".":{".":{regular:{x:1200,y:390},shiny:{x:1240,y:390}}}},unown:{".":{".":{regular:{x:0,y:420},shiny:{x:40,y:420}}},a:{".":{regular:{x:0,y:420},shiny:{x:40,y:420}}},b:{".":{regular:{x:80,y:420},shiny:{x:160,
39 | y:420}},right:{regular:{x:120,y:420},shiny:{x:200,y:420}}},c:{".":{regular:{x:240,y:420},shiny:{x:320,y:420}},right:{regular:{x:280,y:420},shiny:{x:360,y:420}}},d:{".":{regular:{x:400,y:420},shiny:{x:480,y:420}},right:{regular:{x:440,y:420},shiny:{x:520,y:420}}},e:{".":{regular:{x:560,y:420},shiny:{x:640,y:420}},right:{regular:{x:600,y:420},shiny:{x:680,y:420}}},exclamation:{".":{regular:{x:720,y:420},shiny:{x:760,y:420}}},f:{".":{regular:{x:800,y:420},shiny:{x:880,y:420}},right:{regular:{x:840,y:420},
40 | shiny:{x:920,y:420}}},g:{".":{regular:{x:960,y:420},shiny:{x:1040,y:420}},right:{regular:{x:1E3,y:420},shiny:{x:1080,y:420}}},h:{".":{regular:{x:1120,y:420},shiny:{x:1200,y:420}},right:{regular:{x:1160,y:420},shiny:{x:1240,y:420}}},i:{".":{regular:{x:0,y:450},shiny:{x:40,y:450}}},j:{".":{regular:{x:80,y:450},shiny:{x:160,y:450}},right:{regular:{x:120,y:450},shiny:{x:200,y:450}}},k:{".":{regular:{x:240,y:450},shiny:{x:320,y:450}},right:{regular:{x:280,y:450},shiny:{x:360,y:450}}},l:{".":{regular:{x:400,
41 | y:450},shiny:{x:480,y:450}},right:{regular:{x:440,y:450},shiny:{x:520,y:450}}},m:{".":{regular:{x:560,y:450},shiny:{x:640,y:450}},right:{regular:{x:600,y:450},shiny:{x:680,y:450}}},n:{".":{regular:{x:720,y:450},shiny:{x:800,y:450}},right:{regular:{x:760,y:450},shiny:{x:840,y:450}}},o:{".":{regular:{x:880,y:450},shiny:{x:920,y:450}}},p:{".":{regular:{x:960,y:450},shiny:{x:1040,y:450}},right:{regular:{x:1E3,y:450},shiny:{x:1080,y:450}}},q:{".":{regular:{x:1120,y:450},shiny:{x:1200,y:450}},right:{regular:{x:1160,
42 | y:450},shiny:{x:1240,y:450}}},question:{".":{regular:{x:0,y:480},shiny:{x:80,y:480}},right:{regular:{x:40,y:480},shiny:{x:120,y:480}}},r:{".":{regular:{x:160,y:480},shiny:{x:240,y:480}},right:{regular:{x:200,y:480},shiny:{x:280,y:480}}},s:{".":{regular:{x:320,y:480},shiny:{x:400,y:480}},right:{regular:{x:360,y:480},shiny:{x:440,y:480}}},t:{".":{regular:{x:480,y:480},shiny:{x:560,y:480}},right:{regular:{x:520,y:480},shiny:{x:600,y:480}}},u:{".":{regular:{x:640,y:480},shiny:{x:680,y:480}}},v:{".":{regular:{x:720,
43 | y:480},shiny:{x:800,y:480}},right:{regular:{x:760,y:480},shiny:{x:840,y:480}}},w:{".":{regular:{x:880,y:480},shiny:{x:920,y:480}}},x:{".":{regular:{x:960,y:480},shiny:{x:1E3,y:480}}},y:{".":{regular:{x:1040,y:480},shiny:{x:1080,y:480}}},z:{".":{regular:{x:1120,y:480},shiny:{x:1200,y:480}},right:{regular:{x:1160,y:480},shiny:{x:1240,y:480}}}},wobbuffet:{".":{".":{regular:{x:0,y:510},shiny:{x:40,y:510}}}},girafarig:{".":{".":{regular:{x:80,y:510},shiny:{x:120,y:510}}}},pineco:{".":{".":{regular:{x:160,
44 | y:510},shiny:{x:200,y:510}}}},forretress:{".":{".":{regular:{x:240,y:510},shiny:{x:280,y:510}}}},dunsparce:{".":{".":{regular:{x:320,y:510},shiny:{x:360,y:510}}}},gligar:{".":{".":{regular:{x:400,y:510},shiny:{x:440,y:510}}}},steelix:{".":{".":{regular:{x:480,y:510},shiny:{x:520,y:510}}}},snubbull:{".":{".":{regular:{x:560,y:510},shiny:{x:600,y:510}}}},granbull:{".":{".":{regular:{x:640,y:510},shiny:{x:680,y:510}}}},qwilfish:{".":{".":{regular:{x:720,y:510},shiny:{x:760,y:510}}}},scizor:{".":{".":{regular:{x:800,
45 | y:510},shiny:{x:840,y:510}}},mega:{".":{regular:{x:880,y:510},shiny:{x:920,y:510}}}},shuckle:{".":{".":{regular:{x:960,y:510},shiny:{x:1E3,y:510}}}},heracross:{".":{".":{regular:{x:1040,y:510},shiny:{x:1080,y:510}}},mega:{".":{regular:{x:1120,y:510},shiny:{x:1160,y:510}}}},sneasel:{".":{".":{regular:{x:1200,y:510},shiny:{x:0,y:540}},right:{regular:{x:1240,y:510},shiny:{x:40,y:540}}}},teddiursa:{".":{".":{regular:{x:80,y:540},shiny:{x:160,y:540}},right:{regular:{x:120,y:540},shiny:{x:200,y:540}}}},
46 | ursaring:{".":{".":{regular:{x:240,y:540},shiny:{x:280,y:540}}}},slugma:{".":{".":{regular:{x:320,y:540},shiny:{x:360,y:540}}}},magcargo:{".":{".":{regular:{x:400,y:540},shiny:{x:440,y:540}}}},swinub:{".":{".":{regular:{x:480,y:540},shiny:{x:520,y:540}}}},piloswine:{".":{".":{regular:{x:560,y:540},shiny:{x:600,y:540}}}},corsola:{".":{".":{regular:{x:640,y:540},shiny:{x:680,y:540}}}},remoraid:{".":{".":{regular:{x:720,y:540},shiny:{x:760,y:540}}}},octillery:{".":{".":{regular:{x:800,y:540},shiny:{x:840,
47 | y:540}}}},delibird:{".":{".":{regular:{x:880,y:540},shiny:{x:920,y:540}}}},mantine:{".":{".":{regular:{x:960,y:540},shiny:{x:1E3,y:540}}}},skarmory:{".":{".":{regular:{x:1040,y:540},shiny:{x:1080,y:540}}}},houndour:{".":{".":{regular:{x:1120,y:540},shiny:{x:1160,y:540}}}},houndoom:{".":{".":{regular:{x:1200,y:540},shiny:{x:1240,y:540}}},mega:{".":{regular:{x:0,y:570},shiny:{x:40,y:570}}}},kingdra:{".":{".":{regular:{x:80,y:570},shiny:{x:120,y:570}}}},phanpy:{".":{".":{regular:{x:160,y:570},shiny:{x:200,
48 | y:570}}}},donphan:{".":{".":{regular:{x:240,y:570},shiny:{x:280,y:570}}}},porygon2:{".":{".":{regular:{x:320,y:570},shiny:{x:360,y:570}}}},stantler:{".":{".":{regular:{x:400,y:570},shiny:{x:440,y:570}}}},smeargle:{".":{".":{regular:{x:480,y:570},shiny:{x:520,y:570}}}},tyrogue:{".":{".":{regular:{x:560,y:570},shiny:{x:600,y:570}}}},hitmontop:{".":{".":{regular:{x:640,y:570},shiny:{x:680,y:570}}}},smoochum:{".":{".":{regular:{x:720,y:570},shiny:{x:760,y:570}}}},elekid:{".":{".":{regular:{x:800,y:570},
49 | shiny:{x:840,y:570}}}},magby:{".":{".":{regular:{x:880,y:570},shiny:{x:920,y:570}}}},miltank:{".":{".":{regular:{x:960,y:570},shiny:{x:1E3,y:570}}}},blissey:{".":{".":{regular:{x:1040,y:570},shiny:{x:1080,y:570}}}},raikou:{".":{".":{regular:{x:1120,y:570},shiny:{x:1160,y:570}}}},entei:{".":{".":{regular:{x:1200,y:570},shiny:{x:1240,y:570}}}},suicune:{".":{".":{regular:{x:0,y:600},shiny:{x:40,y:600}}}},larvitar:{".":{".":{regular:{x:80,y:600},shiny:{x:120,y:600}}}},pupitar:{".":{".":{regular:{x:160,
50 | y:600},shiny:{x:200,y:600}}}},tyranitar:{".":{".":{regular:{x:240,y:600},shiny:{x:280,y:600}}},mega:{".":{regular:{x:320,y:600},shiny:{x:360,y:600}}}},lugia:{".":{".":{regular:{x:400,y:600},shiny:{x:440,y:600}}}},"ho-oh":{".":{".":{regular:{x:480,y:600},shiny:{x:520,y:600}}}},celebi:{".":{".":{regular:{x:560,y:600},shiny:{x:600,y:600}}}},treecko:{".":{".":{regular:{x:640,y:600},shiny:{x:680,y:600}}}},grovyle:{".":{".":{regular:{x:720,y:600},shiny:{x:760,y:600}}}},sceptile:{".":{".":{regular:{x:800,
51 | y:600},shiny:{x:840,y:600}}}},torchic:{".":{".":{regular:{x:880,y:600},shiny:{x:920,y:600}}}},combusken:{".":{".":{regular:{x:960,y:600},shiny:{x:1E3,y:600}}}},blaziken:{".":{".":{regular:{x:1040,y:600},shiny:{x:1080,y:600}}},mega:{".":{regular:{x:1120,y:600},shiny:{x:1160,y:600}}}},mudkip:{".":{".":{regular:{x:1200,y:600},shiny:{x:1240,y:600}}}},marshtomp:{".":{".":{regular:{x:0,y:630},shiny:{x:40,y:630}}}},swampert:{".":{".":{regular:{x:80,y:630},shiny:{x:120,y:630}}}},poochyena:{".":{".":{regular:{x:160,
52 | y:630},shiny:{x:200,y:630}}}},mightyena:{".":{".":{regular:{x:240,y:630},shiny:{x:280,y:630}}}},zigzagoon:{".":{".":{regular:{x:320,y:630},shiny:{x:360,y:630}}}},linoone:{".":{".":{regular:{x:400,y:630},shiny:{x:440,y:630}}}},wurmple:{".":{".":{regular:{x:480,y:630},shiny:{x:520,y:630}}}},silcoon:{".":{".":{regular:{x:560,y:630},shiny:{x:600,y:630}}}},beautifly:{".":{".":{regular:{x:640,y:630},shiny:{x:680,y:630}}}},cascoon:{".":{".":{regular:{x:720,y:630},shiny:{x:760,y:630}}}},dustox:{".":{".":{regular:{x:800,
53 | y:630},shiny:{x:840,y:630}}}},lotad:{".":{".":{regular:{x:880,y:630},shiny:{x:920,y:630}}}},lombre:{".":{".":{regular:{x:960,y:630},shiny:{x:1E3,y:630}}}},ludicolo:{".":{".":{regular:{x:1040,y:630},shiny:{x:1080,y:630}}}},seedot:{".":{".":{regular:{x:1120,y:630},shiny:{x:1160,y:630}}}},nuzleaf:{".":{".":{regular:{x:1200,y:630},shiny:{x:1240,y:630}}}},shiftry:{".":{".":{regular:{x:0,y:660},shiny:{x:40,y:660}}}},taillow:{".":{".":{regular:{x:80,y:660},shiny:{x:120,y:660}}}},swellow:{".":{".":{regular:{x:160,
54 | y:660},shiny:{x:200,y:660}}}},wingull:{".":{".":{regular:{x:240,y:660},shiny:{x:280,y:660}}}},pelipper:{".":{".":{regular:{x:320,y:660},shiny:{x:360,y:660}}}},ralts:{".":{".":{regular:{x:400,y:660},shiny:{x:440,y:660}}}},kirlia:{".":{".":{regular:{x:480,y:660},shiny:{x:520,y:660}}}},gardevoir:{".":{".":{regular:{x:560,y:660},shiny:{x:600,y:660}}},mega:{".":{regular:{x:640,y:660},shiny:{x:680,y:660}}}},surskit:{".":{".":{regular:{x:720,y:660},shiny:{x:760,y:660}}}},masquerain:{".":{".":{regular:{x:800,
55 | y:660},shiny:{x:840,y:660}}}},shroomish:{".":{".":{regular:{x:880,y:660},shiny:{x:920,y:660}}}},breloom:{".":{".":{regular:{x:960,y:660},shiny:{x:1E3,y:660}}}},slakoth:{".":{".":{regular:{x:1040,y:660},shiny:{x:1080,y:660}}}},vigoroth:{".":{".":{regular:{x:1120,y:660},shiny:{x:1160,y:660}}}},slaking:{".":{".":{regular:{x:1200,y:660},shiny:{x:1240,y:660}}}},nincada:{".":{".":{regular:{x:0,y:690},shiny:{x:40,y:690}}}},ninjask:{".":{".":{regular:{x:80,y:690},shiny:{x:120,y:690}}}},shedinja:{".":{".":{regular:{x:160,
56 | y:690},shiny:{x:200,y:690}}}},whismur:{".":{".":{regular:{x:240,y:690},shiny:{x:280,y:690}}}},loudred:{".":{".":{regular:{x:320,y:690},shiny:{x:360,y:690}}}},exploud:{".":{".":{regular:{x:400,y:690},shiny:{x:440,y:690}}}},makuhita:{".":{".":{regular:{x:480,y:690},shiny:{x:520,y:690}}}},hariyama:{".":{".":{regular:{x:560,y:690},shiny:{x:600,y:690}}}},azurill:{".":{".":{regular:{x:640,y:690},shiny:{x:680,y:690}}}},nosepass:{".":{".":{regular:{x:720,y:690},shiny:{x:760,y:690}}}},skitty:{".":{".":{regular:{x:800,
57 | y:690},shiny:{x:840,y:690}}}},delcatty:{".":{".":{regular:{x:880,y:690},shiny:{x:920,y:690}}}},sableye:{".":{".":{regular:{x:960,y:690},shiny:{x:1E3,y:690}}}},mawile:{".":{".":{regular:{x:1040,y:690},shiny:{x:1080,y:690}}},mega:{".":{regular:{x:1120,y:690},shiny:{x:1160,y:690}}}},aron:{".":{".":{regular:{x:1200,y:690},shiny:{x:1240,y:690}}}},lairon:{".":{".":{regular:{x:0,y:720},shiny:{x:40,y:720}}}},aggron:{".":{".":{regular:{x:80,y:720},shiny:{x:120,y:720}}},mega:{".":{regular:{x:160,y:720},shiny:{x:200,
58 | y:720}}}},meditite:{".":{".":{regular:{x:240,y:720},shiny:{x:280,y:720}}}},medicham:{".":{".":{regular:{x:320,y:720},shiny:{x:360,y:720}}},mega:{".":{regular:{x:400,y:720},shiny:{x:440,y:720}}}},electrike:{".":{".":{regular:{x:480,y:720},shiny:{x:520,y:720}}}},manectric:{".":{".":{regular:{x:560,y:720},shiny:{x:600,y:720}}},mega:{".":{regular:{x:640,y:720},shiny:{x:680,y:720}}}},plusle:{".":{".":{regular:{x:720,y:720},shiny:{x:760,y:720}}}},minun:{".":{".":{regular:{x:800,y:720},shiny:{x:840,y:720}}}},
59 | volbeat:{".":{".":{regular:{x:880,y:720},shiny:{x:920,y:720}}}},illumise:{".":{".":{regular:{x:960,y:720},shiny:{x:1E3,y:720}}}},roselia:{".":{".":{regular:{x:1040,y:720},shiny:{x:1120,y:720}},right:{regular:{x:1080,y:720},shiny:{x:1160,y:720}}}},gulpin:{".":{".":{regular:{x:1200,y:720},shiny:{x:1240,y:720}}}},swalot:{".":{".":{regular:{x:0,y:750},shiny:{x:40,y:750}}}},carvanha:{".":{".":{regular:{x:80,y:750},shiny:{x:120,y:750}}}},sharpedo:{".":{".":{regular:{x:160,y:750},shiny:{x:200,y:750}}}},
60 | wailmer:{".":{".":{regular:{x:240,y:750},shiny:{x:280,y:750}}}},wailord:{".":{".":{regular:{x:320,y:750},shiny:{x:360,y:750}}}},numel:{".":{".":{regular:{x:400,y:750},shiny:{x:440,y:750}}}},camerupt:{".":{".":{regular:{x:480,y:750},shiny:{x:520,y:750}}}},torkoal:{".":{".":{regular:{x:560,y:750},shiny:{x:600,y:750}}}},spoink:{".":{".":{regular:{x:640,y:750},shiny:{x:680,y:750}}}},grumpig:{".":{".":{regular:{x:720,y:750},shiny:{x:760,y:750}}}},spinda:{".":{".":{regular:{x:800,y:750},shiny:{x:840,y:750}}}},
61 | trapinch:{".":{".":{regular:{x:880,y:750},shiny:{x:920,y:750}}}},vibrava:{".":{".":{regular:{x:960,y:750},shiny:{x:1E3,y:750}}}},flygon:{".":{".":{regular:{x:1040,y:750},shiny:{x:1080,y:750}}}},cacnea:{".":{".":{regular:{x:1120,y:750},shiny:{x:1160,y:750}}}},cacturne:{".":{".":{regular:{x:1200,y:750},shiny:{x:1240,y:750}}}},swablu:{".":{".":{regular:{x:0,y:780},shiny:{x:40,y:780}}}},altaria:{".":{".":{regular:{x:80,y:780},shiny:{x:120,y:780}}}},zangoose:{".":{".":{regular:{x:160,y:780},shiny:{x:240,
62 | y:780}},right:{regular:{x:200,y:780},shiny:{x:280,y:780}}}},seviper:{".":{".":{regular:{x:320,y:780},shiny:{x:400,y:780}},right:{regular:{x:360,y:780},shiny:{x:440,y:780}}}},lunatone:{".":{".":{regular:{x:480,y:780},shiny:{x:520,y:780}}}},solrock:{".":{".":{regular:{x:560,y:780},shiny:{x:600,y:780}}}},barboach:{".":{".":{regular:{x:640,y:780},shiny:{x:680,y:780}}}},whiscash:{".":{".":{regular:{x:720,y:780},shiny:{x:760,y:780}}}},corphish:{".":{".":{regular:{x:800,y:780},shiny:{x:840,y:780}}}},crawdaunt:{".":{".":{regular:{x:880,
63 | y:780},shiny:{x:920,y:780}}}},baltoy:{".":{".":{regular:{x:960,y:780},shiny:{x:1E3,y:780}}}},claydol:{".":{".":{regular:{x:1040,y:780},shiny:{x:1080,y:780}}}},lileep:{".":{".":{regular:{x:1120,y:780},shiny:{x:1160,y:780}}}},cradily:{".":{".":{regular:{x:1200,y:780},shiny:{x:1240,y:780}}}},anorith:{".":{".":{regular:{x:0,y:810},shiny:{x:40,y:810}}}},armaldo:{".":{".":{regular:{x:80,y:810},shiny:{x:120,y:810}}}},feebas:{".":{".":{regular:{x:160,y:810},shiny:{x:200,y:810}}}},milotic:{".":{".":{regular:{x:240,
64 | y:810},shiny:{x:280,y:810}}}},castform:{".":{".":{regular:{x:320,y:810},shiny:{x:360,y:810}}},rainy:{".":{regular:{x:400,y:810},shiny:{x:440,y:810}}},snowy:{".":{regular:{x:480,y:810},shiny:{x:560,y:810}},right:{regular:{x:520,y:810},shiny:{x:600,y:810}}},sunny:{".":{regular:{x:640,y:810},shiny:{x:680,y:810}}}},kecleon:{".":{".":{regular:{x:720,y:810},shiny:{x:760,y:810}}}},shuppet:{".":{".":{regular:{x:800,y:810},shiny:{x:840,y:810}}}},banette:{".":{".":{regular:{x:880,y:810},shiny:{x:920,y:810}}},
65 | mega:{".":{regular:{x:960,y:810},shiny:{x:1E3,y:810}}}},duskull:{".":{".":{regular:{x:1040,y:810},shiny:{x:1080,y:810}}}},dusclops:{".":{".":{regular:{x:1120,y:810},shiny:{x:1160,y:810}}}},tropius:{".":{".":{regular:{x:1200,y:810},shiny:{x:1240,y:810}}}},chimecho:{".":{".":{regular:{x:0,y:840},shiny:{x:40,y:840}}}},absol:{".":{".":{regular:{x:80,y:840},shiny:{x:160,y:840}},right:{regular:{x:120,y:840},shiny:{x:200,y:840}}},mega:{".":{regular:{x:240,y:840},shiny:{x:320,y:840}},right:{regular:{x:280,
66 | y:840},shiny:{x:360,y:840}}}},wynaut:{".":{".":{regular:{x:400,y:840},shiny:{x:440,y:840}}}},snorunt:{".":{".":{regular:{x:480,y:840},shiny:{x:520,y:840}}}},glalie:{".":{".":{regular:{x:560,y:840},shiny:{x:600,y:840}}}},spheal:{".":{".":{regular:{x:640,y:840},shiny:{x:680,y:840}}}},sealeo:{".":{".":{regular:{x:720,y:840},shiny:{x:760,y:840}}}},walrein:{".":{".":{regular:{x:800,y:840},shiny:{x:840,y:840}}}},clamperl:{".":{".":{regular:{x:880,y:840},shiny:{x:920,y:840}}}},huntail:{".":{".":{regular:{x:960,
67 | y:840},shiny:{x:1E3,y:840}}}},gorebyss:{".":{".":{regular:{x:1040,y:840},shiny:{x:1080,y:840}}}},relicanth:{".":{".":{regular:{x:1120,y:840},shiny:{x:1160,y:840}}}},luvdisc:{".":{".":{regular:{x:1200,y:840},shiny:{x:1240,y:840}}}},bagon:{".":{".":{regular:{x:0,y:870},shiny:{x:40,y:870}}}},shelgon:{".":{".":{regular:{x:80,y:870},shiny:{x:120,y:870}}}},salamence:{".":{".":{regular:{x:160,y:870},shiny:{x:200,y:870}}}},beldum:{".":{".":{regular:{x:240,y:870},shiny:{x:280,y:870}}}},metang:{".":{".":{regular:{x:320,
68 | y:870},shiny:{x:360,y:870}}}},metagross:{".":{".":{regular:{x:400,y:870},shiny:{x:440,y:870}}}},regirock:{".":{".":{regular:{x:480,y:870},shiny:{x:560,y:870}},right:{regular:{x:520,y:870},shiny:{x:600,y:870}}}},regice:{".":{".":{regular:{x:640,y:870},shiny:{x:680,y:870}}}},registeel:{".":{".":{regular:{x:720,y:870},shiny:{x:760,y:870}}}},latias:{".":{".":{regular:{x:800,y:870},shiny:{x:840,y:870}}},mega:{".":{regular:{x:880,y:870},shiny:{x:920,y:870}}}},latios:{".":{".":{regular:{x:960,y:870},shiny:{x:1E3,
69 | y:870}}},mega:{".":{regular:{x:1040,y:870},shiny:{x:1080,y:870}}}},kyogre:{".":{".":{regular:{x:1120,y:870},shiny:{x:1160,y:870}}}},groudon:{".":{".":{regular:{x:1200,y:870},shiny:{x:1240,y:870}}}},rayquaza:{".":{".":{regular:{x:0,y:900},shiny:{x:40,y:900}}}},jirachi:{".":{".":{regular:{x:80,y:900},shiny:{x:120,y:900}}}},deoxys:{".":{".":{regular:{x:160,y:900},shiny:{x:200,y:900}}},attack:{".":{regular:{x:240,y:900},shiny:{x:280,y:900}}},defense:{".":{regular:{x:320,y:900},shiny:{x:360,y:900}}},normal:{".":{regular:{x:160,
70 | y:900},shiny:{x:200,y:900}}},speed:{".":{regular:{x:400,y:900},shiny:{x:440,y:900}}}},turtwig:{".":{".":{regular:{x:480,y:900},shiny:{x:520,y:900}}}},grotle:{".":{".":{regular:{x:560,y:900},shiny:{x:600,y:900}}}},torterra:{".":{".":{regular:{x:640,y:900},shiny:{x:720,y:900}},right:{regular:{x:680,y:900},shiny:{x:760,y:900}}}},chimchar:{".":{".":{regular:{x:800,y:900},shiny:{x:840,y:900}}}},monferno:{".":{".":{regular:{x:880,y:900},shiny:{x:920,y:900}}}},infernape:{".":{".":{regular:{x:960,y:900},
71 | shiny:{x:1E3,y:900}}}},piplup:{".":{".":{regular:{x:1040,y:900},shiny:{x:1080,y:900}}}},prinplup:{".":{".":{regular:{x:1120,y:900},shiny:{x:1160,y:900}}}},empoleon:{".":{".":{regular:{x:1200,y:900},shiny:{x:1240,y:900}}}},starly:{".":{".":{regular:{x:0,y:930},shiny:{x:40,y:930}}}},staravia:{".":{".":{regular:{x:80,y:930},shiny:{x:120,y:930}}}},staraptor:{".":{".":{regular:{x:160,y:930},shiny:{x:200,y:930}}}},bidoof:{".":{".":{regular:{x:240,y:930},shiny:{x:280,y:930}}}},bibarel:{".":{".":{regular:{x:320,
72 | y:930},shiny:{x:360,y:930}}}},kricketot:{".":{".":{regular:{x:400,y:930},shiny:{x:440,y:930}}}},kricketune:{".":{".":{regular:{x:480,y:930},shiny:{x:520,y:930}}}},shinx:{".":{".":{regular:{x:560,y:930},shiny:{x:600,y:930}}}},luxio:{".":{".":{regular:{x:640,y:930},shiny:{x:680,y:930}}}},luxray:{".":{".":{regular:{x:720,y:930},shiny:{x:760,y:930}}}},budew:{".":{".":{regular:{x:800,y:930},shiny:{x:880,y:930}},right:{regular:{x:840,y:930},shiny:{x:920,y:930}}}},roserade:{".":{".":{regular:{x:960,y:930},
73 | shiny:{x:1040,y:930}},right:{regular:{x:1E3,y:930},shiny:{x:1080,y:930}}}},cranidos:{".":{".":{regular:{x:1120,y:930},shiny:{x:1160,y:930}}}},rampardos:{".":{".":{regular:{x:1200,y:930},shiny:{x:1240,y:930}}}},shieldon:{".":{".":{regular:{x:0,y:960},shiny:{x:40,y:960}}}},bastiodon:{".":{".":{regular:{x:80,y:960},shiny:{x:120,y:960}}}},burmy:{".":{".":{regular:{x:160,y:960},shiny:{x:200,y:960}}},plant:{".":{regular:{x:160,y:960},shiny:{x:200,y:960}}},sandy:{".":{regular:{x:240,y:960},shiny:{x:280,
74 | y:960}}},trash:{".":{regular:{x:320,y:960},shiny:{x:360,y:960}}}},wormadam:{".":{".":{regular:{x:400,y:960},shiny:{x:440,y:960}}},plant:{".":{regular:{x:400,y:960},shiny:{x:440,y:960}}},sandy:{".":{regular:{x:480,y:960},shiny:{x:520,y:960}}},trash:{".":{regular:{x:560,y:960},shiny:{x:600,y:960}}}},mothim:{".":{".":{regular:{x:640,y:960},shiny:{x:680,y:960}}}},combee:{".":{".":{regular:{x:720,y:960},shiny:{x:760,y:960}}}},vespiquen:{".":{".":{regular:{x:800,y:960},shiny:{x:840,y:960}}}},pachirisu:{".":{".":{regular:{x:880,
75 | y:960},shiny:{x:920,y:960}}}},buizel:{".":{".":{regular:{x:960,y:960},shiny:{x:1E3,y:960}}}},floatzel:{".":{".":{regular:{x:1040,y:960},shiny:{x:1080,y:960}}}},cherubi:{".":{".":{regular:{x:1120,y:960},shiny:{x:1160,y:960}}}},cherrim:{".":{".":{regular:{x:1200,y:960},shiny:{x:1240,y:960}}},overcast:{".":{regular:{x:1200,y:960},shiny:{x:1240,y:960}}},sunshine:{".":{regular:{x:0,y:990},shiny:{x:40,y:990}}}},shellos:{".":{".":{regular:{x:80,y:990},shiny:{x:120,y:990}}},east:{".":{regular:{x:160,y:990},
76 | shiny:{x:200,y:990}}},west:{".":{regular:{x:80,y:990},shiny:{x:120,y:990}}}},gastrodon:{".":{".":{regular:{x:240,y:990},shiny:{x:280,y:990}}},east:{".":{regular:{x:320,y:990},shiny:{x:360,y:990}}},west:{".":{regular:{x:240,y:990},shiny:{x:280,y:990}}}},ambipom:{".":{".":{regular:{x:400,y:990},shiny:{x:440,y:990}}}},drifloon:{".":{".":{regular:{x:480,y:990},shiny:{x:520,y:990}}}},drifblim:{".":{".":{regular:{x:560,y:990},shiny:{x:600,y:990}}}},buneary:{".":{".":{regular:{x:640,y:990},shiny:{x:680,
77 | y:990}}}},lopunny:{".":{".":{regular:{x:720,y:990},shiny:{x:760,y:990}}}},mismagius:{".":{".":{regular:{x:800,y:990},shiny:{x:840,y:990}}}},honchkrow:{".":{".":{regular:{x:880,y:990},shiny:{x:920,y:990}}}},glameow:{".":{".":{regular:{x:960,y:990},shiny:{x:1E3,y:990}}}},purugly:{".":{".":{regular:{x:1040,y:990},shiny:{x:1080,y:990}}}},chingling:{".":{".":{regular:{x:1120,y:990},shiny:{x:1160,y:990}}}},stunky:{".":{".":{regular:{x:1200,y:990},shiny:{x:1240,y:990}}}},skuntank:{".":{".":{regular:{x:0,
78 | y:1020},shiny:{x:40,y:1020}}}},bronzor:{".":{".":{regular:{x:80,y:1020},shiny:{x:120,y:1020}}}},bronzong:{".":{".":{regular:{x:160,y:1020},shiny:{x:200,y:1020}}}},bonsly:{".":{".":{regular:{x:240,y:1020},shiny:{x:280,y:1020}}}},"mime-jr":{".":{".":{regular:{x:320,y:1020},shiny:{x:360,y:1020}}}},happiny:{".":{".":{regular:{x:400,y:1020},shiny:{x:440,y:1020}}}},chatot:{".":{".":{regular:{x:480,y:1020},shiny:{x:520,y:1020}}}},spiritomb:{".":{".":{regular:{x:560,y:1020},shiny:{x:600,y:1020}}}},gible:{".":{".":{regular:{x:640,
79 | y:1020},shiny:{x:680,y:1020}}}},gabite:{".":{".":{regular:{x:720,y:1020},shiny:{x:760,y:1020}}}},garchomp:{".":{".":{regular:{x:800,y:1020},shiny:{x:840,y:1020}}},mega:{".":{regular:{x:880,y:1020},shiny:{x:920,y:1020}}}},munchlax:{".":{".":{regular:{x:960,y:1020},shiny:{x:1E3,y:1020}}}},riolu:{".":{".":{regular:{x:1040,y:1020},shiny:{x:1080,y:1020}}}},lucario:{".":{".":{regular:{x:1120,y:1020},shiny:{x:1160,y:1020}}},mega:{".":{regular:{x:1200,y:1020},shiny:{x:1240,y:1020}}}},hippopotas:{".":{".":{regular:{x:0,
80 | y:1050},shiny:{x:40,y:1050}}}},hippowdon:{".":{".":{regular:{x:80,y:1050},shiny:{x:120,y:1050}}}},skorupi:{".":{".":{regular:{x:160,y:1050},shiny:{x:200,y:1050}}}},drapion:{".":{".":{regular:{x:240,y:1050},shiny:{x:280,y:1050}}}},croagunk:{".":{".":{regular:{x:320,y:1050},shiny:{x:360,y:1050}}}},toxicroak:{".":{".":{regular:{x:400,y:1050},shiny:{x:440,y:1050}}}},carnivine:{".":{".":{regular:{x:480,y:1050},shiny:{x:520,y:1050}}}},finneon:{".":{".":{regular:{x:560,y:1050},shiny:{x:600,y:1050}}}},lumineon:{".":{".":{regular:{x:640,
81 | y:1050},shiny:{x:680,y:1050}}}},mantyke:{".":{".":{regular:{x:720,y:1050},shiny:{x:760,y:1050}}}},snover:{".":{".":{regular:{x:800,y:1050},shiny:{x:840,y:1050}}}},abomasnow:{".":{".":{regular:{x:880,y:1050},shiny:{x:920,y:1050}}},mega:{".":{regular:{x:960,y:1050},shiny:{x:1E3,y:1050}}}},weavile:{".":{".":{regular:{x:1040,y:1050},shiny:{x:1080,y:1050}}}},magnezone:{".":{".":{regular:{x:1120,y:1050},shiny:{x:1160,y:1050}}}},lickilicky:{".":{".":{regular:{x:1200,y:1050},shiny:{x:1240,y:1050}}}},rhyperior:{".":{".":{regular:{x:0,
82 | y:1080},shiny:{x:40,y:1080}}}},tangrowth:{".":{".":{regular:{x:80,y:1080},shiny:{x:120,y:1080}}}},electivire:{".":{".":{regular:{x:160,y:1080},shiny:{x:200,y:1080}}}},magmortar:{".":{".":{regular:{x:240,y:1080},shiny:{x:320,y:1080}},right:{regular:{x:280,y:1080},shiny:{x:360,y:1080}}}},togekiss:{".":{".":{regular:{x:400,y:1080},shiny:{x:480,y:1080}},right:{regular:{x:440,y:1080},shiny:{x:520,y:1080}}}},yanmega:{".":{".":{regular:{x:560,y:1080},shiny:{x:600,y:1080}}}},leafeon:{".":{".":{regular:{x:640,
83 | y:1080},shiny:{x:680,y:1080}}}},glaceon:{".":{".":{regular:{x:720,y:1080},shiny:{x:760,y:1080}}}},gliscor:{".":{".":{regular:{x:800,y:1080},shiny:{x:840,y:1080}}}},mamoswine:{".":{".":{regular:{x:880,y:1080},shiny:{x:920,y:1080}}}},"porygon-z":{".":{".":{regular:{x:960,y:1080},shiny:{x:1E3,y:1080}}}},gallade:{".":{".":{regular:{x:1040,y:1080},shiny:{x:1080,y:1080}}}},probopass:{".":{".":{regular:{x:1120,y:1080},shiny:{x:1160,y:1080}}}},dusknoir:{".":{".":{regular:{x:1200,y:1080},shiny:{x:1240,y:1080}}}},
84 | froslass:{".":{".":{regular:{x:0,y:1110},shiny:{x:40,y:1110}}}},rotom:{".":{".":{regular:{x:80,y:1110},shiny:{x:120,y:1110}}},fan:{".":{regular:{x:160,y:1110},shiny:{x:200,y:1110}}},frost:{".":{regular:{x:240,y:1110},shiny:{x:280,y:1110}}},heat:{".":{regular:{x:320,y:1110},shiny:{x:360,y:1110}}},mow:{".":{regular:{x:400,y:1110},shiny:{x:440,y:1110}}},wash:{".":{regular:{x:480,y:1110},shiny:{x:560,y:1110}},right:{regular:{x:520,y:1110},shiny:{x:600,y:1110}}}},uxie:{".":{".":{regular:{x:640,y:1110},
85 | shiny:{x:680,y:1110}}}},mesprit:{".":{".":{regular:{x:720,y:1110},shiny:{x:760,y:1110}}}},azelf:{".":{".":{regular:{x:800,y:1110},shiny:{x:840,y:1110}}}},dialga:{".":{".":{regular:{x:880,y:1110},shiny:{x:920,y:1110}}}},palkia:{".":{".":{regular:{x:960,y:1110},shiny:{x:1E3,y:1110}}}},heatran:{".":{".":{regular:{x:1040,y:1110},shiny:{x:1080,y:1110}}}},regigigas:{".":{".":{regular:{x:1120,y:1110},shiny:{x:1160,y:1110}}}},giratina:{".":{".":{regular:{x:1200,y:1110},shiny:{x:1240,y:1110}}},altered:{".":{regular:{x:1200,
86 | y:1110},shiny:{x:1240,y:1110}}},origin:{".":{regular:{x:0,y:1140},shiny:{x:40,y:1140}}}},cresselia:{".":{".":{regular:{x:80,y:1140},shiny:{x:120,y:1140}}}},phione:{".":{".":{regular:{x:160,y:1140},shiny:{x:200,y:1140}}}},manaphy:{".":{".":{regular:{x:240,y:1140},shiny:{x:280,y:1140}}}},darkrai:{".":{".":{regular:{x:320,y:1140},shiny:{x:360,y:1140}}}},shaymin:{".":{".":{regular:{x:400,y:1140},shiny:{x:440,y:1140}}},land:{".":{regular:{x:400,y:1140},shiny:{x:440,y:1140}}},sky:{".":{regular:{x:480,y:1140},
87 | shiny:{x:560,y:1140}},right:{regular:{x:520,y:1140},shiny:{x:600,y:1140}}}},arceus:{".":{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},bug:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},dark:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},dragon:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},electric:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},fairy:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},fighting:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},fire:{".":{regular:{x:640,
88 | y:1140},shiny:{x:680,y:1140}}},flying:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},ghost:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},grass:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},ground:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},ice:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},normal:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},poison:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},psychic:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},rock:{".":{regular:{x:640,
89 | y:1140},shiny:{x:680,y:1140}}},steel:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}},water:{".":{regular:{x:640,y:1140},shiny:{x:680,y:1140}}}},victini:{".":{".":{regular:{x:720,y:1140},shiny:{x:760,y:1140}}}},snivy:{".":{".":{regular:{x:800,y:1140},shiny:{x:840,y:1140}}}},servine:{".":{".":{regular:{x:880,y:1140},shiny:{x:920,y:1140}}}},serperior:{".":{".":{regular:{x:960,y:1140},shiny:{x:1E3,y:1140}}}},tepig:{".":{".":{regular:{x:1040,y:1140},shiny:{x:1080,y:1140}}}},pignite:{".":{".":{regular:{x:1120,
90 | y:1140},shiny:{x:1160,y:1140}}}},emboar:{".":{".":{regular:{x:1200,y:1140},shiny:{x:0,y:1170}},right:{regular:{x:1240,y:1140},shiny:{x:40,y:1170}}}},oshawott:{".":{".":{regular:{x:80,y:1170},shiny:{x:120,y:1170}}}},dewott:{".":{".":{regular:{x:160,y:1170},shiny:{x:200,y:1170}}}},samurott:{".":{".":{regular:{x:240,y:1170},shiny:{x:280,y:1170}}}},patrat:{".":{".":{regular:{x:320,y:1170},shiny:{x:360,y:1170}}}},watchog:{".":{".":{regular:{x:400,y:1170},shiny:{x:440,y:1170}}}},lillipup:{".":{".":{regular:{x:480,
91 | y:1170},shiny:{x:520,y:1170}}}},herdier:{".":{".":{regular:{x:560,y:1170},shiny:{x:600,y:1170}}}},stoutland:{".":{".":{regular:{x:640,y:1170},shiny:{x:680,y:1170}}}},purrloin:{".":{".":{regular:{x:720,y:1170},shiny:{x:760,y:1170}}}},liepard:{".":{".":{regular:{x:800,y:1170},shiny:{x:840,y:1170}}}},pansage:{".":{".":{regular:{x:880,y:1170},shiny:{x:920,y:1170}}}},simisage:{".":{".":{regular:{x:960,y:1170},shiny:{x:1E3,y:1170}}}},pansear:{".":{".":{regular:{x:1040,y:1170},shiny:{x:1120,y:1170}},right:{regular:{x:1080,
92 | y:1170},shiny:{x:1160,y:1170}}}},simisear:{".":{".":{regular:{x:1200,y:1170},shiny:{x:0,y:1200}},right:{regular:{x:1240,y:1170},shiny:{x:40,y:1200}}}},panpour:{".":{".":{regular:{x:80,y:1200},shiny:{x:120,y:1200}}}},simipour:{".":{".":{regular:{x:160,y:1200},shiny:{x:200,y:1200}}}},munna:{".":{".":{regular:{x:240,y:1200},shiny:{x:280,y:1200}}}},musharna:{".":{".":{regular:{x:320,y:1200},shiny:{x:360,y:1200}}}},pidove:{".":{".":{regular:{x:400,y:1200},shiny:{x:440,y:1200}}}},tranquill:{".":{".":{regular:{x:480,
93 | y:1200},shiny:{x:520,y:1200}}}},unfezant:{".":{".":{regular:{x:560,y:1200},shiny:{x:640,y:1200}},female:{regular:{x:600,y:1200},shiny:{x:680,y:1200}}}},blitzle:{".":{".":{regular:{x:720,y:1200},shiny:{x:760,y:1200}}}},zebstrika:{".":{".":{regular:{x:800,y:1200},shiny:{x:840,y:1200}}}},roggenrola:{".":{".":{regular:{x:880,y:1200},shiny:{x:920,y:1200}}}},boldore:{".":{".":{regular:{x:960,y:1200},shiny:{x:1E3,y:1200}}}},gigalith:{".":{".":{regular:{x:1040,y:1200},shiny:{x:1080,y:1200}}}},woobat:{".":{".":{regular:{x:1120,
94 | y:1200},shiny:{x:1160,y:1200}}}},swoobat:{".":{".":{regular:{x:1200,y:1200},shiny:{x:1240,y:1200}}}},drilbur:{".":{".":{regular:{x:0,y:1230},shiny:{x:80,y:1230}},right:{regular:{x:40,y:1230},shiny:{x:120,y:1230}}}},excadrill:{".":{".":{regular:{x:160,y:1230},shiny:{x:240,y:1230}},right:{regular:{x:200,y:1230},shiny:{x:280,y:1230}}}},audino:{".":{".":{regular:{x:320,y:1230},shiny:{x:360,y:1230}}}},timburr:{".":{".":{regular:{x:400,y:1230},shiny:{x:440,y:1230}}}},gurdurr:{".":{".":{regular:{x:480,y:1230},
95 | shiny:{x:520,y:1230}}}},conkeldurr:{".":{".":{regular:{x:560,y:1230},shiny:{x:600,y:1230}}}},tympole:{".":{".":{regular:{x:640,y:1230},shiny:{x:680,y:1230}}}},palpitoad:{".":{".":{regular:{x:720,y:1230},shiny:{x:760,y:1230}}}},seismitoad:{".":{".":{regular:{x:800,y:1230},shiny:{x:840,y:1230}}}},throh:{".":{".":{regular:{x:880,y:1230},shiny:{x:920,y:1230}}}},sawk:{".":{".":{regular:{x:960,y:1230},shiny:{x:1040,y:1230}},right:{regular:{x:1E3,y:1230},shiny:{x:1080,y:1230}}}},sewaddle:{".":{".":{regular:{x:1120,
96 | y:1230},shiny:{x:1160,y:1230}}}},swadloon:{".":{".":{regular:{x:1200,y:1230},shiny:{x:1240,y:1230}}}},leavanny:{".":{".":{regular:{x:0,y:1260},shiny:{x:40,y:1260}}}},venipede:{".":{".":{regular:{x:80,y:1260},shiny:{x:120,y:1260}}}},whirlipede:{".":{".":{regular:{x:160,y:1260},shiny:{x:200,y:1260}}}},scolipede:{".":{".":{regular:{x:240,y:1260},shiny:{x:280,y:1260}}}},cottonee:{".":{".":{regular:{x:320,y:1260},shiny:{x:360,y:1260}}}},whimsicott:{".":{".":{regular:{x:400,y:1260},shiny:{x:440,y:1260}}}},
97 | petilil:{".":{".":{regular:{x:480,y:1260},shiny:{x:520,y:1260}}}},lilligant:{".":{".":{regular:{x:560,y:1260},shiny:{x:640,y:1260}},right:{regular:{x:600,y:1260},shiny:{x:680,y:1260}}}},basculin:{".":{".":{regular:{x:720,y:1260},shiny:{x:760,y:1260}}},"blue-striped":{".":{regular:{x:800,y:1260},shiny:{x:840,y:1260}}},"red-striped":{".":{regular:{x:720,y:1260},shiny:{x:760,y:1260}}}},sandile:{".":{".":{regular:{x:880,y:1260},shiny:{x:920,y:1260}}}},krokorok:{".":{".":{regular:{x:960,y:1260},shiny:{x:1E3,
98 | y:1260}}}},krookodile:{".":{".":{regular:{x:1040,y:1260},shiny:{x:1080,y:1260}}}},darumaka:{".":{".":{regular:{x:1120,y:1260},shiny:{x:1160,y:1260}}}},darmanitan:{".":{".":{regular:{x:1200,y:1260},shiny:{x:1240,y:1260}}},standard:{".":{regular:{x:1200,y:1260},shiny:{x:1240,y:1260}}},zen:{".":{regular:{x:0,y:1290},shiny:{x:40,y:1290}}}},maractus:{".":{".":{regular:{x:80,y:1290},shiny:{x:120,y:1290}}}},dwebble:{".":{".":{regular:{x:160,y:1290},shiny:{x:200,y:1290}}}},crustle:{".":{".":{regular:{x:240,
99 | y:1290},shiny:{x:280,y:1290}}}},scraggy:{".":{".":{regular:{x:320,y:1290},shiny:{x:360,y:1290}}}},scrafty:{".":{".":{regular:{x:400,y:1290},shiny:{x:440,y:1290}}}},sigilyph:{".":{".":{regular:{x:480,y:1290},shiny:{x:520,y:1290}}}},yamask:{".":{".":{regular:{x:560,y:1290},shiny:{x:600,y:1290}}}},cofagrigus:{".":{".":{regular:{x:640,y:1290},shiny:{x:680,y:1290}}}},tirtouga:{".":{".":{regular:{x:720,y:1290},shiny:{x:760,y:1290}}}},carracosta:{".":{".":{regular:{x:800,y:1290},shiny:{x:840,y:1290}}}},
100 | archen:{".":{".":{regular:{x:880,y:1290},shiny:{x:920,y:1290}}}},archeops:{".":{".":{regular:{x:960,y:1290},shiny:{x:1E3,y:1290}}}},trubbish:{".":{".":{regular:{x:1040,y:1290},shiny:{x:1080,y:1290}}}},garbodor:{".":{".":{regular:{x:1120,y:1290},shiny:{x:1200,y:1290}},right:{regular:{x:1160,y:1290},shiny:{x:1240,y:1290}}}},zorua:{".":{".":{regular:{x:0,y:1320},shiny:{x:40,y:1320}}}},zoroark:{".":{".":{regular:{x:80,y:1320},shiny:{x:120,y:1320}}}},minccino:{".":{".":{regular:{x:160,y:1320},shiny:{x:200,
101 | y:1320}}}},cinccino:{".":{".":{regular:{x:240,y:1320},shiny:{x:280,y:1320}}}},gothita:{".":{".":{regular:{x:320,y:1320},shiny:{x:360,y:1320}}}},gothorita:{".":{".":{regular:{x:400,y:1320},shiny:{x:440,y:1320}}}},gothitelle:{".":{".":{regular:{x:480,y:1320},shiny:{x:520,y:1320}}}},solosis:{".":{".":{regular:{x:560,y:1320},shiny:{x:640,y:1320}},right:{regular:{x:600,y:1320},shiny:{x:680,y:1320}}}},duosion:{".":{".":{regular:{x:720,y:1320},shiny:{x:760,y:1320}}}},reuniclus:{".":{".":{regular:{x:800,
102 | y:1320},shiny:{x:840,y:1320}}}},ducklett:{".":{".":{regular:{x:880,y:1320},shiny:{x:920,y:1320}}}},swanna:{".":{".":{regular:{x:960,y:1320},shiny:{x:1E3,y:1320}}}},vanillite:{".":{".":{regular:{x:1040,y:1320},shiny:{x:1080,y:1320}}}},vanillish:{".":{".":{regular:{x:1120,y:1320},shiny:{x:1160,y:1320}}}},vanilluxe:{".":{".":{regular:{x:1200,y:1320},shiny:{x:0,y:1350}},right:{regular:{x:1240,y:1320},shiny:{x:40,y:1350}}}},deerling:{".":{".":{regular:{x:80,y:1350},shiny:{x:120,y:1350}}},autumn:{".":{regular:{x:160,
103 | y:1350},shiny:{x:200,y:1350}}},spring:{".":{regular:{x:80,y:1350},shiny:{x:120,y:1350}}},summer:{".":{regular:{x:240,y:1350},shiny:{x:280,y:1350}}},winter:{".":{regular:{x:320,y:1350},shiny:{x:360,y:1350}}}},sawsbuck:{".":{".":{regular:{x:400,y:1350},shiny:{x:440,y:1350}}},autumn:{".":{regular:{x:480,y:1350},shiny:{x:520,y:1350}}},spring:{".":{regular:{x:400,y:1350},shiny:{x:440,y:1350}}},summer:{".":{regular:{x:560,y:1350},shiny:{x:600,y:1350}}},winter:{".":{regular:{x:640,y:1350},shiny:{x:680,y:1350}}}},
104 | emolga:{".":{".":{regular:{x:720,y:1350},shiny:{x:760,y:1350}}}},karrablast:{".":{".":{regular:{x:800,y:1350},shiny:{x:840,y:1350}}}},escavalier:{".":{".":{regular:{x:880,y:1350},shiny:{x:920,y:1350}}}},foongus:{".":{".":{regular:{x:960,y:1350},shiny:{x:1E3,y:1350}}}},amoonguss:{".":{".":{regular:{x:1040,y:1350},shiny:{x:1120,y:1350}},right:{regular:{x:1080,y:1350},shiny:{x:1160,y:1350}}}},frillish:{".":{".":{regular:{x:1200,y:1350},shiny:{x:0,y:1380}},female:{regular:{x:1240,y:1350},shiny:{x:40,
105 | y:1380}}}},jellicent:{".":{".":{regular:{x:80,y:1380},shiny:{x:160,y:1380}},female:{regular:{x:120,y:1380},shiny:{x:200,y:1380}}}},alomomola:{".":{".":{regular:{x:240,y:1380},shiny:{x:280,y:1380}}}},joltik:{".":{".":{regular:{x:320,y:1380},shiny:{x:360,y:1380}}}},galvantula:{".":{".":{regular:{x:400,y:1380},shiny:{x:440,y:1380}}}},ferroseed:{".":{".":{regular:{x:480,y:1380},shiny:{x:520,y:1380}}}},ferrothorn:{".":{".":{regular:{x:560,y:1380},shiny:{x:600,y:1380}}}},klink:{".":{".":{regular:{x:640,
106 | y:1380},shiny:{x:720,y:1380}},right:{regular:{x:680,y:1380},shiny:{x:760,y:1380}}}},klang:{".":{".":{regular:{x:800,y:1380},shiny:{x:880,y:1380}},right:{regular:{x:840,y:1380},shiny:{x:920,y:1380}}}},klinklang:{".":{".":{regular:{x:960,y:1380},shiny:{x:1040,y:1380}},right:{regular:{x:1E3,y:1380},shiny:{x:1080,y:1380}}}},tynamo:{".":{".":{regular:{x:1120,y:1380},shiny:{x:1160,y:1380}}}},eelektrik:{".":{".":{regular:{x:1200,y:1380},shiny:{x:1240,y:1380}}}},eelektross:{".":{".":{regular:{x:0,y:1410},
107 | shiny:{x:40,y:1410}}}},elgyem:{".":{".":{regular:{x:80,y:1410},shiny:{x:120,y:1410}}}},beheeyem:{".":{".":{regular:{x:160,y:1410},shiny:{x:200,y:1410}}}},litwick:{".":{".":{regular:{x:240,y:1410},shiny:{x:320,y:1410}},right:{regular:{x:280,y:1410},shiny:{x:360,y:1410}}}},lampent:{".":{".":{regular:{x:400,y:1410},shiny:{x:440,y:1410}}}},chandelure:{".":{".":{regular:{x:480,y:1410},shiny:{x:520,y:1410}}}},axew:{".":{".":{regular:{x:560,y:1410},shiny:{x:600,y:1410}}}},fraxure:{".":{".":{regular:{x:640,
108 | y:1410},shiny:{x:680,y:1410}}}},haxorus:{".":{".":{regular:{x:720,y:1410},shiny:{x:760,y:1410}}}},cubchoo:{".":{".":{regular:{x:800,y:1410},shiny:{x:840,y:1410}}}},beartic:{".":{".":{regular:{x:880,y:1410},shiny:{x:920,y:1410}}}},cryogonal:{".":{".":{regular:{x:960,y:1410},shiny:{x:1E3,y:1410}}}},shelmet:{".":{".":{regular:{x:1040,y:1410},shiny:{x:1080,y:1410}}}},accelgor:{".":{".":{regular:{x:1120,y:1410},shiny:{x:1160,y:1410}}}},stunfisk:{".":{".":{regular:{x:1200,y:1410},shiny:{x:1240,y:1410}}}},
109 | mienfoo:{".":{".":{regular:{x:0,y:1440},shiny:{x:40,y:1440}}}},mienshao:{".":{".":{regular:{x:80,y:1440},shiny:{x:120,y:1440}}}},druddigon:{".":{".":{regular:{x:160,y:1440},shiny:{x:200,y:1440}}}},golett:{".":{".":{regular:{x:240,y:1440},shiny:{x:320,y:1440}},right:{regular:{x:280,y:1440},shiny:{x:360,y:1440}}}},golurk:{".":{".":{regular:{x:400,y:1440},shiny:{x:480,y:1440}},right:{regular:{x:440,y:1440},shiny:{x:520,y:1440}}}},pawniard:{".":{".":{regular:{x:560,y:1440},shiny:{x:600,y:1440}}}},bisharp:{".":{".":{regular:{x:640,
110 | y:1440},shiny:{x:680,y:1440}}}},bouffalant:{".":{".":{regular:{x:720,y:1440},shiny:{x:760,y:1440}}}},rufflet:{".":{".":{regular:{x:800,y:1440},shiny:{x:840,y:1440}}}},braviary:{".":{".":{regular:{x:880,y:1440},shiny:{x:920,y:1440}}}},vullaby:{".":{".":{regular:{x:960,y:1440},shiny:{x:1E3,y:1440}}}},mandibuzz:{".":{".":{regular:{x:1040,y:1440},shiny:{x:1080,y:1440}}}},heatmor:{".":{".":{regular:{x:1120,y:1440},shiny:{x:1160,y:1440}}}},durant:{".":{".":{regular:{x:1200,y:1440},shiny:{x:1240,y:1440}}}},
111 | deino:{".":{".":{regular:{x:0,y:1470},shiny:{x:40,y:1470}}}},zweilous:{".":{".":{regular:{x:80,y:1470},shiny:{x:120,y:1470}}}},hydreigon:{".":{".":{regular:{x:160,y:1470},shiny:{x:200,y:1470}}}},larvesta:{".":{".":{regular:{x:240,y:1470},shiny:{x:280,y:1470}}}},volcarona:{".":{".":{regular:{x:320,y:1470},shiny:{x:360,y:1470}}}},cobalion:{".":{".":{regular:{x:400,y:1470},shiny:{x:440,y:1470}}}},terrakion:{".":{".":{regular:{x:480,y:1470},shiny:{x:520,y:1470}}}},virizion:{".":{".":{regular:{x:560,y:1470},
112 | shiny:{x:600,y:1470}}}},tornadus:{".":{".":{regular:{x:640,y:1470},shiny:{x:680,y:1470}}},incarnate:{".":{regular:{x:640,y:1470},shiny:{x:680,y:1470}}},therian:{".":{regular:{x:720,y:1470},shiny:{x:760,y:1470}}}},thundurus:{".":{".":{regular:{x:800,y:1470},shiny:{x:840,y:1470}}},incarnate:{".":{regular:{x:800,y:1470},shiny:{x:840,y:1470}}},therian:{".":{regular:{x:880,y:1470},shiny:{x:920,y:1470}}}},reshiram:{".":{".":{regular:{x:960,y:1470},shiny:{x:1E3,y:1470}}}},zekrom:{".":{".":{regular:{x:1040,
113 | y:1470},shiny:{x:1080,y:1470}}}},landorus:{".":{".":{regular:{x:1120,y:1470},shiny:{x:1160,y:1470}}},incarnate:{".":{regular:{x:1120,y:1470},shiny:{x:1160,y:1470}}},therian:{".":{regular:{x:1200,y:1470},shiny:{x:1240,y:1470}}}},kyurem:{".":{".":{regular:{x:0,y:1500},shiny:{x:80,y:1500}},right:{regular:{x:40,y:1500},shiny:{x:120,y:1500}}},black:{".":{regular:{x:160,y:1500},shiny:{x:240,y:1500}},right:{regular:{x:200,y:1500},shiny:{x:280,y:1500}}},white:{".":{regular:{x:320,y:1500},shiny:{x:400,y:1500}},
114 | right:{regular:{x:360,y:1500},shiny:{x:440,y:1500}}}},keldeo:{".":{".":{regular:{x:480,y:1500},shiny:{x:520,y:1500}}},ordinary:{".":{regular:{x:480,y:1500},shiny:{x:520,y:1500}}},resolute:{".":{regular:{x:560,y:1500},shiny:{x:640,y:1500}},right:{regular:{x:600,y:1500},shiny:{x:680,y:1500}}}},meloetta:{".":{".":{regular:{x:720,y:1500},shiny:{x:800,y:1500}},right:{regular:{x:760,y:1500},shiny:{x:840,y:1500}}},aria:{".":{regular:{x:720,y:1500},shiny:{x:800,y:1500}},right:{regular:{x:720,y:1500},shiny:{x:800,
115 | y:1500}}},pirouette:{".":{regular:{x:880,y:1500},shiny:{x:920,y:1500}}}},genesect:{".":{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}},burn:{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}},chill:{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}},douse:{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}},shock:{".":{regular:{x:960,y:1500},shiny:{x:1E3,y:1500}}}},chespin:{".":{".":{regular:{x:1040,y:1500},shiny:{x:1080,y:1500}}}},quilladin:{".":{".":{regular:{x:1120,y:1500},shiny:{x:1160,y:1500}}}},
116 | chesnaught:{".":{".":{regular:{x:1200,y:1500},shiny:{x:1240,y:1500}}}},fennekin:{".":{".":{regular:{x:0,y:1530},shiny:{x:40,y:1530}}}},braixen:{".":{".":{regular:{x:80,y:1530},shiny:{x:120,y:1530}}}},delphox:{".":{".":{regular:{x:160,y:1530},shiny:{x:200,y:1530}}}},froakie:{".":{".":{regular:{x:240,y:1530},shiny:{x:280,y:1530}}}},frogadier:{".":{".":{regular:{x:320,y:1530},shiny:{x:360,y:1530}}}},greninja:{".":{".":{regular:{x:400,y:1530},shiny:{x:480,y:1530}},right:{regular:{x:440,y:1530},shiny:{x:520,
117 | y:1530}}}},bunnelby:{".":{".":{regular:{x:560,y:1530},shiny:{x:600,y:1530}}}},diggersby:{".":{".":{regular:{x:640,y:1530},shiny:{x:680,y:1530}}}},fletchling:{".":{".":{regular:{x:720,y:1530},shiny:{x:760,y:1530}}}},fletchinder:{".":{".":{regular:{x:800,y:1530},shiny:{x:840,y:1530}}}},talonflame:{".":{".":{regular:{x:880,y:1530},shiny:{x:920,y:1530}}}},scatterbug:{".":{".":{regular:{x:960,y:1530},shiny:{x:1E3,y:1530}}}},spewpa:{".":{".":{regular:{x:1040,y:1530},shiny:{x:1080,y:1530}}}},vivillon:{".":{".":{regular:{x:1120,
118 | y:1530},shiny:{x:1160,y:1530}}},archipelago:{".":{regular:{x:1200,y:1530},shiny:{x:1240,y:1530}}},continental:{".":{regular:{x:0,y:1560},shiny:{x:40,y:1560}}},elegant:{".":{regular:{x:80,y:1560},shiny:{x:120,y:1560}}},fancy:{".":{regular:{x:160,y:1560},shiny:{x:200,y:1560}}},garden:{".":{regular:{x:240,y:1560},shiny:{x:280,y:1560}}},"high-plains":{".":{regular:{x:320,y:1560},shiny:{x:360,y:1560}}},"icy-snow":{".":{regular:{x:400,y:1560},shiny:{x:440,y:1560}}},jungle:{".":{regular:{x:480,y:1560},shiny:{x:520,
119 | y:1560}}},marine:{".":{regular:{x:560,y:1560},shiny:{x:600,y:1560}}},meadow:{".":{regular:{x:1120,y:1530},shiny:{x:1160,y:1530}}},modern:{".":{regular:{x:640,y:1560},shiny:{x:680,y:1560}}},monsoon:{".":{regular:{x:720,y:1560},shiny:{x:760,y:1560}}},ocean:{".":{regular:{x:800,y:1560},shiny:{x:840,y:1560}}},"poke-ball":{".":{regular:{x:880,y:1560},shiny:{x:920,y:1560}}},polar:{".":{regular:{x:960,y:1560},shiny:{x:1E3,y:1560}}},river:{".":{regular:{x:1040,y:1560},shiny:{x:1080,y:1560}}},sandstorm:{".":{regular:{x:1120,
120 | y:1560},shiny:{x:1160,y:1560}}},savanna:{".":{regular:{x:1200,y:1560},shiny:{x:1240,y:1560}}},sun:{".":{regular:{x:0,y:1590},shiny:{x:40,y:1590}}},tundra:{".":{regular:{x:80,y:1590},shiny:{x:120,y:1590}}}},litleo:{".":{".":{regular:{x:160,y:1590},shiny:{x:200,y:1590}}}},pyroar:{".":{".":{regular:{x:240,y:1590},shiny:{x:320,y:1590}},female:{regular:{x:280,y:1590},shiny:{x:360,y:1590}}}},flabebe:{".":{".":{regular:{x:400,y:1590},shiny:{x:440,y:1590}}},blue:{".":{regular:{x:480,y:1590},shiny:{x:520,
121 | y:1590}}},orange:{".":{regular:{x:560,y:1590},shiny:{x:600,y:1590}}},red:{".":{regular:{x:400,y:1590},shiny:{x:440,y:1590}}},white:{".":{regular:{x:640,y:1590},shiny:{x:680,y:1590}}},yellow:{".":{regular:{x:720,y:1590},shiny:{x:760,y:1590}}}},floette:{".":{".":{regular:{x:800,y:1590},shiny:{x:840,y:1590}}},blue:{".":{regular:{x:880,y:1590},shiny:{x:920,y:1590}}},eternal:{".":{regular:{x:960,y:1590},shiny:{x:1E3,y:1590}}},orange:{".":{regular:{x:1040,y:1590},shiny:{x:1080,y:1590}}},red:{".":{regular:{x:800,
122 | y:1590},shiny:{x:840,y:1590}}},white:{".":{regular:{x:1120,y:1590},shiny:{x:1160,y:1590}}},yellow:{".":{regular:{x:1200,y:1590},shiny:{x:1240,y:1590}}}},florges:{".":{".":{regular:{x:0,y:1620},shiny:{x:40,y:1620}}},blue:{".":{regular:{x:80,y:1620},shiny:{x:120,y:1620}}},orange:{".":{regular:{x:160,y:1620},shiny:{x:200,y:1620}}},red:{".":{regular:{x:0,y:1620},shiny:{x:40,y:1620}}},white:{".":{regular:{x:240,y:1620},shiny:{x:280,y:1620}}},yellow:{".":{regular:{x:320,y:1620},shiny:{x:360,y:1620}}}},
123 | skiddo:{".":{".":{regular:{x:400,y:1620},shiny:{x:440,y:1620}}}},gogoat:{".":{".":{regular:{x:480,y:1620},shiny:{x:520,y:1620}}}},pancham:{".":{".":{regular:{x:560,y:1620},shiny:{x:600,y:1620}}}},pangoro:{".":{".":{regular:{x:640,y:1620},shiny:{x:680,y:1620}}}},furfrou:{".":{".":{regular:{x:720,y:1620},shiny:{x:760,y:1620}}},dandy:{".":{regular:{x:800,y:1620},shiny:{x:840,y:1620}}},debutante:{".":{regular:{x:880,y:1620},shiny:{x:960,y:1620}},right:{regular:{x:920,y:1620},shiny:{x:1E3,y:1620}}},diamond:{".":{regular:{x:1040,
124 | y:1620},shiny:{x:1080,y:1620}}},heart:{".":{regular:{x:1120,y:1620},shiny:{x:1160,y:1620}}},kabuki:{".":{regular:{x:1200,y:1620},shiny:{x:1240,y:1620}}},"la-reine":{".":{regular:{x:0,y:1650},shiny:{x:40,y:1650}}},matron:{".":{regular:{x:80,y:1650},shiny:{x:120,y:1650}}},pharaoh:{".":{regular:{x:160,y:1650},shiny:{x:200,y:1650}}},star:{".":{regular:{x:240,y:1650},shiny:{x:280,y:1650}}}},espurr:{".":{".":{regular:{x:320,y:1650},shiny:{x:360,y:1650}}}},meowstic:{".":{".":{regular:{x:400,y:1650},shiny:{x:480,
125 | y:1650}},female:{regular:{x:440,y:1650},shiny:{x:520,y:1650}}}},honedge:{".":{".":{regular:{x:560,y:1650},shiny:{x:600,y:1650}}}},doublade:{".":{".":{regular:{x:640,y:1650},shiny:{x:680,y:1650}}}},aegislash:{".":{".":{regular:{x:720,y:1650},shiny:{x:760,y:1650}}},blade:{".":{regular:{x:800,y:1650},shiny:{x:840,y:1650}}},shield:{".":{regular:{x:720,y:1650},shiny:{x:760,y:1650}}}},spritzee:{".":{".":{regular:{x:880,y:1650},shiny:{x:920,y:1650}}}},aromatisse:{".":{".":{regular:{x:960,y:1650},shiny:{x:1E3,
126 | y:1650}}}},swirlix:{".":{".":{regular:{x:1040,y:1650},shiny:{x:1080,y:1650}}}},slurpuff:{".":{".":{regular:{x:1120,y:1650},shiny:{x:1160,y:1650}}}},inkay:{".":{".":{regular:{x:1200,y:1650},shiny:{x:1240,y:1650}}}},malamar:{".":{".":{regular:{x:0,y:1680},shiny:{x:40,y:1680}}}},binacle:{".":{".":{regular:{x:80,y:1680},shiny:{x:120,y:1680}}}},barbaracle:{".":{".":{regular:{x:160,y:1680},shiny:{x:240,y:1680}},right:{regular:{x:200,y:1680},shiny:{x:280,y:1680}}}},skrelp:{".":{".":{regular:{x:320,y:1680},
127 | shiny:{x:360,y:1680}}}},dragalge:{".":{".":{regular:{x:400,y:1680},shiny:{x:440,y:1680}}}},clauncher:{".":{".":{regular:{x:480,y:1680},shiny:{x:560,y:1680}},right:{regular:{x:520,y:1680},shiny:{x:600,y:1680}}}},clawitzer:{".":{".":{regular:{x:640,y:1680},shiny:{x:720,y:1680}},right:{regular:{x:680,y:1680},shiny:{x:760,y:1680}}}},helioptile:{".":{".":{regular:{x:800,y:1680},shiny:{x:840,y:1680}}}},heliolisk:{".":{".":{regular:{x:880,y:1680},shiny:{x:920,y:1680}}}},tyrunt:{".":{".":{regular:{x:960,
128 | y:1680},shiny:{x:1E3,y:1680}}}},tyrantrum:{".":{".":{regular:{x:1040,y:1680},shiny:{x:1080,y:1680}}}},amaura:{".":{".":{regular:{x:1120,y:1680},shiny:{x:1160,y:1680}}}},aurorus:{".":{".":{regular:{x:1200,y:1680},shiny:{x:1240,y:1680}}}},sylveon:{".":{".":{regular:{x:0,y:1710},shiny:{x:80,y:1710}},right:{regular:{x:40,y:1710},shiny:{x:120,y:1710}}}},hawlucha:{".":{".":{regular:{x:160,y:1710},shiny:{x:200,y:1710}}}},dedenne:{".":{".":{regular:{x:240,y:1710},shiny:{x:280,y:1710}}}},carbink:{".":{".":{regular:{x:320,
129 | y:1710},shiny:{x:360,y:1710}}}},goomy:{".":{".":{regular:{x:400,y:1710},shiny:{x:440,y:1710}}}},sliggoo:{".":{".":{regular:{x:480,y:1710},shiny:{x:520,y:1710}}}},goodra:{".":{".":{regular:{x:560,y:1710},shiny:{x:600,y:1710}}}},klefki:{".":{".":{regular:{x:640,y:1710},shiny:{x:720,y:1710}},right:{regular:{x:680,y:1710},shiny:{x:760,y:1710}}}},phantump:{".":{".":{regular:{x:800,y:1710},shiny:{x:840,y:1710}}}},trevenant:{".":{".":{regular:{x:880,y:1710},shiny:{x:920,y:1710}}}},pumpkaboo:{".":{".":{regular:{x:960,
130 | y:1710},shiny:{x:1E3,y:1710}}},average:{".":{regular:{x:960,y:1710},shiny:{x:1E3,y:1710}}},large:{".":{regular:{x:960,y:1710},shiny:{x:1E3,y:1710}}},small:{".":{regular:{x:960,y:1710},shiny:{x:1E3,y:1710}}},"super":{".":{regular:{x:960,y:1710},shiny:{x:1E3,y:1710}}}},gourgeist:{".":{".":{regular:{x:1040,y:1710},shiny:{x:1080,y:1710}}},average:{".":{regular:{x:1040,y:1710},shiny:{x:1080,y:1710}}},large:{".":{regular:{x:1040,y:1710},shiny:{x:1080,y:1710}}},small:{".":{regular:{x:1040,y:1710},shiny:{x:1080,
131 | y:1710}}},"super":{".":{regular:{x:1040,y:1710},shiny:{x:1080,y:1710}}}},bergmite:{".":{".":{regular:{x:1120,y:1710},shiny:{x:1160,y:1710}}}},avalugg:{".":{".":{regular:{x:1200,y:1710},shiny:{x:1240,y:1710}}}},noibat:{".":{".":{regular:{x:0,y:1740},shiny:{x:40,y:1740}}}},noivern:{".":{".":{regular:{x:80,y:1740},shiny:{x:120,y:1740}}}},xerneas:{".":{".":{regular:{x:160,y:1740},shiny:{x:200,y:1740}}},active:{".":{regular:{x:160,y:1740},shiny:{x:200,y:1740}}},neutral:{".":{regular:{x:240,y:1740},shiny:{x:280,
132 | y:1740}}}},yveltal:{".":{".":{regular:{x:320,y:1740},shiny:{x:360,y:1740}}}},zygarde:{".":{".":{regular:{x:400,y:1740},shiny:{x:480,y:1740}},right:{regular:{x:440,y:1740},shiny:{x:520,y:1740}}}},diancie:{".":{".":{regular:{x:560,y:1740},shiny:{x:600,y:1740}}}},hoopa:{".":{".":{regular:{x:640,y:1740},shiny:{x:680,y:1740}}}},volcanion:{".":{".":{regular:{x:720,y:1740},shiny:{x:760,y:1740}}}}},etc:{egg:{x:0,y:1770,w:40,h:30},"unknown-pkmn":{x:40,y:1770,w:40,h:30},"unknown-item":{x:450,y:1832,w:30,h:30},
133 | "ball-mega":{x:870,y:2252,w:16,h:16},"ball-fainted":{x:886,y:2252,w:14,h:14},"ball-normal":{x:900,y:2252,w:14,h:14},"ball-null":{x:914,y:2252,w:14,h:14},"ball-sick":{x:928,y:2252,w:14,h:14}},"body-style":{"bipedal-tailed":{x:0,y:1800},"bipedal-tailless":{x:32,y:1800},fins:{x:64,y:1800},"head-arms":{x:96,y:1800},"head-base":{x:128,y:1800},"head-legs":{x:160,y:1800},head:{x:192,y:1800},insectoid:{x:224,y:1800},multiple:{x:256,y:1800},quadruped:{x:288,y:1800},serpentine:{x:320,y:1800},tentacles:{x:352,
134 | y:1800},"wings-multiple":{x:384,y:1800},"wings-single":{x:416,y:1800}},apricorn:{black:{x:448,y:1800},blue:{x:478,y:1800},green:{x:508,y:1800},pink:{x:538,y:1800},red:{x:568,y:1800},white:{x:598,y:1800},yellow:{x:628,y:1800}},"battle-item":{"dire-hit":{x:658,y:1800},"guard-spec":{x:688,y:1800},"x-accuracy":{x:718,y:1800},"x-attack":{x:748,y:1800},"x-defense":{x:778,y:1800},"x-sp-atk":{x:808,y:1800},"x-sp-def":{x:838,y:1800},"x-speed":{x:868,y:1800}},berry:{aguav:{x:898,y:1800},apicot:{x:928,y:1800},
135 | aspear:{x:958,y:1800},babiri:{x:988,y:1800},belue:{x:1018,y:1800},bluk:{x:1048,y:1800},charti:{x:1078,y:1800},cheri:{x:1108,y:1800},chesto:{x:1138,y:1800},chilan:{x:1168,y:1800},chople:{x:1198,y:1800},coba:{x:1228,y:1800},colbur:{x:80,y:1770},cornn:{x:110,y:1770},custap:{x:140,y:1770},durin:{x:170,y:1770},enigma:{x:200,y:1770},figy:{x:230,y:1770},ganlon:{x:260,y:1770},grepa:{x:290,y:1770},haban:{x:320,y:1770},hondew:{x:350,y:1770},iapapa:{x:380,y:1770},jaboca:{x:410,y:1770},kasib:{x:440,y:1770},kebia:{x:470,
136 | y:1770},kee:{x:500,y:1770},kelpsy:{x:530,y:1770},lansat:{x:560,y:1770},leppa:{x:590,y:1770},liechi:{x:620,y:1770},lum:{x:650,y:1770},mago:{x:680,y:1770},magost:{x:710,y:1770},maranga:{x:740,y:1770},micle:{x:770,y:1770},nanab:{x:800,y:1770},nomel:{x:830,y:1770},occa:{x:860,y:1770},oran:{x:890,y:1770},pamtre:{x:920,y:1770},passho:{x:950,y:1770},payapa:{x:980,y:1770},pecha:{x:1010,y:1770},persim:{x:1040,y:1770},petaya:{x:1070,y:1770},pinap:{x:1100,y:1770},pomeg:{x:1130,y:1770},qualot:{x:1160,y:1770},
137 | rabuta:{x:1190,y:1770},rawst:{x:1220,y:1770},razz:{x:1250,y:1770},rindo:{x:0,y:1832},roseli:{x:30,y:1832},rowap:{x:60,y:1832},salac:{x:90,y:1832},shuca:{x:120,y:1832},sitrus:{x:150,y:1832},spelon:{x:180,y:1832},starf:{x:210,y:1832},tamato:{x:240,y:1832},tanga:{x:270,y:1832},wacan:{x:300,y:1832},watmel:{x:330,y:1832},wepear:{x:360,y:1832},wiki:{x:390,y:1832},yache:{x:420,y:1832}},"ev-item":{"macho-brace":{x:480,y:1832},"power-anklet":{x:510,y:1832},"power-band":{x:540,y:1832},"power-belt":{x:570,y:1832},
138 | "power-bracer":{x:600,y:1832},"power-lens":{x:630,y:1832},"power-weight":{x:660,y:1832}},"evo-item":{"dawn-stone":{x:690,y:1832},"deep-sea-scale":{x:720,y:1832},"deep-sea-tooth":{x:750,y:1832},"dragon-scale":{x:780,y:1832},"dubious-disc":{x:810,y:1832},"dusk-stone":{x:840,y:1832},electirizer:{x:870,y:1832},everstone:{x:900,y:1832},"fire-stone":{x:930,y:1832},"kings-rock":{x:960,y:1832},"leaf-stone":{x:990,y:1832},magmarizer:{x:1020,y:1832},"metal-coat":{x:1050,y:1832},"moon-stone":{x:1080,y:1832},
139 | "oval-stone":{x:1110,y:1832},"prism-scale":{x:1140,y:1832},protector:{x:1170,y:1832},"razor-claw":{x:1200,y:1832},"razor-fang":{x:1230,y:1832},"reaper-cloth":{x:0,y:1862},sachet:{x:30,y:1862},"shiny-stone":{x:60,y:1862},"sun-stone":{x:90,y:1862},"thunder-stone":{x:120,y:1862},"up-grade":{x:150,y:1862},"water-stone":{x:180,y:1862},"whipped-dream":{x:210,y:1862}},flute:{black:{x:240,y:1862},blue:{x:270,y:1862},red:{x:300,y:1862},white:{x:330,y:1862},yellow:{x:360,y:1862}},fossil:{armor:{x:390,y:1862},
140 | claw:{x:420,y:1862},cover:{x:450,y:1862},dome:{x:480,y:1862},helix:{x:510,y:1862},jaw:{x:540,y:1862},plume:{x:570,y:1862},root:{x:600,y:1862},sail:{x:630,y:1862},skull:{x:660,y:1862}},gem:{bug:{x:690,y:1862},dark:{x:720,y:1862},dragon:{x:750,y:1862},electric:{x:780,y:1862},fairy:{x:810,y:1862},fighting:{x:840,y:1862},fire:{x:870,y:1862},flying:{x:900,y:1862},ghost:{x:930,y:1862},grass:{x:960,y:1862},ground:{x:990,y:1862},ice:{x:1020,y:1862},normal:{x:1050,y:1862},poison:{x:1080,y:1862},psychic:{x:1110,
141 | y:1862},rock:{x:1140,y:1862},steel:{x:1170,y:1862},water:{x:1200,y:1862}},hm:{fighting:{x:1230,y:1862},flying:{x:0,y:1892},normal:{x:30,y:1892},water:{x:60,y:1892}},"hold-item":{"absorb-bulb":{x:90,y:1892},"adamant-orb":{x:120,y:1892},"air-balloon":{x:150,y:1892},"amulet-coin":{x:180,y:1892},"assault-vest":{x:210,y:1892},"big-root":{x:240,y:1892},"binding-band":{x:270,y:1892},"black-belt":{x:300,y:1892},"black-glasses":{x:330,y:1892},"black-sludge":{x:360,y:1892},"bright-powder":{x:390,y:1892},"burn-drive":{x:420,
142 | y:1892},"cell-battery":{x:450,y:1892},charcoal:{x:480,y:1892},"chill-drive":{x:510,y:1892},"choice-band":{x:540,y:1892},"choice-scarf":{x:570,y:1892},"choice-specs":{x:600,y:1892},"cleanse-tag":{x:630,y:1892},"damp-rock":{x:660,y:1892},"destiny-knot":{x:690,y:1892},"douse-drive":{x:720,y:1892},"dragon-fang":{x:750,y:1892},"eject-button":{x:780,y:1892},eviolite:{x:810,y:1892},"expert-belt":{x:840,y:1892},"flame-orb":{x:870,y:1892},"float-stone":{x:900,y:1892},"focus-band":{x:930,y:1892},"focus-sash":{x:960,
143 | y:1892},"grip-claw":{x:990,y:1892},"griseous-orb":{x:1020,y:1892},"hard-stone":{x:1050,y:1892},"heat-rock":{x:1080,y:1892},"icy-rock":{x:1110,y:1892},"kings-rock":{x:1140,y:1892},"lagging-tail":{x:1170,y:1892},leftovers:{x:1200,y:1892},"life-orb":{x:1230,y:1892},"light-ball":{x:0,y:1922},"light-clay":{x:30,y:1922},"lucky-egg":{x:60,y:1922},"lucky-punch":{x:90,y:1922},"luminous-moss":{x:120,y:1922},"lustrous-orb":{x:150,y:1922},magnet:{x:180,y:1922},"mental-herb":{x:210,y:1922},"metal-coat":{x:240,
144 | y:1922},"metal-powder":{x:270,y:1922},metronome:{x:300,y:1922},"miracle-seed":{x:330,y:1922},"muscle-band":{x:360,y:1922},"mystic-water":{x:390,y:1922},"never-melt-ice":{x:420,y:1922},"poison-barb":{x:450,y:1922},"power-herb":{x:480,y:1922},"quick-claw":{x:510,y:1922},"quick-powder":{x:540,y:1922},"red-card":{x:570,y:1922},"ring-target":{x:600,y:1922},"rocky-helmet":{x:630,y:1922},"safety-goggles":{x:660,y:1922},"scope-lens":{x:690,y:1922},"sharp-beak":{x:720,y:1922},"shed-shell":{x:750,y:1922},"shell-bell":{x:780,
145 | y:1922},"shock-drive":{x:810,y:1922},"silk-scarf":{x:840,y:1922},"silver-powder":{x:870,y:1922},"smoke-ball":{x:900,y:1922},"smooth-rock":{x:930,y:1922},snowball:{x:960,y:1922},"soft-sand":{x:990,y:1922},"soul-dew":{x:1020,y:1922},"spell-tag":{x:1050,y:1922},stick:{x:1080,y:1922},"sticky-barb":{x:1110,y:1922},"thick-club":{x:1140,y:1922},"toxic-orb":{x:1170,y:1922},"twisted-spoon":{x:1200,y:1922},"weakness-policy":{x:1230,y:1922},"white-herb":{x:0,y:1952},"wide-lens":{x:30,y:1952},"wise-glasses":{x:60,
146 | y:1952},"zoom-lens":{x:90,y:1952}},incense:{full:{x:120,y:1952},lax:{x:150,y:1952},luck:{x:180,y:1952},odd:{x:210,y:1952},pure:{x:240,y:1952},rock:{x:270,y:1952},rose:{x:300,y:1952},sea:{x:330,y:1952},wave:{x:360,y:1952}},"other-item":{"discount-coupon":{x:390,y:1952},"escape-rope":{x:420,y:1952},"fluffy-tail":{x:450,y:1952},"heart-scale":{x:480,y:1952},honey:{x:510,y:1952},"max-repel":{x:540,y:1952},"odd-keystone":{x:570,y:1952},"pass-orb":{x:600,y:1952},"poke-doll":{x:630,y:1952},"poke-toy":{x:660,
147 | y:1952},repel:{x:690,y:1952},"soothe-bell":{x:720,y:1952},"strange-souvenir":{x:750,y:1952},"super-repel":{x:780,y:1952}},"key-item":{"acro-bike":{x:810,y:1952},"adventure-rules":{x:840,y:1952},"apricorn-box":{x:870,y:1952},auroraticket:{x:900,y:1952},"azure-flute":{x:930,y:1952},"basement-key":{x:960,y:1952},"berry-pots":{x:990,y:1952},"berry-pouch":{x:1020,y:1952},"bicycle-turquoise":{x:1050,y:1952},"bicycle-yellow":{x:1080,y:1952},bicycle:{x:1110,y:1952},"bike-voucher":{x:1140,y:1952},"blue-card":{x:1170,
148 | y:1952},"blue-orb-gen3":{x:1200,y:1952},"blue-orb":{x:1230,y:1952},"card-key-gen3":{x:0,y:1982},"card-key":{x:30,y:1982},"clear-bell":{x:60,y:1982},"coin-case":{x:90,y:1982},"colress-machine":{x:120,y:1982},"common-stone":{x:150,y:1982},"contest-pass":{x:180,y:1982},"coupon-1":{x:210,y:1982},"coupon-2":{x:240,y:1982},"coupon-3":{x:270,y:1982},"dark-stone":{x:300,y:1982},"data-card":{x:330,y:1982},"devon-goods":{x:360,y:1982},"devon-scope":{x:390,y:1982},"dna-splicers":{x:420,y:1982},"dowsing-machine-gen5":{x:450,
149 | y:1982},"dowsing-machine":{x:480,y:1982},"dragon-skull":{x:510,y:1982},"dropped-item-red":{x:540,y:1982},"dropped-item-yellow":{x:570,y:1982},"dropped-item":{x:600,y:1982},"elevator-key":{x:630,y:1982},"enigma-stone":{x:660,y:1982},"eon-ticket":{x:690,y:1982},"exp-share":{x:720,y:1982},"explorer-kit":{x:750,y:1982},"fame-checker":{x:780,y:1982},"fashion-case":{x:810,y:1982},"galactic-key":{x:840,y:1982},"gb-sounds":{x:870,y:1982},"go-goggles":{x:900,y:1982},"god-stone":{x:930,y:1982},"gold-teeth":{x:960,
150 | y:1982},"good-rod":{x:990,y:1982},gracidea:{x:1020,y:1982},"gram-1":{x:1050,y:1982},"gram-2":{x:1080,y:1982},"gram-3":{x:1110,y:1982},"grubby-hanky":{x:1140,y:1982},"holo-caster-green":{x:1170,y:1982},"holo-caster-red":{x:1200,y:1982},"holo-caster":{x:1230,y:1982},"honor-of-kalos":{x:0,y:2012},"intriguing-stone":{x:30,y:2012},itemfinder:{x:60,y:2012},"jade-orb":{x:90,y:2012},journal:{x:120,y:2012},"lens-case":{x:150,y:2012},letter:{x:180,y:2012},"liberty-pass":{x:210,y:2012},"lift-key":{x:240,y:2012},
151 | "light-stone":{x:270,y:2012},"lock-capsule-gen4":{x:300,y:2012},"lock-capsule":{x:330,y:2012},"looker-ticket":{x:360,y:2012},"loot-sack":{x:390,y:2012},"lost-item-mimejr":{x:420,y:2012},"lost-item":{x:450,y:2012},"lunar-wing":{x:480,y:2012},"mach-bike":{x:510,y:2012},"machine-part":{x:540,y:2012},"magma-emblem":{x:570,y:2012},"magma-stone":{x:600,y:2012},"medal-box":{x:630,y:2012},"mega-ring":{x:660,y:2012},"member-card":{x:690,y:2012},meteorite:{x:720,y:2012},"mystery-egg":{x:750,y:2012},mysticticket:{x:780,
152 | y:2012},"oaks-letter":{x:810,y:2012},"oaks-parcel":{x:840,y:2012},"old-amber":{x:870,y:2012},"old-charm":{x:900,y:2012},"old-rod":{x:930,y:2012},"old-sea-map":{x:960,y:2012},"oval-charm":{x:990,y:2012},"pal-pad":{x:1020,y:2012},parcel:{x:1050,y:2012},pass:{x:1080,y:2012},permit:{x:1110,y:2012},"photo-album":{x:1140,y:2012},"plasma-card":{x:1170,y:2012},"poffin-case":{x:1200,y:2012},"point-card":{x:1230,y:2012},"poke-flute-gen3":{x:0,y:2042},"poke-flute":{x:30,y:2042},"poke-radar":{x:60,y:2042},"pokeblock-case":{x:90,
153 | y:2042},"powder-jar":{x:120,y:2042},"power-plant-pass":{x:150,y:2042},"profs-letter":{x:180,y:2042},"prop-case":{x:210,y:2042},"rainbow-pass":{x:240,y:2042},"rainbow-wing":{x:270,y:2042},"red-chain":{x:300,y:2042},"red-orb-gen3":{x:330,y:2042},"red-orb":{x:360,y:2042},"red-scale":{x:390,y:2042},"reveal-glass":{x:420,y:2042},"rm-1-key":{x:450,y:2042},"rm-2-key":{x:480,y:2042},"rm-4-key":{x:510,y:2042},"rm-6-key":{x:540,y:2042},"roller-skates":{x:570,y:2042},ruby:{x:600,y:2042},"rule-book":{x:630,y:2042},
154 | sapphire:{x:660,y:2042},scanner:{x:690,y:2042},"seal-bag":{x:720,y:2042},"seal-case":{x:750,y:2042},"secret-key-gen3":{x:780,y:2042},"secret-key":{x:810,y:2042},"secret-potion":{x:840,y:2042},"shiny-charm":{x:870,y:2042},"silph-scope":{x:900,y:2042},"silver-wing":{x:930,y:2042},"soot-sack":{x:960,y:2042},sprayduck:{x:990,y:2042},sprinklotad:{x:1020,y:2042},"squirt-bottle":{x:1050,y:2042},"ss-ticket":{x:1080,y:2042},"storage-key-gen3":{x:1110,y:2042},"storage-key":{x:1140,y:2042},"suite-key":{x:1170,
155 | y:2042},"super-rod":{x:1200,y:2042},tea:{x:1230,y:2042},"teachy-tv":{x:0,y:2072},"tidal-bell":{x:30,y:2072},"tm-case":{x:60,y:2072},"tmv-pass":{x:90,y:2072},"town-map-gen3":{x:120,y:2072},"town-map":{x:150,y:2072},"travel-trunk-gold":{x:180,y:2072},"travel-trunk-silver":{x:210,y:2072},"tri-pass":{x:240,y:2072},"unown-report":{x:270,y:2072},"vs-recorder":{x:300,y:2072},"vs-seeker":{x:330,y:2072},"wailmer-pail":{x:360,y:2072},"works-key":{x:390,y:2072},"xtransceiver-blue":{x:420,y:2072},"xtransceiver-red":{x:450,
156 | y:2072},"xtransceiver-yellow":{x:480,y:2072},xtransceiver:{x:510,y:2072}},mail:{air:{x:540,y:2072},bead:{x:570,y:2072},bloom:{x:600,y:2072},brick:{x:630,y:2072},"bridge-d":{x:660,y:2072},"bridge-m":{x:690,y:2072},"bridge-s":{x:720,y:2072},"bridge-t":{x:750,y:2072},"bridge-v":{x:780,y:2072},bubble:{x:810,y:2072},dream:{x:840,y:2072},fab:{x:870,y:2072},favored:{x:900,y:2072},flame:{x:930,y:2072},glitter:{x:960,y:2072},grass:{x:990,y:2072},greet:{x:1020,y:2072},harbor:{x:1050,y:2072},heart:{x:1080,y:2072},
157 | inquiry:{x:1110,y:2072},like:{x:1140,y:2072},mech:{x:1170,y:2072},mosaic:{x:1200,y:2072},orange:{x:1230,y:2072},reply:{x:0,y:2102},retro:{x:30,y:2102},rsvp:{x:60,y:2102},shadow:{x:90,y:2102},snow:{x:120,y:2102},space:{x:150,y:2102},steel:{x:180,y:2102},thanks:{x:210,y:2102},tropic:{x:240,y:2102},tunnel:{x:270,y:2102},wave:{x:300,y:2102},wood:{x:330,y:2102}},medicine:{"ability-capsule":{x:360,y:2102},antidote:{x:390,y:2102},awakening:{x:420,y:2102},"berry-juice":{x:450,y:2102},"burn-heal":{x:480,y:2102},
158 | calcium:{x:510,y:2102},carbos:{x:540,y:2102},casteliacone:{x:570,y:2102},"clever-wing":{x:600,y:2102},elixir:{x:630,y:2102},"energy-powder":{x:660,y:2102},"energy-root":{x:690,y:2102},ether:{x:720,y:2102},"fresh-water":{x:750,y:2102},"full-heal":{x:780,y:2102},"full-restore":{x:810,y:2102},"genius-wing":{x:840,y:2102},"heal-powder":{x:870,y:2102},"health-wing":{x:900,y:2102},"hp-up":{x:930,y:2102},"hyper-potion":{x:960,y:2102},"ice-heal":{x:990,y:2102},iron:{x:1020,y:2102},"lava-cookie":{x:1050,y:2102},
159 | lemonade:{x:1080,y:2102},"lumiose-galette":{x:1110,y:2102},"max-elixir":{x:1140,y:2102},"max-ether":{x:1170,y:2102},"max-potion":{x:1200,y:2102},"max-revive":{x:1230,y:2102},"moomoo-milk":{x:0,y:2132},"muscle-wing":{x:30,y:2132},"old-gateau":{x:60,y:2132},"paralyze-heal":{x:90,y:2132},potion:{x:120,y:2132},"pp-max":{x:150,y:2132},"pp-up":{x:180,y:2132},protein:{x:210,y:2132},"rage-candy-bar":{x:240,y:2132},"rare-candy":{x:270,y:2132},"resist-wing":{x:300,y:2132},"revival-herb":{x:330,y:2132},revive:{x:360,
160 | y:2132},"sacred-ash":{x:390,y:2132},"shalour-sable":{x:420,y:2132},"soda-pop":{x:450,y:2132},"super-potion":{x:480,y:2132},"sweet-heart":{x:510,y:2132},"swift-wing":{x:540,y:2132},zinc:{x:570,y:2132}},"mega-stone":{abomasite:{x:600,y:2132},absolite:{x:630,y:2132},aerodactylite:{x:660,y:2132},aggronite:{x:690,y:2132},alakazite:{x:720,y:2132},ampharosite:{x:750,y:2132},banettite:{x:780,y:2132},blastoisinite:{x:810,y:2132},blazikenite:{x:840,y:2132},"charizardite-x":{x:870,y:2132},"charizardite-y":{x:900,
161 | y:2132},garchompite:{x:930,y:2132},gardevoirite:{x:960,y:2132},gengarite:{x:990,y:2132},gyaradosite:{x:1020,y:2132},heracronite:{x:1050,y:2132},houndoominite:{x:1080,y:2132},kangaskhanite:{x:1110,y:2132},latiasite:{x:1140,y:2132},latiosite:{x:1170,y:2132},lucarionite:{x:1200,y:2132},manectite:{x:1230,y:2132},mawilite:{x:0,y:2162},medichamite:{x:30,y:2162},"mewtwonite-x":{x:60,y:2162},"mewtwonite-y":{x:90,y:2162},pinsirite:{x:120,y:2162},scizorite:{x:150,y:2162},tyranitarite:{x:180,y:2162},venusaurite:{x:210,
162 | y:2162}},mulch:{amaze:{x:240,y:2162},boost:{x:270,y:2162},damp:{x:300,y:2162},gooey:{x:330,y:2162},growth:{x:360,y:2162},rich:{x:390,y:2162},stable:{x:420,y:2162},surprise:{x:450,y:2162}},plate:{draco:{x:480,y:2162},dread:{x:510,y:2162},earth:{x:540,y:2162},fist:{x:570,y:2162},flame:{x:600,y:2162},icicle:{x:630,y:2162},insect:{x:660,y:2162},iron:{x:690,y:2162},meadow:{x:720,y:2162},mind:{x:750,y:2162},pixie:{x:780,y:2162},sky:{x:810,y:2162},splash:{x:840,y:2162},spooky:{x:870,y:2162},stone:{x:900,
163 | y:2162},toxic:{x:930,y:2162},zap:{x:960,y:2162}},pokeball:{cherish:{x:990,y:2162},dive:{x:1020,y:2162},dream:{x:1050,y:2162},dusk:{x:1080,y:2162},fast:{x:1110,y:2162},friend:{x:1140,y:2162},great:{x:1170,y:2162},heal:{x:1200,y:2162},heavy:{x:1230,y:2162},level:{x:0,y:2192},love:{x:30,y:2192},lure:{x:60,y:2192},luxury:{x:90,y:2192},master:{x:120,y:2192},moon:{x:150,y:2192},nest:{x:180,y:2192},net:{x:210,y:2192},park:{x:240,y:2192},poke:{x:270,y:2192},premier:{x:300,y:2192},quick:{x:330,y:2192},repeat:{x:360,
164 | y:2192},safari:{x:390,y:2192},sport:{x:420,y:2192},timer:{x:450,y:2192},ultra:{x:480,y:2192}},scarf:{blue:{x:510,y:2192},green:{x:540,y:2192},pink:{x:570,y:2192},red:{x:600,y:2192},yellow:{x:630,y:2192}},shard:{blue:{x:660,y:2192},green:{x:690,y:2192},red:{x:720,y:2192},yellow:{x:750,y:2192}},tm:{bug:{x:780,y:2192},dark:{x:810,y:2192},dragon:{x:840,y:2192},electric:{x:870,y:2192},fairy:{x:900,y:2192},fighting:{x:930,y:2192},fire:{x:960,y:2192},flying:{x:990,y:2192},ghost:{x:1020,y:2192},grass:{x:1050,
165 | y:2192},ground:{x:1080,y:2192},ice:{x:1110,y:2192},normal:{x:1140,y:2192},poison:{x:1170,y:2192},psychic:{x:1200,y:2192},rock:{x:1230,y:2192},steel:{x:0,y:2222},water:{x:30,y:2222}},"valuable-item":{"balm-mushroom":{x:60,y:2222},"big-mushroom":{x:90,y:2222},"big-nugget":{x:120,y:2222},"big-pearl":{x:150,y:2222},"comet-shard":{x:180,y:2222},nugget:{x:210,y:2222},"pearl-string":{x:240,y:2222},pearl:{x:270,y:2222},"pretty-wing":{x:300,y:2222},"rare-bone":{x:330,y:2222},"relic-band":{x:360,y:2222},"relic-copper":{x:390,
166 | y:2222},"relic-crown":{x:420,y:2222},"relic-gold":{x:450,y:2222},"relic-silver":{x:480,y:2222},"relic-statue":{x:510,y:2222},"relic-vase":{x:540,y:2222},"shoal-salt":{x:570,y:2222},"shoal-shell":{x:600,y:2222},"slowpoke-tail":{x:630,y:2222},"star-piece":{x:660,y:2222},stardust:{x:690,y:2222},"tiny-mushroom":{x:720,y:2222}},"wonder-launcher":{"ability-urge":{x:750,y:2222},antidote:{x:780,y:2222},awakening:{x:810,y:2222},"burn-heal":{x:840,y:2222},"dire-hit-1":{x:870,y:2222},"dire-hit-2":{x:900,y:2222},
167 | "dire-hit-3":{x:930,y:2222},ether:{x:960,y:2222},"full-heal":{x:990,y:2222},"full-restore":{x:1020,y:2222},"guard-spec":{x:1050,y:2222},"hyper-potion":{x:1080,y:2222},"ice-heal":{x:1110,y:2222},"item-drop":{x:1140,y:2222},"item-urge":{x:1170,y:2222},"max-potion":{x:1200,y:2222},"max-revive":{x:1230,y:2222},"paralyze-heal":{x:0,y:2252},potion:{x:30,y:2252},"reset-urge":{x:60,y:2252},revive:{x:90,y:2252},"super-potion":{x:120,y:2252},"x-accuracy-1":{x:150,y:2252},"x-accuracy-2":{x:180,y:2252},"x-accuracy-3":{x:210,
168 | y:2252},"x-accuracy-6":{x:240,y:2252},"x-attack-1":{x:270,y:2252},"x-attack-2":{x:300,y:2252},"x-attack-3":{x:330,y:2252},"x-attack-6":{x:360,y:2252},"x-defense-1":{x:390,y:2252},"x-defense-2":{x:420,y:2252},"x-defense-3":{x:450,y:2252},"x-defense-6":{x:480,y:2252},"x-sp-atk-1":{x:510,y:2252},"x-sp-atk-2":{x:540,y:2252},"x-sp-atk-3":{x:570,y:2252},"x-sp-atk-6":{x:600,y:2252},"x-sp-def-1":{x:630,y:2252},"x-sp-def-2":{x:660,y:2252},"x-sp-def-3":{x:690,y:2252},"x-sp-def-6":{x:720,y:2252},"x-speed-1":{x:750,
169 | y:2252},"x-speed-2":{x:780,y:2252},"x-speed-3":{x:810,y:2252},"x-speed-6":{x:840,y:2252}},status:{"holding-item":{x:942,y:2252},pentagon:{x:952,y:2252},"pokerus-cured":{x:962,y:2252},shiny:{x:972,y:2252}}};a.process_dom=function(){a.K(a.H)};a.decorate=function(c){!1==a.S(c)&&(c=[c]);var b,d,e,f;b=0;for(d=c.length;b