From d003cd898fb2aeda7f87277e71fdf2a5426e1ea8 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 4 Sep 2017 07:57:10 +0200 Subject: [PATCH 1/9] Image download by set with source restriction to supported sets. --- .../card/dl/sources/CardImageSource.java | 18 ++ .../dl/sources/MythicspoilerComSource.java | 37 ++- .../dl/sources/WizardCardsImageSource.java | 273 +++++++++++++++-- .../plugins/card/images/DownloadPictures.java | 286 +++++++++++------- .../target/maven-archiver/pom.properties | 10 +- 5 files changed, 488 insertions(+), 136 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java index 0f25bba72c..f76aeb953d 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java @@ -1,5 +1,6 @@ package org.mage.plugins.card.dl.sources; +import java.util.ArrayList; import org.mage.plugins.card.images.CardDownloadData; /** @@ -9,12 +10,29 @@ import org.mage.plugins.card.images.CardDownloadData; public interface CardImageSource { String generateURL(CardDownloadData card) throws Exception; + String generateTokenUrl(CardDownloadData card) throws Exception; + String getNextHttpImageUrl(); + String getFileForHttpImage(String httpImageUrl); + String getSourceName(); + float getAverageSize(); + int getTotalImages(); + boolean isTokenSource(); + void doPause(String httpImageUrl); + + default ArrayList getSupportedSets() { + return null; + } + + default boolean providesTokenImages() { + return false; + } +; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java index 8368c76c45..d8ceaf19f2 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java @@ -35,9 +35,11 @@ import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.prefs.Preferences; @@ -57,10 +59,11 @@ import org.mage.plugins.card.images.CardDownloadData; public enum MythicspoilerComSource implements CardImageSource { instance; - private Map setsAliases; - private Map cardNameAliases; - private Map> cardNameAliasesStart; + private final Map setsAliases; + private final Map cardNameAliases; + private final Map> cardNameAliasesStart; private final Map> sets; + private final Set supportedSets; @Override public String getSourceName() { @@ -68,6 +71,26 @@ public enum MythicspoilerComSource implements CardImageSource { } MythicspoilerComSource() { + supportedSets = new LinkedHashSet<>(); + supportedSets.add("V16"); + supportedSets.add("CN2"); + supportedSets.add("DDR"); + supportedSets.add("KLD"); + supportedSets.add("MPS"); + supportedSets.add("PZ2"); + supportedSets.add("C16"); + supportedSets.add("PCA"); + supportedSets.add("AER"); + supportedSets.add("MM3"); + supportedSets.add("DDS"); + supportedSets.add("W17"); + supportedSets.add("AKH"); + supportedSets.add("MPS"); + supportedSets.add("CMA"); + supportedSets.add("E01"); + supportedSets.add("HOU"); + supportedSets.add("C17"); + sets = new LinkedHashMap<>(); setsAliases = new HashMap<>(); setsAliases.put("exp", "bfz"); @@ -243,4 +266,12 @@ public enum MythicspoilerComSource implements CardImageSource { @Override public void doPause(String httpImageUrl) { } + + @Override + public ArrayList getSupportedSets() { + ArrayList supportedSetsCopy = new ArrayList<>(); + supportedSetsCopy.addAll(supportedSets); + return supportedSetsCopy; + } + } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java index a42cc1633a..4939fdcbe2 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java @@ -34,10 +34,13 @@ import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; -import java.net.URLEncoder; +import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -46,6 +49,7 @@ import mage.client.MageFrame; import mage.client.dialog.PreferencesDialog; import mage.remote.Connection; import mage.remote.Connection.ProxyType; +import org.apache.log4j.Logger; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -58,10 +62,13 @@ import org.mage.plugins.card.images.CardDownloadData; public enum WizardCardsImageSource implements CardImageSource { instance; - private Map setsAliases; - private Map languageAliases; - private final Map> sets; + private static final Logger logger = Logger.getLogger(WizardCardsImageSource.class); + + private final Map setsAliases; + private final Map languageAliases; + private final Map> sets; + private final Set supportedSets; @Override public String getSourceName() { @@ -69,6 +76,197 @@ public enum WizardCardsImageSource implements CardImageSource { } WizardCardsImageSource() { + supportedSets = new LinkedHashSet<>(); + supportedSets.add("LEA"); + supportedSets.add("LEB"); + supportedSets.add("2ED"); + supportedSets.add("ARN"); + supportedSets.add("ATQ"); + supportedSets.add("3ED"); + supportedSets.add("LEG"); + supportedSets.add("DRK"); + supportedSets.add("FEM"); + supportedSets.add("4ED"); + supportedSets.add("ICE"); + supportedSets.add("CHR"); + supportedSets.add("HML"); + supportedSets.add("ALL"); + supportedSets.add("MIR"); + supportedSets.add("VIS"); + supportedSets.add("5ED"); + supportedSets.add("POR"); + supportedSets.add("WTH"); + supportedSets.add("TMP"); + supportedSets.add("STH"); + supportedSets.add("EXO"); + supportedSets.add("P02"); + supportedSets.add("UGL"); + supportedSets.add("USG"); + supportedSets.add("DD3DVD"); + supportedSets.add("DD3EVG"); + supportedSets.add("DD3GVL"); + supportedSets.add("DD3JVC"); + + supportedSets.add("ULG"); + supportedSets.add("6ED"); + supportedSets.add("UDS"); + supportedSets.add("PTK"); + supportedSets.add("S99"); + supportedSets.add("MMQ"); + // supportedSets.add("BRB");Battle Royale Box Set + supportedSets.add("NEM"); + supportedSets.add("S00"); + supportedSets.add("PCY"); + supportedSets.add("INV"); + // supportedSets.add("BTD"); // Beatdown Boxset + supportedSets.add("PLS"); + supportedSets.add("7ED"); + supportedSets.add("APC"); + supportedSets.add("ODY"); + // supportedSets.add("DKM"); // Deckmasters 2001 + supportedSets.add("TOR"); + supportedSets.add("JUD"); + supportedSets.add("ONS"); + supportedSets.add("LGN"); + supportedSets.add("SCG"); + supportedSets.add("8ED"); + supportedSets.add("MRD"); + supportedSets.add("DST"); + supportedSets.add("5DN"); + supportedSets.add("CHK"); + supportedSets.add("UNH"); + supportedSets.add("BOK"); + supportedSets.add("SOK"); + supportedSets.add("9ED"); + supportedSets.add("RAV"); + supportedSets.add("GPT"); + supportedSets.add("DIS"); + supportedSets.add("CSP"); + supportedSets.add("TSP"); + supportedSets.add("TSB"); + supportedSets.add("PLC"); + supportedSets.add("FUT"); + supportedSets.add("10E"); + supportedSets.add("MED"); + supportedSets.add("LRW"); + supportedSets.add("EVG"); + supportedSets.add("MOR"); + supportedSets.add("SHM"); + supportedSets.add("EVE"); + supportedSets.add("DRB"); + supportedSets.add("ME2"); + supportedSets.add("ALA"); + supportedSets.add("DD2"); + supportedSets.add("CON"); + supportedSets.add("DDC"); + supportedSets.add("ARB"); + supportedSets.add("M10"); + // supportedSets.add("TD0"); // Magic Online Deck Series + supportedSets.add("V09"); + supportedSets.add("HOP"); + supportedSets.add("ME3"); + supportedSets.add("ZEN"); + supportedSets.add("DDD"); + supportedSets.add("H09"); + supportedSets.add("WWK"); + supportedSets.add("DDE"); + supportedSets.add("ROE"); + supportedSets.add("DPA"); + supportedSets.add("ARC"); + supportedSets.add("M11"); + supportedSets.add("V10"); + supportedSets.add("DDF"); + supportedSets.add("SOM"); + // supportedSets.add("TD0"); // Commander Theme Decks + supportedSets.add("PD2"); + supportedSets.add("ME4"); + supportedSets.add("MBS"); + supportedSets.add("DDG"); + supportedSets.add("NPH"); + supportedSets.add("CMD"); + supportedSets.add("M12"); + supportedSets.add("V11"); + supportedSets.add("DDH"); + supportedSets.add("ISD"); + supportedSets.add("PD3"); + supportedSets.add("DKA"); + supportedSets.add("DDI"); + supportedSets.add("AVR"); + supportedSets.add("PC2"); + supportedSets.add("M13"); + supportedSets.add("V12"); + supportedSets.add("DDJ"); + supportedSets.add("RTR"); + supportedSets.add("CM1"); + // supportedSets.add("TD2"); // Duel Decks: Mirrodin Pure vs. New Phyrexia + supportedSets.add("GTC"); + supportedSets.add("DDK"); + supportedSets.add("DGM"); + supportedSets.add("MMA"); + supportedSets.add("M14"); + supportedSets.add("V13"); + supportedSets.add("DDL"); + supportedSets.add("THS"); + supportedSets.add("C13"); + supportedSets.add("BNG"); + supportedSets.add("DDM"); + supportedSets.add("JOU"); + // supportedSets.add("MD1"); // Modern Event Deck + supportedSets.add("CNS"); + supportedSets.add("VMA"); + supportedSets.add("M15"); + supportedSets.add("V14"); + supportedSets.add("DDN"); + supportedSets.add("KTK"); + supportedSets.add("C14"); + // supportedSets.add("DD3"); // Duel Decks Anthology + supportedSets.add("FRF"); + supportedSets.add("DDO"); + supportedSets.add("DTK"); + supportedSets.add("TPR"); + supportedSets.add("MM2"); + supportedSets.add("ORI"); + supportedSets.add("V15"); + supportedSets.add("DDP"); + supportedSets.add("BFZ"); + supportedSets.add("EXP"); + supportedSets.add("C15"); + // supportedSets.add("PZ1"); // Legendary Cube + supportedSets.add("OGW"); + supportedSets.add("DDQ"); + supportedSets.add("W16"); + supportedSets.add("SOI"); + supportedSets.add("EMA"); + supportedSets.add("EMN"); + supportedSets.add("V16"); + supportedSets.add("CN2"); + supportedSets.add("DDR"); + supportedSets.add("KLD"); + supportedSets.add("MPS"); + // supportedSets.add("PZ2"); // Treasure Chests + supportedSets.add("C16"); + supportedSets.add("PCA"); + supportedSets.add("AER"); + supportedSets.add("MM3"); + supportedSets.add("DDS"); + supportedSets.add("W17"); + supportedSets.add("AKH"); + supportedSets.add("MPS"); + supportedSets.add("CMA"); + supportedSets.add("E01"); + supportedSets.add("HOU"); + supportedSets.add("C17"); +// supportedSets.add("XLN"); +// supportedSets.add("DDT"); +// supportedSets.add("IMA"); +// supportedSets.add("E02"); +// supportedSets.add("V17"); +// supportedSets.add("UST"); +// supportedSets.add("RIX"); +// supportedSets.add("A25"); +// supportedSets.add("DOM"); +// supportedSets.add("M19"); + sets = new HashMap<>(); setsAliases = new HashMap<>(); setsAliases.put("2ED", "Unlimited Edition"); @@ -102,6 +300,7 @@ public enum WizardCardsImageSource implements CardImageSource { setsAliases.put("C14", "Commander 2014"); setsAliases.put("C15", "Commander 2015"); setsAliases.put("C16", "Commander 2016"); + setsAliases.put("C17", "Commander 2017"); setsAliases.put("CMA", "Commander Anthology"); setsAliases.put("CHK", "Champions of Kamigawa"); setsAliases.put("CHR", "Chronicles"); @@ -140,6 +339,7 @@ public enum WizardCardsImageSource implements CardImageSource { setsAliases.put("DRK", "The Dark"); setsAliases.put("DST", "Darksteel"); setsAliases.put("DTK", "Dragons of Tarkir"); + setsAliases.put("E01", "Archenemy: Nicol Bolas"); setsAliases.put("EMN", "Eldritch Moon"); setsAliases.put("EMA", "Eternal Masters"); setsAliases.put("EVE", "Eventide"); @@ -272,18 +472,20 @@ public enum WizardCardsImageSource implements CardImageSource { } private Map getSetLinks(String cardSet) { - ConcurrentHashMap setLinks = new ConcurrentHashMap<>(); + LinkedHashMap setLinks = new LinkedHashMap<>(); ExecutorService executor = Executors.newFixedThreadPool(10); try { String setNames = setsAliases.get(cardSet); String preferedLanguage = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PREF_LANGUAGE, "en"); for (String setName : setNames.split("\\^")) { - String URLSetName = URLEncoder.encode(setName, "UTF-8"); + // String URLSetName = URLEncoder.encode(setName, "UTF-8"); + String URLSetName = setName.replaceAll(" ", "%20"); int page = 0; int firstMultiverseIdLastPage = 0; Pages: while (page < 999) { - String searchUrl = "http://gatherer.wizards.com/Pages/Search/Default.aspx?page=" + page + "&output=spoiler&method=visual&action=advanced&set=+[%22" + URLSetName + "%22]"; + String searchUrl = "http://gatherer.wizards.com/Pages/Search/Default.aspx?sort=cn+&page=" + page + "&action=advanced&output=spoiler&method=visual&set=+%5B%22" + URLSetName + "%22%5D"; + logger.debug("URL: " + searchUrl); Document doc = getDocument(searchUrl); Elements cardsImages = doc.select("img[src^=../../Handlers/]"); if (cardsImages.isEmpty()) { @@ -307,7 +509,7 @@ public enum WizardCardsImageSource implements CardImageSource { } } } catch (IOException ex) { - System.out.println("Exception when parsing the wizards page: " + ex.getMessage()); + logger.error("Exception when parsing the wizards page: " + ex.getMessage()); } executor.shutdown(); @@ -327,14 +529,15 @@ public enum WizardCardsImageSource implements CardImageSource { Connection.ProxyType proxyType = Connection.ProxyType.valueByText(prefs.get("proxyType", "None")); Document doc; if (proxyType == ProxyType.NONE) { - doc = Jsoup.connect(urlString).get(); + doc = Jsoup.connect(urlString).timeout(60 * 1000).get(); } else { String proxyServer = prefs.get("proxyAddress", ""); int proxyPort = Integer.parseInt(prefs.get("proxyPort", "0")); URL url = new URL(urlString); Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyServer, proxyPort)); HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy); - + uc.setConnectTimeout(10000); + uc.setReadTimeout(60000); uc.connect(); String line; @@ -356,7 +559,7 @@ public enum WizardCardsImageSource implements CardImageSource { if (!variations.isEmpty()) { int landNumber = 1; for (Element variation : variations) { - Integer landMultiverseId = Integer.parseInt(variation.attr("onclick").replaceAll("[^\\d]", "")); + Integer landMultiverseId = Integer.parseInt(variation.attr("href").replaceAll("[^\\d]", "")); links.put((cardName + landNumber).toLowerCase(), generateLink(landMultiverseId)); landNumber++; } @@ -444,11 +647,11 @@ public enum WizardCardsImageSource implements CardImageSource { } int number = Integer.parseInt(collectorId.substring(0, length)); - - if (setLinks.size() >= number) { - link = setLinks.get(Integer.toString(number - 1)); - } else { - link = setLinks.get(Integer.toString(number - 21)); + List l = new ArrayList<>(setLinks.values()); + if (l.size() >= number) { + link = l.get(number - 1); + } else {; + link = l.get(number - 21); if (link != null) { link = link.replace(Integer.toString(number - 20), (Integer.toString(number - 20) + 'a')); } @@ -474,16 +677,24 @@ public enum WizardCardsImageSource implements CardImageSource { private final class GetImageLinkTask implements Runnable { - private final int multiverseId; - private final String cardName; - private final String preferedLanguage; - private final ConcurrentHashMap setLinks; + private int multiverseId; + private String cardName; + private String preferedLanguage; + private LinkedHashMap setLinks; - public GetImageLinkTask(int multiverseId, String cardName, String preferedLanguage, ConcurrentHashMap setLinks) { - this.multiverseId = multiverseId; - this.cardName = cardName; - this.preferedLanguage = preferedLanguage; - this.setLinks = setLinks; + public GetImageLinkTask(int multiverseId, String cardName, String preferedLanguage, LinkedHashMap setLinks) { + try { + this.multiverseId = multiverseId; + this.cardName = cardName; + this.preferedLanguage = preferedLanguage; + this.setLinks = setLinks; + } catch (Exception ex) { + logger.error(ex.getMessage()); + logger.error("multiverseId: " + multiverseId); + logger.error("cardName: " + cardName); + logger.error("preferedLanguage: " + preferedLanguage); + logger.error("setLinks: " + setLinks.toString()); + } } @Override @@ -496,7 +707,7 @@ public enum WizardCardsImageSource implements CardImageSource { setLinks.put(cardName.toLowerCase(), generateLink(preferedMultiverseId)); } } catch (IOException | NumberFormatException ex) { - System.out.println("Exception when parsing the wizards page: " + ex.getMessage()); + logger.error("Exception when parsing the wizards page: " + ex.getMessage()); } } @@ -515,4 +726,12 @@ public enum WizardCardsImageSource implements CardImageSource { @Override public void doPause(String httpImageUrl) { } + + @Override + public ArrayList getSupportedSets() { + ArrayList supportedSetsCopy = new ArrayList<>(); + supportedSetsCopy.addAll(supportedSets); + return supportedSetsCopy; + } + } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index 02e639ba19..c9b9a25d1b 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -21,11 +21,16 @@ import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.FileImageOutputStream; import javax.swing.*; +import mage.cards.ExpansionSet; +import mage.cards.Sets; import mage.cards.repository.CardInfo; import mage.client.constants.Constants; import mage.client.dialog.PreferencesDialog; import mage.client.util.sets.ConstructedFormats; import mage.remote.Connection; +import static mage.remote.Connection.ProxyType.HTTP; +import static mage.remote.Connection.ProxyType.NONE; +import static mage.remote.Connection.ProxyType.SOCKS; import net.java.truevfs.access.TFile; import net.java.truevfs.access.TFileOutputStream; import net.java.truevfs.access.TVFS; @@ -39,18 +44,31 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab private static final Logger logger = Logger.getLogger(DownloadPictures.class); + public static final String ALL_CARDS = "- All cards from that source"; + public static final String ALL_STANDARD_CARDS = "- All cards from standard from that source"; + public static final String ALL_TOKENS = "- All token images from that source"; + private final JProgressBar bar; private final JOptionPane dlg; private boolean cancel; private final JButton closeButton; private final JButton startDownloadButton; private int cardIndex; - private List cards; - private List type2cards; - private final JComboBox jComboBox1; - private final JLabel jLabel1; - private static boolean offlineMode = false; - private JCheckBox checkBox; + private List allCardsMissingImage; + List cardsToDownload = new ArrayList<>(); + + private int missingCards = 0; + private int missingTokens = 0; + + List selectedSetCodes = new ArrayList<>(); + + private final JComboBox jComboBoxServer; + private final JLabel jLabelAllMissing; + private final JLabel jLabelServer; + + private final JComboBox jComboBoxSet; + private final JLabel jLabelSet; + private final Object sync = new Object(); private static CardImageSource cardImageSource; @@ -90,7 +108,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } public DownloadPictures(List cards) { - this.cards = cards; + this.allCardsMissingImage = cards; bar = new JProgressBar(this); @@ -98,15 +116,21 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); p0.add(Box.createVerticalStrut(5)); - jLabel1 = new JLabel(); - jLabel1.setText("Please select server:"); - jLabel1.setAlignmentX(Component.LEFT_ALIGNMENT); + jLabelAllMissing = new JLabel(); - p0.add(jLabel1); + jLabelAllMissing.setAlignmentX(Component.LEFT_ALIGNMENT); + p0.add(jLabelAllMissing); p0.add(Box.createVerticalStrut(5)); - ComboBoxModel jComboBox1Model = new DefaultComboBoxModel(new String[]{ - // "magiccards.info", + + jLabelServer = new JLabel(); + jLabelServer.setText("Please select server:"); + jLabelServer.setAlignmentX(Component.LEFT_ALIGNMENT); + p0.add(jLabelServer); + + p0.add(Box.createVerticalStrut(5)); + + ComboBoxModel jComboBoxDownloadSourcesModel = new DefaultComboBoxModel(new String[]{ "wizards.com", "mythicspoiler.com", "tokens.mtg.onl", //"mtgimage.com (HQ)", @@ -114,50 +138,45 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab "alternative.mtg.onl", "GrabBag", "magidex.com", - "scryfall.com", //"mtgathering.ru HQ", + "scryfall.com", + "magiccards.info" + //"mtgathering.ru HQ", //"mtgathering.ru MQ", //"mtgathering.ru LQ", }); - jComboBox1 = new JComboBox(); + jComboBoxServer = new JComboBox(); - cardImageSource = MagicCardsImageSource.instance; + cardImageSource = WizardCardsImageSource.instance; - jComboBox1.setModel(jComboBox1Model); - jComboBox1.setAlignmentX(Component.LEFT_ALIGNMENT); - jComboBox1.addActionListener(e -> { - JComboBox cb = (JComboBox) e.getSource(); - switch (cb.getSelectedIndex() + 1) { - case 0: - cardImageSource = MagicCardsImageSource.instance; - break; - case 1: - cardImageSource = WizardCardsImageSource.instance; - break; - case 2: - cardImageSource = MythicspoilerComSource.instance; - break; - case 3: - cardImageSource = TokensMtgImageSource.instance; - break; - case 4: - cardImageSource = MtgOnlTokensImageSource.instance; - break; - case 5: - cardImageSource = AltMtgOnlTokensImageSource.instance; - break; - case 6: - cardImageSource = GrabbagImageSource.instance; - break; - case 7: - cardImageSource = MagidexImageSource.instance; - break; - case 8: - cardImageSource = ScryfallImageSource.instance; - break; + jComboBoxServer.setModel(jComboBoxDownloadSourcesModel); + jComboBoxServer.setAlignmentX(Component.LEFT_ALIGNMENT); + jComboBoxServer.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboBoxServerActionPerformed(evt); } - updateCardsToDownload(); }); - p0.add(jComboBox1); + p0.add(jComboBoxServer); + + p0.add(Box.createVerticalStrut(5)); + + // Set selection --------------------------------- + jLabelSet = new JLabel(); + jLabelSet.setText("Please select sets to download images for:"); + jLabelSet.setAlignmentX(Component.LEFT_ALIGNMENT); + p0.add(jLabelSet); + + jComboBoxSet = new JComboBox(); + jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); + jComboBoxSet.setAlignmentX(Component.LEFT_ALIGNMENT); + jComboBoxSet.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + comboBoxSetActionPerformed(evt); + } + }); + p0.add(jComboBoxSet); + p0.add(Box.createVerticalStrut(5)); // Start @@ -165,31 +184,21 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab startDownloadButton.addActionListener(e -> { new Thread(DownloadPictures.this).start(); startDownloadButton.setEnabled(false); - checkBox.setEnabled(false); }); p0.add(Box.createVerticalStrut(5)); // Progress p0.add(bar); bar.setStringPainted(true); - int count = cards.size(); - float mb = (count * cardImageSource.getAverageSize()) / 1024; - bar.setString(String.format(cardIndex == cards.size() ? "%d of %d cards finished! Please close!" - : "%d of %d cards finished! Please wait! [%.1f Mb]", 0, cards.size(), mb)); Dimension d = bar.getPreferredSize(); d.width = 300; bar.setPreferredSize(d); - p0.add(Box.createVerticalStrut(5)); - checkBox = new JCheckBox("Download images for Standard (Type2) only"); - p0.add(checkBox); - p0.add(Box.createVerticalStrut(5)); - - checkBox.addActionListener(e -> updateCardsToDownload()); - // JOptionPane Object[] options = {startDownloadButton, closeButton = new JButton("Cancel")}; dlg = new JOptionPane(p0, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[1]); + + updateCardsToDownload(); } public static boolean checkForMissingCardImages(List allCards) { @@ -209,31 +218,120 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab return missedCardTFiles.get(); } + private void comboBoxServerActionPerformed(java.awt.event.ActionEvent evt) { + JComboBox cb = (JComboBox) evt.getSource(); + switch (cb.getSelectedIndex()) { + case 0: + cardImageSource = WizardCardsImageSource.instance; + break; + case 1: + cardImageSource = MythicspoilerComSource.instance; + break; + case 2: + cardImageSource = TokensMtgImageSource.instance; + break; + case 3: + cardImageSource = MtgOnlTokensImageSource.instance; + break; + case 4: + cardImageSource = AltMtgOnlTokensImageSource.instance; + break; + case 5: + cardImageSource = GrabbagImageSource.instance; + break; + case 6: + cardImageSource = MagidexImageSource.instance; + break; + case 7: + cardImageSource = ScryfallImageSource.instance; + break; + case 8: + cardImageSource = MagicCardsImageSource.instance; + break; + } + jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); + updateCardsToDownload(); + } + + private Object[] getSetsForCurrentImageSource() { + // Set the available sets to the combo box + ArrayList supportedSets = cardImageSource.getSupportedSets(); + List setNames = new ArrayList<>(); + setNames.add(ALL_CARDS); + setNames.add(ALL_STANDARD_CARDS); + if (cardImageSource.providesTokenImages()) { + setNames.add(ALL_TOKENS); + } + if (supportedSets != null) { + for (String setCode : supportedSets) { + ExpansionSet expansionSet = Sets.findSet(setCode); + if (expansionSet != null) { + setNames.add(expansionSet.getName()); + } else { + logger.error(cardImageSource.getSourceName() + ": Expansion set for code " + setCode + " not found!"); + } + } + + } + return setNames.toArray(new String[0]); + } + private void updateCardsToDownload() { - List cardsToDownload = cards; - if (type2cardsOnly()) { - selectType2andTokenCardsIfNotYetDone(); - cardsToDownload = type2cards; + String expansionSelection = jComboBoxSet.getSelectedItem().toString(); + selectedSetCodes.clear(); + boolean tokens = false; + switch (expansionSelection) { + case ALL_CARDS: + if (cardImageSource.getSupportedSets() == null) { + selectedSetCodes = cardImageSource.getSupportedSets(); + } else { + selectedSetCodes.addAll(cardImageSource.getSupportedSets()); + } + break; + case ALL_STANDARD_CARDS: + List standardSets = ConstructedFormats.getSetsByFormat(ConstructedFormats.STANDARD); + for (String setCode : cardImageSource.getSupportedSets()) { + if (standardSets.contains(setCode)) { + selectedSetCodes.add(setCode); + } else { + logger.debug("Set code " + setCode + " from download source " + cardImageSource.getSourceName()); + } + } + break; + case ALL_TOKENS: + tokens = true; + default: + int nonSetEntries = 2; + if (cardImageSource.providesTokenImages()) { + nonSetEntries++; + } + selectedSetCodes.add(cardImageSource.getSupportedSets().get(jComboBoxSet.getSelectedIndex() - nonSetEntries)); + } + cardsToDownload.clear(); + for (CardDownloadData data : allCardsMissingImage) { + if ((data.isToken() && tokens) + || (!data.isToken() && selectedSetCodes.contains(data.getSet()))) { + cardsToDownload.add(data); + } } updateProgressText(cardsToDownload.size()); } - private boolean type2cardsOnly() { - return checkBox.isSelected(); - } - - private void selectType2andTokenCardsIfNotYetDone() { - if (type2cards == null) { - type2cards = new ArrayList<>(); - for (CardDownloadData data : cards) { - if (data.isType2() || data.isToken()) { - type2cards.add(data); - } - } - } + private void comboBoxSetActionPerformed(java.awt.event.ActionEvent evt) { + // Update the cards to download related to the selected set + updateCardsToDownload(); } private void updateProgressText(int cardCount) { + missingTokens = 0; + for (CardDownloadData card : allCardsMissingImage) { + if (card.isToken()) { + missingTokens++; + } + } + missingCards = allCardsMissingImage.size() - missingTokens; + jLabelAllMissing.setText("Missing: " + missingCards + " cards / " + missingTokens + " tokens"); + float mb = (cardCount * cardImageSource.getAverageSize()) / 1024; bar.setString(String.format(cardIndex == cardCount ? "%d of %d cards finished! Please close!" : "%d of %d cards finished! Please wait! [%.1f Mb]", 0, cardCount, mb)); @@ -262,11 +360,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab logger.warn("No formats defined. Try connecting to a server first!"); } - int numberCardImages = allCards.size(); - int numberWithoutTokens = 0; List allCardsUrls = Collections.synchronizedList(new ArrayList<>()); try { - offlineMode = true; allCards.parallelStream().forEach(card -> { if (!card.getCardNumber().isEmpty() && !"0".equals(card.getCardNumber()) && !card.getSetCode().isEmpty() && !ignoreUrls.contains(card.getSetCode())) { @@ -308,14 +403,11 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab logger.error("Card has no set name and won't be sent to client:" + card.getName()); } }); - numberWithoutTokens = allCards.size(); allCardsUrls.addAll(getTokenCardUrls()); } catch (Exception e) { logger.error(e); } - int numberAllTokenImages = allCardsUrls.size() - numberWithoutTokens; - /** * check to see which cards we already have */ @@ -329,22 +421,13 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } }); - int tokenImages = 0; - for (CardDownloadData card : cardsToDownload) { - logger.debug((card.isToken() ? "Token" : "Card") + " image to download: " + card.getName() + " (" + card.getSet() + ')'); - if (card.isToken()) { - tokenImages++; - } - } - logger.info("Check download images (total card images: " + numberCardImages + ", total token images: " + numberAllTokenImages + ')'); - logger.info(" => Missing card images: " + (cardsToDownload.size() - tokenImages)); - logger.info(" => Missing token images: " + tokenImages); return new ArrayList<>(cardsToDownload); } public static ArrayList getTokenCardUrls() throws RuntimeException { ArrayList list = new ArrayList<>(); - InputStream in = DownloadPictures.class.getClassLoader().getResourceAsStream("card-pictures-tok.txt"); + InputStream in = DownloadPictures.class + .getClassLoader().getResourceAsStream("card-pictures-tok.txt"); if (in == null) { logger.error("resources input stream is null"); @@ -446,9 +529,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab if (p != null) { HashSet ignoreUrls = SettingsManager.getIntance().getIgnoreUrls(); - List cardsToDownload = this.checkBox.isSelected() ? type2cards : cards; - update(0, cardsToDownload.size()); + logger.info("Started download of " + cardsToDownload.size() + " cards from source: " + cardImageSource.getSourceName()); int numberOfThreads = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_THREADS, "10")); ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads); @@ -712,16 +794,18 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab card, count, mb)); } else { List remainingCards = Collections.synchronizedList(new ArrayList<>()); - DownloadPictures.this.cards.parallelStream().forEach(cardDownloadData -> { + DownloadPictures.this.allCardsMissingImage.parallelStream().forEach(cardDownloadData -> { TFile file = new TFile(CardImageUtils.generateImagePath(cardDownloadData)); if (!file.exists()) { remainingCards.add(cardDownloadData); } }); - DownloadPictures.this.cards = new ArrayList<>(remainingCards); + // remove the cards not downloaded to get the siccessfull downloaded cards + DownloadPictures.this.cardsToDownload.removeAll(remainingCards); + DownloadPictures.this.allCardsMissingImage.removeAll(DownloadPictures.this.cardsToDownload); - count = DownloadPictures.this.cards.size(); + count = remainingCards.size(); if (count == 0) { bar.setString("0 cards remaining! Please close!"); diff --git a/Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target/maven-archiver/pom.properties b/Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target/maven-archiver/pom.properties index d7097083df..03ac9e7681 100644 --- a/Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target/maven-archiver/pom.properties +++ b/Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ -#Generated by Maven -#Mon Aug 28 09:53:46 CEST 2017 -version=1.4.26 -groupId=org.mage -artifactId=mage-game-pennydreadfulcommanderfreeforall +#Generated by Maven +#Sun Sep 03 07:46:59 CEST 2017 +version=1.4.26 +groupId=org.mage +artifactId=mage-game-pennydreadfulcommanderfreeforall From 5a1544050c855789ebe7635ff947868b8705f2a7 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Mon, 4 Sep 2017 18:25:31 +0200 Subject: [PATCH 2/9] Updated image download handling. --- .../src/main/java/mage/client/MageFrame.java | 22 +- .../card/dl/sources/CardImageSource.java | 13 +- .../dl/sources/MagicCardsImageSource.java | 216 +++++++++++++++++- .../dl/sources/MtgOnlTokensImageSource.java | 9 +- .../dl/sources/MythicspoilerComSource.java | 2 +- .../card/dl/sources/ScryfallImageSource.java | 203 +++++++++++++++- .../card/dl/sources/TokensMtgImageSource.java | 42 ++-- .../dl/sources/WizardCardsImageSource.java | 5 + .../plugins/card/images/DownloadPictures.java | 210 ++++++++--------- 9 files changed, 556 insertions(+), 166 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index d474fbd100..425172f7a6 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -44,8 +44,6 @@ import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import mage.cards.action.ActionCallback; import mage.cards.decks.Deck; -import mage.cards.repository.CardCriteria; -import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; import mage.client.cards.BigCard; import mage.client.chat.ChatPanelBasic; @@ -134,8 +132,6 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { private final BalloonTip balloonTip; - private java.util.List missingCards; - /** * @return the session */ @@ -513,18 +509,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } private void checkForNewImages() { - long beforeCall = System.currentTimeMillis(); - missingCards = CardRepository.instance.findCards(new CardCriteria()); - LOGGER.info("Card pool load time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds")); - beforeCall = System.currentTimeMillis(); - if (DownloadPictures.checkForMissingCardImages(missingCards)) { - LOGGER.info("Card images checking time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds")); - UserRequestMessage message = new UserRequestMessage("New images available", "Card images are missing (" + missingCards.size() + "). Do you want to download the images?" - + "

You can deactivate the image download check on application start in the preferences."); - message.setButton1("No", null); - message.setButton2("Yes", PlayerAction.CLIENT_DOWNLOAD_CARD_IMAGES); - showUserRequestDialog(message); - } + // Removed TODO: Remove related pref code } public static void setActive(MagePane frame) { @@ -978,8 +963,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { }//GEN-LAST:event_btnImagesActionPerformed public void downloadImages() { - java.util.List cards = CardRepository.instance.findCards(new CardCriteria()); - DownloadPictures.startDownload(null, cards); + DownloadPictures.startDownload(); } public void exitApp() { @@ -1317,7 +1301,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { Plugins.instance.downloadSymbols(); break; case CLIENT_DOWNLOAD_CARD_IMAGES: - DownloadPictures.startDownload(null, missingCards); + DownloadPictures.startDownload(); break; case CLIENT_DISCONNECT: if (SessionHandler.isConnected()) { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java index f76aeb953d..ed125d6f2b 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java @@ -23,16 +23,17 @@ public interface CardImageSource { int getTotalImages(); - boolean isTokenSource(); + default int getTokenImages() { + return 0; + } + + default boolean isTokenSource() { + return false; + } void doPause(String httpImageUrl); default ArrayList getSupportedSets() { return null; } - - default boolean providesTokenImages() { - return false; - } -; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java index 3052a2dc41..78f55e9b7a 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java @@ -1,7 +1,10 @@ package org.mage.plugins.card.dl.sources; +import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.Map; +import java.util.Set; import mage.client.dialog.PreferencesDialog; import org.mage.plugins.card.images.CardDownloadData; import org.mage.plugins.card.utils.CardImageUtils; @@ -13,6 +16,202 @@ import org.mage.plugins.card.utils.CardImageUtils; public enum MagicCardsImageSource implements CardImageSource { instance; + + private static final Set supportedSets = new LinkedHashSet() { + { + // add("PTC"); // Prerelease Events + add("LEA"); + add("LEB"); + add("2ED"); + add("ARN"); + add("ATQ"); + add("3ED"); + add("LEG"); + add("DRK"); + add("FEM"); + add("4ED"); + add("ICE"); + add("CHR"); + add("HML"); + add("ALL"); + add("MIR"); + add("VIS"); + add("5ED"); + add("POR"); + add("WTH"); + add("TMP"); + add("STH"); + add("EXO"); + add("P02"); + add("UGL"); + add("USG"); + add("DD3DVD"); + add("DD3EVG"); + add("DD3GVL"); + add("DD3JVC"); + + add("ULG"); + add("6ED"); + add("UDS"); + add("PTK"); + add("S99"); + add("MMQ"); + // add("BRB");Battle Royale Box Set + add("NEM"); + add("S00"); + add("PCY"); + add("INV"); + // add("BTD"); // Beatdown Boxset + add("PLS"); + add("7ED"); + add("APC"); + add("ODY"); + // add("DKM"); // Deckmasters 2001 + add("TOR"); + add("JUD"); + add("ONS"); + add("LGN"); + add("SCG"); + add("8ED"); + add("MRD"); + add("DST"); + add("5DN"); + add("CHK"); + add("UNH"); + add("BOK"); + add("SOK"); + add("9ED"); + add("RAV"); + add("GPT"); + add("DIS"); + add("CSP"); + add("TSP"); + add("TSB"); + add("PLC"); + add("FUT"); + add("10E"); + add("MED"); + add("LRW"); + add("EVG"); + add("MOR"); + add("SHM"); + add("EVE"); + add("DRB"); + add("ME2"); + add("ALA"); + add("DD2"); + add("CON"); + add("DDC"); + add("ARB"); + add("M10"); + // add("TD0"); // Magic Online Deck Series + add("V09"); + add("HOP"); + add("ME3"); + add("ZEN"); + add("DDD"); + add("H09"); + add("WWK"); + add("DDE"); + add("ROE"); + add("DPA"); + add("ARC"); + add("M11"); + add("V10"); + add("DDF"); + add("SOM"); + // add("TD0"); // Commander Theme Decks + add("PD2"); + add("ME4"); + add("MBS"); + add("DDG"); + add("NPH"); + add("CMD"); + add("M12"); + add("V11"); + add("DDH"); + add("ISD"); + add("PD3"); + add("DKA"); + add("DDI"); + add("AVR"); + add("PC2"); + add("M13"); + add("V12"); + add("DDJ"); + add("RTR"); + add("CM1"); + // add("TD2"); // Duel Decks: Mirrodin Pure vs. New Phyrexia + add("GTC"); + add("DDK"); + add("DGM"); + add("MMA"); + add("M14"); + add("V13"); + add("DDL"); + add("THS"); + add("C13"); + add("BNG"); + add("DDM"); + add("JOU"); + // add("MD1"); // Modern Event Deck + add("CNS"); + add("VMA"); + add("M15"); + add("V14"); + add("DDN"); + add("KTK"); + add("C14"); + // add("DD3"); // Duel Decks Anthology + add("FRF"); + add("DDO"); + add("DTK"); + add("TPR"); + add("MM2"); + add("ORI"); + add("V15"); + add("DDP"); + add("BFZ"); + add("EXP"); + add("C15"); + // add("PZ1"); // Legendary Cube + add("OGW"); + add("DDQ"); + add("W16"); + add("SOI"); + add("EMA"); + add("EMN"); + add("V16"); + add("CN2"); + add("DDR"); + add("KLD"); + add("MPS"); + // add("PZ2"); // Treasure Chests + add("C16"); + add("PCA"); + add("AER"); + add("MM3"); + add("DDS"); + add("W17"); + add("AKH"); + add("MPS"); + add("CMA"); + add("E01"); + add("HOU"); + add("C17"); +// add("XLN"); +// add("DDT"); +// add("IMA"); +// add("E02"); +// add("V17"); +// add("UST"); +// add("RIX"); +// add("A25"); +// add("DOM"); +// add("M19"); + } + }; + private static final Map setNameTokenReplacement = new HashMap() { { put("10E", "tenth-edition"); @@ -146,12 +345,11 @@ public enum MagicCardsImageSource implements CardImageSource { return "magiccards.info"; } - @Override public String getNextHttpImageUrl() { return null; } - + @Override public String getFileForHttpImage(String httpImageUrl) { return null; @@ -210,18 +408,26 @@ public enum MagicCardsImageSource implements CardImageSource { public float getAverageSize() { return 70.0f; } - + @Override public int getTotalImages() { return -1; } - + @Override public boolean isTokenSource() { return true; } - + + @Override + public ArrayList getSupportedSets() { + ArrayList supportedSetsCopy = new ArrayList<>(); + supportedSetsCopy.addAll(supportedSets); + return supportedSetsCopy; + } + @Override public void doPause(String httpImageUrl) { } + } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java index 56f42fac5a..41207d6b9c 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java @@ -27,11 +27,10 @@ */ package org.mage.plugins.card.dl.sources; -import org.apache.log4j.Logger; -import org.mage.plugins.card.images.CardDownloadData; - import java.io.IOException; import java.util.HashMap; +import org.apache.log4j.Logger; +import org.mage.plugins.card.images.CardDownloadData; /** * @@ -368,12 +367,12 @@ public enum MtgOnlTokensImageSource implements CardImageSource { } return -1; } - + @Override public boolean isTokenSource() { return true; } - + @Override public void doPause(String httpImageUrl) { } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java index d8ceaf19f2..cf81ee5957 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java @@ -77,7 +77,7 @@ public enum MythicspoilerComSource implements CardImageSource { supportedSets.add("DDR"); supportedSets.add("KLD"); supportedSets.add("MPS"); - supportedSets.add("PZ2"); + // supportedSets.add("PZ2"); supportedSets.add("C16"); supportedSets.add("PCA"); supportedSets.add("AER"); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java index 1166e40fc8..a54e5c0118 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/ScryfallImageSource.java @@ -1,18 +1,206 @@ package org.mage.plugins.card.dl.sources; -import org.mage.plugins.card.images.CardDownloadData; - +import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.Map; +import java.util.Set; +import org.mage.plugins.card.images.CardDownloadData; /** * @author Quercitron * */ -public enum ScryfallImageSource implements CardImageSource { +public enum ScryfallImageSource implements CardImageSource { instance; + private final Set supportedSets; + + ScryfallImageSource() { + supportedSets = new LinkedHashSet<>(); + // supportedSets.add("PTC"); // + supportedSets.add("LEA"); + supportedSets.add("LEB"); + supportedSets.add("2ED"); + supportedSets.add("ARN"); + supportedSets.add("ATQ"); + supportedSets.add("3ED"); + supportedSets.add("LEG"); + supportedSets.add("DRK"); + supportedSets.add("FEM"); + supportedSets.add("4ED"); + supportedSets.add("ICE"); + supportedSets.add("CHR"); + supportedSets.add("HML"); + supportedSets.add("ALL"); + supportedSets.add("MIR"); + supportedSets.add("VIS"); + supportedSets.add("5ED"); + supportedSets.add("POR"); + supportedSets.add("WTH"); + supportedSets.add("TMP"); + supportedSets.add("STH"); + supportedSets.add("EXO"); + supportedSets.add("P02"); + supportedSets.add("UGL"); + supportedSets.add("USG"); + supportedSets.add("DD3DVD"); + supportedSets.add("DD3EVG"); + supportedSets.add("DD3GVL"); + supportedSets.add("DD3JVC"); + + supportedSets.add("ULG"); + supportedSets.add("6ED"); + supportedSets.add("UDS"); + supportedSets.add("PTK"); + supportedSets.add("S99"); + supportedSets.add("MMQ"); + // supportedSets.add("BRB");Battle Royale Box Set + supportedSets.add("NEM"); + supportedSets.add("S00"); + supportedSets.add("PCY"); + supportedSets.add("INV"); + // supportedSets.add("BTD"); // Beatdown Boxset + supportedSets.add("PLS"); + supportedSets.add("7ED"); + supportedSets.add("APC"); + supportedSets.add("ODY"); + // supportedSets.add("DKM"); // Deckmasters 2001 + supportedSets.add("TOR"); + supportedSets.add("JUD"); + supportedSets.add("ONS"); + supportedSets.add("LGN"); + supportedSets.add("SCG"); + supportedSets.add("8ED"); + supportedSets.add("MRD"); + supportedSets.add("DST"); + supportedSets.add("5DN"); + supportedSets.add("CHK"); + supportedSets.add("UNH"); + supportedSets.add("BOK"); + supportedSets.add("SOK"); + supportedSets.add("9ED"); + supportedSets.add("RAV"); + supportedSets.add("GPT"); + supportedSets.add("DIS"); + supportedSets.add("CSP"); + supportedSets.add("TSP"); + supportedSets.add("TSB"); + supportedSets.add("PLC"); + supportedSets.add("FUT"); + supportedSets.add("10E"); + supportedSets.add("MED"); + supportedSets.add("LRW"); + supportedSets.add("EVG"); + supportedSets.add("MOR"); + supportedSets.add("SHM"); + supportedSets.add("EVE"); + supportedSets.add("DRB"); + supportedSets.add("ME2"); + supportedSets.add("ALA"); + supportedSets.add("DD2"); + supportedSets.add("CON"); + supportedSets.add("DDC"); + supportedSets.add("ARB"); + supportedSets.add("M10"); + // supportedSets.add("TD0"); // Magic Online Deck Series + supportedSets.add("V09"); + supportedSets.add("HOP"); + supportedSets.add("ME3"); + supportedSets.add("ZEN"); + supportedSets.add("DDD"); + supportedSets.add("H09"); + supportedSets.add("WWK"); + supportedSets.add("DDE"); + supportedSets.add("ROE"); + supportedSets.add("DPA"); + supportedSets.add("ARC"); + supportedSets.add("M11"); + supportedSets.add("V10"); + supportedSets.add("DDF"); + supportedSets.add("SOM"); + // supportedSets.add("TD0"); // Commander Theme Decks + supportedSets.add("PD2"); + supportedSets.add("ME4"); + supportedSets.add("MBS"); + supportedSets.add("DDG"); + supportedSets.add("NPH"); + supportedSets.add("CMD"); + supportedSets.add("M12"); + supportedSets.add("V11"); + supportedSets.add("DDH"); + supportedSets.add("ISD"); + supportedSets.add("PD3"); + supportedSets.add("DKA"); + supportedSets.add("DDI"); + supportedSets.add("AVR"); + supportedSets.add("PC2"); + supportedSets.add("M13"); + supportedSets.add("V12"); + supportedSets.add("DDJ"); + supportedSets.add("RTR"); + supportedSets.add("CM1"); + // supportedSets.add("TD2"); // Duel Decks: Mirrodin Pure vs. New Phyrexia + supportedSets.add("GTC"); + supportedSets.add("DDK"); + supportedSets.add("DGM"); + supportedSets.add("MMA"); + supportedSets.add("M14"); + supportedSets.add("V13"); + supportedSets.add("DDL"); + supportedSets.add("THS"); + supportedSets.add("C13"); + supportedSets.add("BNG"); + supportedSets.add("DDM"); + supportedSets.add("JOU"); + // supportedSets.add("MD1"); // Modern Event Deck + supportedSets.add("CNS"); + supportedSets.add("VMA"); + supportedSets.add("M15"); + supportedSets.add("V14"); + supportedSets.add("DDN"); + supportedSets.add("KTK"); + supportedSets.add("C14"); + // supportedSets.add("DD3"); // Duel Decks Anthology + supportedSets.add("FRF"); + supportedSets.add("DDO"); + supportedSets.add("DTK"); + supportedSets.add("TPR"); + supportedSets.add("MM2"); + supportedSets.add("ORI"); + supportedSets.add("V15"); + supportedSets.add("DDP"); + supportedSets.add("BFZ"); + supportedSets.add("EXP"); + supportedSets.add("C15"); + // supportedSets.add("PZ1"); // Legendary Cube + supportedSets.add("OGW"); + supportedSets.add("DDQ"); + supportedSets.add("W16"); + supportedSets.add("SOI"); + supportedSets.add("EMA"); + supportedSets.add("EMN"); + supportedSets.add("V16"); + supportedSets.add("CN2"); + supportedSets.add("DDR"); + supportedSets.add("KLD"); + supportedSets.add("MPS"); + // supportedSets.add("PZ2"); + supportedSets.add("C16"); + supportedSets.add("PCA"); + supportedSets.add("AER"); + supportedSets.add("MM3"); + supportedSets.add("DDS"); + supportedSets.add("W17"); + supportedSets.add("AKH"); + supportedSets.add("MPS"); + supportedSets.add("CMA"); + supportedSets.add("E01"); + supportedSets.add("HOU"); + supportedSets.add("C17"); + } + @Override public String generateURL(CardDownloadData card) throws Exception { return "https://api.scryfall.com/cards/" + formatSetName(card.getSet()) + "/" + card.getCollectorId() + "?format=image"; @@ -40,7 +228,7 @@ public enum ScryfallImageSource implements CardImageSource { @Override public float getAverageSize() { - return 240; + return 90; } @Override @@ -75,4 +263,11 @@ public enum ScryfallImageSource implements CardImageSource { put("MBP", "pmei"); } }; + + @Override + public ArrayList getSupportedSets() { + ArrayList supportedSetsCopy = new ArrayList<>(); + supportedSetsCopy.addAll(supportedSets); + return supportedSetsCopy; + } } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java index 2f58b13a2c..7f932f3536 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java @@ -27,9 +27,6 @@ */ package org.mage.plugins.card.dl.sources; -import org.apache.log4j.Logger; -import org.mage.plugins.card.images.CardDownloadData; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -39,6 +36,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.log4j.Logger; +import org.mage.plugins.card.images.CardDownloadData; /** * @@ -46,10 +45,9 @@ import java.util.Map; */ public enum TokensMtgImageSource implements CardImageSource { - instance; + instance; private static final Logger logger = Logger.getLogger(TokensMtgImageSource.class); - private List tokensData; private final Object tokensDataSync = new Object(); @@ -137,6 +135,7 @@ public enum TokensMtgImageSource implements CardImageSource { List newTokensData = getTokensData(); if (newTokensData.isEmpty()) { + logger.info("Source " + getSourceName() + " provides no token data."); return null; } @@ -146,17 +145,18 @@ public enum TokensMtgImageSource implements CardImageSource { matchedTokens.add(token); } } -// -// if (matchedTokens.isEmpty()) { -// logger.info("Could not find data for token " + name + ", set " + set + "."); -// return null; -// } + + if (matchedTokens.isEmpty()) { + logger.info("Could not find data for token " + name + ", set " + set + "."); + return null; + } TokenData tokenData; if (type == 0) { if (matchedTokens.size() > 1) { logger.info("Multiple images were found for token " + name + ", set " + set + '.'); } + logger.info("Token found: " + name + ", set " + set + '.'); tokenData = matchedTokens.get(0); } else { if (type > matchedTokens.size()) { @@ -178,7 +178,7 @@ public enum TokensMtgImageSource implements CardImageSource { tokensData = new ArrayList<>(); // get tokens data from resource file - try(InputStream inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv")) { + try (InputStream inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv")) { List fileTokensData = parseTokensData(inputStream); tokensData.addAll(fileTokensData); } catch (Exception exception) { @@ -188,7 +188,7 @@ public enum TokensMtgImageSource implements CardImageSource { // description on site may contain new information // try to add it URL url = new URL("http://tokens.mtg.onl/data/SetsWithTokens.csv"); - try(InputStream inputStream = url.openStream()) { + try (InputStream inputStream = url.openStream()) { List siteTokensData = parseTokensData(inputStream); List newTokensData = new ArrayList<>(); for (TokenData siteData : siteTokensData) { @@ -219,8 +219,8 @@ public enum TokensMtgImageSource implements CardImageSource { private List parseTokensData(InputStream inputStream) throws IOException { List newTokensData = new ArrayList<>(); - try(InputStreamReader inputReader = new InputStreamReader(inputStream, "Cp1252"); - BufferedReader reader = new BufferedReader(inputReader)) { + try (InputStreamReader inputReader = new InputStreamReader(inputStream, "Cp1252"); + BufferedReader reader = new BufferedReader(inputReader)) { // we have to specify encoding to read special comma reader.readLine(); // skip header @@ -285,7 +285,19 @@ public enum TokensMtgImageSource implements CardImageSource { @Override public int getTotalImages() { - return -1; + return getTokenImages(); + } + + @Override + public int getTokenImages() { + int number = 0; + try { + List newTokensData = getTokensData(); + number = newTokensData.size(); + } catch (IOException ex) { + logger.error(getSourceName() + ": Loading available data failed. " + ex.getMessage()); + } + return number; } @Override diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java index 4939fdcbe2..50bf2c99ca 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/WizardCardsImageSource.java @@ -77,6 +77,7 @@ public enum WizardCardsImageSource implements CardImageSource { WizardCardsImageSource() { supportedSets = new LinkedHashSet<>(); + // supportedSets.add("PTC"); // Prerelease Events supportedSets.add("LEA"); supportedSets.add("LEB"); supportedSets.add("2ED"); @@ -638,6 +639,9 @@ public enum WizardCardsImageSource implements CardImageSource { String setNames = setsAliases.get(cardSet); if (setNames != null) { Map setLinks = sets.computeIfAbsent(cardSet, k -> getSetLinks(cardSet)); + if (setLinks == null || setLinks.isEmpty()) { + return null; + } String link = setLinks.get(card.getDownloadName().toLowerCase()); if (link == null) { int length = collectorId.length(); @@ -663,6 +667,7 @@ public enum WizardCardsImageSource implements CardImageSource { return link; } return null; + } @Override diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index c9b9a25d1b..86a16bc15a 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -1,6 +1,7 @@ package org.mage.plugins.card.images; import java.awt.*; +import java.awt.event.ItemEvent; import java.awt.image.BufferedImage; import java.io.*; import java.net.*; @@ -14,7 +15,6 @@ import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriteParam; @@ -23,7 +23,9 @@ import javax.imageio.stream.FileImageOutputStream; import javax.swing.*; import mage.cards.ExpansionSet; import mage.cards.Sets; +import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; import mage.client.constants.Constants; import mage.client.dialog.PreferencesDialog; import mage.client.util.sets.ConstructedFormats; @@ -75,28 +77,56 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab private Proxy p = Proxy.NO_PROXY; - // private ExecutorService executor = Executors.newFixedThreadPool(10); - public static void main(String[] args) { - startDownload(null, null); + enum DownloadSources { + WIZARDS("wizards.com", WizardCardsImageSource.instance), + MYTHICSPOILER("mythicspoiler.com", MythicspoilerComSource.instance), + TOKENS("tokens.mtg.onl", TokensMtgImageSource.instance), + MTG_ONL("mtg.onl", MtgOnlTokensImageSource.instance), + ALTERNATIVE("alternative.mtg.onl", AltMtgOnlTokensImageSource.instance), + GRAB_BAG("GrabBag", GrabbagImageSource.instance), + MAGIDEX("magidex.com", MagidexImageSource.instance), + SCRYFALL("scryfall.com", ScryfallImageSource.instance), + MAGICCARDS("magiccards.info", MagicCardsImageSource.instance); + + private final String text; + private final CardImageSource source; + + DownloadSources(String text, CardImageSource sourceInstance) { + this.text = text; + this.source = sourceInstance; + } + + public CardImageSource getSource() { + return source; + } + + @Override + public String toString() { + return text; + } + } - public static void startDownload(JFrame frame, List allCards) { - List cards = getNeededCards(allCards); + public static void main(String[] args) { + startDownload(); + } + + public static void startDownload() { /* * if (cards == null || cards.isEmpty()) { * JOptionPane.showMessageDialog(null, * "All card pictures have been downloaded."); return; } */ - DownloadPictures download = new DownloadPictures(cards); - JDialog dlg = download.getDlg(frame); + DownloadPictures download = new DownloadPictures(); + JDialog dlg = download.getDlg(null); dlg.setVisible(true); dlg.dispose(); download.cancel = true; } public JDialog getDlg(JFrame frame) { - String title = "Downloading"; + String title = "Downloading images"; final JDialog dialog = this.dlg.createDialog(frame, title); closeButton.addActionListener(e -> dialog.setVisible(false)); @@ -107,11 +137,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab this.cancel = cancel; } - public DownloadPictures(List cards) { - this.allCardsMissingImage = cards; - - bar = new JProgressBar(this); - + public DownloadPictures() { JPanel p0 = new JPanel(); p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); @@ -120,61 +146,46 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab jLabelAllMissing = new JLabel(); jLabelAllMissing.setAlignmentX(Component.LEFT_ALIGNMENT); + // jLabelAllMissing.setText("Computing number of missing images..."); p0.add(jLabelAllMissing); p0.add(Box.createVerticalStrut(5)); jLabelServer = new JLabel(); - jLabelServer.setText("Please select server:"); + jLabelServer.setText("Please select image source:"); jLabelServer.setAlignmentX(Component.LEFT_ALIGNMENT); p0.add(jLabelServer); p0.add(Box.createVerticalStrut(5)); - ComboBoxModel jComboBoxDownloadSourcesModel = new DefaultComboBoxModel(new String[]{ - "wizards.com", - "mythicspoiler.com", - "tokens.mtg.onl", //"mtgimage.com (HQ)", - "mtg.onl", - "alternative.mtg.onl", - "GrabBag", - "magidex.com", - "scryfall.com", - "magiccards.info" - //"mtgathering.ru HQ", - //"mtgathering.ru MQ", - //"mtgathering.ru LQ", - }); jComboBoxServer = new JComboBox(); - - cardImageSource = WizardCardsImageSource.instance; - - jComboBoxServer.setModel(jComboBoxDownloadSourcesModel); + jComboBoxServer.setModel(new DefaultComboBoxModel(DownloadSources.values())); jComboBoxServer.setAlignmentX(Component.LEFT_ALIGNMENT); - jComboBoxServer.addActionListener(new java.awt.event.ActionListener() { - @Override - public void actionPerformed(java.awt.event.ActionEvent evt) { - comboBoxServerActionPerformed(evt); + jComboBoxServer.addItemListener((ItemEvent event) -> { + if (event.getStateChange() == ItemEvent.SELECTED) { + comboBoxServerItemSelected(event); } }); p0.add(jComboBoxServer); + // set the first source as default + cardImageSource = WizardCardsImageSource.instance; p0.add(Box.createVerticalStrut(5)); // Set selection --------------------------------- jLabelSet = new JLabel(); - jLabelSet.setText("Please select sets to download images for:"); + jLabelSet.setText("Please select sets to download the images for:"); jLabelSet.setAlignmentX(Component.LEFT_ALIGNMENT); p0.add(jLabelSet); jComboBoxSet = new JComboBox(); jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); jComboBoxSet.setAlignmentX(Component.LEFT_ALIGNMENT); - jComboBoxSet.addActionListener(new java.awt.event.ActionListener() { - @Override - public void actionPerformed(java.awt.event.ActionEvent evt) { - comboBoxSetActionPerformed(evt); + jComboBoxSet.addItemListener((ItemEvent event) -> { + if (event.getStateChange() == ItemEvent.SELECTED) { + comboBoxSetItemSelected(event); } }); + p0.add(jComboBoxSet); p0.add(Box.createVerticalStrut(5)); @@ -188,8 +199,10 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab p0.add(Box.createVerticalStrut(5)); // Progress + bar = new JProgressBar(this); p0.add(bar); bar.setStringPainted(true); + Dimension d = bar.getPreferredSize(); d.width = 300; bar.setPreferredSize(d); @@ -198,68 +211,31 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab Object[] options = {startDownloadButton, closeButton = new JButton("Cancel")}; dlg = new JOptionPane(p0, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[1]); - updateCardsToDownload(); + setAllMissingCards(); } - public static boolean checkForMissingCardImages(List allCards) { - AtomicBoolean missedCardTFiles = new AtomicBoolean(); - allCards.parallelStream().forEach(card -> { - if (!missedCardTFiles.get()) { - if (!card.getCardNumber().isEmpty() && !"0".equals(card.getCardNumber()) && !card.getSetCode().isEmpty()) { - CardDownloadData url = new CardDownloadData(card.getName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), - 0, "", "", false, card.isDoubleFaced(), card.isNightCard()); - TFile file = new TFile(CardImageUtils.generateImagePath(url)); - if (!file.exists()) { - missedCardTFiles.set(true); - } - } - } - }); - return missedCardTFiles.get(); + public void setAllMissingCards() { + List cards = CardRepository.instance.findCards(new CardCriteria()); + this.allCardsMissingImage = getNeededCards(cards); + updateCardsToDownload(jComboBoxSet.getSelectedItem().toString()); } - private void comboBoxServerActionPerformed(java.awt.event.ActionEvent evt) { - JComboBox cb = (JComboBox) evt.getSource(); - switch (cb.getSelectedIndex()) { - case 0: - cardImageSource = WizardCardsImageSource.instance; - break; - case 1: - cardImageSource = MythicspoilerComSource.instance; - break; - case 2: - cardImageSource = TokensMtgImageSource.instance; - break; - case 3: - cardImageSource = MtgOnlTokensImageSource.instance; - break; - case 4: - cardImageSource = AltMtgOnlTokensImageSource.instance; - break; - case 5: - cardImageSource = GrabbagImageSource.instance; - break; - case 6: - cardImageSource = MagidexImageSource.instance; - break; - case 7: - cardImageSource = ScryfallImageSource.instance; - break; - case 8: - cardImageSource = MagicCardsImageSource.instance; - break; - } + private void comboBoxServerItemSelected(ItemEvent evt) { + cardImageSource = ((DownloadSources) evt.getItem()).getSource(); + // update the available sets / token comboBox jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); - updateCardsToDownload(); + updateCardsToDownload(jComboBoxSet.getSelectedItem().toString()); } private Object[] getSetsForCurrentImageSource() { // Set the available sets to the combo box ArrayList supportedSets = cardImageSource.getSupportedSets(); List setNames = new ArrayList<>(); - setNames.add(ALL_CARDS); - setNames.add(ALL_STANDARD_CARDS); - if (cardImageSource.providesTokenImages()) { + if (supportedSets != null) { + setNames.add(ALL_CARDS); + setNames.add(ALL_STANDARD_CARDS); + } + if (cardImageSource.isTokenSource()) { setNames.add(ALL_TOKENS); } if (supportedSets != null) { @@ -273,14 +249,17 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } } + if (setNames.isEmpty()) { + logger.error("Source " + cardImageSource.getSourceName() + " creates no selectable items."); + setNames.add("not avalable"); + } return setNames.toArray(new String[0]); } - private void updateCardsToDownload() { - String expansionSelection = jComboBoxSet.getSelectedItem().toString(); + private void updateCardsToDownload(String itemText) { selectedSetCodes.clear(); boolean tokens = false; - switch (expansionSelection) { + switch (itemText) { case ALL_CARDS: if (cardImageSource.getSupportedSets() == null) { selectedSetCodes = cardImageSource.getSupportedSets(); @@ -300,9 +279,13 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab break; case ALL_TOKENS: tokens = true; + break; default: - int nonSetEntries = 2; - if (cardImageSource.providesTokenImages()) { + int nonSetEntries = 0; + if (cardImageSource.getSupportedSets() != null) { + nonSetEntries = 2; + } + if (cardImageSource.isTokenSource()) { nonSetEntries++; } selectedSetCodes.add(cardImageSource.getSupportedSets().get(jComboBoxSet.getSelectedIndex() - nonSetEntries)); @@ -310,16 +293,20 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab cardsToDownload.clear(); for (CardDownloadData data : allCardsMissingImage) { if ((data.isToken() && tokens) - || (!data.isToken() && selectedSetCodes.contains(data.getSet()))) { + || (!data.isToken() && selectedSetCodes != null && selectedSetCodes.contains(data.getSet()))) { cardsToDownload.add(data); } } - updateProgressText(cardsToDownload.size()); + int numberTokenImagesAvailable = 0; + if (tokens) { + cardImageSource.getTokenImages(); + } + updateProgressText(cardsToDownload.size() + numberTokenImagesAvailable); } - private void comboBoxSetActionPerformed(java.awt.event.ActionEvent evt) { + private void comboBoxSetItemSelected(ItemEvent event) { // Update the cards to download related to the selected set - updateCardsToDownload(); + updateCardsToDownload(event.getItem().toString()); } private void updateProgressText(int cardCount) { @@ -330,11 +317,11 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } } missingCards = allCardsMissingImage.size() - missingTokens; - jLabelAllMissing.setText("Missing: " + missingCards + " cards / " + missingTokens + " tokens"); + jLabelAllMissing.setText("Missing: " + missingCards + " card images / " + missingTokens + " token images"); float mb = (cardCount * cardImageSource.getAverageSize()) / 1024; - bar.setString(String.format(cardIndex == cardCount ? "%d of %d cards finished! Please close!" - : "%d of %d cards finished! Please wait! [%.1f Mb]", 0, cardCount, mb)); + bar.setString(String.format(cardIndex == cardCount ? "%d of %d image downloads finished! Please close!" + : "%d of %d image downloads finished! Please wait! [%.1f Mb]", 0, cardCount, mb)); } private static String createDownloadName(CardInfo card) { @@ -530,7 +517,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab HashSet ignoreUrls = SettingsManager.getIntance().getIgnoreUrls(); update(0, cardsToDownload.size()); - logger.info("Started download of " + cardsToDownload.size() + " cards from source: " + cardImageSource.getSourceName()); + logger.info("Started download of " + cardsToDownload.size() + " images from source: " + cardImageSource.getSourceName()); int numberOfThreads = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_THREADS, "10")); ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads); @@ -539,7 +526,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab CardDownloadData card = cardsToDownload.get(i); - logger.debug("Downloading card: " + card.getName() + " (" + card.getSet() + ')'); + logger.debug("Downloading image: " + card.getName() + " (" + card.getSet() + ')'); String url; if (ignoreUrls.contains(card.getSet()) || card.isToken()) { @@ -564,7 +551,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } catch (Exception ex) { } } else if (cardImageSource.getTotalImages() == -1) { - logger.info("Card not available on " + cardImageSource.getSourceName() + ": " + card.getName() + " (" + card.getSet() + ')'); + logger.info("Image not available on " + cardImageSource.getSourceName() + ": " + card.getName() + " (" + card.getSet() + ')'); synchronized (sync) { update(cardIndex + 1, cardsToDownload.size()); } @@ -595,6 +582,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab System.gc(); } closeButton.setText("Close"); + updateCardsToDownload(jComboBoxSet.getSelectedItem().toString()); } static String convertStreamToString(java.io.InputStream is) { @@ -790,7 +778,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab if (cardIndex < count) { float mb = ((count - card) * cardImageSource.getAverageSize()) / 1024; - bar.setString(String.format("%d of %d cards finished! Please wait! [%.1f Mb]", + bar.setString(String.format("%d of %d image downloads finished! Please wait! [%.1f Mb]", card, count, mb)); } else { List remainingCards = Collections.synchronizedList(new ArrayList<>()); @@ -808,9 +796,9 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab count = remainingCards.size(); if (count == 0) { - bar.setString("0 cards remaining! Please close!"); + bar.setString("0 images remaining! Please close!"); } else { - bar.setString(String.format("%d cards remaining! Please choose another source!", count)); +// bar.setString(String.format("%d cards remaining! Please choose another source!", count)); startDownloadButton.setEnabled(true); } } From 7329dc6c3f83a344c3b47b5cfaec82eb5c9eb927 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 5 Sep 2017 00:12:09 +0200 Subject: [PATCH 3/9] Some more changes to image download. --- .../card/dl/sources/GrabbagImageSource.java | 111 ++++++--- .../card/dl/sources/MagidexImageSource.java | 235 +++++++++++++++++- .../plugins/card/images/DownloadPictures.java | 1 + .../src/mage/cards/e/EssenceScatter.java | 1 + 4 files changed, 305 insertions(+), 43 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java index f0b6aa02d4..4eb98dd2e3 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java @@ -28,7 +28,11 @@ package org.mage.plugins.card.dl.sources; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import org.mage.plugins.card.images.CardDownloadData; @@ -37,12 +41,34 @@ import org.mage.plugins.card.images.CardDownloadData; * * @author spjspj */ -public enum GrabbagImageSource implements CardImageSource { +public enum GrabbagImageSource implements CardImageSource { instance; private static final Logger logger = Logger.getLogger(GrabbagImageSource.class); private static int maxTimes = 0; + private static final Set supportedSets = new LinkedHashSet() { + { + add("PTC"); + add("EXP"); + add("APAC"); + add("ARENA"); + add("FNMP"); + add("GPX"); + add("GRC"); + add("JR"); + add("MBP"); + add("MGDC"); + add("MLP"); + add("MPRP"); + add("MPS"); + add("SUS"); + add("UGIN"); + add("WMCQ"); + + } + }; + @Override public String getSourceName() { return ""; @@ -55,36 +81,37 @@ public enum GrabbagImageSource implements CardImageSource { @Override public String getNextHttpImageUrl() { - if (copyUrlToImage == null) { - setupLinks(); - } - - for (String key : copyUrlToImageDone.keySet()) { - if (copyUrlToImageDone.get(key) < maxTimes) { - copyUrlToImageDone.put(key, maxTimes); - return getSourceName(key) + key; - } - } - if (maxTimes < 2) { - maxTimes++; - } - for (String key : copyUrlToImageDone.keySet()) { - if (copyUrlToImageDone.get(key) < maxTimes) { - copyUrlToImageDone.put(key, maxTimes); - return getSourceName(key) + key; - } - } return null; +// if (copyUrlToImage == null) { +// setupLinks(); +// } +// +// for (String key : copyUrlToImageDone.keySet()) { +// if (copyUrlToImageDone.get(key) < maxTimes) { +// copyUrlToImageDone.put(key, maxTimes); +// return getSourceName(key) + key; +// } +// } +// if (maxTimes < 2) { +// maxTimes++; +// } +// for (String key : copyUrlToImageDone.keySet()) { +// if (copyUrlToImageDone.get(key) < maxTimes) { +// copyUrlToImageDone.put(key, maxTimes); +// return getSourceName(key) + key; +// } +// } +// return null; } @Override public String getFileForHttpImage(String httpImageUrl) { - String copy = httpImageUrl; - if (copy != null) { - copy = copy.replaceFirst("http:\\/\\/static.starcitygames.com\\/sales\\/cardscans\\/", ""); - copy = copy.replaceFirst("http:\\/\\/magiccards.info\\/scans\\/en\\/", ""); - return copyUrlToImage.get(copy); - } +// String copy = httpImageUrl; +// if (copy != null) { +// copy = copy.replaceFirst("http:\\/\\/static.starcitygames.com\\/sales\\/cardscans\\/", ""); +// copy = copy.replaceFirst("http:\\/\\/magiccards.info\\/scans\\/en\\/", ""); +// return copyUrlToImage.get(copy); +// } return null; } @@ -93,6 +120,11 @@ public enum GrabbagImageSource implements CardImageSource { if (copyUrlToImage == null) { setupLinks(); } + for (Map.Entry urlInfo : copyUrlToImage.entrySet()) { + if (urlInfo.getValue().contains(card.getSet()) && urlInfo.getValue().contains(card.getName())) { + return getSourceName(urlInfo.getValue()) + urlInfo.getKey(); + } + } return null; } @@ -108,16 +140,16 @@ public enum GrabbagImageSource implements CardImageSource { copyImageToUrl = new HashMap<>(); copyUrlToImageDone = new HashMap<>(); - //http://anonymouse.org/cgi-bin/anon-www.cgi/http://magiccards.info/scans/en/arena/42.jpg - copyUrlToImage.put("MTG/BNG/en/promo/ArbiterOfTheIdeal.jpg", "PTC.zip/PTC/Arbiter of the Ideal.full.jpg"); - copyUrlToImage.put("MTG/BNG/en/promo/CourserOfKruphix.jpg", "PTC.zip/PTC/Courser of Kruphix.full.jpg"); - copyUrlToImage.put("MTG/BNG/en/promo/EaterOfHope.jpg", "PTC.zip/PTC/Eater of Hope.full.jpg"); - copyUrlToImage.put("MTG/BNG/en/promo/FatedReturn.jpg", "PTC.zip/PTC/Fated Return.full.jpg"); - copyUrlToImage.put("MTG/BNG/en/promo/ForgestokerDragon.jpg", "PTC.zip/PTC/Forgestoker Dragon.full.jpg"); - copyUrlToImage.put("MTG/BNG/en/promo/NessianWildsRavager.jpg", "PTC.zip/PTC/Nessian Wilds Ravager.full.jpg"); - copyUrlToImage.put("MTG/BNG/en/promo/PainSeer.jpg", "PTC.zip/PTC/Pain Seer.full.jpg"); - copyUrlToImage.put("MTG/BNG/en/promo/SilentSentinel.jpg", "PTC.zip/PTC/Silent Sentinel.full.jpg"); - copyUrlToImage.put("MTG/BNG/en/promo/Tromokratis.jpg", "PTC.zip/PTC/Tromokratis.full.jpg"); + copyUrlToImage.put("PTC/Arbiter of the Ideal", "MTG/BNG/en/promo/ArbiterOfTheIdeal.jpg"); + copyUrlToImage.put("PTC/Courser of Kruphix", "MTG/BNG/en/promo/CourserOfKruphix.jpg"); + copyUrlToImage.put("PTC/Eater of Hope", "MTG/BNG/en/promo/EaterOfHope.jpg"); + copyUrlToImage.put("PTC/Fated Return", "MTG/BNG/en/promo/FatedReturn.jpg"); + copyUrlToImage.put("PTC/Forgestoker Dragon", "MTG/BNG/en/promo/ForgestokerDragon.jpg"); + copyUrlToImage.put("PTC/Nessian Wilds Ravager", "MTG/BNG/en/promo/NessianWildsRavager.jpg"); + copyUrlToImage.put("PTC/Pain Seer", "MTG/BNG/en/promo/PainSeer.jpg"); + copyUrlToImage.put("PTC/Silent Sentinel", "MTG/BNG/en/promo/SilentSentinel.jpg"); + copyUrlToImage.put("PTC/Tromokratis", "MTG/BNG/en/promo/Tromokratis.jpg"); + copyUrlToImage.put("MTG/FRF/en/promo/prerelease/AleshaWhoSmilesAtDeath.jpg", "PTC.zip/PTC/Alesha, Who Smiles at Death.full.jpg"); copyUrlToImage.put("MTG/FRF/en/promo/prerelease/Arcbond.jpg", "PTC.zip/PTC/Arcbond.full.jpg"); copyUrlToImage.put("MTG/FRF/en/promo/prerelease/ArchfiendOfDepravity.jpg", "PTC.zip/PTC/Archfiend of Depravity.full.jpg"); @@ -1687,6 +1719,13 @@ public enum GrabbagImageSource implements CardImageSource { } } + @Override + public ArrayList getSupportedSets() { + ArrayList supportedSetsCopy = new ArrayList<>(); + supportedSetsCopy.addAll(supportedSets); + return supportedSetsCopy; + } + @Override public void doPause(String httpImageUrl) { if (!httpImageUrl.startsWith("/MTG")) { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java index 2c0ab80e75..7261ad4cbc 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagidexImageSource.java @@ -24,20 +24,221 @@ * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package org.mage.plugins.card.dl.sources; -import org.mage.plugins.card.images.CardDownloadData; import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; +import org.mage.plugins.card.images.CardDownloadData; /** * * @author Pete Rossi */ +public enum MagidexImageSource implements CardImageSource { + instance; -public enum MagidexImageSource implements CardImageSource { - instance; + private final Set supportedSets; + + MagidexImageSource() { + supportedSets = new LinkedHashSet<>(); + // supportedSets.add("PTC"); // Prerelease Events + // supportedSets.add("FNMP"); + supportedSets.add("JR"); + supportedSets.add("LEA"); + supportedSets.add("LEB"); + supportedSets.add("2ED"); + supportedSets.add("ARN"); + supportedSets.add("ATQ"); + supportedSets.add("3ED"); + supportedSets.add("LEG"); + supportedSets.add("DRK"); + supportedSets.add("FEM"); + supportedSets.add("4ED"); + supportedSets.add("ICE"); + supportedSets.add("CHR"); + supportedSets.add("HML"); + supportedSets.add("ALL"); + supportedSets.add("MIR"); + supportedSets.add("VIS"); + supportedSets.add("5ED"); + supportedSets.add("POR"); + supportedSets.add("WTH"); + supportedSets.add("TMP"); + supportedSets.add("STH"); + supportedSets.add("EXO"); + supportedSets.add("P02"); + supportedSets.add("UGL"); + supportedSets.add("USG"); + supportedSets.add("DD3DVD"); + supportedSets.add("DD3EVG"); + supportedSets.add("DD3GVL"); + supportedSets.add("DD3JVC"); + + supportedSets.add("ULG"); + supportedSets.add("6ED"); + supportedSets.add("UDS"); + supportedSets.add("PTK"); + supportedSets.add("S99"); + supportedSets.add("MMQ"); + // supportedSets.add("BRB");Battle Royale Box Set + supportedSets.add("NEM"); + supportedSets.add("S00"); + supportedSets.add("PCY"); + supportedSets.add("INV"); + // supportedSets.add("BTD"); // Beatdown Boxset + supportedSets.add("PLS"); + supportedSets.add("7ED"); + supportedSets.add("APC"); + supportedSets.add("ODY"); + // supportedSets.add("DKM"); // Deckmasters 2001 + supportedSets.add("TOR"); + supportedSets.add("JUD"); + supportedSets.add("ONS"); + supportedSets.add("LGN"); + supportedSets.add("SCG"); + supportedSets.add("8ED"); + supportedSets.add("MRD"); + supportedSets.add("DST"); + supportedSets.add("5DN"); + supportedSets.add("CHK"); + supportedSets.add("UNH"); + supportedSets.add("BOK"); + supportedSets.add("SOK"); + supportedSets.add("9ED"); + supportedSets.add("RAV"); + supportedSets.add("GPT"); + supportedSets.add("DIS"); + supportedSets.add("CSP"); + supportedSets.add("TSP"); + supportedSets.add("TSB"); + supportedSets.add("PLC"); + supportedSets.add("FUT"); + supportedSets.add("10E"); + supportedSets.add("MED"); + supportedSets.add("LRW"); + supportedSets.add("EVG"); + supportedSets.add("MOR"); + supportedSets.add("SHM"); + supportedSets.add("EVE"); + supportedSets.add("DRB"); + supportedSets.add("ME2"); + supportedSets.add("ALA"); + supportedSets.add("DD2"); + supportedSets.add("CON"); + supportedSets.add("DDC"); + supportedSets.add("ARB"); + supportedSets.add("M10"); + // supportedSets.add("TD0"); // Magic Online Deck Series + supportedSets.add("V09"); + supportedSets.add("HOP"); + supportedSets.add("ME3"); + supportedSets.add("ZEN"); + supportedSets.add("DDD"); + supportedSets.add("H09"); + supportedSets.add("WWK"); + supportedSets.add("DDE"); + supportedSets.add("ROE"); + supportedSets.add("DPA"); + supportedSets.add("ARC"); + supportedSets.add("M11"); + supportedSets.add("V10"); + supportedSets.add("DDF"); + supportedSets.add("SOM"); + // supportedSets.add("TD0"); // Commander Theme Decks + supportedSets.add("PD2"); + supportedSets.add("ME4"); + supportedSets.add("MBS"); + supportedSets.add("DDG"); + supportedSets.add("NPH"); + supportedSets.add("CMD"); + supportedSets.add("M12"); + supportedSets.add("V11"); + supportedSets.add("DDH"); + supportedSets.add("ISD"); + supportedSets.add("PD3"); + supportedSets.add("DKA"); + supportedSets.add("DDI"); + supportedSets.add("AVR"); + supportedSets.add("PC2"); + supportedSets.add("M13"); + supportedSets.add("V12"); + supportedSets.add("DDJ"); + supportedSets.add("RTR"); + supportedSets.add("CM1"); + // supportedSets.add("TD2"); // Duel Decks: Mirrodin Pure vs. New Phyrexia + supportedSets.add("GTC"); + supportedSets.add("DDK"); + supportedSets.add("DGM"); + supportedSets.add("MMA"); + supportedSets.add("M14"); + supportedSets.add("V13"); + supportedSets.add("DDL"); + supportedSets.add("THS"); + supportedSets.add("C13"); + supportedSets.add("BNG"); + supportedSets.add("DDM"); + supportedSets.add("JOU"); + // supportedSets.add("MD1"); // Modern Event Deck + supportedSets.add("CNS"); + supportedSets.add("VMA"); + supportedSets.add("M15"); + supportedSets.add("V14"); + supportedSets.add("DDN"); + supportedSets.add("KTK"); + supportedSets.add("C14"); + // supportedSets.add("DD3"); // Duel Decks Anthology + supportedSets.add("FRF"); + supportedSets.add("DDO"); + supportedSets.add("DTK"); + supportedSets.add("TPR"); + supportedSets.add("MM2"); + supportedSets.add("ORI"); + supportedSets.add("V15"); + supportedSets.add("DDP"); + supportedSets.add("BFZ"); + supportedSets.add("EXP"); + supportedSets.add("C15"); + // supportedSets.add("PZ1"); // Legendary Cube + supportedSets.add("OGW"); + supportedSets.add("DDQ"); + supportedSets.add("W16"); + supportedSets.add("SOI"); + supportedSets.add("EMA"); + supportedSets.add("EMN"); + supportedSets.add("V16"); + supportedSets.add("CN2"); + supportedSets.add("DDR"); + supportedSets.add("KLD"); + supportedSets.add("MPS"); + // supportedSets.add("PZ2"); // Treasure Chests + supportedSets.add("C16"); + supportedSets.add("PCA"); + supportedSets.add("AER"); + supportedSets.add("MM3"); + supportedSets.add("DDS"); + supportedSets.add("W17"); + supportedSets.add("AKH"); + supportedSets.add("MPS"); + supportedSets.add("CMA"); + supportedSets.add("E01"); + supportedSets.add("HOU"); + supportedSets.add("C17"); +// supportedSets.add("XLN"); +// supportedSets.add("DDT"); +// supportedSets.add("IMA"); +// supportedSets.add("E02"); +// supportedSets.add("V17"); +// supportedSets.add("UST"); +// supportedSets.add("RIX"); +// supportedSets.add("A25"); +// supportedSets.add("DOM"); +// supportedSets.add("M19"); + } @Override public String getSourceName() { @@ -68,10 +269,23 @@ public enum MagidexImageSource implements CardImageSource { } // This will properly escape the url - URI uri = new URI("http", "magidex.com", "/extstatic/card/" + cardSet + '/' + cardDownloadName + ".jpg", null, null); - return uri.toASCIIString(); + URI uri = new URI("http", "magidex.com", "/extstatic/card/" + formatSetName(cardSet) + '/' + cardDownloadName + ".jpg", null, null); + return uri.toASCIIString(); } + private String formatSetName(String setName) { + if (setNameReplacement.containsKey(setName)) { + setName = setNameReplacement.get(setName); + } + return setName; + } + + private static final Map setNameReplacement = new HashMap() { + { + put("JR", "pJGP"); + } + }; + @Override public String generateTokenUrl(CardDownloadData card) { return null; @@ -95,4 +309,11 @@ public enum MagidexImageSource implements CardImageSource { @Override public void doPause(String httpImageUrl) { } + + @Override + public ArrayList getSupportedSets() { + ArrayList supportedSetsCopy = new ArrayList<>(); + supportedSetsCopy.addAll(supportedSets); + return supportedSetsCopy; + } } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index 86a16bc15a..be4345dadf 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -674,6 +674,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab if (temporaryFile != null && temporaryFile.length() > 100) { useTempFile = true; } else { + cardImageSource.doPause(url.getPath()); httpConn = url.openConnection(p); httpConn.connect(); diff --git a/Mage.Sets/src/mage/cards/e/EssenceScatter.java b/Mage.Sets/src/mage/cards/e/EssenceScatter.java index 136b54c670..653ffbe8fd 100644 --- a/Mage.Sets/src/mage/cards/e/EssenceScatter.java +++ b/Mage.Sets/src/mage/cards/e/EssenceScatter.java @@ -44,6 +44,7 @@ public class EssenceScatter extends CardImpl { public EssenceScatter(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}"); + // Counter target creature spell. this.getSpellAbility().addTarget(new TargetSpell(new FilterCreatureSpell())); this.getSpellAbility().addEffect(new CounterTargetEffect()); } From c9327b718dabb0301c9f9fa3fa394f0e1166710b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 6 Sep 2017 17:49:55 +0200 Subject: [PATCH 4/9] Updated some logic. --- .../card/dl/sources/CardImageSource.java | 8 + .../card/dl/sources/GrabbagImageSource.java | 3455 +++++++++-------- .../plugins/card/images/DownloadPictures.java | 4 +- 3 files changed, 1877 insertions(+), 1590 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java index ed125d6f2b..e49c334a1c 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardImageSource.java @@ -36,4 +36,12 @@ public interface CardImageSource { default ArrayList getSupportedSets() { return null; } + + default boolean isSetSupportedComplete(String setCode) { + return true; + } + + default boolean isImageProvided(String setCode, String cardName) { + return false; + } } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java index 4eb98dd2e3..501b1c61e9 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java @@ -31,7 +31,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashSet; -import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; @@ -45,26 +44,26 @@ public enum GrabbagImageSource implements CardImageSource { instance; private static final Logger logger = Logger.getLogger(GrabbagImageSource.class); - private static int maxTimes = 0; private static final Set supportedSets = new LinkedHashSet() { { add("PTC"); - add("EXP"); - add("APAC"); - add("ARENA"); - add("FNMP"); - add("GPX"); - add("GRC"); - add("JR"); - add("MBP"); - add("MGDC"); - add("MLP"); - add("MPRP"); - add("MPS"); - add("SUS"); - add("UGIN"); - add("WMCQ"); + add("SWS"); +// add("EXP"); +// add("APAC"); +// add("ARENA"); +// add("FNMP"); +// add("GPX"); +// add("GRC"); +// add("JR"); +// add("MBP"); +// add("MGDC"); +// add("MLP"); +// add("MPRP"); +// add("MPS"); +// add("SUS"); +// add("UGIN"); +// add("WMCQ"); } }; @@ -82,22 +81,22 @@ public enum GrabbagImageSource implements CardImageSource { @Override public String getNextHttpImageUrl() { return null; -// if (copyUrlToImage == null) { +// if (singleLinks == null) { // setupLinks(); // } // -// for (String key : copyUrlToImageDone.keySet()) { -// if (copyUrlToImageDone.get(key) < maxTimes) { -// copyUrlToImageDone.put(key, maxTimes); +// for (String key : singleLinksDone.keySet()) { +// if (singleLinksDone.get(key) < maxTimes) { +// singleLinksDone.put(key, maxTimes); // return getSourceName(key) + key; // } // } // if (maxTimes < 2) { // maxTimes++; // } -// for (String key : copyUrlToImageDone.keySet()) { -// if (copyUrlToImageDone.get(key) < maxTimes) { -// copyUrlToImageDone.put(key, maxTimes); +// for (String key : singleLinksDone.keySet()) { +// if (singleLinksDone.get(key) < maxTimes) { +// singleLinksDone.put(key, maxTimes); // return getSourceName(key) + key; // } // } @@ -110,1584 +109,1846 @@ public enum GrabbagImageSource implements CardImageSource { // if (copy != null) { // copy = copy.replaceFirst("http:\\/\\/static.starcitygames.com\\/sales\\/cardscans\\/", ""); // copy = copy.replaceFirst("http:\\/\\/magiccards.info\\/scans\\/en\\/", ""); -// return copyUrlToImage.get(copy); +// return singleLinks.get(copy); // } return null; } @Override public String generateURL(CardDownloadData card) throws Exception { - if (copyUrlToImage == null) { + if (singleLinks == null) { setupLinks(); } - for (Map.Entry urlInfo : copyUrlToImage.entrySet()) { - if (urlInfo.getValue().contains(card.getSet()) && urlInfo.getValue().contains(card.getName())) { - return getSourceName(urlInfo.getValue()) + urlInfo.getKey(); - } + String url = singleLinks.get(card.getSet() + "/" + card.getName()); + if (url != null) { + return getSourceName(card, url) + url; } return null; } - HashMap copyUrlToImage = null; - HashMap copyImageToUrl = null; - HashMap copyUrlToImageDone = null; + HashMap singleLinks = null; private void setupLinks() { - if (copyUrlToImage != null) { + if (singleLinks != null) { return; } - copyUrlToImage = new HashMap<>(); - copyImageToUrl = new HashMap<>(); - copyUrlToImageDone = new HashMap<>(); + singleLinks = new HashMap<>(); + singleLinks.put("PTC/Arbiter of the Ideal", "MTG/BNG/en/promo/ArbiterOfTheIdeal.jpg"); + singleLinks.put("PTC/Courser of Kruphix", "MTG/BNG/en/promo/CourserOfKruphix.jpg"); + singleLinks.put("PTC/Eater of Hope", "MTG/BNG/en/promo/EaterOfHope.jpg"); + singleLinks.put("PTC/Fated Return", "MTG/BNG/en/promo/FatedReturn.jpg"); + singleLinks.put("PTC/Forgestoker Dragon", "MTG/BNG/en/promo/ForgestokerDragon.jpg"); + singleLinks.put("PTC/Nessian Wilds Ravager", "MTG/BNG/en/promo/NessianWildsRavager.jpg"); + singleLinks.put("PTC/Pain Seer", "MTG/BNG/en/promo/PainSeer.jpg"); + singleLinks.put("PTC/Silent Sentinel", "MTG/BNG/en/promo/SilentSentinel.jpg"); + singleLinks.put("PTC/Tromokratis", "MTG/BNG/en/promo/Tromokratis.jpg"); - copyUrlToImage.put("PTC/Arbiter of the Ideal", "MTG/BNG/en/promo/ArbiterOfTheIdeal.jpg"); - copyUrlToImage.put("PTC/Courser of Kruphix", "MTG/BNG/en/promo/CourserOfKruphix.jpg"); - copyUrlToImage.put("PTC/Eater of Hope", "MTG/BNG/en/promo/EaterOfHope.jpg"); - copyUrlToImage.put("PTC/Fated Return", "MTG/BNG/en/promo/FatedReturn.jpg"); - copyUrlToImage.put("PTC/Forgestoker Dragon", "MTG/BNG/en/promo/ForgestokerDragon.jpg"); - copyUrlToImage.put("PTC/Nessian Wilds Ravager", "MTG/BNG/en/promo/NessianWildsRavager.jpg"); - copyUrlToImage.put("PTC/Pain Seer", "MTG/BNG/en/promo/PainSeer.jpg"); - copyUrlToImage.put("PTC/Silent Sentinel", "MTG/BNG/en/promo/SilentSentinel.jpg"); - copyUrlToImage.put("PTC/Tromokratis", "MTG/BNG/en/promo/Tromokratis.jpg"); + singleLinks.put("SWS/AAT-1", "CqmDY8V.jpg"); + singleLinks.put("SWS/Acklay of the Arena", "ESVRm6F.jpg"); + singleLinks.put("SWS/Acquire Target", "FOskB4q.jpg"); + singleLinks.put("SWS/Admiral Ackbar", "JdGpP3p.jpg"); + singleLinks.put("SWS/Adroit Hateflayer", "0gSIQ4K.jpg"); + singleLinks.put("SWS/Anakin Skywalker", "3pGvZZEg.png"); + singleLinks.put("SWS/Ancient Holocron", "fH2dVP5.jpg"); + singleLinks.put("SWS/Aqualish Bounty Hunter", "Wm2aKa2.jpg"); + singleLinks.put("SWS/Armed Protocol Droid", "mywdKgN.jpg"); + singleLinks.put("SWS/Arrest", "VXLnNUo.jpg"); + singleLinks.put("SWS/Asajj Ventress", "rOXSIwO.jpg"); + singleLinks.put("SWS/AT-ST", "9sMcy3C.jpg"); + singleLinks.put("SWS/Aurra Sing, Bane of Jedi", "VgbndqZ.png"); + singleLinks.put("SWS/A-Wing", "4TaYoRO.jpg"); + singleLinks.put("SWS/Bantha Herd", "9rLPE2a.jpg"); + singleLinks.put("SWS/Bathe in Bacta", "sPynQAZ.jpg"); + singleLinks.put("SWS/Battle Tactics", "zoon1p4.jpg"); + singleLinks.put("SWS/Bib Fortuna", "AqAmOEw.jpg"); + singleLinks.put("SWS/Black Market Dealer", "EJpIxna.jpg"); + singleLinks.put("SWS/Blind Worship", "GonJyeF.jpg"); + singleLinks.put("SWS/Boba Fett", "XE83Ks7.jpg"); + singleLinks.put("SWS/Bossk", "m91vUdJ.jpg"); + singleLinks.put("SWS/Bounty Collector", "GHHxvb0.jpg"); + singleLinks.put("SWS/Bounty Sniper", "ANTNrsS.jpg"); + singleLinks.put("SWS/Bounty Spotter", "aB6LAZs.jpg"); + singleLinks.put("SWS/Bull Rancor", "eG4mJ7o.jpg"); + singleLinks.put("SWS/C-3PO and R2D2", "RTv4ikx.jpg"); + singleLinks.put("SWS/Cantina Band", "PqMQP0o.jpg"); + singleLinks.put("SWS/Capture", "jxoTOyC.jpg"); + singleLinks.put("SWS/Carbonite Chamber", "rqEr1gm.jpg"); + singleLinks.put("SWS/Chewbacca", "D3D5T42.jpg"); + singleLinks.put("SWS/Chief Chirpa", "Gx3hLsg.jpg"); + singleLinks.put("SWS/Cloaking Device", "Vtz1NZU.jpg"); + singleLinks.put("SWS/Commander Cody", "9PGV2pV.jpg"); + singleLinks.put("SWS/Condemn", "36yejT2.jpg"); + singleLinks.put("SWS/Corellian Corvette", "j8uPQDY.jpg"); + singleLinks.put("SWS/Crossfire", "Iz9OdPh.jpg"); + singleLinks.put("SWS/Cruelty of the Sith", "q3WIYAt.jpg"); + singleLinks.put("SWS/Cunning Abduction", "CueTNo7.jpg"); + singleLinks.put("SWS/Dagobah Maw Slug", "SqmdUMp.jpg"); + singleLinks.put("SWS/Dark Apprenticeship", "yf5MthH.jpg"); + singleLinks.put("SWS/Dark Decision", "2HB5lYN.jpg"); + singleLinks.put("SWS/Dark Trooper", "atKdUTA.jpg"); + singleLinks.put("SWS/Darth Maul", "EwC1e1Q.jpg"); + singleLinks.put("SWS/Darth Sidious, Sith Lord", "UYk3KnH.png"); + singleLinks.put("SWS/Darth Tyranus, Count of Serenno", "AXUfNuO.png"); + singleLinks.put("SWS/Darth Vader", "3pGvZZE.png"); + singleLinks.put("SWS/Death Trooper", "j7lWmPJ.jpg"); + singleLinks.put("SWS/Deploy The Troops", "QtcN0qV.jpg"); + singleLinks.put("SWS/Doom Blade", "cSuxWUr.jpg"); + singleLinks.put("SWS/Droid Commando", "HkKiaBQ.jpg"); + singleLinks.put("SWS/Droid Factory", "34L3ykD.jpg"); + singleLinks.put("SWS/Droid Foundry", "qYijxSk.jpg"); + singleLinks.put("SWS/Droideka", "BXN7t1i.jpg"); + singleLinks.put("SWS/Drone Holocron", "cHzqK4v.jpg"); + singleLinks.put("SWS/Echo Base Commando", "AdLjV4Y.jpg"); + singleLinks.put("SWS/EMP Blast", "Y0JWgRO.jpg"); + singleLinks.put("SWS/Escape Pod", "vj8gQ1u.jpg"); + singleLinks.put("SWS/Ewok Ambush", "219aufH.jpg"); + singleLinks.put("SWS/Ewok Firedancers", "DFAB3h4.jpg"); + singleLinks.put("SWS/Ewok Village", "rgQevhZ.jpg"); + singleLinks.put("SWS/Exogorth", "cS6fq3u.jpg"); + singleLinks.put("SWS/Ferocity of the Underworld", "lTqtVab.jpg"); + singleLinks.put("SWS/Flames of Remembrance", "WAKhi9i.jpg"); + singleLinks.put("SWS/Force Choke", "Uu1QUf9.jpg"); + singleLinks.put("SWS/Force Denial", "qwYGiUg.jpg"); + singleLinks.put("SWS/Force Drain", "prHdDXa.jpg"); + singleLinks.put("SWS/Force Healing", "kDGRFoj.jpg"); + singleLinks.put("SWS/Force Lightning", "DhAE9lZ.jpg"); + singleLinks.put("SWS/Force Mastery", "XPCWaP8.jpg"); + singleLinks.put("SWS/Force Pull", "rWWfkhX.jpg"); + singleLinks.put("SWS/Force Push", "aN8n4sk.jpg"); + singleLinks.put("SWS/Force Reflex", "RIlvXTz.jpg"); + singleLinks.put("SWS/Force Scream", "EsagOnR.jpg"); + singleLinks.put("SWS/Force Spark", "14MOM1y.jpg"); + singleLinks.put("SWS/Forest", "LIpeeP9.jpg"); + singleLinks.put("SWS/Forest", "jKwDwH7.jpg"); + singleLinks.put("SWS/Forest", "CVb3582.jpg"); + singleLinks.put("SWS/Forest", "q09fMW0.jpg"); + singleLinks.put("SWS/Fulfill Contract", "FtLMpHK.jpg"); + singleLinks.put("SWS/Gamorrean Prison Guard", "4dgOMPA.jpg"); + singleLinks.put("SWS/General Grievous", "tRLM8Hz.jpg"); + singleLinks.put("SWS/Gifted Initiate", "NDePdLv.jpg"); + singleLinks.put("SWS/Grand Moff Tarkin", "QXq1V40.jpg"); + singleLinks.put("SWS/Greater Krayt Dragon", "dzIiXXg.jpg"); + singleLinks.put("SWS/Greedo", "IRKwsX0.jpg"); + singleLinks.put("SWS/Gundark", "zLxfLM8.jpg"); + singleLinks.put("SWS/Gungan Captain", "1Q4DNWh.jpg"); + singleLinks.put("SWS/Han Solo", "G0Awota.jpg"); + singleLinks.put("SWS/Hazard Trooper", "ZOutamG.jpg"); + singleLinks.put("SWS/Head Hunting", "7OT1bGZ.jpg"); + singleLinks.put("SWS/Heavy Trooper", "HhZWs2N.jpg"); + singleLinks.put("SWS/Hot Pursuit", "ih1GT5Z.jpg"); + singleLinks.put("SWS/Hungry Dragonsnake", "23v7RTm.jpg"); + singleLinks.put("SWS/Hunt to Extinction", "3eJyfzZ.jpg"); + singleLinks.put("SWS/Hutt Crime Lord", "NAzK7Hp.jpg"); + singleLinks.put("SWS/Hutt Palace", "HEb2JN5.jpg"); + singleLinks.put("SWS/IG-88B", "YZUZJC8.jpg"); + singleLinks.put("SWS/Images of the Past", "sOXEk4Q.jpg"); + singleLinks.put("SWS/Imperial Gunner", "9KpZ8AX.jpg"); + singleLinks.put("SWS/Impulsive Wager", "lLutRRs.jpg"); + singleLinks.put("SWS/Insatiable Rakghoul", "IYqBnTK.jpg"); + singleLinks.put("SWS/Interrogation", "kI2bIbo.jpg"); + singleLinks.put("SWS/Ion Cannon", "Tb546IK.jpg"); + singleLinks.put("SWS/Iron Fist of the Empire", "9Ui7NRn.jpg"); + singleLinks.put("SWS/Island", "GxITXBO.jpg"); + singleLinks.put("SWS/Island", "vKdg4fG.jpg"); + singleLinks.put("SWS/Island", "NPMxIew.jpg"); + singleLinks.put("SWS/Island", "cnqFMa6.jpg"); + singleLinks.put("SWS/Ithorian Initiate", "2RYpp5o.jpg"); + singleLinks.put("SWS/Jabba the Hutt", "QMz0sKa.jpg"); + singleLinks.put("SWS/Jango Fett", "nEnspQP.jpg"); + singleLinks.put("SWS/Jar Jar Binks", "GCnx72b.jpg"); + singleLinks.put("SWS/Jar'Kai Battle Stance", "GLavgj7.jpg"); + singleLinks.put("SWS/Jedi Battle Healer", "RyIJON5.jpg"); + singleLinks.put("SWS/Jedi Battle Mage", "V9qHRGq.jpg"); + singleLinks.put("SWS/Jedi Battle Sage", "sZVlGWE.jpg"); + singleLinks.put("SWS/Jedi Enclave", "FlibBhx.jpg"); + singleLinks.put("SWS/Jedi Holocron", "ojbt2av.jpg"); + singleLinks.put("SWS/Jedi Inquirer", "ghFQA76.jpg"); + singleLinks.put("SWS/Jedi Instructor", "IwEpVkz.jpg"); + singleLinks.put("SWS/Jedi Knight", "VXNHpZs.jpg"); + singleLinks.put("SWS/Jedi Mind Trick", "aaVfgSA.jpg"); + singleLinks.put("SWS/Jedi Sentinel", "cae3O1s.jpg"); + singleLinks.put("SWS/Jedi Starfighter", "Ta20jjD.jpg"); + singleLinks.put("SWS/Jedi Temple", "ZkOUJnM.jpg"); + singleLinks.put("SWS/Jedi Training", "7L1LWie.jpg"); + singleLinks.put("SWS/Jump Trooper", "62Pg5r4.jpg"); + singleLinks.put("SWS/Jungle Village", "3a1KN8u.jpg"); + singleLinks.put("SWS/Kamino Cloning Facility", "kwBudvf.jpg"); + singleLinks.put("SWS/Ki-Adi-Mundi", "atqNF3H.jpg"); + singleLinks.put("SWS/LAAT Gunship", "DEMXleY.jpg"); + singleLinks.put("SWS/Lando Calrissian", "jcoTjGV.jpg"); + singleLinks.put("SWS/Legacy of the Beloved", "Y0ObvQg.jpg"); + singleLinks.put("SWS/Lightning Bolt", "XSNGQYi.jpg"); + singleLinks.put("SWS/Lightsaber", "YrpWygk.jpg"); + singleLinks.put("SWS/Loyal Tauntaun", "JKDV2WK.jpg"); + singleLinks.put("SWS/Luke Skywalker", "9worW6q.jpg"); + singleLinks.put("SWS/Mace Windu", "rmTuBGT.jpg"); + singleLinks.put("SWS/Maintenance Droid", "A66IIC1.jpg"); + singleLinks.put("SWS/Maintenance Hangar", "DzCYnH3.jpg"); + singleLinks.put("SWS/Mantellian Savrip", "a9JIDEM.jpg"); + singleLinks.put("SWS/March of the Droids", "A4HIQ5V.jpg"); + singleLinks.put("SWS/Massiff Swarm", "0qRPfbC.jpg"); + singleLinks.put("SWS/Might of the Wild", "eNXOdxp.jpg"); + singleLinks.put("SWS/Millennium Falcon", "aZ6sIn2.jpg"); + singleLinks.put("SWS/Miraculous Recovery", "DH6Cei8.jpg"); + singleLinks.put("SWS/Moisture Farm", "S6kJHtL.jpg"); + singleLinks.put("SWS/Mon Calamari Cruiser", "ZHdTV7p.jpg"); + singleLinks.put("SWS/Mon Calamari Initiate", "GBuXdGP.jpg"); + singleLinks.put("SWS/Mountain", "MCii4g1.jpg"); + singleLinks.put("SWS/Mountain", "Tb0ic31.jpg"); + singleLinks.put("SWS/Mountain", "wqXTdsC.jpg"); + singleLinks.put("SWS/Mountain", "9oBNCHk.jpg"); + singleLinks.put("SWS/N-1 Starfighter", "UH3qd7x.jpg"); + singleLinks.put("SWS/Nebulon-B Frigate", "IwEpVkz.jpg"); + singleLinks.put("SWS/Neophyte Hateflayer", "Has2AIW.jpg"); + singleLinks.put("SWS/Nerf Herder", "VUX0LHV.jpg"); + singleLinks.put("SWS/Nexu Stalker", "E1xxHe1.jpg"); + singleLinks.put("SWS/Nightspider", "H1po0uV.jpg"); + singleLinks.put("SWS/No Contest", "6SwC9ri.jpg"); + singleLinks.put("SWS/Novice Bounty Hunter", "WfNSsLY.jpg"); + singleLinks.put("SWS/Nute Gunray", "UZg12DD.jpg"); + singleLinks.put("SWS/Obi-Wan Kenobi", "BHkbjdL.png"); + singleLinks.put("SWS/Open Season", "E4iM90K.jpg"); + singleLinks.put("SWS/Orbital Bombardment", "Ov1mB3A.jpg"); + singleLinks.put("SWS/Order 66", "jZituQQ.jpg"); + singleLinks.put("SWS/Ortolan Keyboardist", "dYDgEUB.jpg"); + singleLinks.put("SWS/Outer Rim Slaver", "xq8ozqq.jpg"); + singleLinks.put("SWS/Outlaw Holocron", "mWbyX78.jpg"); + singleLinks.put("SWS/Personal Energy Shield", "v6TGLne.jpg"); + singleLinks.put("SWS/Plains", "HgXaAKh.jpg"); + singleLinks.put("SWS/Plains", "Y0i7MBh.jpg"); + singleLinks.put("SWS/Plains", "4grXQVd.jpg"); + singleLinks.put("SWS/Plains", "kTmN8MM.jpg"); + singleLinks.put("SWS/Plo Koon", "dDNi8CV.jpg"); + singleLinks.put("SWS/Precipice of Mortis", "TRAPT86.jpg"); + singleLinks.put("SWS/Predator's Strike", "pcBoUny.jpg"); + singleLinks.put("SWS/Preordain", "u8nSNQW.jpg"); + singleLinks.put("SWS/Primal Instinct", "bInouYH.jpg"); + singleLinks.put("SWS/Princess Leia", "pnHyPWg.jpg"); + singleLinks.put("SWS/Probe Droid", "0r84uUM.jpg"); + singleLinks.put("SWS/Qui-Gon Jinn", "7DdumG2.jpg"); + singleLinks.put("SWS/Raging Reek", "9maXaMR.jpg"); + singleLinks.put("SWS/Rallying Fire", "wtaTlhd.jpg"); + singleLinks.put("SWS/Ravenous Wampa", "rHDaKDD.jpg"); + singleLinks.put("SWS/Regression", "j5z0TOE.jpg"); + singleLinks.put("SWS/Republic Frigate", "LzNpjxP.jpg"); + singleLinks.put("SWS/Repurpose", "BvRMy3f.jpg"); + singleLinks.put("SWS/Revenge", "xkKzMRX.jpg"); + singleLinks.put("SWS/Riding Ronto", "xECBi7G.jpg"); + singleLinks.put("SWS/Rocket Trooper", "94wUTH5.jpg"); + singleLinks.put("SWS/Rogue's Passage", "UunpJPZ.jpg"); + singleLinks.put("SWS/Rule of two", "wNqZWLJ.jpg"); + singleLinks.put("SWS/Rumination", "nSD3UHQ.jpg"); + singleLinks.put("SWS/Rumor Monger", "wSN6H6v.jpg"); + singleLinks.put("SWS/Sabacc Game", "qIcFb3U.jpg"); + singleLinks.put("SWS/Salvage Squad", "ThYSxmD.jpg"); + singleLinks.put("SWS/Sand Trooper", "ysfpyL8.jpg"); + singleLinks.put("SWS/Sarlacc Pit", "N4dcnln.png"); + singleLinks.put("SWS/Scout the Perimeter", "2cObUbz.jpg"); + singleLinks.put("SWS/Scout Trooper", "9RAY4U1.jpg"); + singleLinks.put("SWS/Security Droid", "dzy8m4v.jpg"); + singleLinks.put("SWS/Senator Bail Organa", "BRkUuYU.jpg"); + singleLinks.put("SWS/Senator Lott Dod", "yYQtXZo.jpg"); + singleLinks.put("SWS/Senator Onaconda Farr", "oPez77z.png"); + singleLinks.put("SWS/Senator Padmé Amidala", "287deD9.jpg"); + singleLinks.put("SWS/Senator Passel Argente", "51qpnaE.jpg"); + singleLinks.put("SWS/Shaak Herd", "PtnZD0I.jpg"); + singleLinks.put("SWS/Shadow Trooper", "09NAiGa.jpg"); + singleLinks.put("SWS/Shock Trooper", "UVNOxMR.jpg"); + singleLinks.put("SWS/Show of Dominance", "ru2D3Qp.jpg"); + singleLinks.put("SWS/Sith Assassin", "Nt8WUCj.jpg"); + singleLinks.put("SWS/Sith Citadel", "bBCbK30.jpg"); + singleLinks.put("SWS/Sith Evoker", "jwRzCEB.jpg"); + singleLinks.put("SWS/Sith Holocron", "07Ufx5X.jpg"); + singleLinks.put("SWS/Sith Inquisitor", "NivI1E5.jpg"); + singleLinks.put("SWS/Sith Lord", "lWBfQoA.jpg"); + singleLinks.put("SWS/Sith Magic", "cDPFeve.jpg"); + singleLinks.put("SWS/Sith Manipulator", "Q7CIvyz.jpg"); + singleLinks.put("SWS/Sith Marauder", "9zZUSJW.jpg"); + singleLinks.put("SWS/Sith Mindseer", "Lmps3oO.jpg"); + singleLinks.put("SWS/Sith Ravager", "nl9Dp41.jpg"); + singleLinks.put("SWS/Sith Ruins", "oSqiYyO.jpg"); + singleLinks.put("SWS/Sith Sorcerer", "Pq37iop.jpg"); + singleLinks.put("SWS/Sith Thoughtseeker", "YzIY1di.jpg"); + singleLinks.put("SWS/Slave I", "QUGpxlb.jpg"); + singleLinks.put("SWS/Smash to Smithereens", "UlzDZWp.jpg"); + singleLinks.put("SWS/Snow Trooper", "28Jp5JL.jpg"); + singleLinks.put("SWS/Speeder Trooper", "BIEnTDL.jpg"); + singleLinks.put("SWS/Star Destroyer", "DYUMXHZ.jpg"); + singleLinks.put("SWS/Strike Team Commando", "783ZFsF.jpg"); + singleLinks.put("SWS/Super Battle Droid", "T8IjrKD.jpg"); + singleLinks.put("SWS/Surprise Maneuver", "uaAmzz8.jpg"); + singleLinks.put("SWS/Swamp", "kBGj6vk.jpg"); + singleLinks.put("SWS/Swamp", "BLJl2lf.jpg"); + singleLinks.put("SWS/Swamp", "MLH5o2u.jpg"); + singleLinks.put("SWS/Swamp", "Rmrv9tC.jpg"); + singleLinks.put("SWS/Swarm the Skies", "Ti1McaV.jpg"); + singleLinks.put("SWS/Syndicate Enforcer", "xZ0g2Sx.jpg"); + singleLinks.put("SWS/Tank Droid", "N4YyMje.jpg"); + singleLinks.put("SWS/Terentatek Cub", "nbmBxst.jpg"); + singleLinks.put("SWS/The Battle of Endor", "vhL6gdI.jpg"); + singleLinks.put("SWS/The Battle of Geonosis", "7Fnr2MD.jpg"); + singleLinks.put("SWS/The Battle of Hoth", "wcVJwKP.jpg"); + singleLinks.put("SWS/The Battle of Naboo", "aesSN9E.jpg"); + singleLinks.put("SWS/The Battle of Yavin", "AtGE49k.jpg"); + singleLinks.put("SWS/The Death Star", "2LjSXa9.jpg"); + singleLinks.put("SWS/TIE Bomber", "R2l7ZXQ.jpg"); + singleLinks.put("SWS/TIE Interceptor", "fYY4PUR.jpg"); + singleLinks.put("SWS/Trade Federation Battleship", "sKN9Gzv.jpg"); + singleLinks.put("SWS/Tri-Fighter", "IhwHzqT.jpg"); + singleLinks.put("SWS/Trooper Armor", "nqnFj9f.jpg"); + singleLinks.put("SWS/Trooper Commando", "PiAYXJv.jpg"); + singleLinks.put("SWS/Twi'lek Seductress", "iPhUxUV.jpg"); + singleLinks.put("SWS/Ugnaught Scrap Worker", "fuuNN3n.jpg"); + singleLinks.put("SWS/Underworld Slums", "o4CFq3x.jpg"); + singleLinks.put("SWS/Unity of the Droids", "WFAIRy3.jpg"); + singleLinks.put("SWS/Unruly Sureshot", "AHymfLc.jpg"); + singleLinks.put("SWS/Vapor Snag", "8g3q0ny.jpg"); + singleLinks.put("SWS/V-Wing", "7eThuU9.jpg"); + singleLinks.put("SWS/Weequay Beastmaster", "metAs1p.jpg"); + singleLinks.put("SWS/Wild Holocron", "adw7dFO.jpg"); + singleLinks.put("SWS/Wisdom of the Jedi", "TgTj2Dd.jpg"); + singleLinks.put("SWS/Womp Rat", "XKF79Hr.jpg"); + singleLinks.put("SWS/Wookiee Bounty Hunter", "A76UGTJ.jpg"); + singleLinks.put("SWS/Wookiee Mystic", "8DCkOVe.jpg"); + singleLinks.put("SWS/Wookiee Raidleader", "ZZTduL5.jpg"); + singleLinks.put("SWS/X-Wing", "AV1LPuZ.jpg"); + singleLinks.put("SWS/Yoda, Jedi Master", "6arN1Hl.png"); + singleLinks.put("SWS/Y-Wing", "aQQ5zwA.jpg"); + singleLinks.put("SWS/Zam Wesell", "ToG0C1r.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/AleshaWhoSmilesAtDeath.jpg", "PTC.zip/PTC/Alesha, Who Smiles at Death.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/Arcbond.jpg", "PTC.zip/PTC/Arcbond.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/ArchfiendOfDepravity.jpg", "PTC.zip/PTC/Archfiend of Depravity.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/AtarkaWorldRender.jpg", "PTC.zip/PTC/Atarka, World Render.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/BrutalHordechief.jpg", "PTC.zip/PTC/Brutal Hordechief.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/DaghatarTheAdamant.jpg", "PTC.zip/PTC/Daghatar the Adamant.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/DragonscaleGeneral.jpg", "PTC.zip/PTC/Dragonscale General.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/DromokaTheEternal.jpg", "PTC.zip/PTC/Dromoka, the Eternal.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/FlamerushRider.jpg", "PTC.zip/PTC/Flamerush Rider.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/FlamewakePhoenix.jpg", "PTC.zip/PTC/Flamewake Phoenix.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/JeskaiInfiltrator.jpg", "PTC.zip/PTC/Jeskai Infiltrator.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/KolaghanTheStormsFury.jpg", "PTC.zip/PTC/Kolaghan, the Storm's Fury.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/MarduStrikeLeader.jpg", "PTC.zip/PTC/Mardu Strike leader.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/MasteryOfTheUnseen.jpg", "PTC.zip/PTC/Mastery of the Unseen.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/OjutaiSoulOfWinter.jpg", "PTC.zip/PTC/Ojutai, Soul of Winter.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/RallyTheAncestors.jpg", "PTC.zip/PTC/Rally the Ancestors.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/SageEyeAvengers.jpg", "PTC.zip/PTC/Sage-Eye Avengers.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/SandsteppeMastodon.jpg", "PTC.zip/PTC/Sandsteppe Mastodon.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/ShamanOfTheGreatHunt.jpg", "PTC.zip/PTC/Shaman of the Great Hunt.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/ShamanicRevelation.jpg", "PTC.zip/PTC/Shamanic Revelation.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/ShuYunTheSilentTempest.jpg", "PTC.zip/PTC/Shu Yun, the Silent Tempest.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/SilumgarTheDriftingDeath.jpg", "PTC.zip/PTC/Silumgar, the Drifting Death.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/SoulfireGrandMaster.jpg", "PTC.zip/PTC/Soulfire Grand Master.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/Soulflayer.jpg", "PTC.zip/PTC/Soulflayer.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/SupplantForm.jpg", "PTC.zip/PTC/Supplant Form.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/TasigurTheGoldenFang.jpg", "PTC.zip/PTC/Tasigur, the Golden Fang.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/TorrentElemental.jpg", "PTC.zip/PTC/Torrent Elemental.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/WardenOfTheFirstTree.jpg", "PTC.zip/PTC/Warden of the First Tree.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/Wildcall.jpg", "PTC.zip/PTC/Wildcall.full.jpg"); - copyUrlToImage.put("MTG/FRF/en/promo/prerelease/YasovaDragonclaw.jpg", "PTC.zip/PTC/Yasova Dragonclaw.full.jpg"); - copyUrlToImage.put("MTG/JOU/en/promo/DawnbringerCharioteers.jpg", "PTC.zip/PTC/Dawnbringer Charioteers.full.jpg"); - copyUrlToImage.put("MTG/JOU/en/promo/DictateOfKruphix.jpg", "PTC.zip/PTC/Dictate of Kruphix.full.jpg"); - copyUrlToImage.put("MTG/JOU/en/promo/DictateOfTheTwinGods.jpg", "PTC.zip/PTC/Dictate of the Twin Gods.full.jpg"); - copyUrlToImage.put("MTG/JOU/en/promo/DoomwakeGiant.jpg", "PTC.zip/PTC/Doomwake Giant.full.jpg"); - copyUrlToImage.put("MTG/JOU/en/promo/EidolonOfBlossoms.jpg", "PTC.zip/PTC/Eidolon of Blossoms.full.jpg"); - copyUrlToImage.put("MTG/JOU/en/promo/ScourgeOfSkolaVale.jpg", "PTC.zip/PTC/Scourge of Skola Vale.full.jpg"); - copyUrlToImage.put("MTG/JOU/en/promo/SpawnOfThraxes.jpg", "PTC.zip/PTC/Spawn of Thraxes.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/AbzanAscendancy.jpg", "PTC.zip/PTC/Abzan Ascendancy.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/AnafenzaTheForemost.jpg", "PTC.zip/PTC/Anafenza, the Foremost.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/AnkleShanker.jpg", "PTC.zip/PTC/Ankle Shanker.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/AvalancheTusker.jpg", "PTC.zip/PTC/Avalanche Tusker.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/BloodsoakedChampion.jpg", "PTC.zip/PTC/Bloodsoaked Champion.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/ButcherOfTheHorde.jpg", "PTC.zip/PTC/Butcher of the Horde.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/CracklingDoom.jpg", "PTC.zip/PTC/Crackling Doom.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/CratersClaws.jpg", "PTC.zip/PTC/Crater's Claws.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/DeflectingPalm.jpg", "PTC.zip/PTC/Deflecting Palm.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/DigThroughTime.jpg", "PTC.zip/PTC/Dig Through Time.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/DragonStyleTwins.jpg", "PTC.zip/PTC/Dragon-Style Twins.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/DragonThroneOfTarkir.jpg", "PTC.zip/PTC/Dragon Throne of Tarkir.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/Duneblast.jpg", "PTC.zip/PTC/Duneblast.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/FlyingCraneTechnique.jpg", "PTC.zip/PTC/Flying Crane Technique.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/GrimHaruspex.jpg", "PTC.zip/PTC/Grim Haruspex.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/HardenedScales.jpg", "PTC.zip/PTC/Hardened Scales.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/HeraldOfTorment.jpg", "PTC.zip/PTC/Herald of Torment.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/HighSentinelsOfArashin.jpg", "PTC.zip/PTC/High Sentinels of Arashin.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/IcyBlast.jpg", "PTC.zip/PTC/Icy Blast.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/IvorytuskFortress.jpg", "PTC.zip/PTC/Ivorytusk Fortress.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/JeeringInstigator.jpg", "PTC.zip/PTC/Jeering Instigator.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/JeskaiAscendancy.jpg", "PTC.zip/PTC/Jeskai Ascendancy.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/KheruSpellsnatcher.jpg", "PTC.zip/PTC/Kheru Spellsnatcher.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/MarduAscendancy.jpg", "PTC.zip/PTC/Mardu Ascendancy.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/MasterOfPearls.jpg", "PTC.zip/PTC/Master of Pearls.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/NarsetEnlightenedMaster.jpg", "PTC.zip/PTC/Narset, Enlightened Master.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/NecropolisFiend.jpg", "PTC.zip/PTC/Necropolis Fiend.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/RakshasaVizier.jpg", "PTC.zip/PTC/Rakshasa Vizier.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/RattleclawMystic.jpg", "PTC.zip/PTC/Rattleclaw Mystic.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/SageOfTheInwardEye.jpg", "PTC.zip/PTC/Sage of the Inward Eye.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/SidisiBroodTyrant.jpg", "PTC.zip/PTC/Sidisi, Brood Tyrant.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/SiegeRhino.jpg", "PTC.zip/PTC/Siege Rhino.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/SultaiAscendancy.jpg", "PTC.zip/PTC/Sultai Ascendancy.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/SurrakDragonclaw.jpg", "PTC.zip/PTC/Surrak Dragonclaw.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/TemurAscendancy.jpg", "PTC.zip/PTC/Temur Ascendancy.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/ThousandWinds.jpg", "PTC.zip/PTC/Thousand Winds.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/TrailOfMystery.jpg", "PTC.zip/PTC/Trail of Mystery.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/TrapEssence.jpg", "PTC.zip/PTC/Trap Essence.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/UtterEnd.jpg", "PTC.zip/PTC/Utter End.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/VillainousWealth.jpg", "PTC.zip/PTC/Villainous Wealth.full.jpg"); - copyUrlToImage.put("MTG/KTK/en/promo/ZurgoHelmsmasher.jpg", "PTC.zip/PTC/Zurgo Helmsmasher.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/ChiefEngineer.jpg", "PTC.zip/PTC/Chief Engineer.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/InGarruksWake.jpg", "PTC.zip/PTC/In Garruk's Wake.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/IndulgentTormentor.jpg", "PTC.zip/PTC/Indulgent Tormentor.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/MercurialPretender.jpg", "PTC.zip/PTC/Mercurial Pretender.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/PhyrexianRevoker.jpg", "PTC.zip/PTC/Phyrexian Revoker.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/Phytotitan.jpg", "PTC.zip/PTC/Phytotitan.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/ResoluteArchangel.jpg", "PTC.zip/PTC/Resolute Archangel.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/SiegeDragon.jpg", "PTC.zip/PTC/Siege Dragon.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/SoulOfRavnica.jpg", "PTC.zip/PTC/Soul of Ravnica.full.jpg"); - copyUrlToImage.put("MTG/M15/en/promo/SoulOfZendikar.jpg", "PTC.zip/PTC/Soul of Zendikar.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/AzusaLostButSeeking.jpg", "JR.zip/JR/Azusa, Lost but Seeking.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/Bitterblossom.jpg", "JR.zip/JR/Bitterblossom.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/BloodstainedMire.jpg", "JR.zip/JR/Bloodstained Mire.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/CommandBeacon.jpg", "JR.zip/JR/Command Beacon.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/DarkRitual.jpg", "JR.zip/JR/Dark Ritual.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/DecreeOfJustice.jpg", "JR.zip/JR/Decree of Justice.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/DefenseOfTheHeart.jpg", "JR.zip/JR/Defense of the Heart.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/ExaltedAngel.jpg", "JR.zip/JR/Exalted Angel.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/FeldonOfTheThirdPath.jpg", "JR.zip/JR/Feldon of the Third Path.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/ForceOfWill.jpg", "JR.zip/JR/Force of Will.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/GaeasCradle.jpg", "JR.zip/JR/Gaea's Cradle.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/ImperialRecruiter.jpg", "JR.zip/JR/Imperial Recruiter.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/LandTax.jpg", "JR.zip/JR/Land Tax.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/MindsDesire.jpg", "JR.zip/JR/Mind's Desire.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/MishrasFactory.jpg", "JR.zip/JR/Mishra's Factory.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/RishadanPort.jpg", "JR.zip/JR/Rishadan Port.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/ShardlessAgent.jpg", "JR.zip/JR/Shardless Agent.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/ThawingGlaciers.jpg", "JR.zip/JR/Thawing Glaciers.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/Vindicate2007.jpg", "JR.zip/JR/Vindicate.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/Vindicate2013.jpg", "JR.zip/JR/Vindicate 1.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/Wasteland2010.jpg", "JR.zip/JR/Wasteland 1.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/Wasteland2015.jpg", "JR.zip/JR/Wasteland.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/WindsweptHeath.jpg", "JR.zip/JR/Windswept Heath.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/XiahouDunTheOneEyed.jpg", "JR.zip/JR/Xiahou Dun, the One-Eyed.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/YawgmothsWill.jpg", "JR.zip/JR/Yawgmoth's Will.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Judge/ZurtheEnchanter.jpg", "JR.zip/JR/Zur the Enchanter.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/AkoumFirebird.jpg", "PTC.zip/PTC/Akoum Firebird.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/AkoumHellkite.jpg", "PTC.zip/PTC/Akoum Hellkite.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/AlignedHedronNetwork.jpg", "PTC.zip/PTC/Aligned Hedron Network.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/AllyEncampment.jpg", "PTC.zip/PTC/Ally Encampment.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/AngelicCaptain.jpg", "PTC.zip/PTC/Angelic Captain.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/BarrageTyrant.jpg", "PTC.zip/PTC/Barrage Tyrant.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/BeastcallerSavant.jpg", "PTC.zip/PTC/Beastcaller Savant.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/BlightHerder.jpg", "PTC.zip/PTC/Blight Herder.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/BringToLight.jpg", "PTC.zip/PTC/Bring to Light.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/BroodButcher.jpg", "PTC.zip/PTC/Brood Butcher.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/BrutalExpulsion.jpg", "PTC.zip/PTC/Brutal Expulsion.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/CanopyVista.jpg", "PTC.zip/PTC/Canopy Vista.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/CinderGlade.jpg", "PTC.zip/PTC/Cinder Glade.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/ConduitOfRuin.jpg", "PTC.zip/PTC/Conduit of Ruin.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/DefiantBloodlord.jpg", "PTC.zip/PTC/Defiant Bloodlord.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/DesolationTwin.jpg", "PTC.zip/PTC/Desolation Twin.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/DragonmasterOutcast.jpg", "PTC.zip/PTC/Dragonmaster Outcast.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/DranasChosen.jpg", "PTC.zip/PTC/Drana's Chosen.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/DrownerOfHope.jpg", "PTC.zip/PTC/Drowner of Hope.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/DustStalker.jpg", "PTC.zip/PTC/Dust Stalker.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/EmeriaShepherd.jpg", "PTC.zip/PTC/Emeria Shepherd.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/EndlessOne.jpg", "PTC.zip/PTC/Endless One.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/ExertInfluence.jpg", "PTC.zip/PTC/Exert Influence.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/FathomFeeder.jpg", "PTC.zip/PTC/Fathom Feeder.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/FelidarSovereign.jpg", "PTC.zip/PTC/Felidar Sovereign.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/FromBeyond.jpg", "PTC.zip/PTC/From Beyond.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/GideonAllyOfZendikar.jpg", "PTC.zip/PTC/Gideon, Ally of Zendikar.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/GreenwardenOfMurasa.jpg", "PTC.zip/PTC/Greenwarden of Murasa.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/GruesomeSlaughter.jpg", "PTC.zip/PTC/Gruesome Slaughter.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/GuardianOfTazeem.jpg", "PTC.zip/PTC/Guardian of Tazeem.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/GuulDrazOverseer.jpg", "PTC.zip/PTC/Guul Draz Overseer.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/HeroOfGomaFada.jpg", "PTC.zip/PTC/Hero of Goma Fada.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/HerosDownfall.jpg", "PTC.zip/PTC/Hero's Downfall.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/KioraMasterOfTheDepths.jpg", "PTC.zip/PTC/Kiora, Master of the Depths.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/KioraTheCrashingWave.jpg", "PTC.zip/PTC/Kiora, the Crashing Wave.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/LanternScout.jpg", "PTC.zip/PTC/Lantern Scout.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/LumberingFalls.jpg", "PTC.zip/PTC/Lumbering Falls.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/MarchFromTheTomb.jpg", "PTC.zip/PTC/March from the Tomb.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/MundaAmbushLeader.jpg", "PTC.zip/PTC/Munda, Ambush Leader.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/NissasRenewal.jpg", "PTC.zip/PTC/Nissa's Renewal.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/NoyanDarRoilShaper.jpg", "PTC.zip/PTC/Noyan Dar, Roil Shaper.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/ObNixilisReignited.jpg", "PTC.zip/PTC/Ob Nixilis Reignited.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/ObNixilisUnshackled.jpg", "PTC.zip/PTC/Ob Nixilis, Unshackled.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/OblivionSower.jpg", "PTC.zip/PTC/Oblivion Sower.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/OmnathLocusOfRage.jpg", "PTC.zip/PTC/Omnath, Locus of Rage.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/OranRiefHydra.jpg", "PTC.zip/PTC/Oran-Rief Hydra.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/PainfulTruths.jpg", "PTC.zip/PTC/Painful Truths.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/PartTheWaterveil.jpg", "PTC.zip/PTC/Part the Waterveil.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/PlanarOutburst.jpg", "PTC.zip/PTC/Planar Outburst.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/PrairieStream.jpg", "PTC.zip/PTC/Prairie Stream.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/PrismArray.jpg", "PTC.zip/PTC/Prism Array.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/QuarantineField.jpg", "PTC.zip/PTC/Quarantine Field.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/RadiantFlames.jpg", "PTC.zip/PTC/Radiant Flames.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/RuinousPath.jpg", "PTC.zip/PTC/Ruinous Path.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/SanctumOfUgin.jpg", "PTC.zip/PTC/Sanctum of Ugin.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/ScatterToTheWinds.jpg", "PTC.zip/PTC/Scatter to the Winds.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/SerpentineSpike.jpg", "PTC.zip/PTC/Serpentine Spike.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/ShamblingVent.jpg", "PTC.zip/PTC/Shambling Vent.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/ShrineOfTheForsakenGods.jpg", "PTC.zip/PTC/Shrine of the Forsaken Gods.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/SireOfStagnation.jpg", "PTC.zip/PTC/Sire of Stagnation.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/SmolderingMarsh.jpg", "PTC.zip/PTC/Smoldering Marsh.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/SmotheringAbomination.jpg", "PTC.zip/PTC/Smothering Abomination.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/SunkenHollow.jpg", "PTC.zip/PTC/Sunken Hollow.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/UginsInsight.jpg", "PTC.zip/PTC/Ugin's Insight.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/UginsNexus.jpg", "PTC.zip/PTC/Ugin's Nexus.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/UlamogTheCeaselessHunger.jpg", "PTC.zip/PTC/Ulamog, the Ceaseless Hunger.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/UndergrowthChampion.jpg", "PTC.zip/PTC/Undergrowth Champion.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/VeteranWarleader.jpg", "PTC.zip/PTC/Veteran Warleader.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/VoidWinnower.jpg", "PTC.zip/PTC/Void Winnower.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/WastelandStrangler.jpg", "PTC.zip/PTC/Wasteland Strangler.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/WoodlandWanderer.jpg", "PTC.zip/PTC/Woodland Wanderer.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/BFZ/ZadaHedronGrinder.jpg", "PTC.zip/PTC/Zada, Hedron Grinder.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/AetherfluxReservoir.jpg", "PTC.zip/PTC/Aetherflux Reservoir.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/AethersquallAncient.jpg", "PTC.zip/PTC/Aethersquall Ancient.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/AetherstormRoc.jpg", "PTC.zip/PTC/Aetherstorm Roc.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/AetherworksMarvel.jpg", "PTC.zip/PTC/Aetherworks Marvel.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/AngelOfInvention.jpg", "PTC.zip/PTC/Angel of Invention.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/AnimationModule.jpg", "PTC.zip/PTC/Animation Module.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/ArchitectOfTheUntamed.jpg", "PTC.zip/PTC/Architect of the Untamed.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/AuthorityOfTheConsuls.jpg", "PTC.zip/PTC/Authority of the Consuls.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/BloomingMarsh.jpg", "PTC.zip/PTC/Blooming Marsh.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/BomatCourier.jpg", "PTC.zip/PTC/Bomat Courier.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/BotanicalSanctum.jpg", "PTC.zip/PTC/Botanical Sanctum.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/BristlingHydra.jpg", "PTC.zip/PTC/Bristling Hydra.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/CapturedByTheConsulate.jpg", "PTC.zip/PTC/Captured by the Consulate.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/CataclysmicGearhulk.jpg", "PTC.zip/PTC/Cataclysmic Gearhulk.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/ChandraTorchOfDefiance.jpg", "PTC.zip/PTC/Chandra, Torch of Defiance.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/CombustibleGearhulk.jpg", "PTC.zip/PTC/Combustible Gearhulk.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/ConcealedCourtyard.jpg", "PTC.zip/PTC/Concealed Courtyard.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/ConfiscationCoup.jpg", "PTC.zip/PTC/Confiscation Coup.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/CultivatorOfBlades.jpg", "PTC.zip/PTC/Cultivator of Blades.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/CultivatorsCaravan.jpg", "PTC.zip/PTC/Cultivator's Caravan.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/DeadlockTrap.jpg", "PTC.zip/PTC/Deadlock Trap.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/DemonOfDarkSchemes.jpg", "PTC.zip/PTC/Demon of Dark Schemes.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/DepalaPilotExemplar.jpg", "PTC.zip/PTC/Depala, Pilot Exemplar.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/DovinBaan.jpg", "PTC.zip/PTC/Dovin Baan.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/DubiousChallenge.jpg", "PTC.zip/PTC/Dubious Challenge.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/DynavoltTower.jpg", "PTC.zip/PTC/Dynavolt Tower.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/ElectrostaticPummeler.jpg", "PTC.zip/PTC/Electrostatic Pummeler.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/EliminateTheCompetition.jpg", "PTC.zip/PTC/Eliminate the Competition.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/FatefulShowdown.jpg", "PTC.zip/PTC/Fateful Showdown.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/FleetwheelCruiser.jpg", "PTC.zip/PTC/Fleetwheel Cruiser.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/Fumigate.jpg", "PTC.zip/PTC/Fumigate.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/GhirapurOrrery.jpg", "PTC.zip/PTC/Ghirapur Orrery.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/GontiLordOfLuxury.jpg", "PTC.zip/PTC/Gonti, Lord of Luxury.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/InsidiousWill.jpg", "PTC.zip/PTC/Insidious Will.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/InspiringVantage.jpg", "PTC.zip/PTC/Inspiring Vantage.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/InventorsFair.jpg", "PTC.zip/PTC/Inventors' Fair.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/KambalConsulOfAllocation.jpg", "PTC.zip/PTC/Kambal, Consul of Allocation.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/KeyToTheCity.jpg", "PTC.zip/PTC/Key to the City.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/LathnuHellion.jpg", "PTC.zip/PTC/Lathnu Hellion.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/LostLegacy.jpg", "PTC.zip/PTC/Lost Legacy.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/MadcapExperiment.jpg", "PTC.zip/PTC/Madcap Experiment.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/MarionetteMaster.jpg", "PTC.zip/PTC/Marionette Master.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/MasterTrinketeer.jpg", "PTC.zip/PTC/Master Trinketeer.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/MetallurgicSummonings.jpg", "PTC.zip/PTC/Metallurgic Summonings.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/MetalworkColossus.jpg", "PTC.zip/PTC/Metalwork Colossus.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/MidnightOil.jpg", "PTC.zip/PTC/Midnight Oil.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/MultiformWonder.jpg", "PTC.zip/PTC/Multiform Wonder.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/NissaVitalForce.jpg", "PTC.zip/PTC/Nissa, Vital Force.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/NoxiousGearhulk.jpg", "PTC.zip/PTC/Noxious Gearhulk.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/OviyaPashiriSageLifecrafter.jpg", "PTC.zip/PTC/Oviya Pashiri, Sage Lifecrafter.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/PadeemConsulOfInnovation.jpg", "PTC.zip/PTC/Padeem, Consul of Innovation.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/Panharmonicon.jpg", "PTC.zip/PTC/Panharmonicon.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/ParadoxicalOutcome.jpg", "PTC.zip/PTC/Paradoxical Outcome.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/PiaNalaar.jpg", "PTC.zip/PTC/Pia Nalaar.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/RashmiEternitiesCrafter.jpg", "PTC.zip/PTC/Rashmi, Eternities Crafter.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/SaheeliRai.jpg", "PTC.zip/PTC/Saheeli Rai.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/SaheelisArtistry.jpg", "PTC.zip/PTC/Saheeli's Artistry.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/ScrapheapScrounger.jpg", "PTC.zip/PTC/Scrapheap Scrounger.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/SkyshipStalker.jpg", "PTC.zip/PTC/Skyship Stalker.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/SkysovereignConsulFlagship.jpg", "PTC.zip/PTC/Skysovereign, Consul Flagship.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/SmugglersCopter.jpg", "PTC.zip/PTC/Smuggler's Copter.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/SpirebluffCanal.jpg", "PTC.zip/PTC/Spirebluff Canal.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/SyndicateTrafficker.jpg", "PTC.zip/PTC/Syndicate Trafficker.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/TerritorialGorger.jpg", "PTC.zip/PTC/Territorial Gorger.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/ToolcraftExemplar.jpg", "PTC.zip/PTC/Toolcraft Exemplar.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/TorrentialGearhulk.jpg", "PTC.zip/PTC/Torrential Gearhulk.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/VerdurousGearhulk.jpg", "PTC.zip/PTC/Verdurous Gearhulk.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/KLD/WildestDreams.jpg", "PTC.zip/PTC/Wildest Dreams.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/AyliEternalPilgrim.jpg", "PTC.zip/PTC/Ayli, Eternal Pilgrim.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/BearerOfSilence.jpg", "PTC.zip/PTC/Bearer of Silence.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/BearerOfTheHeavens.jpg", "PTC.zip/PTC/Bearer of the Heavens.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/CallTheGatewatch.jpg", "PTC.zip/PTC/Call the Gatewatch.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/CaptainsClaws.jpg", "PTC.zip/PTC/Captain's Claws.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/ChandraFlamecaller.jpg", "PTC.zip/PTC/Chandra, Flamecaller.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/ChandraPyromaster.jpg", "PTC.zip/PTC/Chandra, Pyromaster.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/CorruptedCrossroads.jpg", "PTC.zip/PTC/Corrupted Crossroads.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/CrushOfTentacles.jpg", "PTC.zip/PTC/Crush of Tentacles.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/DeceiverOfForm.jpg", "PTC.zip/PTC/Deceiver of Form.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/DeepfathomSkulker.jpg", "PTC.zip/PTC/Deepfathom Skulker.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/DimensionalInfiltrator.jpg", "PTC.zip/PTC/Dimensional Infiltrator.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/DranaLiberatorOfMalakir.jpg", "PTC.zip/PTC/Drana, Liberator of Malakir.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/DreadDefiler.jpg", "PTC.zip/PTC/Dread Defiler.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziDisplacer.jpg", "PTC.zip/PTC/Eldrazi Displacer.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziMimic.jpg", "PTC.zip/PTC/Eldrazi Mimic.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziObligator.jpg", "PTC.zip/PTC/Eldrazi Obligator.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/EndHostilities.jpg", "PTC.zip/PTC/End Hostilities.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/Endbringer.jpg", "PTC.zip/PTC/Endbringer.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/FallOfTheTitans.jpg", "PTC.zip/PTC/Fall of the Titans.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/GeneralTazri.jpg", "PTC.zip/PTC/General Tazri.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/GladehartCavalry.jpg", "PTC.zip/PTC/Gladehart Cavalry.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/GoblinDarkDwellers.jpg", "PTC.zip/PTC/Goblin Dark-Dwellers.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/GoblinRabblemaster.jpg", "PTC.zip/PTC/Goblin Rabblemaster.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/HedronAlignment.jpg", "PTC.zip/PTC/Hedron Alignment.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/HissingQuagmire.jpg", "PTC.zip/PTC/Hissing Quagmire.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/InverterOfTruth.jpg", "PTC.zip/PTC/Inverter of Truth.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/JoriEnRuinDiver.jpg", "PTC.zip/PTC/Jori En, Ruin Diver.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/KalitasTraitorOfGhet.jpg", "PTC.zip/PTC/Kalitas, Traitor of Ghet.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/KozilekTheGreatDistortion.jpg", "PTC.zip/PTC/Kozilek, the Great Distortion.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/KozileksReturn.jpg", "PTC.zip/PTC/Kozilek's Return.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/LinvalaThePreserver.jpg", "PTC.zip/PTC/Linvala, the Preserver.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/MatterReshaper.jpg", "PTC.zip/PTC/Matter Reshaper.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/MinaAndDennWildborn.jpg", "PTC.zip/PTC/Mina and Denn, Wildborn.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/Mirrorpool.jpg", "PTC.zip/PTC/Mirrorpool.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/MundasVanguard.jpg", "PTC.zip/PTC/Munda's Vanguard.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/NeedleSpires.jpg", "PTC.zip/PTC/Needle Spires.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/NissaVoiceOfZendikar.jpg", "PTC.zip/PTC/Nissa, Voice of Zendikar.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfChandra.jpg", "PTC.zip/PTC/Oath of Chandra.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfGideon.jpg", "PTC.zip/PTC/Oath of Gideon.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfJace.jpg", "PTC.zip/PTC/Oath of Jace.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfNissa.jpg", "PTC.zip/PTC/Oath of Nissa.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/OverwhelmingDenial.jpg", "PTC.zip/PTC/Overwhelming Denial.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/RealitySmasher.jpg", "PTC.zip/PTC/Reality Smasher.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/RemorselessPunishment.jpg", "PTC.zip/PTC/Remorseless Punishment.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/RuinsOfOranRief.jpg", "PTC.zip/PTC/Ruins of Oran-Rief.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/SeaGateWreckage.jpg", "PTC.zip/PTC/Sea Gate Wreckage.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/SifterOfSkulls.jpg", "PTC.zip/PTC/Sifter of Skulls.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/SphinxOfTheFinalWord.jpg", "PTC.zip/PTC/Sphinx of the Final Word.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/StoneHavenOutfitter.jpg", "PTC.zip/PTC/Stone Haven Outfitter.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/StoneforgeMasterwork.jpg", "PTC.zip/PTC/Stoneforge Masterwork.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/SylvanAdvocate.jpg", "PTC.zip/PTC/Sylvan Advocate.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/SylvanCaryatid.jpg", "PTC.zip/PTC/Sylvan Caryatid.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/ThoughtKnotSeer.jpg", "PTC.zip/PTC/Thought-Knot Seer.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/TyrantOfValakut.jpg", "PTC.zip/PTC/Tyrant of Valakut.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/VileRedeemer.jpg", "PTC.zip/PTC/Vile Redeemer.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/WanderingFumarole.jpg", "PTC.zip/PTC/Wandering Fumarole.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/WorldBreaker.jpg", "PTC.zip/PTC/World Breaker.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/OGW/ZendikarResurgent.jpg", "PTC.zip/PTC/Zendikar Resurgent.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/AlteredEgo.jpg", "PTC.zip/PTC/Altered Ego.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/AlwaysWatching.jpg", "PTC.zip/PTC/Always Watching.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/AngelOfDeliverance.jpg", "PTC.zip/PTC/Angel of Deliverance.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/AnguishedUnmaking.jpg", "PTC.zip/PTC/Anguished Unmaking.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ArchangelAvacyn.jpg", "PTC.zip/PTC/Archangel Avacyn.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ArlinnKord.jpg", "PTC.zip/PTC/Arlinn Kord.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/AsylumVisitor.jpg", "PTC.zip/PTC/Asylum Visitor.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/AvacynGuardianAngel.jpg", "PTC.zip/PTC/Avacyn, Guardian Angel.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/AvacynsJudgment.jpg", "PTC.zip/PTC/Avacyn's Judgement.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/BeholdTheBeyond.jpg", "PTC.zip/PTC/Behold the Beyond.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/BrainInAJar.jpg", "PTC.zip/PTC/Brain in a Jar.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/BurnFromWithin.jpg", "PTC.zip/PTC/Burn from Within.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/BygoneBishop.jpg", "PTC.zip/PTC/Bygone Bishop.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ChokedEstuary.jpg", "PTC.zip/PTC/Choked Estuary.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ConfirmSuspicions.jpg", "PTC.zip/PTC/Confirm Suspicions.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/CorruptedGrafstone.jpg", "PTC.zip/PTC/Corrupted Grafstone.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/CryptolithRite.jpg", "PTC.zip/PTC/Cryptolith Rite.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/DeathcapCultivator.jpg", "PTC.zip/PTC/Deathcap Cultivator.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/DeclarationInStone.jpg", "PTC.zip/PTC/Declaration in Stone.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/DescendUponTheSinful.jpg", "PTC.zip/PTC/Descend upon the Sinful.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/DevilsPlayground.jpg", "PTC.zip/PTC/Devils' Playground.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/DiregrafColossus.jpg", "PTC.zip/PTC/Diregraf Colossus.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/DrogskolCavalry.jpg", "PTC.zip/PTC/Drogskol Cavalry.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/DrownyardTemple.jpg", "PTC.zip/PTC/Drownyard Temple.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/EerieInterlude.jpg", "PTC.zip/PTC/Eerie Interlude.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/EngulfTheShore.jpg", "PTC.zip/PTC/Engulf the Shore.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/EpiphanyAtTheDrownyard.jpg", "PTC.zip/PTC/Epiphany at the Drownyard.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/EverAfter.jpg", "PTC.zip/PTC/Ever After.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/FalkenrathGorger.jpg", "PTC.zip/PTC/Falkenrath Gorger.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/FeveredVisions.jpg", "PTC.zip/PTC/Fevered Visions.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/FlamebladeAngel.jpg", "PTC.zip/PTC/Flameblade Angel.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ForebodingRuins.jpg", "PTC.zip/PTC/Foreboding Ruins.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ForgottenCreation.jpg", "PTC.zip/PTC/Forgotten Creation.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/FortifiedVillage.jpg", "PTC.zip/PTC/Fortified Village.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/FromUnderTheFloorboards.jpg", "PTC.zip/PTC/From Under the Floorboards.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/GameTrail.jpg", "PTC.zip/PTC/Game Trail.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/GeierReachBandit.jpg", "PTC.zip/PTC/Geier Reach Bandit.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/GeierReachSanitarium.jpg", "PTC.zip/PTC/Geier Reach Sanitarium.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/GeralfsMasterpiece.jpg", "PTC.zip/PTC/Geralf's Masterpiece.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/GoldnightCastigator.jpg", "PTC.zip/PTC/Goldnight Castigator.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/HanweirMilitiaCaptain.jpg", "PTC.zip/PTC/Hanweir Militia Captain.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/HarnessTheStorm.jpg", "PTC.zip/PTC/Harness the Storm.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/InexorableBlob.jpg", "PTC.zip/PTC/Inexorable Blob.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/InvocationOfSaintTraft.jpg", "PTC.zip/PTC/Invocation of Saint Traft.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/JaceTheLivingGuildpact.jpg", "PTC.zip/PTC/Jace, the Living Guildpact.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/JaceUnravelerOfSecrets.jpg", "PTC.zip/PTC/Jace, Unraveler of Secrets.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/MarkovDreadknight.jpg", "PTC.zip/PTC/Markov Dreadknight.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/MindwrackDemon.jpg", "PTC.zip/PTC/Mindwrack Demon.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/NahiriTheHarbinger.jpg", "PTC.zip/PTC/Nahiri, the Harbinger.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/NephaliaMoondrakes.jpg", "PTC.zip/PTC/Nephalia Moondrakes.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/OdricLunarchMarshal.jpg", "PTC.zip/PTC/Odric, Lunarch Marshal.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/OliviaMobilizedForWar.jpg", "PTC.zip/PTC/Olivia, Mobilized for War.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/OrmendahlProfanePrince.jpg", "PTC.zip/PTC/Ormendahl, Profane Prince.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/PortTown.jpg", "PTC.zip/PTC/Port Town.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/PrizedAmalgam.jpg", "PTC.zip/PTC/Prized Amalgam.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/Rattlechains.jpg", "PTC.zip/PTC/Rattlechains.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/RelentlessDead.jpg", "PTC.zip/PTC/Relentless Dead.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SageOfAncientLore.jpg", "PTC.zip/PTC/Sage of Ancient Lore.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ScourgeWolf.jpg", "PTC.zip/PTC/Scourge Wolf.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SeasonsPast.jpg", "PTC.zip/PTC/Seasons Past.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SecondHarvest.jpg", "PTC.zip/PTC/Second Harvest.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SigardaHeronsGrace.jpg", "PTC.zip/PTC/Sigarda, Heron's Grace.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SilverfurPartisan.jpg", "PTC.zip/PTC/Silverfur Partisan.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SinProdder.jpg", "PTC.zip/PTC/Sin Prodder.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SlayersPlate.jpg", "PTC.zip/PTC/Slayer's Plate.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SorinGrimNemesis.jpg", "PTC.zip/PTC/Sorin, Grim Nemesis.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SorinSolemnVisitor.jpg", "PTC.zip/PTC/Sorin, Solemn Visitor.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/SoulSwallower.jpg", "PTC.zip/PTC/Soul Swallower.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/StartledAwake.jpg", "PTC.zip/PTC/Startled Awake.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/TamiyoFieldResearcher.jpg", "PTC.zip/PTC/Tamiyo, Field Researcher.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/TamiyosJournal.jpg", "PTC.zip/PTC/Tamiyo's Journal.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ThaliaHereticCathar.jpg", "PTC.zip/PTC/Thalia, Heretic Cathar.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ThaliasLieutenant.jpg", "PTC.zip/PTC/Thalia's Lieutenant.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/TheGitrogMonster.jpg", "PTC.zip/PTC/The Gitrog Monster.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ThingInTheIce.jpg", "PTC.zip/PTC/Thing in the Ice.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/TirelessTracker.jpg", "PTC.zip/PTC/Tireless Tracker.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/ToTheSlaughter.jpg", "PTC.zip/PTC/To the Slaughter.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/TraverseTheUlvenwald.jpg", "PTC.zip/PTC/Traverse the Ulvenwald.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/Triskaidekaphobia.jpg", "PTC.zip/PTC/Triskaidekaphobia.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/UlvenwaldObserver.jpg", "PTC.zip/PTC/Ulvenwald Observer.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/WelcomeToTheFold.jpg", "PTC.zip/PTC/Welcome to the Fold.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/WestvaleAbbey.jpg", "PTC.zip/PTC/Westvale Abbey.full.jpg"); - copyUrlToImage.put("MTG/PRM/en/foil/Prerelease/SOI/WolfOfDevilsBreach.jpg", "PTC.zip/PTC/Wolf of Devil's Breach.full.jpg"); - copyUrlToImage.put("MTG/THS/en/promo/HerosDownfall.jpg", "PTC.zip/PTC/Hero's Downfall.full.jpg"); - copyUrlToImage.put("MTG/THS/en/promo/ReaperOfTheWilds.jpg", "PTC.zip/PTC/Reaper of the Wilds.full.jpg"); - copyUrlToImage.put("MTG/THS/en/promo/WhipOfErebos.jpg", "PTC.zip/PTC/Whip of Erebos.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/AncientTomb.jpg", "EXP.zip/EXP/Ancient Tomb .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/CascadeBluffs.jpg", "EXP.zip/EXP/Cascade Bluffs .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/DustBowl.jpg", "EXP.zip/EXP/Dust Bowl .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/EyeOfUgin.jpg", "EXP.zip/EXP/Eye of Ugin .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/FetidHeath.jpg", "EXP.zip/EXP/Fetid Heath .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/FireLitThicket.jpg", "EXP.zip/EXP/Fire-Lit Thicket .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/FloodedGrove.jpg", "EXP.zip/EXP/Flooded Grove .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/ForbiddenOrchard.jpg", "EXP.zip/EXP/Forbidden Orchard .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/GravenCairns.jpg", "EXP.zip/EXP/Graven Cairns .full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/HorizonCanopy.jpg", "EXP.zip/EXP/Horizon Canopy.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/KorHaven.jpg", "EXP.zip/EXP/Kor Haven.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/ManaConfluence.jpg", "EXP.zip/EXP/Mana Confluence.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/MysticGate.jpg", "EXP.zip/EXP/Mystic Gate.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/RuggedPrairie.jpg", "EXP.zip/EXP/Rugged Prairie.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/StripMine.jpg", "EXP.zip/EXP/Strip Mine.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/SunkenRuins.jpg", "EXP.zip/EXP/Sunken Ruins.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/TectonicEdge.jpg", "EXP.zip/EXP/Tectonic Edge.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/TwilightMire.jpg", "EXP.zip/EXP/Twilight Mire.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/Wasteland.jpg", "EXP.zip/EXP/Wasteland.full.jpg"); - copyUrlToImage.put("MTG/EXP/en/foil/WoodedBastion.jpg", "EXP.zip/EXP/Wooded Bastion.full.jpg"); - copyUrlToImage.put("apac/1.jpg", "APAC.zip/APAC/Forest.1.full.jpg"); - copyUrlToImage.put("apac/10.jpg", "APAC.zip/APAC/Swamp.10.full.jpg"); - copyUrlToImage.put("apac/11.jpg", "APAC.zip/APAC/Forest.11.full.jpg"); - copyUrlToImage.put("apac/12.jpg", "APAC.zip/APAC/Island.7.full.jpg"); - copyUrlToImage.put("apac/13.jpg", "APAC.zip/APAC/Mountain.13.full.jpg"); - copyUrlToImage.put("apac/14.jpg", "APAC.zip/APAC/Plains.14.full.jpg"); - copyUrlToImage.put("apac/15.jpg", "APAC.zip/APAC/Swamp.15.full.jpg"); - copyUrlToImage.put("apac/2.jpg", "APAC.zip/APAC/Island.2.full.jpg"); - copyUrlToImage.put("apac/3.jpg", "APAC.zip/APAC/Mountain.3.full.jpg"); - copyUrlToImage.put("apac/4.jpg", "APAC.zip/APAC/Plains.4.full.jpg"); - copyUrlToImage.put("apac/5.jpg", "APAC.zip/APAC/Swamp.5.full.jpg"); - copyUrlToImage.put("apac/6.jpg", "APAC.zip/APAC/Forest.6.full.jpg"); - copyUrlToImage.put("apac/7.jpg", "APAC.zip/APAC/Island.12.full.jpg"); - copyUrlToImage.put("apac/8.jpg", "APAC.zip/APAC/Mountain.8.full.jpg"); - copyUrlToImage.put("apac/9.jpg", "APAC.zip/APAC/Plains.9.full.jpg"); - copyUrlToImage.put("arena/1.jpg", "ARENA.zip/ARENA/Plains.1.full.jpg"); - copyUrlToImage.put("arena/10.jpg", "ARENA.zip/ARENA/Swamp.10.full.jpg"); - copyUrlToImage.put("arena/11.jpg", "ARENA.zip/ARENA/Mountain.11.full.jpg"); - copyUrlToImage.put("arena/12.jpg", "ARENA.zip/ARENA/Forest.12.full.jpg"); - copyUrlToImage.put("arena/13.jpg", "ARENA.zip/ARENA/Pouncing Jaguar.full.jpg"); - copyUrlToImage.put("arena/14.jpg", "ARENA.zip/ARENA/Skittering Skirge.full.jpg"); - copyUrlToImage.put("arena/15.jpg", "ARENA.zip/ARENA/Rewind.full.jpg"); - copyUrlToImage.put("arena/16.jpg", "ARENA.zip/ARENA/Karn, Silver Golem.full.jpg"); - copyUrlToImage.put("arena/17.jpg", "ARENA.zip/ARENA/Duress.full.jpg"); - copyUrlToImage.put("arena/18.jpg", "ARENA.zip/ARENA/Uktabi Orangutan.full.jpg"); - copyUrlToImage.put("arena/19.jpg", "ARENA.zip/ARENA/Chill.full.jpg"); - copyUrlToImage.put("arena/2.jpg", "ARENA.zip/ARENA/Island.2.full.jpg"); - copyUrlToImage.put("arena/20.jpg", "ARENA.zip/ARENA/Pillage.full.jpg"); - copyUrlToImage.put("arena/21.jpg", "ARENA.zip/ARENA/Enlightened Tutor.full.jpg"); - copyUrlToImage.put("arena/22.jpg", "ARENA.zip/ARENA/Stupor.full.jpg"); - copyUrlToImage.put("arena/23.jpg", "ARENA.zip/ARENA/Plains.23.full.jpg"); - copyUrlToImage.put("arena/24.jpg", "ARENA.zip/ARENA/Island.24.full.jpg"); - copyUrlToImage.put("arena/25.jpg", "ARENA.zip/ARENA/Swamp.25.full.jpg"); - copyUrlToImage.put("arena/26.jpg", "ARENA.zip/ARENA/Mountain.26.full.jpg"); - copyUrlToImage.put("arena/27.jpg", "ARENA.zip/ARENA/Forest.27.full.jpg"); - copyUrlToImage.put("arena/28.jpg", "ARENA.zip/ARENA/Creeping Mold.full.jpg"); - copyUrlToImage.put("arena/29.jpg", "ARENA.zip/ARENA/Dismiss.full.jpg"); - copyUrlToImage.put("arena/3.jpg", "ARENA.zip/ARENA/Swamp.3.full.jpg"); - copyUrlToImage.put("arena/30.jpg", "ARENA.zip/ARENA/Fling.full.jpg"); - copyUrlToImage.put("arena/31.jpg", "ARENA.zip/ARENA/Empyrial Armor.full.jpg"); - copyUrlToImage.put("arena/32.jpg", "ARENA.zip/ARENA/Plains.32.full.jpg"); - copyUrlToImage.put("arena/33.jpg", "ARENA.zip/ARENA/Island.33.full.jpg"); - copyUrlToImage.put("arena/34.jpg", "ARENA.zip/ARENA/Swamp.34.full.jpg"); - copyUrlToImage.put("arena/35.jpg", "ARENA.zip/ARENA/Mountain.35.full.jpg"); - copyUrlToImage.put("arena/36.jpg", "ARENA.zip/ARENA/Forest.36.full.jpg"); - copyUrlToImage.put("arena/37.jpg", "ARENA.zip/ARENA/Diabolic Edict.full.jpg"); - copyUrlToImage.put("arena/38.jpg", "ARENA.zip/ARENA/Gaea's Blessing.full.jpg"); - copyUrlToImage.put("arena/39.jpg", "ARENA.zip/ARENA/Island.39.full.jpg"); - copyUrlToImage.put("arena/4.jpg", "ARENA.zip/ARENA/Mountain.4.full.jpg"); - copyUrlToImage.put("arena/40.jpg", "ARENA.zip/ARENA/Forest.40.full.jpg"); - copyUrlToImage.put("arena/41.jpg", "ARENA.zip/ARENA/Man-o'-War.full.jpg"); - copyUrlToImage.put("arena/42.jpg", "ARENA.zip/ARENA/Arc Lightning.full.jpg"); - copyUrlToImage.put("arena/43.jpg", "ARENA.zip/ARENA/Dauthi Slayer.full.jpg"); - copyUrlToImage.put("arena/44.jpg", "ARENA.zip/ARENA/Mana Leak.full.jpg"); - copyUrlToImage.put("arena/45.jpg", "ARENA.zip/ARENA/Plains.45.full.jpg"); - copyUrlToImage.put("arena/46.jpg", "ARENA.zip/ARENA/Island.46.full.jpg"); - copyUrlToImage.put("arena/47.jpg", "ARENA.zip/ARENA/Swamp.47.full.jpg"); - copyUrlToImage.put("arena/48.jpg", "ARENA.zip/ARENA/Mountain.48.full.jpg"); - copyUrlToImage.put("arena/5.jpg", "ARENA.zip/ARENA/Forest.5.full.jpg"); - copyUrlToImage.put("arena/50.jpg", "ARENA.zip/ARENA/Skirk Marauder.full.jpg"); - copyUrlToImage.put("arena/51.jpg", "ARENA.zip/ARENA/Elvish Aberration.full.jpg"); - copyUrlToImage.put("arena/52.jpg", "ARENA.zip/ARENA/Bonesplitter.full.jpg"); - copyUrlToImage.put("arena/53.jpg", "ARENA.zip/ARENA/Plains.53.full.jpg"); - copyUrlToImage.put("arena/54.jpg", "ARENA.zip/ARENA/Island.54.full.jpg"); - copyUrlToImage.put("arena/55.jpg", "ARENA.zip/ARENA/Swamp.55.full.jpg"); - copyUrlToImage.put("arena/56.jpg", "ARENA.zip/ARENA/Mountain.56.full.jpg"); - copyUrlToImage.put("arena/57.jpg", "ARENA.zip/ARENA/Forest.57.full.jpg"); - copyUrlToImage.put("arena/58.jpg", "ARENA.zip/ARENA/Darksteel Ingot.full.jpg"); - copyUrlToImage.put("arena/59.jpg", "ARENA.zip/ARENA/Serum Visions.full.jpg"); - copyUrlToImage.put("arena/6.jpg", "ARENA.zip/ARENA/Disenchant.full.jpg"); - copyUrlToImage.put("arena/60.jpg", "ARENA.zip/ARENA/Glacial Ray.full.jpg"); - copyUrlToImage.put("arena/61.jpg", "ARENA.zip/ARENA/Circle of Protection Art.full.jpg"); - copyUrlToImage.put("arena/62.jpg", "ARENA.zip/ARENA/Mise.full.jpg"); - copyUrlToImage.put("arena/63.jpg", "ARENA.zip/ARENA/Booster Tutor.full.jpg"); - copyUrlToImage.put("arena/64.jpg", "ARENA.zip/ARENA/Goblin Mime.full.jpg"); - copyUrlToImage.put("arena/65.jpg", "ARENA.zip/ARENA/Granny's Payback.full.jpg"); - copyUrlToImage.put("arena/66.jpg", "ARENA.zip/ARENA/Ashnod's Coupon.full.jpg"); - copyUrlToImage.put("arena/67.jpg", "ARENA.zip/ARENA/Plains.67.full.jpg"); - copyUrlToImage.put("arena/68.jpg", "ARENA.zip/ARENA/Island.68.full.jpg"); - copyUrlToImage.put("arena/69.jpg", "ARENA.zip/ARENA/Swamp.69.full.jpg"); - copyUrlToImage.put("arena/7.jpg", "ARENA.zip/ARENA/Fireball.full.jpg"); - copyUrlToImage.put("arena/70.jpg", "ARENA.zip/ARENA/Mountain.70.full.jpg"); - copyUrlToImage.put("arena/71.jpg", "ARENA.zip/ARENA/Forest.71.full.jpg"); - copyUrlToImage.put("arena/72.jpg", "ARENA.zip/ARENA/Genju of the Spires.full.jpg"); - copyUrlToImage.put("arena/73.jpg", "ARENA.zip/ARENA/Okina Nightwatch.full.jpg"); - copyUrlToImage.put("arena/74.jpg", "ARENA.zip/ARENA/Skyknight Legionnaire.full.jpg"); - copyUrlToImage.put("arena/75.jpg", "ARENA.zip/ARENA/Plains.75.full.jpg"); - copyUrlToImage.put("arena/76.jpg", "ARENA.zip/ARENA/Island.76.full.jpg"); - copyUrlToImage.put("arena/77.jpg", "ARENA.zip/ARENA/Swamp.77.full.jpg"); - copyUrlToImage.put("arena/78.jpg", "ARENA.zip/ARENA/Mountain.78.full.jpg"); - copyUrlToImage.put("arena/8.jpg", "ARENA.zip/ARENA/Plains.8.full.jpg"); - copyUrlToImage.put("arena/80.jpg", "ARENA.zip/ARENA/Castigate.full.jpg"); - copyUrlToImage.put("arena/81.jpg", "ARENA.zip/ARENA/Wee Dragonauts.full.jpg"); - copyUrlToImage.put("arena/82.jpg", "ARENA.zip/ARENA/Coiling Oracle.full.jpg"); - copyUrlToImage.put("arena/83.jpg", "ARENA.zip/ARENA/Surging Flame.full.jpg"); - copyUrlToImage.put("arena/9.jpg", "ARENA.zip/ARENA/Island.9.full.jpg"); - copyUrlToImage.put("euro/1.jpg", "EURO.zip/EURO/Forest.1.full.jpg"); - copyUrlToImage.put("euro/10.jpg", "EURO.zip/EURO/Swamp.10.full.jpg"); - copyUrlToImage.put("euro/11.jpg", "EURO.zip/EURO/Forest.11.full.jpg"); - copyUrlToImage.put("euro/12.jpg", "EURO.zip/EURO/Island.12.full.jpg"); - copyUrlToImage.put("euro/13.jpg", "EURO.zip/EURO/Mountain.13.full.jpg"); - copyUrlToImage.put("euro/14.jpg", "EURO.zip/EURO/Plains.14.full.jpg"); - copyUrlToImage.put("euro/15.jpg", "EURO.zip/EURO/Swamp.15.full.jpg"); - copyUrlToImage.put("euro/2.jpg", "EURO.zip/EURO/Island.2.full.jpg"); - copyUrlToImage.put("euro/3.jpg", "EURO.zip/EURO/Mountain.3.full.jpg"); - copyUrlToImage.put("euro/4.jpg", "EURO.zip/EURO/Plains.4.full.jpg"); - copyUrlToImage.put("euro/5.jpg", "EURO.zip/EURO/Swamp.5.full.jpg"); - copyUrlToImage.put("euro/6.jpg", "EURO.zip/EURO/Forest.6.full.jpg"); - copyUrlToImage.put("euro/7.jpg", "EURO.zip/EURO/Island.7.full.jpg"); - copyUrlToImage.put("euro/8.jpg", "EURO.zip/EURO/Mountain.8.full.jpg"); - copyUrlToImage.put("euro/9.jpg", "EURO.zip/EURO/Plains.9.full.jpg"); - copyUrlToImage.put("exp/1.jpg", "EXP.zip/EXP/Prairie Stream.full.jpg"); - copyUrlToImage.put("exp/10.jpg", "EXP.zip/EXP/Temple Garden.full.jpg"); - copyUrlToImage.put("exp/11.jpg", "EXP.zip/EXP/Godless Shrine.full.jpg"); - copyUrlToImage.put("exp/12.jpg", "EXP.zip/EXP/Steam Vents.full.jpg"); - copyUrlToImage.put("exp/13.jpg", "EXP.zip/EXP/Overgrown Tomb.full.jpg"); - copyUrlToImage.put("exp/14.jpg", "EXP.zip/EXP/Sacred Foundry.full.jpg"); - copyUrlToImage.put("exp/15.jpg", "EXP.zip/EXP/Breeding Pool.full.jpg"); - copyUrlToImage.put("exp/16.jpg", "EXP.zip/EXP/Flooded Strand.full.jpg"); - copyUrlToImage.put("exp/17.jpg", "EXP.zip/EXP/Polluted Delta.full.jpg"); - copyUrlToImage.put("exp/18.jpg", "EXP.zip/EXP/Bloodstained Mire.full.jpg"); - copyUrlToImage.put("exp/19.jpg", "EXP.zip/EXP/Wooded Foothills.full.jpg"); - copyUrlToImage.put("exp/2.jpg", "EXP.zip/EXP/Sunken Hollow.full.jpg"); - copyUrlToImage.put("exp/20.jpg", "EXP.zip/EXP/Windswept Heath.full.jpg"); - copyUrlToImage.put("exp/21.jpg", "EXP.zip/EXP/Marsh Flats.full.jpg"); - copyUrlToImage.put("exp/22.jpg", "EXP.zip/EXP/Scalding Tarn.full.jpg"); - copyUrlToImage.put("exp/23.jpg", "EXP.zip/EXP/Verdant Catacombs.full.jpg"); - copyUrlToImage.put("exp/24.jpg", "EXP.zip/EXP/Arid Mesa.full.jpg"); - copyUrlToImage.put("exp/25.jpg", "EXP.zip/EXP/Misty Rainforest.full.jpg"); - copyUrlToImage.put("exp/3.jpg", "EXP.zip/EXP/Smoldering Marsh.full.jpg"); - copyUrlToImage.put("exp/4.jpg", "EXP.zip/EXP/Cinder Glade.full.jpg"); - copyUrlToImage.put("exp/5.jpg", "EXP.zip/EXP/Canopy Vista.full.jpg"); - copyUrlToImage.put("exp/6.jpg", "EXP.zip/EXP/Hallowed Fountain.full.jpg"); - copyUrlToImage.put("exp/7.jpg", "EXP.zip/EXP/Watery Grave.full.jpg"); - copyUrlToImage.put("exp/8.jpg", "EXP.zip/EXP/Blood Crypt.full.jpg"); - copyUrlToImage.put("exp/9.jpg", "EXP.zip/EXP/Stomping Ground.full.jpg"); - copyUrlToImage.put("fnmp/1.jpg", "FNMP.zip/FNMP/River Boa.full.jpg"); - copyUrlToImage.put("fnmp/10.jpg", "FNMP.zip/FNMP/Stone Rain.full.jpg"); - copyUrlToImage.put("fnmp/100.jpg", "FNMP.zip/FNMP/Thirst for Knowledge.full.jpg"); - copyUrlToImage.put("fnmp/101.jpg", "FNMP.zip/FNMP/Serrated Arrows.full.jpg"); - copyUrlToImage.put("fnmp/102.jpg", "FNMP.zip/FNMP/Isochron Scepter.full.jpg"); - copyUrlToImage.put("fnmp/103.jpg", "FNMP.zip/FNMP/Shrapnel Blast.full.jpg"); - copyUrlToImage.put("fnmp/104.jpg", "FNMP.zip/FNMP/Magma Jet.full.jpg"); - copyUrlToImage.put("fnmp/105.jpg", "FNMP.zip/FNMP/Myr Enforcer.full.jpg"); - copyUrlToImage.put("fnmp/106.jpg", "FNMP.zip/FNMP/Kitchen Finks.full.jpg"); - copyUrlToImage.put("fnmp/107.jpg", "FNMP.zip/FNMP/Merrow Reejerey.full.jpg"); - copyUrlToImage.put("fnmp/108.jpg", "FNMP.zip/FNMP/Wren's Run Vanquisher.full.jpg"); - copyUrlToImage.put("fnmp/109.jpg", "FNMP.zip/FNMP/Mulldrifter.full.jpg"); - copyUrlToImage.put("fnmp/11.jpg", "FNMP.zip/FNMP/Llanowar Elves.full.jpg"); - copyUrlToImage.put("fnmp/110.jpg", "FNMP.zip/FNMP/Murderous Redcap.full.jpg"); - copyUrlToImage.put("fnmp/111.jpg", "FNMP.zip/FNMP/Lightning Greaves.full.jpg"); - copyUrlToImage.put("fnmp/112.jpg", "FNMP.zip/FNMP/Watchwolf.full.jpg"); - copyUrlToImage.put("fnmp/113.jpg", "FNMP.zip/FNMP/Browbeat.full.jpg"); - copyUrlToImage.put("fnmp/114.jpg", "FNMP.zip/FNMP/Oblivion Ring.full.jpg"); - copyUrlToImage.put("fnmp/115.jpg", "FNMP.zip/FNMP/Sakura-Tribe Elder.full.jpg"); - copyUrlToImage.put("fnmp/116.jpg", "FNMP.zip/FNMP/Tidehollow Sculler.full.jpg"); - copyUrlToImage.put("fnmp/117.jpg", "FNMP.zip/FNMP/Ghostly Prison.full.jpg"); - copyUrlToImage.put("fnmp/118.jpg", "FNMP.zip/FNMP/Ancient Ziggurat.full.jpg"); - copyUrlToImage.put("fnmp/119.jpg", "FNMP.zip/FNMP/Bloodbraid Elf.full.jpg"); - copyUrlToImage.put("fnmp/12.jpg", "FNMP.zip/FNMP/Swords to Plowshares.full.jpg"); - copyUrlToImage.put("fnmp/120.jpg", "FNMP.zip/FNMP/Cloudpost.full.jpg"); - copyUrlToImage.put("fnmp/121.jpg", "FNMP.zip/FNMP/Elvish Visionary.full.jpg"); - copyUrlToImage.put("fnmp/122.jpg", "FNMP.zip/FNMP/Anathemancer.full.jpg"); - copyUrlToImage.put("fnmp/123.jpg", "FNMP.zip/FNMP/Krosan Grip.full.jpg"); - copyUrlToImage.put("fnmp/124.jpg", "FNMP.zip/FNMP/Qasali Pridemage.full.jpg"); - copyUrlToImage.put("fnmp/125.jpg", "FNMP.zip/FNMP/Rift Bolt.full.jpg"); - copyUrlToImage.put("fnmp/126.jpg", "FNMP.zip/FNMP/Gatekeeper of Malakir.full.jpg"); - copyUrlToImage.put("fnmp/127.jpg", "FNMP.zip/FNMP/Wild Nacatl.full.jpg"); - copyUrlToImage.put("fnmp/128.jpg", "FNMP.zip/FNMP/Everflowing Chalice.full.jpg"); - copyUrlToImage.put("fnmp/129.jpg", "FNMP.zip/FNMP/Spellstutter Sprite.full.jpg"); - copyUrlToImage.put("fnmp/13.jpg", "FNMP.zip/FNMP/Ophidian.full.jpg"); - copyUrlToImage.put("fnmp/130.jpg", "FNMP.zip/FNMP/Wall of Omens.full.jpg"); - copyUrlToImage.put("fnmp/131.jpg", "FNMP.zip/FNMP/Artisan of Kozilek.full.jpg"); - copyUrlToImage.put("fnmp/132.jpg", "FNMP.zip/FNMP/Squadron Hawk.full.jpg"); - copyUrlToImage.put("fnmp/133.jpg", "FNMP.zip/FNMP/Rhox War Monk.full.jpg"); - copyUrlToImage.put("fnmp/134.jpg", "FNMP.zip/FNMP/Jace's Ingenuity.full.jpg"); - copyUrlToImage.put("fnmp/135.jpg", "FNMP.zip/FNMP/Cultivate.full.jpg"); - copyUrlToImage.put("fnmp/136.jpg", "FNMP.zip/FNMP/Teetering Peaks.full.jpg"); - copyUrlToImage.put("fnmp/137.jpg", "FNMP.zip/FNMP/Contagion Clasp.full.jpg"); - copyUrlToImage.put("fnmp/138.jpg", "FNMP.zip/FNMP/Go for the Throat.full.jpg"); - copyUrlToImage.put("fnmp/139.jpg", "FNMP.zip/FNMP/Savage Lands.full.jpg"); - copyUrlToImage.put("fnmp/14.jpg", "FNMP.zip/FNMP/Jackal Pup.full.jpg"); - copyUrlToImage.put("fnmp/140.jpg", "FNMP.zip/FNMP/Glistener Elf.full.jpg"); - copyUrlToImage.put("fnmp/141.jpg", "FNMP.zip/FNMP/Despise.full.jpg"); - copyUrlToImage.put("fnmp/142.jpg", "FNMP.zip/FNMP/Tectonic Edge.full.jpg"); - copyUrlToImage.put("fnmp/143.jpg", "FNMP.zip/FNMP/Dismember.full.jpg"); - copyUrlToImage.put("fnmp/144.jpg", "FNMP.zip/FNMP/Ancient Grudge.full.jpg"); - copyUrlToImage.put("fnmp/145.jpg", "FNMP.zip/FNMP/Acidic Slime.full.jpg"); - copyUrlToImage.put("fnmp/146.jpg", "FNMP.zip/FNMP/Forbidden Alchemy.full.jpg"); - copyUrlToImage.put("fnmp/147.jpg", "FNMP.zip/FNMP/Avacyn's Pilgrim.full.jpg"); - copyUrlToImage.put("fnmp/148.jpg", "FNMP.zip/FNMP/Lingering Souls.full.jpg"); - copyUrlToImage.put("fnmp/149.jpg", "FNMP.zip/FNMP/Evolving Wilds.full.jpg"); - copyUrlToImage.put("fnmp/15.jpg", "FNMP.zip/FNMP/Quirion Ranger.full.jpg"); - copyUrlToImage.put("fnmp/150.jpg", "FNMP.zip/FNMP/Pillar of Flame.full.jpg"); - copyUrlToImage.put("fnmp/151.jpg", "FNMP.zip/FNMP/Gitaxian Probe.full.jpg"); - copyUrlToImage.put("fnmp/152.jpg", "FNMP.zip/FNMP/Searing Spear.full.jpg"); - copyUrlToImage.put("fnmp/153.jpg", "FNMP.zip/FNMP/Reliquary Tower.full.jpg"); - copyUrlToImage.put("fnmp/154.jpg", "FNMP.zip/FNMP/Farseek.full.jpg"); - copyUrlToImage.put("fnmp/155.jpg", "FNMP.zip/FNMP/Call of the Conclave.full.jpg"); - copyUrlToImage.put("fnmp/156.jpg", "FNMP.zip/FNMP/Judge's Familiar.full.jpg"); - copyUrlToImage.put("fnmp/157.jpg", "FNMP.zip/FNMP/Izzet Charm.full.jpg"); - copyUrlToImage.put("fnmp/158.jpg", "FNMP.zip/FNMP/Rakdos Cackler.full.jpg"); - copyUrlToImage.put("fnmp/159.jpg", "FNMP.zip/FNMP/Dimir Charm.full.jpg"); - copyUrlToImage.put("fnmp/16.jpg", "FNMP.zip/FNMP/Carnophage.full.jpg"); - copyUrlToImage.put("fnmp/160.jpg", "FNMP.zip/FNMP/Experiment One.full.jpg"); - copyUrlToImage.put("fnmp/161.jpg", "FNMP.zip/FNMP/Ghor-Clan Rampager.full.jpg"); - copyUrlToImage.put("fnmp/162.jpg", "FNMP.zip/FNMP/Grisly Salvage.full.jpg"); - copyUrlToImage.put("fnmp/163.jpg", "FNMP.zip/FNMP/Sin Collector.full.jpg"); - copyUrlToImage.put("fnmp/164.jpg", "FNMP.zip/FNMP/Warleader's Helix.full.jpg"); - copyUrlToImage.put("fnmp/165.jpg", "FNMP.zip/FNMP/Elvish Mystic.full.jpg"); - copyUrlToImage.put("fnmp/166.jpg", "FNMP.zip/FNMP/Banisher Priest.full.jpg"); - copyUrlToImage.put("fnmp/167.jpg", "FNMP.zip/FNMP/Encroaching Wastes.full.jpg"); - copyUrlToImage.put("fnmp/168.jpg", "FNMP.zip/FNMP/Tormented Hero.full.jpg"); - copyUrlToImage.put("fnmp/169.jpg", "FNMP.zip/FNMP/Dissolve.full.jpg"); - copyUrlToImage.put("fnmp/17.jpg", "FNMP.zip/FNMP/Impulse.full.jpg"); - copyUrlToImage.put("fnmp/170.jpg", "FNMP.zip/FNMP/Magma Spray.full.jpg"); - copyUrlToImage.put("fnmp/171.jpg", "FNMP.zip/FNMP/Bile Blight.full.jpg"); - copyUrlToImage.put("fnmp/172.jpg", "FNMP.zip/FNMP/Banishing Light.full.jpg"); - copyUrlToImage.put("fnmp/173.jpg", "FNMP.zip/FNMP/Fanatic of Xenagos.full.jpg"); - copyUrlToImage.put("fnmp/174.jpg", "FNMP.zip/FNMP/Brain Maggot.full.jpg"); - copyUrlToImage.put("fnmp/175.jpg", "FNMP.zip/FNMP/Stoke the Flames.full.jpg"); - copyUrlToImage.put("fnmp/176.jpg", "FNMP.zip/FNMP/Frenzied Goblin.full.jpg"); - copyUrlToImage.put("fnmp/177.jpg", "FNMP.zip/FNMP/Disdainful Stroke.full.jpg"); - copyUrlToImage.put("fnmp/178.jpg", "FNMP.zip/FNMP/Hordeling Outburst.full.jpg"); - copyUrlToImage.put("fnmp/179.jpg", "FNMP.zip/FNMP/Suspension Field.full.jpg"); - copyUrlToImage.put("fnmp/18.jpg", "FNMP.zip/FNMP/Fireblast.full.jpg"); - copyUrlToImage.put("fnmp/180.jpg", "FNMP.zip/FNMP/Abzan Beastmaster.full.jpg"); - copyUrlToImage.put("fnmp/181.jpg", "FNMP.zip/FNMP/Frost Walker.full.jpg"); - copyUrlToImage.put("fnmp/182.jpg", "FNMP.zip/FNMP/Path to Exile.full.jpg"); - copyUrlToImage.put("fnmp/183.jpg", "FNMP.zip/FNMP/Serum Visions.full.jpg"); - copyUrlToImage.put("fnmp/184.jpg", "FNMP.zip/FNMP/Orator of Ojutai.full.jpg"); - copyUrlToImage.put("fnmp/186.jpg", "FNMP.zip/FNMP/Roast.full.jpg"); - copyUrlToImage.put("fnmp/187.jpg", "FNMP.zip/FNMP/Anticipate.full.jpg"); - copyUrlToImage.put("fnmp/188.jpg", "FNMP.zip/FNMP/Nissa's Pilgrimage.full.jpg"); - copyUrlToImage.put("fnmp/189.jpg", "FNMP.zip/FNMP/Clash of Wills.full.jpg"); - copyUrlToImage.put("fnmp/19.jpg", "FNMP.zip/FNMP/Soltari Priest.full.jpg"); - copyUrlToImage.put("fnmp/190.jpg", "FNMP.zip/FNMP/Smash to Smithereens.full.jpg"); - copyUrlToImage.put("fnmp/191.jpg", "FNMP.zip/FNMP/Blighted Fen.full.jpg"); - copyUrlToImage.put("fnmp/2.jpg", "FNMP.zip/FNMP/Terror.full.jpg"); - copyUrlToImage.put("fnmp/20.jpg", "FNMP.zip/FNMP/Albino Troll.full.jpg"); - copyUrlToImage.put("fnmp/21.jpg", "FNMP.zip/FNMP/Dissipate.full.jpg"); - copyUrlToImage.put("fnmp/22.jpg", "FNMP.zip/FNMP/Black Knight.full.jpg"); - copyUrlToImage.put("fnmp/23.jpg", "FNMP.zip/FNMP/Wall of Blossoms.full.jpg"); - copyUrlToImage.put("fnmp/24.jpg", "FNMP.zip/FNMP/Fireslinger.full.jpg"); - copyUrlToImage.put("fnmp/25.jpg", "FNMP.zip/FNMP/Drain Life.full.jpg"); - copyUrlToImage.put("fnmp/26.jpg", "FNMP.zip/FNMP/Aura of Silence.full.jpg"); - copyUrlToImage.put("fnmp/27.jpg", "FNMP.zip/FNMP/Forbid.full.jpg"); - copyUrlToImage.put("fnmp/28.jpg", "FNMP.zip/FNMP/Spike Feeder.full.jpg"); - copyUrlToImage.put("fnmp/29.jpg", "FNMP.zip/FNMP/Mogg Fanatic.full.jpg"); - copyUrlToImage.put("fnmp/3.jpg", "FNMP.zip/FNMP/Longbow Archer.full.jpg"); - copyUrlToImage.put("fnmp/30.jpg", "FNMP.zip/FNMP/White Knight.full.jpg"); - copyUrlToImage.put("fnmp/31.jpg", "FNMP.zip/FNMP/Disenchant.full.jpg"); - copyUrlToImage.put("fnmp/32.jpg", "FNMP.zip/FNMP/Bottle Gnomes.full.jpg"); - copyUrlToImage.put("fnmp/33.jpg", "FNMP.zip/FNMP/Muscle Sliver.full.jpg"); - copyUrlToImage.put("fnmp/34.jpg", "FNMP.zip/FNMP/Crystalline Sliver.full.jpg"); - copyUrlToImage.put("fnmp/35.jpg", "FNMP.zip/FNMP/Capsize.full.jpg"); - copyUrlToImage.put("fnmp/36.jpg", "FNMP.zip/FNMP/Priest of Titania.full.jpg"); - copyUrlToImage.put("fnmp/37.jpg", "FNMP.zip/FNMP/Goblin Bombardment.full.jpg"); - copyUrlToImage.put("fnmp/38.jpg", "FNMP.zip/FNMP/Scragnoth.full.jpg"); - copyUrlToImage.put("fnmp/39.jpg", "FNMP.zip/FNMP/Smother.full.jpg"); - copyUrlToImage.put("fnmp/4.jpg", "FNMP.zip/FNMP/Volcanic Geyser.full.jpg"); - copyUrlToImage.put("fnmp/40.jpg", "FNMP.zip/FNMP/Whipcorder.full.jpg"); - copyUrlToImage.put("fnmp/41.jpg", "FNMP.zip/FNMP/Sparksmith.full.jpg"); - copyUrlToImage.put("fnmp/42.jpg", "FNMP.zip/FNMP/Krosan Tusker.full.jpg"); - copyUrlToImage.put("fnmp/43.jpg", "FNMP.zip/FNMP/Withered Wretch.full.jpg"); - copyUrlToImage.put("fnmp/44.jpg", "FNMP.zip/FNMP/Willbender.full.jpg"); - copyUrlToImage.put("fnmp/45.jpg", "FNMP.zip/FNMP/Slice and Dice.full.jpg"); - copyUrlToImage.put("fnmp/46.jpg", "FNMP.zip/FNMP/Silver Knight.full.jpg"); - copyUrlToImage.put("fnmp/47.jpg", "FNMP.zip/FNMP/Krosan Warchief.full.jpg"); - copyUrlToImage.put("fnmp/48.jpg", "FNMP.zip/FNMP/Lightning Rift.full.jpg"); - copyUrlToImage.put("fnmp/49.jpg", "FNMP.zip/FNMP/Carrion Feeder.full.jpg"); - copyUrlToImage.put("fnmp/5.jpg", "FNMP.zip/FNMP/Mind Warp.full.jpg"); - copyUrlToImage.put("fnmp/50.jpg", "FNMP.zip/FNMP/Treetop Village.full.jpg"); - copyUrlToImage.put("fnmp/51.jpg", "FNMP.zip/FNMP/Accumulated Knowledge.full.jpg"); - copyUrlToImage.put("fnmp/52.jpg", "FNMP.zip/FNMP/Avalanche Riders.full.jpg"); - copyUrlToImage.put("fnmp/53.jpg", "FNMP.zip/FNMP/Reanimate.full.jpg"); - copyUrlToImage.put("fnmp/54.jpg", "FNMP.zip/FNMP/Mother of Runes.full.jpg"); - copyUrlToImage.put("fnmp/55.jpg", "FNMP.zip/FNMP/Brainstorm.full.jpg"); - copyUrlToImage.put("fnmp/56.jpg", "FNMP.zip/FNMP/Rancor.full.jpg"); - copyUrlToImage.put("fnmp/57.jpg", "FNMP.zip/FNMP/Seal of Cleansing.full.jpg"); - copyUrlToImage.put("fnmp/58.jpg", "FNMP.zip/FNMP/Flametongue Kavu.full.jpg"); - copyUrlToImage.put("fnmp/59.jpg", "FNMP.zip/FNMP/Blastoderm.full.jpg"); - copyUrlToImage.put("fnmp/6.jpg", "FNMP.zip/FNMP/Shock.full.jpg"); - copyUrlToImage.put("fnmp/60.jpg", "FNMP.zip/FNMP/Cabal Therapy.full.jpg"); - copyUrlToImage.put("fnmp/61.jpg", "FNMP.zip/FNMP/Fact or Fiction.full.jpg"); - copyUrlToImage.put("fnmp/62.jpg", "FNMP.zip/FNMP/Juggernaut.full.jpg"); - copyUrlToImage.put("fnmp/63.jpg", "FNMP.zip/FNMP/Circle of Protection Red.full.jpg"); - copyUrlToImage.put("fnmp/64.jpg", "FNMP.zip/FNMP/Kird Ape.full.jpg"); - copyUrlToImage.put("fnmp/65.jpg", "FNMP.zip/FNMP/Duress.full.jpg"); - copyUrlToImage.put("fnmp/66.jpg", "FNMP.zip/FNMP/Counterspell.full.jpg"); - copyUrlToImage.put("fnmp/67.jpg", "FNMP.zip/FNMP/Icy Manipulator.full.jpg"); - copyUrlToImage.put("fnmp/68.jpg", "FNMP.zip/FNMP/Elves of Deep Shadow.full.jpg"); - copyUrlToImage.put("fnmp/69.jpg", "FNMP.zip/FNMP/Armadillo Cloak.full.jpg"); - copyUrlToImage.put("fnmp/7.jpg", "FNMP.zip/FNMP/Staunch Defenders.full.jpg"); - copyUrlToImage.put("fnmp/70.jpg", "FNMP.zip/FNMP/Terminate.full.jpg"); - copyUrlToImage.put("fnmp/71.jpg", "FNMP.zip/FNMP/Lobotomy.full.jpg"); - copyUrlToImage.put("fnmp/72.jpg", "FNMP.zip/FNMP/Goblin Warchief.full.jpg"); - copyUrlToImage.put("fnmp/73.jpg", "FNMP.zip/FNMP/Wild Mongrel.full.jpg"); - copyUrlToImage.put("fnmp/74.jpg", "FNMP.zip/FNMP/Chainer's Edict.full.jpg"); - copyUrlToImage.put("fnmp/75.jpg", "FNMP.zip/FNMP/Circular Logic.full.jpg"); - copyUrlToImage.put("fnmp/76.jpg", "FNMP.zip/FNMP/Astral Slide.full.jpg"); - copyUrlToImage.put("fnmp/77.jpg", "FNMP.zip/FNMP/Arrogant Wurm.full.jpg"); - copyUrlToImage.put("fnmp/78a.jpg", "FNMP.zip/FNMP/Life (Life/Death.full.jpg"); - copyUrlToImage.put("fnmp/78b.jpg", "FNMP.zip/FNMP/Death (Life/Death).full.jpg"); - copyUrlToImage.put("fnmp/79a.jpg", "FNMP.zip/FNMP/Fire (Fire/Ice).full.jpg"); - copyUrlToImage.put("fnmp/79b.jpg", "FNMP.zip/FNMP/Ice (Fire/Ice).full.jpg"); - copyUrlToImage.put("fnmp/8.jpg", "FNMP.zip/FNMP/Giant Growth.full.jpg"); - copyUrlToImage.put("fnmp/80.jpg", "FNMP.zip/FNMP/Firebolt.full.jpg"); - copyUrlToImage.put("fnmp/81.jpg", "FNMP.zip/FNMP/Deep Analysis.full.jpg"); - copyUrlToImage.put("fnmp/82.jpg", "FNMP.zip/FNMP/Gerrard's Verdict.full.jpg"); - copyUrlToImage.put("fnmp/83.jpg", "FNMP.zip/FNMP/Basking Rootwalla.full.jpg"); - copyUrlToImage.put("fnmp/84.jpg", "FNMP.zip/FNMP/Wonder.full.jpg"); - copyUrlToImage.put("fnmp/85.jpg", "FNMP.zip/FNMP/Goblin Legionnaire.full.jpg"); - copyUrlToImage.put("fnmp/86.jpg", "FNMP.zip/FNMP/Engineered Plague.full.jpg"); - copyUrlToImage.put("fnmp/87.jpg", "FNMP.zip/FNMP/Goblin Ringleader.full.jpg"); - copyUrlToImage.put("fnmp/88.jpg", "FNMP.zip/FNMP/Wing Shards.full.jpg"); - copyUrlToImage.put("fnmp/89.jpg", "FNMP.zip/FNMP/Cabal Coffers.full.jpg"); - copyUrlToImage.put("fnmp/9.jpg", "FNMP.zip/FNMP/Prodigal Sorcerer.full.jpg"); - copyUrlToImage.put("fnmp/90.jpg", "FNMP.zip/FNMP/Roar of the Wurm.full.jpg"); - copyUrlToImage.put("fnmp/91.jpg", "FNMP.zip/FNMP/Force Spike.full.jpg"); - copyUrlToImage.put("fnmp/92.jpg", "FNMP.zip/FNMP/Remand.full.jpg"); - copyUrlToImage.put("fnmp/93.jpg", "FNMP.zip/FNMP/Tormod's Crypt.full.jpg"); - copyUrlToImage.put("fnmp/94.jpg", "FNMP.zip/FNMP/Eternal Witness.full.jpg"); - copyUrlToImage.put("fnmp/95.jpg", "FNMP.zip/FNMP/Tendrils of Agony.full.jpg"); - copyUrlToImage.put("fnmp/96.jpg", "FNMP.zip/FNMP/Pendelhaven.full.jpg"); - copyUrlToImage.put("fnmp/97.jpg", "FNMP.zip/FNMP/Resurrection.full.jpg"); - copyUrlToImage.put("fnmp/98.jpg", "FNMP.zip/FNMP/Wall of Roots.full.jpg"); - copyUrlToImage.put("fnmp/99.jpg", "FNMP.zip/FNMP/Desert.full.jpg"); - copyUrlToImage.put("gpx/1.jpg", "GPX.zip/GPX/Spiritmonger.full.jpg"); - copyUrlToImage.put("gpx/10.jpg", "GPX.zip/GPX/Batterskull.full.jpg"); - copyUrlToImage.put("gpx/11.jpg", "GPX.zip/GPX/Griselbrand.full.jpg"); - copyUrlToImage.put("gpx/12.jpg", "GPX.zip/GPX/Stoneforge Mystic.full.jpg"); - copyUrlToImage.put("gpx/2.jpg", "GPX.zip/GPX/Call of the Herd.full.jpg"); - copyUrlToImage.put("gpx/3.jpg", "GPX.zip/GPX/Chrome Mox.full.jpg"); - copyUrlToImage.put("gpx/4.jpg", "GPX.zip/GPX/Umezawa's Jitte.full.jpg"); - copyUrlToImage.put("gpx/5.jpg", "GPX.zip/GPX/Maelstrom Pulse.full.jpg"); - copyUrlToImage.put("gpx/6.jpg", "GPX.zip/GPX/Goblin Guide.full.jpg"); - copyUrlToImage.put("gpx/7.jpg", "GPX.zip/GPX/Lotus Cobra.full.jpg"); - copyUrlToImage.put("gpx/8.jpg", "GPX.zip/GPX/Primeval Titan.full.jpg"); - copyUrlToImage.put("gpx/9.jpg", "GPX.zip/GPX/All Is Dust.full.jpg"); - copyUrlToImage.put("grc/1.jpg", "GRC.zip/GRC/Wood Elves.full.jpg"); - copyUrlToImage.put("grc/10.jpg", "GRC.zip/GRC/Mogg Fanatic.full.jpg"); - copyUrlToImage.put("grc/11.jpg", "GRC.zip/GRC/Mind Stone.full.jpg"); - copyUrlToImage.put("grc/12.jpg", "GRC.zip/GRC/Dauntless Dourbark.full.jpg"); - copyUrlToImage.put("grc/13.jpg", "GRC.zip/GRC/Lava Axe.full.jpg"); - copyUrlToImage.put("grc/14.jpg", "GRC.zip/GRC/Cenn's Tactician.full.jpg"); - copyUrlToImage.put("grc/15.jpg", "GRC.zip/GRC/Oona's Blackguard.full.jpg"); - copyUrlToImage.put("grc/16.jpg", "GRC.zip/GRC/Gravedigger.full.jpg"); - copyUrlToImage.put("grc/17.jpg", "GRC.zip/GRC/Boggart Ram-Gang.full.jpg"); - copyUrlToImage.put("grc/18.jpg", "GRC.zip/GRC/Wilt-Leaf Cavaliers.full.jpg"); - copyUrlToImage.put("grc/19.jpg", "GRC.zip/GRC/Duergar Hedge-Mage.full.jpg"); - copyUrlToImage.put("grc/2.jpg", "GRC.zip/GRC/Icatian Javelineers.full.jpg"); - copyUrlToImage.put("grc/20.jpg", "GRC.zip/GRC/Selkie Hedge-Mage.full.jpg"); - copyUrlToImage.put("grc/21.jpg", "GRC.zip/GRC/Sprouting Thrinax.full.jpg"); - copyUrlToImage.put("grc/22.jpg", "GRC.zip/GRC/Woolly Thoctar.full.jpg"); - copyUrlToImage.put("grc/24.jpg", "GRC.zip/GRC/Path to Exile.full.jpg"); - copyUrlToImage.put("grc/25.jpg", "GRC.zip/GRC/Hellspark Elemental.full.jpg"); - copyUrlToImage.put("grc/26.jpg", "GRC.zip/GRC/Marisi's Twinclaws.full.jpg"); - copyUrlToImage.put("grc/27.jpg", "GRC.zip/GRC/Slave of Bolas.full.jpg"); - copyUrlToImage.put("grc/28.jpg", "GRC.zip/GRC/Mycoid Shepherd.full.jpg"); - copyUrlToImage.put("grc/29.jpg", "GRC.zip/GRC/Naya Sojourners.full.jpg"); - copyUrlToImage.put("grc/3.jpg", "GRC.zip/GRC/Fiery Temper.full.jpg"); - copyUrlToImage.put("grc/30.jpg", "GRC.zip/GRC/Mind Control.full.jpg"); - copyUrlToImage.put("grc/31.jpg", "GRC.zip/GRC/Rise from the Grave.full.jpg"); - copyUrlToImage.put("grc/32.jpg", "GRC.zip/GRC/Kor Duelist.full.jpg"); - copyUrlToImage.put("grc/33.jpg", "GRC.zip/GRC/Vampire Nighthawk.full.jpg"); - copyUrlToImage.put("grc/34.jpg", "GRC.zip/GRC/Nissa's Chosen.full.jpg"); - copyUrlToImage.put("grc/35.jpg", "GRC.zip/GRC/Emeria Angel.full.jpg"); - copyUrlToImage.put("grc/36.jpg", "GRC.zip/GRC/Kor Firewalker.full.jpg"); - copyUrlToImage.put("grc/37.jpg", "GRC.zip/GRC/Leatherback Baloth.full.jpg"); - copyUrlToImage.put("grc/38.jpg", "GRC.zip/GRC/Hada Freeblade.full.jpg"); - copyUrlToImage.put("grc/39.jpg", "GRC.zip/GRC/Kalastria Highborn.full.jpg"); - copyUrlToImage.put("grc/4.jpg", "GRC.zip/GRC/Boomerang.full.jpg"); - copyUrlToImage.put("grc/40.jpg", "GRC.zip/GRC/Syphon Mind.full.jpg"); - copyUrlToImage.put("grc/46.jpg", "GRC.zip/GRC/Pathrazer of Ulamog.full.jpg"); - copyUrlToImage.put("grc/47.jpg", "GRC.zip/GRC/Curse of Wizardry.full.jpg"); - copyUrlToImage.put("grc/48.jpg", "GRC.zip/GRC/Staggershock.full.jpg"); - copyUrlToImage.put("grc/49.jpg", "GRC.zip/GRC/Deathless Angel.full.jpg"); - copyUrlToImage.put("grc/5.jpg", "GRC.zip/GRC/Calciderm.full.jpg"); - copyUrlToImage.put("grc/50.jpg", "GRC.zip/GRC/Fling.full.jpg"); - copyUrlToImage.put("grc/51.jpg", "GRC.zip/GRC/Sylvan Ranger.full.jpg"); - copyUrlToImage.put("grc/59.jpg", "GRC.zip/GRC/Plague Stinger.full.jpg"); - copyUrlToImage.put("grc/6.jpg", "GRC.zip/GRC/Reckless Wurm.full.jpg"); - copyUrlToImage.put("grc/60.jpg", "GRC.zip/GRC/Golem's Heart.full.jpg"); - copyUrlToImage.put("grc/63.jpg", "GRC.zip/GRC/Skinrender.full.jpg"); - copyUrlToImage.put("grc/64.jpg", "GRC.zip/GRC/Master's Call.full.jpg"); - copyUrlToImage.put("grc/65.jpg", "GRC.zip/GRC/Plague Myr.full.jpg"); - copyUrlToImage.put("grc/66.jpg", "GRC.zip/GRC/Signal Pest.full.jpg"); - copyUrlToImage.put("grc/69.jpg", "GRC.zip/GRC/Fling.full.jpg"); - copyUrlToImage.put("grc/7.jpg", "GRC.zip/GRC/Yixlid Jailer.full.jpg"); - copyUrlToImage.put("grc/70.jpg", "GRC.zip/GRC/Sylvan Ranger.full.jpg"); - copyUrlToImage.put("grc/71.jpg", "GRC.zip/GRC/Vault Skirge.full.jpg"); - copyUrlToImage.put("grc/72.jpg", "GRC.zip/GRC/Maul Splicer.full.jpg"); - copyUrlToImage.put("grc/73.jpg", "GRC.zip/GRC/Shrine of Burning Rage.full.jpg"); - copyUrlToImage.put("grc/76.jpg", "GRC.zip/GRC/Tormented Soul.full.jpg"); - copyUrlToImage.put("grc/77.jpg", "GRC.zip/GRC/Auramancer.full.jpg"); - copyUrlToImage.put("grc/78.jpg", "GRC.zip/GRC/Circle of Flame.full.jpg"); - copyUrlToImage.put("grc/79.jpg", "GRC.zip/GRC/Gather the Townsfolk.full.jpg"); - copyUrlToImage.put("grc/8.jpg", "GRC.zip/GRC/Zoetic Cavern.full.jpg"); - copyUrlToImage.put("grc/80.jpg", "GRC.zip/GRC/Curse of the Bloody Tome.full.jpg"); - copyUrlToImage.put("grc/81.jpg", "GRC.zip/GRC/Curse of Thirst.full.jpg"); - copyUrlToImage.put("grc/82.jpg", "GRC.zip/GRC/Nearheath Stalker.full.jpg"); - copyUrlToImage.put("grc/83.jpg", "GRC.zip/GRC/Bloodcrazed Neonate.full.jpg"); - copyUrlToImage.put("grc/84.jpg", "GRC.zip/GRC/Boneyard Wurm.full.jpg"); - copyUrlToImage.put("grc/9.jpg", "GRC.zip/GRC/Llanowar Elves.full.jpg"); - copyUrlToImage.put("jr/1.jpg", "JP.zip/JP/Lightning Bolt.full.jpg"); - copyUrlToImage.put("jr/10.jpg", "JP.zip/JP/Tradewind Rider.full.jpg"); - copyUrlToImage.put("jr/100.jpg", "JP.zip/JP/Feldon of the Third Path.full.jpg"); - copyUrlToImage.put("jr/101.jpg", "JP.zip/JP/Wasteland.full.jpg"); - copyUrlToImage.put("jr/103.jpg", "JP.zip/JP/Mana Drain.full.jpg"); - copyUrlToImage.put("jr/105.jpg", "JP.zip/JP/Command Beacon.full.jpg"); - copyUrlToImage.put("jr/11.jpg", "JP.zip/JP/Intuition.full.jpg"); - copyUrlToImage.put("jr/12.jpg", "JP.zip/JP/Argothian Enchantress.full.jpg"); - copyUrlToImage.put("jr/13.jpg", "JP.zip/JP/Living Death.full.jpg"); - copyUrlToImage.put("jr/14.jpg", "JP.zip/JP/Armageddon.full.jpg"); - copyUrlToImage.put("jr/15.jpg", "JP.zip/JP/Balance.full.jpg"); - copyUrlToImage.put("jr/16.jpg", "JP.zip/JP/Time Warp.full.jpg"); - copyUrlToImage.put("jr/17.jpg", "JP.zip/JP/Phyrexian Negator.full.jpg"); - copyUrlToImage.put("jr/18.jpg", "JP.zip/JP/Deranged Hermit.full.jpg"); - copyUrlToImage.put("jr/19.jpg", "JP.zip/JP/Hermit Druid.full.jpg"); - copyUrlToImage.put("jr/2.jpg", "JP.zip/JP/Stroke of Genius.full.jpg"); - copyUrlToImage.put("jr/20.jpg", "JP.zip/JP/Gemstone Mine.full.jpg"); - copyUrlToImage.put("jr/21.jpg", "JP.zip/JP/Regrowth.full.jpg"); - copyUrlToImage.put("jr/22.jpg", "JP.zip/JP/Sol Ring.full.jpg"); - copyUrlToImage.put("jr/23.jpg", "JP.zip/JP/Mishra's Factory.full.jpg"); - copyUrlToImage.put("jr/24.jpg", "JP.zip/JP/Exalted Angel.full.jpg"); - copyUrlToImage.put("jr/25.jpg", "JP.zip/JP/Grim Lavamancer.full.jpg"); - copyUrlToImage.put("jr/26.jpg", "JP.zip/JP/Meddling Mage.full.jpg"); - copyUrlToImage.put("jr/27.jpg", "JP.zip/JP/Pernicious Deed.full.jpg"); - copyUrlToImage.put("jr/28.jpg", "JP.zip/JP/Ravenous Baloth.full.jpg"); - copyUrlToImage.put("jr/29.jpg", "JP.zip/JP/Cunning Wish.full.jpg"); - copyUrlToImage.put("jr/3.jpg", "JP.zip/JP/Gaea's Cradle.full.jpg"); - copyUrlToImage.put("jr/30.jpg", "JP.zip/JP/Yawgmoth's Will.full.jpg"); - copyUrlToImage.put("jr/31.jpg", "JP.zip/JP/Vindicate.full.jpg"); - copyUrlToImage.put("jr/32.jpg", "JP.zip/JP/Decree of Justice.full.jpg"); - copyUrlToImage.put("jr/33.jpg", "JP.zip/JP/Orim's Chant.full.jpg"); - copyUrlToImage.put("jr/34.jpg", "JP.zip/JP/Mind's Desire.full.jpg"); - copyUrlToImage.put("jr/35.jpg", "JP.zip/JP/Demonic Tutor.full.jpg"); - copyUrlToImage.put("jr/36.jpg", "JP.zip/JP/Goblin Piledriver.full.jpg"); - copyUrlToImage.put("jr/37.jpg", "JP.zip/JP/Living Wish.full.jpg"); - copyUrlToImage.put("jr/38.jpg", "JP.zip/JP/Dark Ritual.full.jpg"); - copyUrlToImage.put("jr/39.jpg", "JP.zip/JP/Maze of Ith.full.jpg"); - copyUrlToImage.put("jr/4.jpg", "JP.zip/JP/Memory Lapse.full.jpg"); - copyUrlToImage.put("jr/40.jpg", "JP.zip/JP/Stifle.full.jpg"); - copyUrlToImage.put("jr/41.jpg", "JP.zip/JP/Survival of the Fittest.full.jpg"); - copyUrlToImage.put("jr/42.jpg", "JP.zip/JP/Burning Wish.full.jpg"); - copyUrlToImage.put("jr/43.jpg", "JP.zip/JP/Bloodstained Mire.full.jpg"); - copyUrlToImage.put("jr/44.jpg", "JP.zip/JP/Flooded Strand.full.jpg"); - copyUrlToImage.put("jr/45.jpg", "JP.zip/JP/Polluted Delta.full.jpg"); - copyUrlToImage.put("jr/46.jpg", "JP.zip/JP/Windswept Heath.full.jpg"); - copyUrlToImage.put("jr/47.jpg", "JP.zip/JP/Wooded Foothills.full.jpg"); - copyUrlToImage.put("jr/48.jpg", "JP.zip/JP/Sinkhole.full.jpg"); - copyUrlToImage.put("jr/49.jpg", "JP.zip/JP/Natural Order.full.jpg"); - copyUrlToImage.put("jr/5.jpg", "JP.zip/JP/Counterspell.full.jpg"); - copyUrlToImage.put("jr/50.jpg", "JP.zip/JP/Phyrexian Dreadnought.full.jpg"); - copyUrlToImage.put("jr/51.jpg", "JP.zip/JP/Thawing Glaciers.full.jpg"); - copyUrlToImage.put("jr/52.jpg", "JP.zip/JP/Land Tax.full.jpg"); - copyUrlToImage.put("jr/53.jpg", "JP.zip/JP/Morphling.full.jpg"); - copyUrlToImage.put("jr/54.jpg", "JP.zip/JP/Wheel of Fortune.full.jpg"); - copyUrlToImage.put("jr/55.jpg", "JP.zip/JP/Wasteland.full.jpg"); - copyUrlToImage.put("jr/56.jpg", "JP.zip/JP/Entomb.full.jpg"); - copyUrlToImage.put("jr/57.jpg", "JP.zip/JP/Sword of Fire and Ice.full.jpg"); - copyUrlToImage.put("jr/58.jpg", "JP.zip/JP/Vendilion Clique.full.jpg"); - copyUrlToImage.put("jr/59.jpg", "JP.zip/JP/Bitterblossom.full.jpg"); - copyUrlToImage.put("jr/6.jpg", "JP.zip/JP/Vampiric Tutor.full.jpg"); - copyUrlToImage.put("jr/60.jpg", "JP.zip/JP/Mana Crypt.full.jpg"); - copyUrlToImage.put("jr/61.jpg", "JP.zip/JP/Dark Confidant.full.jpg"); - copyUrlToImage.put("jr/62.jpg", "JP.zip/JP/Doubling Season.full.jpg"); - copyUrlToImage.put("jr/63.jpg", "JP.zip/JP/Goblin Welder.full.jpg"); - copyUrlToImage.put("jr/64.jpg", "JP.zip/JP/Xiahou Dun, the One-Eyed.full.jpg"); - copyUrlToImage.put("jr/65.jpg", "JP.zip/JP/Flusterstorm.full.jpg"); - copyUrlToImage.put("jr/66.jpg", "JP.zip/JP/Noble Hierarch.full.jpg"); - copyUrlToImage.put("jr/67.jpg", "JP.zip/JP/Karmic Guide.full.jpg"); - copyUrlToImage.put("jr/68.jpg", "JP.zip/JP/Sneak Attack.full.jpg"); - copyUrlToImage.put("jr/69.jpg", "JP.zip/JP/Karakas.full.jpg"); - copyUrlToImage.put("jr/7.jpg", "JP.zip/JP/Ball Lightning.full.jpg"); - copyUrlToImage.put("jr/70.jpg", "JP.zip/JP/Sword of Light and Shadow.full.jpg"); - copyUrlToImage.put("jr/71.jpg", "JP.zip/JP/Command Tower.full.jpg"); - copyUrlToImage.put("jr/72.jpg", "JP.zip/JP/Swords to Plowshares.full.jpg"); - copyUrlToImage.put("jr/73.jpg", "JP.zip/JP/Bribery.full.jpg"); - copyUrlToImage.put("jr/74.jpg", "JP.zip/JP/Imperial Recruiter.full.jpg"); - copyUrlToImage.put("jr/75.jpg", "JP.zip/JP/Crucible of Worlds.full.jpg"); - copyUrlToImage.put("jr/76.jpg", "JP.zip/JP/Overwhelming Forces.full.jpg"); - copyUrlToImage.put("jr/77.jpg", "JP.zip/JP/Show and Tell.full.jpg"); - copyUrlToImage.put("jr/78.jpg", "JP.zip/JP/Vindicate.full.jpg"); - copyUrlToImage.put("jr/79.jpg", "JP.zip/JP/Genesis.full.jpg"); - copyUrlToImage.put("jr/8.jpg", "JP.zip/JP/Oath of Druids.full.jpg"); - copyUrlToImage.put("jr/80.jpg", "JP.zip/JP/Karador, Ghost Chieftain.full.jpg"); - copyUrlToImage.put("jr/81.jpg", "JP.zip/JP/Greater Good.full.jpg"); - copyUrlToImage.put("jr/82.jpg", "JP.zip/JP/Riku of Two Reflections.full.jpg"); - copyUrlToImage.put("jr/83.jpg", "JP.zip/JP/Force of Will.full.jpg"); - copyUrlToImage.put("jr/84.jpg", "JP.zip/JP/Hanna, Ship's Navigator.full.jpg"); - copyUrlToImage.put("jr/85.jpg", "JP.zip/JP/Sword of Feast and Famine.full.jpg"); - copyUrlToImage.put("jr/86.jpg", "JP.zip/JP/Nekusar, the Mindrazer.full.jpg"); - copyUrlToImage.put("jr/87.jpg", "JP.zip/JP/Elesh Norn, Grand Cenobite.full.jpg"); - copyUrlToImage.put("jr/88.jpg", "JP.zip/JP/Oloro, Ageless Ascetic.full.jpg"); - copyUrlToImage.put("jr/89.jpg", "JP.zip/JP/Plains.full.jpg"); - copyUrlToImage.put("jr/9.jpg", "JP.zip/JP/Hammer of Bogardan.full.jpg"); - copyUrlToImage.put("jr/90.jpg", "JP.zip/JP/Island.full.jpg"); - copyUrlToImage.put("jr/91.jpg", "JP.zip/JP/Swamp.full.jpg"); - copyUrlToImage.put("jr/92.jpg", "JP.zip/JP/Mountain.full.jpg"); - copyUrlToImage.put("jr/93.jpg", "JP.zip/JP/Forest.full.jpg"); - copyUrlToImage.put("jr/97.jpg", "JP.zip/JP/Ravages of War.full.jpg"); - copyUrlToImage.put("jr/98.jpg", "JP.zip/JP/Damnation.full.jpg"); - copyUrlToImage.put("jr/99.jpg", "JP.zip/JP/Dualcaster Mage.full.jpg"); - copyUrlToImage.put("mbp/1.jpg", "MBP.zip/MBP/Arena.full.jpg"); - copyUrlToImage.put("mbp/10.jpg", "MBP.zip/MBP/Lightning Hounds.full.jpg"); - copyUrlToImage.put("mbp/100.jpg", "MBP.zip/MBP/Jace, the Living Guildpact.full.jpg"); - copyUrlToImage.put("mbp/101.jpg", "MBP.zip/MBP/Liliana Vess.full.jpg"); - copyUrlToImage.put("mbp/102.jpg", "MBP.zip/MBP/Chandra, Pyromaster.full.jpg"); - copyUrlToImage.put("mbp/103.jpg", "MBP.zip/MBP/Nissa, Worldwaker.full.jpg"); - copyUrlToImage.put("mbp/104.jpg", "MBP.zip/MBP/Garruk, Apex Predator.full.jpg"); - copyUrlToImage.put("mbp/105.jpg", "MBP.zip/MBP/Shamanic Revelation.full.jpg"); - copyUrlToImage.put("mbp/106.jpg", "MBP.zip/MBP/Ojutai's Command.full.jpg"); - copyUrlToImage.put("mbp/107.jpg", "MBP.zip/MBP/Dragonscale General.full.jpg"); - copyUrlToImage.put("mbp/108.jpg", "MBP.zip/MBP/Sage-Eye Avengers.full.jpg"); - copyUrlToImage.put("mbp/109.jpg", "MBP.zip/MBP/Archfiend of Depravity.full.jpg"); - copyUrlToImage.put("mbp/11.jpg", "MBP.zip/MBP/Spined Wurm.full.jpg"); - copyUrlToImage.put("mbp/110.jpg", "MBP.zip/MBP/Flamerush Rider.full.jpg"); - copyUrlToImage.put("mbp/111.jpg", "MBP.zip/MBP/Temur War Shaman.full.jpg"); - copyUrlToImage.put("mbp/112.jpg", "MBP.zip/MBP/Arashin Sovereign.full.jpg"); - copyUrlToImage.put("mbp/113.jpg", "MBP.zip/MBP/Pristine Skywise.full.jpg"); - copyUrlToImage.put("mbp/114.jpg", "MBP.zip/MBP/Necromaster Dragon.full.jpg"); - copyUrlToImage.put("mbp/115.jpg", "MBP.zip/MBP/Boltwing Marauder.full.jpg"); - copyUrlToImage.put("mbp/116.jpg", "MBP.zip/MBP/Harbinger of the Hunt.full.jpg"); - copyUrlToImage.put("mbp/117.jpg", "MBP.zip/MBP/Sultai Charm.full.jpg"); - copyUrlToImage.put("mbp/118.jpg", "MBP.zip/MBP/Aeronaut Tinkerer.full.jpg"); - copyUrlToImage.put("mbp/119.jpg", "MBP.zip/MBP/Dragon Fodder.full.jpg"); - copyUrlToImage.put("mbp/12.jpg", "MBP.zip/MBP/Warmonger.full.jpg"); - copyUrlToImage.put("mbp/120.jpg", "MBP.zip/MBP/Dragonlord's Servant.full.jpg"); - copyUrlToImage.put("mbp/121.jpg", "MBP.zip/MBP/Evolving Wilds.full.jpg"); - copyUrlToImage.put("mbp/122.jpg", "MBP.zip/MBP/Foe-Razer Regent.full.jpg"); - copyUrlToImage.put("mbp/123.jpg", "MBP.zip/MBP/Relic Seeker.full.jpg"); - copyUrlToImage.put("mbp/124.jpg", "MBP.zip/MBP/Alhammarret, High Arbiter.full.jpg"); - copyUrlToImage.put("mbp/125.jpg", "MBP.zip/MBP/Dwynen, Gilt-Leaf Daen.full.jpg"); - copyUrlToImage.put("mbp/126.jpg", "MBP.zip/MBP/Hixus, Prison Warden.full.jpg"); - copyUrlToImage.put("mbp/127.jpg", "MBP.zip/MBP/Kothophed, Soul Hoarder.full.jpg"); - copyUrlToImage.put("mbp/128.jpg", "MBP.zip/MBP/Pia and Kiran Nalaar.full.jpg"); - copyUrlToImage.put("mbp/129.jpg", "MBP.zip/MBP/Honored Hierarch.full.jpg"); - copyUrlToImage.put("mbp/13.jpg", "MBP.zip/MBP/Silver Drake.full.jpg"); - copyUrlToImage.put("mbp/130.jpg", "MBP.zip/MBP/Seeker of the Way.full.jpg"); - copyUrlToImage.put("mbp/131.jpg", "MBP.zip/MBP/Valorous Stance.full.jpg"); - copyUrlToImage.put("mbp/132.jpg", "MBP.zip/MBP/Dromoka, the Eternal.full.jpg"); - copyUrlToImage.put("mbp/133.jpg", "MBP.zip/MBP/Siege Rhino.full.jpg"); - copyUrlToImage.put("mbp/134.jpg", "MBP.zip/MBP/Sandsteppe Citadel.full.jpg"); - copyUrlToImage.put("mbp/135.jpg", "MBP.zip/MBP/Ruinous Path.full.jpg"); - copyUrlToImage.put("mbp/136.jpg", "MBP.zip/MBP/Hero of Goma Fada.full.jpg"); - copyUrlToImage.put("mbp/137.jpg", "MBP.zip/MBP/Drowner of Hope.full.jpg"); - copyUrlToImage.put("mbp/138.jpg", "MBP.zip/MBP/Defiant Bloodlord.full.jpg"); - copyUrlToImage.put("mbp/139.jpg", "MBP.zip/MBP/Barrage Tyrant.full.jpg"); - copyUrlToImage.put("mbp/14.jpg", "MBP.zip/MBP/Phyrexian Rager.full.jpg"); - copyUrlToImage.put("mbp/140.jpg", "MBP.zip/MBP/Oran-Rief Hydra.full.jpg"); - copyUrlToImage.put("mbp/141.jpg", "MBP.zip/MBP/Scythe Leopard.full.jpg"); - copyUrlToImage.put("mbp/142.jpg", "MBP.zip/MBP/Genesis Hydra.full.jpg"); - copyUrlToImage.put("mbp/143.jpg", "MBP.zip/MBP/Munda's Vanguard.full.jpg"); - copyUrlToImage.put("mbp/144.jpg", "MBP.zip/MBP/Deepfathom Skulker.full.jpg"); - copyUrlToImage.put("mbp/145.jpg", "MBP.zip/MBP/Dread Defiler.full.jpg"); - copyUrlToImage.put("mbp/146.jpg", "MBP.zip/MBP/Tyrant of Valakut.full.jpg"); - copyUrlToImage.put("mbp/147.jpg", "MBP.zip/MBP/Gladehart Cavalry.full.jpg"); - copyUrlToImage.put("mbp/148.jpg", "MBP.zip/MBP/Goblin Dark-Dwellers.full.jpg"); - copyUrlToImage.put("mbp/15.jpg", "MBP.zip/MBP/Jace Beleren.full.jpg"); - copyUrlToImage.put("mbp/16.jpg", "MBP.zip/MBP/Garruk Wildspeaker.full.jpg"); - copyUrlToImage.put("mbp/17.jpg", "MBP.zip/MBP/Brion Stoutarm.full.jpg"); - copyUrlToImage.put("mbp/18.jpg", "MBP.zip/MBP/Jaya Ballard, Task Mage.full.jpg"); - copyUrlToImage.put("mbp/19.jpg", "MBP.zip/MBP/Broodmate Dragon.full.jpg"); - copyUrlToImage.put("mbp/2.jpg", "MBP.zip/MBP/Sewers of Estark.full.jpg"); - copyUrlToImage.put("mbp/20.jpg", "MBP.zip/MBP/Honor of the Pure.full.jpg"); - copyUrlToImage.put("mbp/21.jpg", "MBP.zip/MBP/Steward of Valeron.full.jpg"); - copyUrlToImage.put("mbp/22.jpg", "MBP.zip/MBP/Day of Judgment.full.jpg"); - copyUrlToImage.put("mbp/23.jpg", "MBP.zip/MBP/Celestial Colonnade.full.jpg"); - copyUrlToImage.put("mbp/24.jpg", "MBP.zip/MBP/Retaliator Griffin.full.jpg"); - copyUrlToImage.put("mbp/25.jpg", "MBP.zip/MBP/Kor Skyfisher.full.jpg"); - copyUrlToImage.put("mbp/26.jpg", "MBP.zip/MBP/Guul Draz Assassin.full.jpg"); - copyUrlToImage.put("mbp/27.jpg", "MBP.zip/MBP/Nissa Revane.full.jpg"); - copyUrlToImage.put("mbp/28.jpg", "MBP.zip/MBP/Birds of Paradise.full.jpg"); - copyUrlToImage.put("mbp/29.jpg", "MBP.zip/MBP/Memoricide.full.jpg"); - copyUrlToImage.put("mbp/3.jpg", "MBP.zip/MBP/Nalathni Dragon.full.jpg"); - copyUrlToImage.put("mbp/30.jpg", "MBP.zip/MBP/Liliana Vess.full.jpg"); - copyUrlToImage.put("mbp/31.jpg", "MBP.zip/MBP/Bloodthrone Vampire.full.jpg"); - copyUrlToImage.put("mbp/32.jpg", "MBP.zip/MBP/Mirran Crusader.full.jpg"); - copyUrlToImage.put("mbp/33.jpg", "MBP.zip/MBP/Surgical Extraction.full.jpg"); - copyUrlToImage.put("mbp/34.jpg", "MBP.zip/MBP/Frost Titan.full.jpg"); - copyUrlToImage.put("mbp/35.jpg", "MBP.zip/MBP/Grave Titan.full.jpg"); - copyUrlToImage.put("mbp/36.jpg", "MBP.zip/MBP/Inferno Titan.full.jpg"); - copyUrlToImage.put("mbp/37.jpg", "MBP.zip/MBP/Chandra's Phoenix.full.jpg"); - copyUrlToImage.put("mbp/38.jpg", "MBP.zip/MBP/Treasure Hunt.full.jpg"); - copyUrlToImage.put("mbp/39.jpg", "MBP.zip/MBP/Faithless Looting.full.jpg"); - copyUrlToImage.put("mbp/4.jpg", "MBP.zip/MBP/Fireball.full.jpg"); - copyUrlToImage.put("mbp/40.jpg", "MBP.zip/MBP/Devil's Play.full.jpg"); - copyUrlToImage.put("mbp/41.jpg", "MBP.zip/MBP/Gravecrawler.full.jpg"); - copyUrlToImage.put("mbp/42.jpg", "MBP.zip/MBP/Electrolyze.full.jpg"); - copyUrlToImage.put("mbp/43.jpg", "MBP.zip/MBP/Feast of Blood.full.jpg"); - copyUrlToImage.put("mbp/44.jpg", "MBP.zip/MBP/Silverblade Paladin.full.jpg"); - copyUrlToImage.put("mbp/45.jpg", "MBP.zip/MBP/Merfolk Mesmerist.full.jpg"); - copyUrlToImage.put("mbp/46.jpg", "MBP.zip/MBP/Knight Exemplar.full.jpg"); - copyUrlToImage.put("mbp/47.jpg", "MBP.zip/MBP/Sunblast Angel.full.jpg"); - copyUrlToImage.put("mbp/48.jpg", "MBP.zip/MBP/Serra Avatar.full.jpg"); - copyUrlToImage.put("mbp/49.jpg", "MBP.zip/MBP/Primordial Hydra.full.jpg"); - copyUrlToImage.put("mbp/5.jpg", "MBP.zip/MBP/Blue Elemental Blast.full.jpg"); - copyUrlToImage.put("mbp/50.jpg", "MBP.zip/MBP/Vampire Nocturnus.full.jpg"); - copyUrlToImage.put("mbp/51.jpg", "MBP.zip/MBP/Cathedral of War.full.jpg"); - copyUrlToImage.put("mbp/52.jpg", "MBP.zip/MBP/Terastodon.full.jpg"); - copyUrlToImage.put("mbp/53.jpg", "MBP.zip/MBP/Arrest.full.jpg"); - copyUrlToImage.put("mbp/54.jpg", "MBP.zip/MBP/Consume Spirit.full.jpg"); - copyUrlToImage.put("mbp/55.jpg", "MBP.zip/MBP/Dreg Mangler.full.jpg"); - copyUrlToImage.put("mbp/56.jpg", "MBP.zip/MBP/Supreme Verdict.full.jpg"); - copyUrlToImage.put("mbp/57.jpg", "MBP.zip/MBP/Standstill.full.jpg"); - copyUrlToImage.put("mbp/58.jpg", "MBP.zip/MBP/Breath of Malfegor.full.jpg"); - copyUrlToImage.put("mbp/59.jpg", "MBP.zip/MBP/Angel of Glory's Rise.full.jpg"); - copyUrlToImage.put("mbp/6.jpg", "MBP.zip/MBP/Mana Crypt.full.jpg"); - copyUrlToImage.put("mbp/60.jpg", "MBP.zip/MBP/Turnabout.full.jpg"); - copyUrlToImage.put("mbp/61.jpg", "MBP.zip/MBP/Nightveil Specter.full.jpg"); - copyUrlToImage.put("mbp/62.jpg", "MBP.zip/MBP/Voidmage Husher.full.jpg"); - copyUrlToImage.put("mbp/63.jpg", "MBP.zip/MBP/Ogre Arsonist.full.jpg"); - copyUrlToImage.put("mbp/64.jpg", "MBP.zip/MBP/Corrupt.full.jpg"); - copyUrlToImage.put("mbp/65.jpg", "MBP.zip/MBP/Chandra's Fury.full.jpg"); - copyUrlToImage.put("mbp/66.jpg", "MBP.zip/MBP/Render Silent.full.jpg"); - copyUrlToImage.put("mbp/67.jpg", "MBP.zip/MBP/Ratchet Bomb.full.jpg"); - copyUrlToImage.put("mbp/68.jpg", "MBP.zip/MBP/Bonescythe Sliver.full.jpg"); - copyUrlToImage.put("mbp/69.jpg", "MBP.zip/MBP/Ogre Battledriver.full.jpg"); - copyUrlToImage.put("mbp/7.jpg", "MBP.zip/MBP/Windseeker Centaur.full.jpg"); - copyUrlToImage.put("mbp/70.jpg", "MBP.zip/MBP/Scavenging Ooze.full.jpg"); - copyUrlToImage.put("mbp/71.jpg", "MBP.zip/MBP/Hamletback Goliath.full.jpg"); - copyUrlToImage.put("mbp/72.jpg", "MBP.zip/MBP/Ajani, Caller of the Pride.full.jpg"); - copyUrlToImage.put("mbp/73.jpg", "MBP.zip/MBP/Jace, Memory Adept.full.jpg"); - copyUrlToImage.put("mbp/74.jpg", "MBP.zip/MBP/Liliana of the Dark Realms.full.jpg"); - copyUrlToImage.put("mbp/75.jpg", "MBP.zip/MBP/Chandra, Pyromaster.full.jpg"); - copyUrlToImage.put("mbp/76.jpg", "MBP.zip/MBP/Garruk, Caller of Beasts.full.jpg"); - copyUrlToImage.put("mbp/77.jpg", "MBP.zip/MBP/Sylvan Caryatid.full.jpg"); - copyUrlToImage.put("mbp/78.jpg", "MBP.zip/MBP/Karametra's Acolyte.full.jpg"); - copyUrlToImage.put("mbp/79.jpg", "MBP.zip/MBP/Fated Conflagration.full.jpg"); - copyUrlToImage.put("mbp/8.jpg", "MBP.zip/MBP/Giant Badger.full.jpg"); - copyUrlToImage.put("mbp/80.jpg", "MBP.zip/MBP/High Tide.full.jpg"); - copyUrlToImage.put("mbp/81.jpg", "MBP.zip/MBP/Gaze of Granite.full.jpg"); - copyUrlToImage.put("mbp/82.jpg", "MBP.zip/MBP/Wash Out.full.jpg"); - copyUrlToImage.put("mbp/83.jpg", "MBP.zip/MBP/Acquire.full.jpg"); - copyUrlToImage.put("mbp/84.jpg", "MBP.zip/MBP/Duress.full.jpg"); - copyUrlToImage.put("mbp/85.jpg", "MBP.zip/MBP/Eidolon of Blossoms.full.jpg"); - copyUrlToImage.put("mbp/86.jpg", "MBP.zip/MBP/Magister of Worth.full.jpg"); - copyUrlToImage.put("mbp/87.jpg", "MBP.zip/MBP/Soul of Ravnica.full.jpg"); - copyUrlToImage.put("mbp/88.jpg", "MBP.zip/MBP/Soul of Zendikar.full.jpg"); - copyUrlToImage.put("mbp/89.jpg", "MBP.zip/MBP/Stealer of Secrets.full.jpg"); - copyUrlToImage.put("mbp/9.jpg", "MBP.zip/MBP/Scent of Cinder.full.jpg"); - copyUrlToImage.put("mbp/90.jpg", "MBP.zip/MBP/Angelic Skirmisher.full.jpg"); - copyUrlToImage.put("mbp/91.jpg", "MBP.zip/MBP/Xathrid Necromancer.full.jpg"); - copyUrlToImage.put("mbp/92.jpg", "MBP.zip/MBP/Rattleclaw Mystic.full.jpg"); - copyUrlToImage.put("mbp/93.jpg", "MBP.zip/MBP/Ankle Shanker.full.jpg"); - copyUrlToImage.put("mbp/94.jpg", "MBP.zip/MBP/Avalanche Tusker.full.jpg"); - copyUrlToImage.put("mbp/95.jpg", "MBP.zip/MBP/Ivorytusk Fortress.full.jpg"); - copyUrlToImage.put("mbp/96.jpg", "MBP.zip/MBP/Rakshasa Vizier.full.jpg"); - copyUrlToImage.put("mbp/97.jpg", "MBP.zip/MBP/Sage of the Inward Eye.full.jpg"); - copyUrlToImage.put("mbp/98.jpg", "MBP.zip/MBP/Goblin Rabblemaster.full.jpg"); - copyUrlToImage.put("mbp/99.jpg", "MBP.zip/MBP/Ajani Steadfast.full.jpg"); - copyUrlToImage.put("mgdc/1.jpg", "MGDC.zip/MGDC/Reya Dawnbringer.full.jpg"); - copyUrlToImage.put("mgdc/10.jpg", "MGDC.zip/MGDC/Stormblood Berserker.full.jpg"); - copyUrlToImage.put("mgdc/11.jpg", "MGDC.zip/MGDC/Dungrove Elder.full.jpg"); - copyUrlToImage.put("mgdc/12.jpg", "MGDC.zip/MGDC/Diregraf Ghoul.full.jpg"); - copyUrlToImage.put("mgdc/13.jpg", "MGDC.zip/MGDC/Elite Inquisitor.full.jpg"); - copyUrlToImage.put("mgdc/14.jpg", "MGDC.zip/MGDC/Zombie Apocalypse.full.jpg"); - copyUrlToImage.put("mgdc/15.jpg", "MGDC.zip/MGDC/Strangleroot Geist.full.jpg"); - copyUrlToImage.put("mgdc/16.jpg", "MGDC.zip/MGDC/Suture Priest.full.jpg"); - copyUrlToImage.put("mgdc/17.jpg", "MGDC.zip/MGDC/Pristine Talisman.full.jpg"); - copyUrlToImage.put("mgdc/18.jpg", "MGDC.zip/MGDC/Latch Seeker.full.jpg"); - copyUrlToImage.put("mgdc/19.jpg", "MGDC.zip/MGDC/Killing Wave.full.jpg"); - copyUrlToImage.put("mgdc/2.jpg", "MGDC.zip/MGDC/Liliana's Specter.full.jpg"); - copyUrlToImage.put("mgdc/20.jpg", "MGDC.zip/MGDC/Magmaquake.full.jpg"); - copyUrlToImage.put("mgdc/21.jpg", "MGDC.zip/MGDC/Mwonvuli Beast Tracker.full.jpg"); - copyUrlToImage.put("mgdc/22.jpg", "MGDC.zip/MGDC/Cryptborn Horror.full.jpg"); - copyUrlToImage.put("mgdc/23.jpg", "MGDC.zip/MGDC/Dryad Militant.full.jpg"); - copyUrlToImage.put("mgdc/24.jpg", "MGDC.zip/MGDC/Firemane Avenger.full.jpg"); - copyUrlToImage.put("mgdc/25.jpg", "MGDC.zip/MGDC/Zameck Guildmage.full.jpg"); - copyUrlToImage.put("mgdc/26.jpg", "MGDC.zip/MGDC/Melek, Izzet Paragon.full.jpg"); - copyUrlToImage.put("mgdc/27.jpg", "MGDC.zip/MGDC/Trostani's Summoner.full.jpg"); - copyUrlToImage.put("mgdc/28.jpg", "MGDC.zip/MGDC/Hive Stirrings.full.jpg"); - copyUrlToImage.put("mgdc/29.jpg", "MGDC.zip/MGDC/Goblin Diplomats.full.jpg"); - copyUrlToImage.put("mgdc/3.jpg", "MGDC.zip/MGDC/Mitotic Slime.full.jpg"); - copyUrlToImage.put("mgdc/30.jpg", "MGDC.zip/MGDC/Phalanx Leader.full.jpg"); - copyUrlToImage.put("mgdc/31.jpg", "MGDC.zip/MGDC/Nighthowler.full.jpg"); - copyUrlToImage.put("mgdc/32.jpg", "MGDC.zip/MGDC/Pain Seer.full.jpg"); - copyUrlToImage.put("mgdc/33.jpg", "MGDC.zip/MGDC/Kiora's Follower.full.jpg"); - copyUrlToImage.put("mgdc/34.jpg", "MGDC.zip/MGDC/Squelching Leeches.full.jpg"); - copyUrlToImage.put("mgdc/35.jpg", "MGDC.zip/MGDC/Dictate of Kruphix.full.jpg"); - copyUrlToImage.put("mgdc/36.jpg", "MGDC.zip/MGDC/Hall of Triumph.full.jpg"); - copyUrlToImage.put("mgdc/37.jpg", "MGDC.zip/MGDC/Heir of the Wilds.full.jpg"); - copyUrlToImage.put("mgdc/38.jpg", "MGDC.zip/MGDC/Utter End.full.jpg"); - copyUrlToImage.put("mgdc/39.jpg", "MGDC.zip/MGDC/Reclamation Sage.full.jpg"); - copyUrlToImage.put("mgdc/4.jpg", "MGDC.zip/MGDC/Memnite.full.jpg"); - copyUrlToImage.put("mgdc/40.jpg", "MGDC.zip/MGDC/Chief Engineer.full.jpg"); - copyUrlToImage.put("mgdc/41.jpg", "MGDC.zip/MGDC/Mardu Shadowspear.full.jpg"); - copyUrlToImage.put("mgdc/42.jpg", "MGDC.zip/MGDC/Supplant Form.full.jpg"); - copyUrlToImage.put("mgdc/43.jpg", "MGDC.zip/MGDC/Thunderbreak Regent.full.jpg"); - copyUrlToImage.put("mgdc/44.jpg", "MGDC.zip/MGDC/Scaleguard Sentinels.full.jpg"); - copyUrlToImage.put("mgdc/45.jpg", "MGDC.zip/MGDC/Conclave Naturalists.full.jpg"); - copyUrlToImage.put("mgdc/46.jpg", "MGDC.zip/MGDC/Languish.full.jpg"); - copyUrlToImage.put("mgdc/47.jpg", "MGDC.zip/MGDC/Stasis Snare.full.jpg"); - copyUrlToImage.put("mgdc/48.jpg", "MGDC.zip/MGDC/Radiant Flames.full.jpg"); - copyUrlToImage.put("mgdc/49.jpg", "MGDC.zip/MGDC/Immolating Glare.full.jpg"); - copyUrlToImage.put("mgdc/5.jpg", "MGDC.zip/MGDC/Tempered Steel.full.jpg"); - copyUrlToImage.put("mgdc/50.jpg", "MGDC.zip/MGDC/Jori En, Ruin Diver.full.jpg"); - copyUrlToImage.put("mgdc/6.jpg", "MGDC.zip/MGDC/Treasure Mage.full.jpg"); - copyUrlToImage.put("mgdc/7.jpg", "MGDC.zip/MGDC/Black Sun's Zenith.full.jpg"); - copyUrlToImage.put("mgdc/8.jpg", "MGDC.zip/MGDC/Myr Superion.full.jpg"); - copyUrlToImage.put("mgdc/9.jpg", "MGDC.zip/MGDC/Priest of Urabrask.full.jpg"); - copyUrlToImage.put("mlp/1.jpg", "MLP.zip/MLP/Earwig Squad.full.jpg"); - copyUrlToImage.put("mlp/10.jpg", "MLP.zip/MLP/Lord of Shatterskull Pass.full.jpg"); - copyUrlToImage.put("mlp/11.jpg", "MLP.zip/MLP/Ancient Hellkite.full.jpg"); - copyUrlToImage.put("mlp/12.jpg", "MLP.zip/MLP/Steel Hellkite.full.jpg"); - copyUrlToImage.put("mlp/13.jpg", "MLP.zip/MLP/Thopter Assembly.full.jpg"); - copyUrlToImage.put("mlp/14.jpg", "MLP.zip/MLP/Phyrexian Metamorph.full.jpg"); - copyUrlToImage.put("mlp/15.jpg", "MLP.zip/MLP/Garruk's Horde.full.jpg"); - copyUrlToImage.put("mlp/16a.jpg", "MLP.zip/MLP/Ludevic's Test Subject.full.jpg"); - copyUrlToImage.put("mlp/16b.jpg", "MLP.zip/MLP/Ludevic's Abomination.full.jpg"); - copyUrlToImage.put("mlp/17a.jpg", "MLP.zip/MLP/Mondronen Shaman.full.jpg"); - copyUrlToImage.put("mlp/17b.jpg", "MLP.zip/MLP/Tovolar's Magehunter.full.jpg"); - copyUrlToImage.put("mlp/18.jpg", "MLP.zip/MLP/Restoration Angel.full.jpg"); - copyUrlToImage.put("mlp/19.jpg", "MLP.zip/MLP/Staff of Nin.full.jpg"); - copyUrlToImage.put("mlp/2.jpg", "MLP.zip/MLP/Vexing Shusher.full.jpg"); - copyUrlToImage.put("mlp/20.jpg", "MLP.zip/MLP/Deadbridge Goliath.full.jpg"); - copyUrlToImage.put("mlp/21.jpg", "MLP.zip/MLP/Skarrg Goliath.full.jpg"); - copyUrlToImage.put("mlp/22a.jpg", "MLP.zip/MLP/Breaking (Breaking/Entering).full.jpg"); - copyUrlToImage.put("mlp/22b.jpg", "MLP.zip/MLP/Entering (Breaking/Entering).full.jpg"); - copyUrlToImage.put("mlp/23.jpg", "MLP.zip/MLP/Colossal Whale.full.jpg"); - copyUrlToImage.put("mlp/24.jpg", "MLP.zip/MLP/Bident of Thassa.full.jpg"); - copyUrlToImage.put("mlp/25.jpg", "MLP.zip/MLP/Tromokratis.full.jpg"); - copyUrlToImage.put("mlp/26.jpg", "MLP.zip/MLP/Dictate of the Twin Gods.full.jpg"); - copyUrlToImage.put("mlp/27.jpg", "MLP.zip/MLP/Dragone Throne of Tarkir.full.jpg"); - copyUrlToImage.put("mlp/28.jpg", "MLP.zip/MLP/In Garruk's Wake.full.jpg"); - copyUrlToImage.put("mlp/29.jpg", "MLP.zip/MLP/Sandsteppe Mastodon.full.jpg"); - copyUrlToImage.put("mlp/3.jpg", "MLP.zip/MLP/Figure of Destiny.full.jpg"); - copyUrlToImage.put("mlp/31.jpg", "MLP.zip/MLP/Deathbringer Regent.full.jpg"); - copyUrlToImage.put("mlp/32.jpg", "MLP.zip/MLP/Mizzium Meddler.full.jpg"); - copyUrlToImage.put("mlp/33.jpg", "MLP.zip/MLP/Blight Herder.full.jpg"); - copyUrlToImage.put("mlp/34.jpg", "MLP.zip/MLP/Endbringer.full.jpg"); - copyUrlToImage.put("mlp/4.jpg", "MLP.zip/MLP/Ajani Vengeant.full.jpg"); - copyUrlToImage.put("mlp/5.jpg", "MLP.zip/MLP/Obelisk of Alara.full.jpg"); - copyUrlToImage.put("mlp/6.jpg", "MLP.zip/MLP/Knight of New Alara.full.jpg"); - copyUrlToImage.put("mlp/7.jpg", "MLP.zip/MLP/Ant Queen.full.jpg"); - copyUrlToImage.put("mlp/8.jpg", "MLP.zip/MLP/Valakut, the Molten Pinnacle.full.jpg"); - copyUrlToImage.put("mlp/9.jpg", "MLP.zip/MLP/Joraga Warcaller.full.jpg"); - copyUrlToImage.put("mprp/1.jpg", "MPRP.zip/MPRP/Wasteland.full.jpg"); - copyUrlToImage.put("mprp/10.jpg", "MPRP.zip/MPRP/Hypnotic Specter.full.jpg"); - copyUrlToImage.put("mprp/11.jpg", "MPRP.zip/MPRP/Hinder.full.jpg"); - copyUrlToImage.put("mprp/12.jpg", "MPRP.zip/MPRP/Pyroclasm.full.jpg"); - copyUrlToImage.put("mprp/13.jpg", "MPRP.zip/MPRP/Giant Growth.full.jpg"); - copyUrlToImage.put("mprp/14.jpg", "MPRP.zip/MPRP/Putrefy.full.jpg"); - copyUrlToImage.put("mprp/15.jpg", "MPRP.zip/MPRP/Zombify.full.jpg"); - copyUrlToImage.put("mprp/16.jpg", "MPRP.zip/MPRP/Lightning Helix.full.jpg"); - copyUrlToImage.put("mprp/17.jpg", "MPRP.zip/MPRP/Wrath of God.full.jpg"); - copyUrlToImage.put("mprp/18.jpg", "MPRP.zip/MPRP/Condemn.full.jpg"); - copyUrlToImage.put("mprp/19.jpg", "MPRP.zip/MPRP/Mortify.full.jpg"); - copyUrlToImage.put("mprp/2.jpg", "MPRP.zip/MPRP/Voidmage Prodigy.full.jpg"); - copyUrlToImage.put("mprp/20.jpg", "MPRP.zip/MPRP/Psionic Blast.full.jpg"); - copyUrlToImage.put("mprp/21.jpg", "MPRP.zip/MPRP/Cruel Edict.full.jpg"); - copyUrlToImage.put("mprp/22.jpg", "MPRP.zip/MPRP/Disenchant.full.jpg"); - copyUrlToImage.put("mprp/23.jpg", "MPRP.zip/MPRP/Recollect.full.jpg"); - copyUrlToImage.put("mprp/24.jpg", "MPRP.zip/MPRP/Damnation.full.jpg"); - copyUrlToImage.put("mprp/25.jpg", "MPRP.zip/MPRP/Tidings.full.jpg"); - copyUrlToImage.put("mprp/26.jpg", "MPRP.zip/MPRP/Incinerate.full.jpg"); - copyUrlToImage.put("mprp/27.jpg", "MPRP.zip/MPRP/Mana Tithe.full.jpg"); - copyUrlToImage.put("mprp/28.jpg", "MPRP.zip/MPRP/Harmonize.full.jpg"); - copyUrlToImage.put("mprp/29.jpg", "MPRP.zip/MPRP/Ponder.full.jpg"); - copyUrlToImage.put("mprp/3.jpg", "MPRP.zip/MPRP/Powder Keg.full.jpg"); - copyUrlToImage.put("mprp/30.jpg", "MPRP.zip/MPRP/Corrupt.full.jpg"); - copyUrlToImage.put("mprp/31.jpg", "MPRP.zip/MPRP/Cryptic Command.full.jpg"); - copyUrlToImage.put("mprp/32.jpg", "MPRP.zip/MPRP/Flame Javelin.full.jpg"); - copyUrlToImage.put("mprp/33.jpg", "MPRP.zip/MPRP/Unmake.full.jpg"); - copyUrlToImage.put("mprp/34.jpg", "MPRP.zip/MPRP/Nameless Inversion.full.jpg"); - copyUrlToImage.put("mprp/35.jpg", "MPRP.zip/MPRP/Remove Soul.full.jpg"); - copyUrlToImage.put("mprp/36.jpg", "MPRP.zip/MPRP/Blightning.full.jpg"); - copyUrlToImage.put("mprp/37.jpg", "MPRP.zip/MPRP/Rampant Growth.full.jpg"); - copyUrlToImage.put("mprp/38.jpg", "MPRP.zip/MPRP/Negate.full.jpg"); - copyUrlToImage.put("mprp/39.jpg", "MPRP.zip/MPRP/Terminate.full.jpg"); - copyUrlToImage.put("mprp/4.jpg", "MPRP.zip/MPRP/Psychatog.full.jpg"); - copyUrlToImage.put("mprp/40.jpg", "MPRP.zip/MPRP/Lightning Bolt.full.jpg"); - copyUrlToImage.put("mprp/41.jpg", "MPRP.zip/MPRP/Cancel.full.jpg"); - copyUrlToImage.put("mprp/42.jpg", "MPRP.zip/MPRP/Sign in Blood.full.jpg"); - copyUrlToImage.put("mprp/43.jpg", "MPRP.zip/MPRP/Infest.full.jpg"); - copyUrlToImage.put("mprp/44.jpg", "MPRP.zip/MPRP/Volcanic Fallout.full.jpg"); - copyUrlToImage.put("mprp/45.jpg", "MPRP.zip/MPRP/Celestial Purge.full.jpg"); - copyUrlToImage.put("mprp/46.jpg", "MPRP.zip/MPRP/Bituminous Blast.full.jpg"); - copyUrlToImage.put("mprp/47.jpg", "MPRP.zip/MPRP/Burst Lightning.full.jpg"); - copyUrlToImage.put("mprp/48.jpg", "MPRP.zip/MPRP/Harrow.full.jpg"); - copyUrlToImage.put("mprp/49.jpg", "MPRP.zip/MPRP/Day of Judgment.full.jpg"); - copyUrlToImage.put("mprp/5.jpg", "MPRP.zip/MPRP/Terror.full.jpg"); - copyUrlToImage.put("mprp/50.jpg", "MPRP.zip/MPRP/Brave the Elements.full.jpg"); - copyUrlToImage.put("mprp/51.jpg", "MPRP.zip/MPRP/Doom Blade.full.jpg"); - copyUrlToImage.put("mprp/52.jpg", "MPRP.zip/MPRP/Treasure Hunt.full.jpg"); - copyUrlToImage.put("mprp/53.jpg", "MPRP.zip/MPRP/Searing Blaze.full.jpg"); - copyUrlToImage.put("mprp/6.jpg", "MPRP.zip/MPRP/Fireball.full.jpg"); - copyUrlToImage.put("mprp/7.jpg", "MPRP.zip/MPRP/Oxidize.full.jpg"); - copyUrlToImage.put("mprp/8.jpg", "MPRP.zip/MPRP/Mana Leak.full.jpg"); - copyUrlToImage.put("mprp/9.jpg", "MPRP.zip/MPRP/Reciprocate.full.jpg"); - copyUrlToImage.put("mpskld/1.jpg", "MPS.zip/MPS/Cataclysmic Gearhulk.full.jpg"); - copyUrlToImage.put("mpskld/10.jpg", "MPS.zip/MPS/Cloudstone Curio.full.jpg"); - copyUrlToImage.put("mpskld/11.jpg", "MPS.zip/MPS/Crucible of Worlds.full.jpg"); - copyUrlToImage.put("mpskld/12.jpg", "MPS.zip/MPS/Gauntlet of Power.full.jpg"); - copyUrlToImage.put("mpskld/13.jpg", "MPS.zip/MPS/Hangarback Walker.full.jpg"); - copyUrlToImage.put("mpskld/14.jpg", "MPS.zip/MPS/Lightning Greaves.full.jpg"); - copyUrlToImage.put("mpskld/15.jpg", "MPS.zip/MPS/Lotus Petal.full.jpg"); - copyUrlToImage.put("mpskld/16.jpg", "MPS.zip/MPS/Mana Crypt.full.jpg"); - copyUrlToImage.put("mpskld/17.jpg", "MPS.zip/MPS/Mana Vault.full.jpg"); - copyUrlToImage.put("mpskld/18.jpg", "MPS.zip/MPS/Mind's Eye.full.jpg"); - copyUrlToImage.put("mpskld/19.jpg", "MPS.zip/MPS/Mox Opal.full.jpg"); - copyUrlToImage.put("mpskld/2.jpg", "MPS.zip/MPS/Torrential Gearhulk.full.jpg"); - copyUrlToImage.put("mpskld/20.jpg", "MPS.zip/MPS/Painter's Servant.full.jpg"); - copyUrlToImage.put("mpskld/21.jpg", "MPS.zip/MPS/Rings of Brighthearth.full.jpg"); - copyUrlToImage.put("mpskld/22.jpg", "MPS.zip/MPS/Scroll Rack.full.jpg"); - copyUrlToImage.put("mpskld/23.jpg", "MPS.zip/MPS/Sculpting Steel.full.jpg"); - copyUrlToImage.put("mpskld/24.jpg", "MPS.zip/MPS/Sol Ring.full.jpg"); - copyUrlToImage.put("mpskld/25.jpg", "MPS.zip/MPS/Solemn Simulacrum.full.jpg"); - copyUrlToImage.put("mpskld/26.jpg", "MPS.zip/MPS/Static Orb.full.jpg"); - copyUrlToImage.put("mpskld/27.jpg", "MPS.zip/MPS/Steel Overseer.full.jpg"); - copyUrlToImage.put("mpskld/28.jpg", "MPS.zip/MPS/Sword of Feast and Famine.full.jpg"); - copyUrlToImage.put("mpskld/29.jpg", "MPS.zip/MPS/Sword of Fire and Ice.full.jpg"); - copyUrlToImage.put("mpskld/3.jpg", "MPS.zip/MPS/Noxious Gearhulk.full.jpg"); - copyUrlToImage.put("mpskld/30.jpg", "MPS.zip/MPS/Sword of Light and Shadow.full.jpg"); - copyUrlToImage.put("mpskld/4.jpg", "MPS.zip/MPS/Combustible Gearhulk.full.jpg"); - copyUrlToImage.put("mpskld/5.jpg", "MPS.zip/MPS/Verdurous Gearhulk.full.jpg"); - copyUrlToImage.put("mpskld/6.jpg", "MPS.zip/MPS/Aether Vial.full.jpg"); - copyUrlToImage.put("mpskld/7.jpg", "MPS.zip/MPS/Champion's Helm.full.jpg"); - copyUrlToImage.put("mpskld/8.jpg", "MPS.zip/MPS/Chromatic Lantern.full.jpg"); - copyUrlToImage.put("mpskld/9.jpg", "MPS.zip/MPS/Chrome Mox.full.jpg"); - copyUrlToImage.put("ptc/1.jpg", "PTC.zip/PTC/Dirtcowl Wurm.full.jpg"); - copyUrlToImage.put("ptc/10.jpg", "PTC.zip/PTC/Rathi Assassin.full.jpg"); - copyUrlToImage.put("ptc/100.jpg", "PTC.zip/PTC/Flying Crane Technique.full.jpg"); - copyUrlToImage.put("ptc/101.jpg", "PTC.zip/PTC/Grim Haruspex.full.jpg"); - copyUrlToImage.put("ptc/102.jpg", "PTC.zip/PTC/Hardened Scales.full.jpg"); - copyUrlToImage.put("ptc/103.jpg", "PTC.zip/PTC/Herald of Anafenza.full.jpg"); - copyUrlToImage.put("ptc/104.jpg", "PTC.zip/PTC/High Sentinels of Arashin.full.jpg"); - copyUrlToImage.put("ptc/105.jpg", "PTC.zip/PTC/Icy Blast.full.jpg"); - copyUrlToImage.put("ptc/106.jpg", "PTC.zip/PTC/Ivorytusk Fortress.full.jpg"); - copyUrlToImage.put("ptc/107.jpg", "PTC.zip/PTC/Jeering Instigator.full.jpg"); - copyUrlToImage.put("ptc/108.jpg", "PTC.zip/PTC/Jeskai Ascendancy.full.jpg"); - copyUrlToImage.put("ptc/109.jpg", "PTC.zip/PTC/Kheru Lich Lord.full.jpg"); - copyUrlToImage.put("ptc/11.jpg", "PTC.zip/PTC/Avatar of Hope.full.jpg"); - copyUrlToImage.put("ptc/110.jpg", "PTC.zip/PTC/Mardu Ascendancy.full.jpg"); - copyUrlToImage.put("ptc/111.jpg", "PTC.zip/PTC/Master of Pearls.full.jpg"); - copyUrlToImage.put("ptc/112.jpg", "PTC.zip/PTC/Narset, Enlightened Master.full.jpg"); - copyUrlToImage.put("ptc/113.jpg", "PTC.zip/PTC/Necropolis Fiend.full.jpg"); - copyUrlToImage.put("ptc/114.jpg", "PTC.zip/PTC/Rakshasa Vizier.full.jpg"); - copyUrlToImage.put("ptc/115.jpg", "PTC.zip/PTC/Rattleclaw Mystic.full.jpg"); - copyUrlToImage.put("ptc/116.jpg", "PTC.zip/PTC/Sage of the Inward Eye.full.jpg"); - copyUrlToImage.put("ptc/117.jpg", "PTC.zip/PTC/Sidisi, Brood Tyrant.full.jpg"); - copyUrlToImage.put("ptc/118.jpg", "PTC.zip/PTC/Siege Rhino.full.jpg"); - copyUrlToImage.put("ptc/119.jpg", "PTC.zip/PTC/Sultai Ascendacy.full.jpg"); - copyUrlToImage.put("ptc/12.jpg", "PTC.zip/PTC/Raging Kavu.full.jpg"); - copyUrlToImage.put("ptc/120.jpg", "PTC.zip/PTC/Surrak Dragonclaw.full.jpg"); - copyUrlToImage.put("ptc/121.jpg", "PTC.zip/PTC/Temur Ascendancy.full.jpg"); - copyUrlToImage.put("ptc/122.jpg", "PTC.zip/PTC/Thousand Winds.full.jpg"); - copyUrlToImage.put("ptc/123.jpg", "PTC.zip/PTC/Trail of Mystery.full.jpg"); - copyUrlToImage.put("ptc/124.jpg", "PTC.zip/PTC/Trap Essence.full.jpg"); - copyUrlToImage.put("ptc/125.jpg", "PTC.zip/PTC/Utter End.full.jpg"); - copyUrlToImage.put("ptc/126.jpg", "PTC.zip/PTC/Villainous Wealth.full.jpg"); - copyUrlToImage.put("ptc/127.jpg", "PTC.zip/PTC/Zurgo Helmsmasher.full.jpg"); - copyUrlToImage.put("ptc/128.jpg", "PTC.zip/PTC/Alesha, Who Smiles at Death.full.jpg"); - copyUrlToImage.put("ptc/129.jpg", "PTC.zip/PTC/Arcbond.full.jpg"); - copyUrlToImage.put("ptc/13.jpg", "PTC.zip/PTC/Questing Phelddagrif.full.jpg"); - copyUrlToImage.put("ptc/130.jpg", "PTC.zip/PTC/Archfiend of Depravity.full.jpg"); - copyUrlToImage.put("ptc/131.jpg", "PTC.zip/PTC/Atarka, World Render.full.jpg"); - copyUrlToImage.put("ptc/132.jpg", "PTC.zip/PTC/Brutal Hordechief.full.jpg"); - copyUrlToImage.put("ptc/133.jpg", "PTC.zip/PTC/Daghatar the Adamant.full.jpg"); - copyUrlToImage.put("ptc/134.jpg", "PTC.zip/PTC/Dragonscale General.full.jpg"); - copyUrlToImage.put("ptc/135.jpg", "PTC.zip/PTC/Dromoka, the Eternal.full.jpg"); - copyUrlToImage.put("ptc/136.jpg", "PTC.zip/PTC/Flamerush Rider.full.jpg"); - copyUrlToImage.put("ptc/137.jpg", "PTC.zip/PTC/Flamewake Phoenix.full.jpg"); - copyUrlToImage.put("ptc/138.jpg", "PTC.zip/PTC/Jeskai Infiltrator.full.jpg"); - copyUrlToImage.put("ptc/14.jpg", "PTC.zip/PTC/Fungal Shambler.full.jpg"); - copyUrlToImage.put("ptc/141.jpg", "PTC.zip/PTC/Mastery of the Unseen.full.jpg"); - copyUrlToImage.put("ptc/142.jpg", "PTC.zip/PTC/Ojutai, Soul of Winter.full.jpg"); - copyUrlToImage.put("ptc/143.jpg", "PTC.zip/PTC/Rally the Ancestors.full.jpg"); - copyUrlToImage.put("ptc/145.jpg", "PTC.zip/PTC/Sandsteppe Mastodon.full.jpg"); - copyUrlToImage.put("ptc/147.jpg", "PTC.zip/PTC/Shamanic Revelation.full.jpg"); - copyUrlToImage.put("ptc/15.jpg", "PTC.zip/PTC/Stone-Tongue Basilisk.full.jpg"); - copyUrlToImage.put("ptc/150.jpg", "PTC.zip/PTC/Soulfire Grand Master.full.jpg"); - copyUrlToImage.put("ptc/151.jpg", "PTC.zip/PTC/Soulflayer.full.jpg"); - copyUrlToImage.put("ptc/152.jpg", "PTC.zip/PTC/Supplant Form.full.jpg"); - copyUrlToImage.put("ptc/153.jpg", "PTC.zip/PTC/Tasigur, the Golden Fang.full.jpg"); - copyUrlToImage.put("ptc/154.jpg", "PTC.zip/PTC/Torrent Elemental.full.jpg"); - copyUrlToImage.put("ptc/157.jpg", "PTC.zip/PTC/Yasova Dragonclaw.full.jpg"); - copyUrlToImage.put("ptc/16.jpg", "PTC.zip/PTC/Laquatus's Champion.full.jpg"); - copyUrlToImage.put("ptc/166.jpg", "PTC.zip/PTC/Crater Elemental.full.jpg"); - copyUrlToImage.put("ptc/168.jpg", "PTC.zip/PTC/Deathbringer Regent.full.jpg"); - copyUrlToImage.put("ptc/17.jpg", "PTC.zip/PTC/Glory.full.jpg"); - copyUrlToImage.put("ptc/18.jpg", "PTC.zip/PTC/Silent Specter.full.jpg"); - copyUrlToImage.put("ptc/181.jpg", "PTC.zip/PTC/Kolaghan's Command.full.jpg"); - copyUrlToImage.put("ptc/183.jpg", "PTC.zip/PTC/Myth Realized.full.jpg"); - copyUrlToImage.put("ptc/185.jpg", "PTC.zip/PTC/Ojutai's Command.full.jpg"); - copyUrlToImage.put("ptc/19.jpg", "PTC.zip/PTC/Feral Throwback.full.jpg"); - copyUrlToImage.put("ptc/196.jpg", "PTC.zip/PTC/Volcanic Vision.full.jpg"); - copyUrlToImage.put("ptc/198.jpg", "PTC.zip/PTC/Abbot of Keral Keep.full.jpg"); - copyUrlToImage.put("ptc/2.jpg", "PTC.zip/PTC/Revenant.full.jpg"); - copyUrlToImage.put("ptc/20.jpg", "PTC.zip/PTC/Soul Collector.full.jpg"); - copyUrlToImage.put("ptc/21.jpg", "PTC.zip/PTC/Sword of Kaldra.full.jpg"); - copyUrlToImage.put("ptc/210.jpg", "PTC.zip/PTC/Gilt-Leaf Winnower.full.jpg"); - copyUrlToImage.put("ptc/212.jpg", "PTC.zip/PTC/Graveblade Marauder.full.jpg"); - copyUrlToImage.put("ptc/216.jpg", "PTC.zip/PTC/Jace, Vryn's Prodigy.full.jpg"); - copyUrlToImage.put("ptc/22.jpg", "PTC.zip/PTC/Shield of Kaldra.full.jpg"); - copyUrlToImage.put("ptc/225.jpg", "PTC.zip/PTC/Nissa's Revelation.full.jpg"); - copyUrlToImage.put("ptc/227.jpg", "PTC.zip/PTC/Outland Colossus.full.jpg"); - copyUrlToImage.put("ptc/23.jpg", "PTC.zip/PTC/Helm of Kaldra.full.jpg"); - copyUrlToImage.put("ptc/238.jpg", "PTC.zip/PTC/Akoum Firebird.full.jpg"); - copyUrlToImage.put("ptc/239.jpg", "PTC.zip/PTC/Akoum Hellkite.full.jpg"); - copyUrlToImage.put("ptc/24.jpg", "PTC.zip/PTC/Ryusei, the Falling Star.full.jpg"); - copyUrlToImage.put("ptc/240.jpg", "PTC.zip/PTC/Aligned Hedron Network.full.jpg"); - copyUrlToImage.put("ptc/241.jpg", "PTC.zip/PTC/Ally Encampment.full.jpg"); - copyUrlToImage.put("ptc/242.jpg", "PTC.zip/PTC/Angelic Captain.full.jpg"); - copyUrlToImage.put("ptc/243.jpg", "PTC.zip/PTC/Barrage Tyrant.full.jpg"); - copyUrlToImage.put("ptc/244.jpg", "PTC.zip/PTC/Beastcaller Savant.full.jpg"); - copyUrlToImage.put("ptc/245.jpg", "PTC.zip/PTC/Blight Herder.full.jpg"); - copyUrlToImage.put("ptc/246.jpg", "PTC.zip/PTC/Bring to Light.full.jpg"); - copyUrlToImage.put("ptc/247.jpg", "PTC.zip/PTC/Brood Butcher.full.jpg"); - copyUrlToImage.put("ptc/248.jpg", "PTC.zip/PTC/Brutal Expulsion.full.jpg"); - copyUrlToImage.put("ptc/249.jpg", "PTC.zip/PTC/Canopy Vista.full.jpg"); - copyUrlToImage.put("ptc/25.jpg", "PTC.zip/PTC/Ink-Eyes, Servant of Oni.full.jpg"); - copyUrlToImage.put("ptc/250.jpg", "PTC.zip/PTC/Cinder Glade.full.jpg"); - copyUrlToImage.put("ptc/251.jpg", "PTC.zip/PTC/Conduit of Ruin.full.jpg"); - copyUrlToImage.put("ptc/252.jpg", "PTC.zip/PTC/Defiant Bloodlord.full.jpg"); - copyUrlToImage.put("ptc/253.jpg", "PTC.zip/PTC/Desolation Twin.full.jpg"); - copyUrlToImage.put("ptc/254.jpg", "PTC.zip/PTC/Dragonmaster Outcast.full.jpg"); - copyUrlToImage.put("ptc/255.jpg", "PTC.zip/PTC/Drana, Liberator of Malakir.full.jpg"); - copyUrlToImage.put("ptc/256.jpg", "PTC.zip/PTC/Drowner of Hope.full.jpg"); - copyUrlToImage.put("ptc/257.jpg", "PTC.zip/PTC/Dust Stalker.full.jpg"); - copyUrlToImage.put("ptc/258.jpg", "PTC.zip/PTC/Emeria Shepherd.full.jpg"); - copyUrlToImage.put("ptc/259.jpg", "PTC.zip/PTC/Endless One.full.jpg"); - copyUrlToImage.put("ptc/26.jpg", "PTC.zip/PTC/Kiyomaro, First to Stand.full.jpg"); - copyUrlToImage.put("ptc/260.jpg", "PTC.zip/PTC/Exert Influence.full.jpg"); - copyUrlToImage.put("ptc/261.jpg", "PTC.zip/PTC/Fathom Feeder.full.jpg"); - copyUrlToImage.put("ptc/262.jpg", "PTC.zip/PTC/Felidar Sovereign.full.jpg"); - copyUrlToImage.put("ptc/263.jpg", "PTC.zip/PTC/From Beyond.full.jpg"); - copyUrlToImage.put("ptc/264.jpg", "PTC.zip/PTC/Gideon, Ally of Zendikar.full.jpg"); - copyUrlToImage.put("ptc/265.jpg", "PTC.zip/PTC/Greenwarden of Murasa.full.jpg"); - copyUrlToImage.put("ptc/266.jpg", "PTC.zip/PTC/Gruesome Slaughter.full.jpg"); - copyUrlToImage.put("ptc/267.jpg", "PTC.zip/PTC/Guardian of Tazeem.full.jpg"); - copyUrlToImage.put("ptc/268.jpg", "PTC.zip/PTC/Guul Draz Overseer.full.jpg"); - copyUrlToImage.put("ptc/27.jpg", "PTC.zip/PTC/Gleancrawler.full.jpg"); - copyUrlToImage.put("ptc/271.jpg", "PTC.zip/PTC/Lantern Scout.full.jpg"); - copyUrlToImage.put("ptc/272.jpg", "PTC.zip/PTC/Lumbering Falls.full.jpg"); - copyUrlToImage.put("ptc/273.jpg", "PTC.zip/PTC/March from the Tomb.full.jpg"); - copyUrlToImage.put("ptc/274.jpg", "PTC.zip/PTC/Munda, Ambush Leader.full.jpg"); - copyUrlToImage.put("ptc/275.jpg", "PTC.zip/PTC/Nissa's Renewal.full.jpg"); - copyUrlToImage.put("ptc/276.jpg", "PTC.zip/PTC/Noyan Dar, Roil Shaper.full.jpg"); - copyUrlToImage.put("ptc/277.jpg", "PTC.zip/PTC/Ob Nixilis Reignited.full.jpg"); - copyUrlToImage.put("ptc/278.jpg", "PTC.zip/PTC/Oblivion Sower.full.jpg"); - copyUrlToImage.put("ptc/279.jpg", "PTC.zip/PTC/Omnath, Locus of Rage.full.jpg"); - copyUrlToImage.put("ptc/28.jpg", "PTC.zip/PTC/Djinn Illuminatus.full.jpg"); - copyUrlToImage.put("ptc/280.jpg", "PTC.zip/PTC/Oran-Rief Hydra.full.jpg"); - copyUrlToImage.put("ptc/281.jpg", "PTC.zip/PTC/Painful Truths.full.jpg"); - copyUrlToImage.put("ptc/282.jpg", "PTC.zip/PTC/Part the Waterveil.full.jpg"); - copyUrlToImage.put("ptc/283.jpg", "PTC.zip/PTC/Planar Outburst.full.jpg"); - copyUrlToImage.put("ptc/284.jpg", "PTC.zip/PTC/Prairie Stream.full.jpg"); - copyUrlToImage.put("ptc/285.jpg", "PTC.zip/PTC/Prism Array.full.jpg"); - copyUrlToImage.put("ptc/286.jpg", "PTC.zip/PTC/Quarantine Field.full.jpg"); - copyUrlToImage.put("ptc/287.jpg", "PTC.zip/PTC/Radiant Flames.full.jpg"); - copyUrlToImage.put("ptc/288.jpg", "PTC.zip/PTC/Ruinous Path.full.jpg"); - copyUrlToImage.put("ptc/289.jpg", "PTC.zip/PTC/Sanctum of Ugin.full.jpg"); - copyUrlToImage.put("ptc/29.jpg", "PTC.zip/PTC/Avatar of Discord.full.jpg"); - copyUrlToImage.put("ptc/290.jpg", "PTC.zip/PTC/Scatter to the Winds.full.jpg"); - copyUrlToImage.put("ptc/291.jpg", "PTC.zip/PTC/Serpentine Spike.full.jpg"); - copyUrlToImage.put("ptc/292.jpg", "PTC.zip/PTC/Shambling Vent.full.jpg"); - copyUrlToImage.put("ptc/293.jpg", "PTC.zip/PTC/Shrine of the Forsaken Gods.full.jpg"); - copyUrlToImage.put("ptc/294.jpg", "PTC.zip/PTC/Sire of Stagnation.full.jpg"); - copyUrlToImage.put("ptc/295.jpg", "PTC.zip/PTC/Smoldering Marsh.full.jpg"); - copyUrlToImage.put("ptc/296.jpg", "PTC.zip/PTC/Smothering Abomination.full.jpg"); - copyUrlToImage.put("ptc/297.jpg", "PTC.zip/PTC/Sunken Hollow.full.jpg"); - copyUrlToImage.put("ptc/298.jpg", "PTC.zip/PTC/Ugin's Insight.full.jpg"); - copyUrlToImage.put("ptc/299.jpg", "PTC.zip/PTC/Ulamog, the Ceaseless Hunger.full.jpg"); - copyUrlToImage.put("ptc/3.jpg", "PTC.zip/PTC/Monstrous Hound.full.jpg"); - copyUrlToImage.put("ptc/30.jpg", "PTC.zip/PTC/Allosaurus Rider.full.jpg"); - copyUrlToImage.put("ptc/300.jpg", "PTC.zip/PTC/Undergrowth Champion.full.jpg"); - copyUrlToImage.put("ptc/301.jpg", "PTC.zip/PTC/Veteran Warleader.full.jpg"); - copyUrlToImage.put("ptc/302.jpg", "PTC.zip/PTC/Void Winnower.full.jpg"); - copyUrlToImage.put("ptc/303.jpg", "PTC.zip/PTC/Wasteland Strangler.full.jpg"); - copyUrlToImage.put("ptc/304.jpg", "PTC.zip/PTC/Woodland Wanderer.full.jpg"); - copyUrlToImage.put("ptc/305.jpg", "PTC.zip/PTC/Zada, Hedron Grinder.full.jpg"); - copyUrlToImage.put("ptc/31.jpg", "PTC.zip/PTC/Lotus Bloom.full.jpg"); - copyUrlToImage.put("ptc/32.jpg", "PTC.zip/PTC/Oros, the Avenger.full.jpg"); - copyUrlToImage.put("ptc/33.jpg", "PTC.zip/PTC/Korlash, Heir to Blackblade.full.jpg"); - copyUrlToImage.put("ptc/34.jpg", "PTC.zip/PTC/Wren's Run Packmaster.full.jpg"); - copyUrlToImage.put("ptc/35.jpg", "PTC.zip/PTC/Door of Destinies.full.jpg"); - copyUrlToImage.put("ptc/36.jpg", "PTC.zip/PTC/Demigod of Revenge.full.jpg"); - copyUrlToImage.put("ptc/37.jpg", "PTC.zip/PTC/Overbeing of Myth.full.jpg"); - copyUrlToImage.put("ptc/38.jpg", "PTC.zip/PTC/Ajani Vengeant.full.jpg"); - copyUrlToImage.put("ptc/39.jpg", "PTC.zip/PTC/Malfegor.full.jpg"); - copyUrlToImage.put("ptc/4.jpg", "PTC.zip/PTC/Lightning Dragon.full.jpg"); - copyUrlToImage.put("ptc/40.jpg", "PTC.zip/PTC/Dragon Broodmother.full.jpg"); - copyUrlToImage.put("ptc/41.jpg", "PTC.zip/PTC/Vampire Nocturnus.full.jpg"); - copyUrlToImage.put("ptc/42.jpg", "PTC.zip/PTC/Rampaging Baloths.full.jpg"); - copyUrlToImage.put("ptc/43.jpg", "PTC.zip/PTC/Comet Storm.full.jpg"); - copyUrlToImage.put("ptc/44.jpg", "PTC.zip/PTC/Emrakul, the Aeons Torn.full.jpg"); - copyUrlToImage.put("ptc/45.jpg", "PTC.zip/PTC/Sun Titan.full.jpg"); - copyUrlToImage.put("ptc/46.jpg", "PTC.zip/PTC/Wurmcoil Engine.full.jpg"); - copyUrlToImage.put("ptc/47.jpg", "PTC.zip/PTC/Hero of Bladehold.full.jpg"); - copyUrlToImage.put("ptc/48.jpg", "PTC.zip/PTC/Glissa, the Traitor.full.jpg"); - copyUrlToImage.put("ptc/49.jpg", "PTC.zip/PTC/Sheoldred, Whispering One.full.jpg"); - copyUrlToImage.put("ptc/5.jpg", "PTC.zip/PTC/Beast of Burden.full.jpg"); - copyUrlToImage.put("ptc/50.jpg", "PTC.zip/PTC/Bloodlord of Vaasgoth.full.jpg"); - copyUrlToImage.put("ptc/51a.jpg", "PTC.zip/PTC/Mayor of Avabruck.full.jpg"); - copyUrlToImage.put("ptc/51b.jpg", "PTC.zip/PTC/Howlpack Alpha.full.jpg"); - copyUrlToImage.put("ptc/52a.jpg", "PTC.zip/PTC/Ravenous Demon.full.jpg"); - copyUrlToImage.put("ptc/52b.jpg", "PTC.zip/PTC/Archdemon of Greed.full.jpg"); - copyUrlToImage.put("ptc/53.jpg", "PTC.zip/PTC/Moonsilver Spear.full.jpg"); - copyUrlToImage.put("ptc/54.jpg", "PTC.zip/PTC/Xathrid Gorgon.full.jpg"); - copyUrlToImage.put("ptc/55.jpg", "PTC.zip/PTC/Archon of the Triumvirate.full.jpg"); - copyUrlToImage.put("ptc/56.jpg", "PTC.zip/PTC/Hypersonic Dragon.full.jpg"); - copyUrlToImage.put("ptc/57.jpg", "PTC.zip/PTC/Carnival Hellsteed.full.jpg"); - copyUrlToImage.put("ptc/58.jpg", "PTC.zip/PTC/Corpsejack Menace.full.jpg"); - copyUrlToImage.put("ptc/59.jpg", "PTC.zip/PTC/Grove of the Guardian.full.jpg"); - copyUrlToImage.put("ptc/6.jpg", "PTC.zip/PTC/Lu Bu, Master-at-Arms.full.jpg"); - copyUrlToImage.put("ptc/60.jpg", "PTC.zip/PTC/Consuming Aberration.full.jpg"); - copyUrlToImage.put("ptc/61.jpg", "PTC.zip/PTC/Fathom Mage.full.jpg"); - copyUrlToImage.put("ptc/62.jpg", "PTC.zip/PTC/Foundry Champion.full.jpg"); - copyUrlToImage.put("ptc/63.jpg", "PTC.zip/PTC/Rubblehulk.full.jpg"); - copyUrlToImage.put("ptc/64.jpg", "PTC.zip/PTC/Treasury Thrull.full.jpg"); - copyUrlToImage.put("ptc/65.jpg", "PTC.zip/PTC/Maze's End.full.jpg"); - copyUrlToImage.put("ptc/66.jpg", "PTC.zip/PTC/Plains.66.full.jpg"); - copyUrlToImage.put("ptc/67.jpg", "PTC.zip/PTC/Megantic Sliver.full.jpg"); - copyUrlToImage.put("ptc/68.jpg", "PTC.zip/PTC/Celestial Archon.full.jpg"); - copyUrlToImage.put("ptc/69.jpg", "PTC.zip/PTC/Shipbreaker Kraken.full.jpg"); - copyUrlToImage.put("ptc/7.jpg", "PTC.zip/PTC/False Prophet.full.jpg"); - copyUrlToImage.put("ptc/70.jpg", "PTC.zip/PTC/Abhorrent Overlord.full.jpg"); - copyUrlToImage.put("ptc/71.jpg", "PTC.zip/PTC/Ember Swallower.full.jpg"); - copyUrlToImage.put("ptc/72.jpg", "PTC.zip/PTC/Anthousa, Setessan Hero.full.jpg"); - copyUrlToImage.put("ptc/73.jpg", "PTC.zip/PTC/Silent Sentinel.full.jpg"); - copyUrlToImage.put("ptc/74.jpg", "PTC.zip/PTC/Arbiter of the Ideal.full.jpg"); - copyUrlToImage.put("ptc/75.jpg", "PTC.zip/PTC/Eater of Hope.full.jpg"); - copyUrlToImage.put("ptc/76.jpg", "PTC.zip/PTC/Forgestoker Dragon.full.jpg"); - copyUrlToImage.put("ptc/77.jpg", "PTC.zip/PTC/Nessian Wilds Ravager.full.jpg"); - copyUrlToImage.put("ptc/78.jpg", "PTC.zip/PTC/Dawnbringer Charioteers.full.jpg"); - copyUrlToImage.put("ptc/79.jpg", "PTC.zip/PTC/Scourge of Fleets.full.jpg"); - copyUrlToImage.put("ptc/8.jpg", "PTC.zip/PTC/Lu Bu, Master-at-Arms.full.jpg"); - copyUrlToImage.put("ptc/80.jpg", "PTC.zip/PTC/Doomwake Giant.full.jpg"); - copyUrlToImage.put("ptc/81.jpg", "PTC.zip/PTC/Spawn of Thraxes.full.jpg"); - copyUrlToImage.put("ptc/82.jpg", "PTC.zip/PTC/Heroes' Bane.full.jpg"); - copyUrlToImage.put("ptc/83.jpg", "PTC.zip/PTC/Resolute Archangel.full.jpg"); - copyUrlToImage.put("ptc/84.jpg", "PTC.zip/PTC/Mercurial Pretender.full.jpg"); - copyUrlToImage.put("ptc/85.jpg", "PTC.zip/PTC/Indulgent Tormentor.full.jpg"); - copyUrlToImage.put("ptc/86.jpg", "PTC.zip/PTC/Siege Dragon.full.jpg"); - copyUrlToImage.put("ptc/87.jpg", "PTC.zip/PTC/Phytotitan.full.jpg"); - copyUrlToImage.put("ptc/88.jpg", "PTC.zip/PTC/Abzan Ascendancy.full.jpg"); - copyUrlToImage.put("ptc/89.jpg", "PTC.zip/PTC/Anafenza, the Foremost.full.jpg"); - copyUrlToImage.put("ptc/9.jpg", "PTC.zip/PTC/Overtaker.full.jpg"); - copyUrlToImage.put("ptc/90.jpg", "PTC.zip/PTC/Ankle Shanker.full.jpg"); - copyUrlToImage.put("ptc/91.jpg", "PTC.zip/PTC/Avalanche Tusker.full.jpg"); - copyUrlToImage.put("ptc/92.jpg", "PTC.zip/PTC/Bloodsoaked Champion.full.jpg"); - copyUrlToImage.put("ptc/93.jpg", "PTC.zip/PTC/Butcher of the Horde.full.jpg"); - copyUrlToImage.put("ptc/94.jpg", "PTC.zip/PTC/Crackling Doom.full.jpg"); - copyUrlToImage.put("ptc/95.jpg", "PTC.zip/PTC/Crater's Claws.full.jpg"); - copyUrlToImage.put("ptc/96.jpg", "PTC.zip/PTC/Deflecting Palm.full.jpg"); - copyUrlToImage.put("ptc/97.jpg", "PTC.zip/PTC/Dig Through Time.full.jpg"); - copyUrlToImage.put("ptc/98.jpg", "PTC.zip/PTC/Dragon-Style Twins.full.jpg"); - copyUrlToImage.put("ptc/99.jpg", "PTC.zip/PTC/Duneblast.full.jpg"); - copyUrlToImage.put("sus/1.jpg", "SUS.zip/SUS/Thran Quarry.full.jpg"); - copyUrlToImage.put("sus/10.jpg", "SUS.zip/SUS/Slith Firewalker.full.jpg"); - copyUrlToImage.put("sus/11.jpg", "SUS.zip/SUS/Royal Assassin.full.jpg"); - copyUrlToImage.put("sus/12.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); - copyUrlToImage.put("sus/13.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); - copyUrlToImage.put("sus/14.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); - copyUrlToImage.put("sus/15.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); - copyUrlToImage.put("sus/16.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); - copyUrlToImage.put("sus/17.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); - copyUrlToImage.put("sus/18.jpg", "SUS.zip/SUS/Mad Auntie.full.jpg"); - copyUrlToImage.put("sus/19.jpg", "SUS.zip/SUS/Slith Firewalker.full.jpg"); - copyUrlToImage.put("sus/2.jpg", "SUS.zip/SUS/Serra Avatar.full.jpg"); - copyUrlToImage.put("sus/20.jpg", "SUS.zip/SUS/Royal Assassin.full.jpg"); - copyUrlToImage.put("sus/21.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); - copyUrlToImage.put("sus/22.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); - copyUrlToImage.put("sus/23.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); - copyUrlToImage.put("sus/24.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); - copyUrlToImage.put("sus/25.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); - copyUrlToImage.put("sus/26.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); - copyUrlToImage.put("sus/27.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); - copyUrlToImage.put("sus/28.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); - copyUrlToImage.put("sus/29.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); - copyUrlToImage.put("sus/3.jpg", "SUS.zip/SUS/Lord of Atlantis.full.jpg"); - copyUrlToImage.put("sus/30.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); - copyUrlToImage.put("sus/31.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); - copyUrlToImage.put("sus/32.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); - copyUrlToImage.put("sus/4.jpg", "SUS.zip/SUS/Crusade.full.jpg"); - copyUrlToImage.put("sus/5.jpg", "SUS.zip/SUS/Elvish Lyrist.full.jpg"); - copyUrlToImage.put("sus/6.jpg", "SUS.zip/SUS/City of Brass.full.jpg"); - copyUrlToImage.put("sus/7.jpg", "SUS.zip/SUS/Volcanic Hammer.full.jpg"); - copyUrlToImage.put("sus/8.jpg", "SUS.zip/SUS/Giant Growth.full.jpg"); - copyUrlToImage.put("sus/9.jpg", "SUS.zip/SUS/Two-Headed Dragon.full.jpg"); - copyUrlToImage.put("ugin/1.jpg", "UGIN.zip/UGIN/Ugin, the Spirit Dragon.full.jpg"); - copyUrlToImage.put("ugin/113.jpg", "UGIN.zip/UGIN/Jeering Instigator.full.jpg"); - copyUrlToImage.put("ugin/123.jpg", "UGIN.zip/UGIN/Arashin War Beast.full.jpg"); - copyUrlToImage.put("ugin/129.jpg", "UGIN.zip/UGIN/Formless Nurturing.full.jpg"); - copyUrlToImage.put("ugin/131.jpg", "UGIN.zip/UGIN/Dragonscale Boon.full.jpg"); - copyUrlToImage.put("ugin/146.jpg", "UGIN.zip/UGIN/Wildcall.full.jpg"); - copyUrlToImage.put("ugin/161.jpg", "UGIN.zip/UGIN/Hewed Stone Retainers.full.jpg"); - copyUrlToImage.put("ugin/164.jpg", "UGIN.zip/UGIN/Ugin's Construct.full.jpg"); - copyUrlToImage.put("ugin/19.jpg", "UGIN.zip/UGIN/Mastery of the Unseen.full.jpg"); - copyUrlToImage.put("ugin/216.jpg", "UGIN.zip/UGIN/Altar of the Brood.full.jpg"); - copyUrlToImage.put("ugin/217.jpg", "UGIN.zip/UGIN/Briber's Purse.full.jpg"); - copyUrlToImage.put("ugin/220.jpg", "UGIN.zip/UGIN/Ghostfire Blade.full.jpg"); - copyUrlToImage.put("ugin/24.jpg", "UGIN.zip/UGIN/Smite the Monstrous.full.jpg"); - copyUrlToImage.put("ugin/26.jpg", "UGIN.zip/UGIN/Soul Summons.full.jpg"); - copyUrlToImage.put("ugin/30.jpg", "UGIN.zip/UGIN/Watcher of the Roost.full.jpg"); - copyUrlToImage.put("ugin/36.jpg", "UGIN.zip/UGIN/Jeskai Infiltrator.full.jpg"); - copyUrlToImage.put("ugin/46.jpg", "UGIN.zip/UGIN/Reality Shift.full.jpg"); - copyUrlToImage.put("ugin/48.jpg", "UGIN.zip/UGIN/Mystic of the Hidden Way.full.jpg"); - copyUrlToImage.put("ugin/59.jpg", "UGIN.zip/UGIN/Write into Being.full.jpg"); - copyUrlToImage.put("ugin/68.jpg", "UGIN.zip/UGIN/Debilitating Injury.full.jpg"); - copyUrlToImage.put("ugin/73.jpg", "UGIN.zip/UGIN/Grim Haruspex.full.jpg"); - copyUrlToImage.put("ugin/85.jpg", "UGIN.zip/UGIN/Sultai Emissary.full.jpg"); - copyUrlToImage.put("ugin/88.jpg", "UGIN.zip/UGIN/Ruthless Ripper.full.jpg"); - copyUrlToImage.put("ugin/96.jpg", "UGIN.zip/UGIN/Ainok Tracker.full.jpg"); - copyUrlToImage.put("ugin/97.jpg", "UGIN.zip/UGIN/Arc Lightning.full.jpg"); - copyUrlToImage.put("ugin/98.jpg", "UGIN.zip/UGIN/Fierce Invocation.full.jpg"); - copyUrlToImage.put("wmcq/1.jpg", "WMCQ.zip/WMCQ/Vengevine.full.jpg"); - copyUrlToImage.put("wmcq/2.jpg", "WMCQ.zip/WMCQ/Geist of Saint Traft.full.jpg"); - copyUrlToImage.put("wmcq/3.jpg", "WMCQ.zip/WMCQ/Thalia, Guardian of Thraben.full.jpg"); - copyUrlToImage.put("wmcq/4.jpg", "WMCQ.zip/WMCQ/Liliana of the Veil.full.jpg"); - copyUrlToImage.put("wmcq/5.jpg", "WMCQ.zip/WMCQ/Snapcaster Mage.full.jpg"); - - for (String key : copyUrlToImage.keySet()) { - copyUrlToImageDone.put(key, maxTimes); - copyImageToUrl.put(copyUrlToImage.get(key), key); - } +// singleLinks.put("MTG/FRF/en/promo/prerelease/AleshaWhoSmilesAtDeath.jpg", "PTC.zip/PTC/Alesha, Who Smiles at Death.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/Arcbond.jpg", "PTC.zip/PTC/Arcbond.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/ArchfiendOfDepravity.jpg", "PTC.zip/PTC/Archfiend of Depravity.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/AtarkaWorldRender.jpg", "PTC.zip/PTC/Atarka, World Render.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/BrutalHordechief.jpg", "PTC.zip/PTC/Brutal Hordechief.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/DaghatarTheAdamant.jpg", "PTC.zip/PTC/Daghatar the Adamant.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/DragonscaleGeneral.jpg", "PTC.zip/PTC/Dragonscale General.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/DromokaTheEternal.jpg", "PTC.zip/PTC/Dromoka, the Eternal.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/FlamerushRider.jpg", "PTC.zip/PTC/Flamerush Rider.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/FlamewakePhoenix.jpg", "PTC.zip/PTC/Flamewake Phoenix.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/JeskaiInfiltrator.jpg", "PTC.zip/PTC/Jeskai Infiltrator.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/KolaghanTheStormsFury.jpg", "PTC.zip/PTC/Kolaghan, the Storm's Fury.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/MarduStrikeLeader.jpg", "PTC.zip/PTC/Mardu Strike leader.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/MasteryOfTheUnseen.jpg", "PTC.zip/PTC/Mastery of the Unseen.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/OjutaiSoulOfWinter.jpg", "PTC.zip/PTC/Ojutai, Soul of Winter.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/RallyTheAncestors.jpg", "PTC.zip/PTC/Rally the Ancestors.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/SageEyeAvengers.jpg", "PTC.zip/PTC/Sage-Eye Avengers.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/SandsteppeMastodon.jpg", "PTC.zip/PTC/Sandsteppe Mastodon.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/ShamanOfTheGreatHunt.jpg", "PTC.zip/PTC/Shaman of the Great Hunt.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/ShamanicRevelation.jpg", "PTC.zip/PTC/Shamanic Revelation.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/ShuYunTheSilentTempest.jpg", "PTC.zip/PTC/Shu Yun, the Silent Tempest.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/SilumgarTheDriftingDeath.jpg", "PTC.zip/PTC/Silumgar, the Drifting Death.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/SoulfireGrandMaster.jpg", "PTC.zip/PTC/Soulfire Grand Master.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/Soulflayer.jpg", "PTC.zip/PTC/Soulflayer.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/SupplantForm.jpg", "PTC.zip/PTC/Supplant Form.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/TasigurTheGoldenFang.jpg", "PTC.zip/PTC/Tasigur, the Golden Fang.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/TorrentElemental.jpg", "PTC.zip/PTC/Torrent Elemental.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/WardenOfTheFirstTree.jpg", "PTC.zip/PTC/Warden of the First Tree.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/Wildcall.jpg", "PTC.zip/PTC/Wildcall.full.jpg"); +// singleLinks.put("MTG/FRF/en/promo/prerelease/YasovaDragonclaw.jpg", "PTC.zip/PTC/Yasova Dragonclaw.full.jpg"); +// singleLinks.put("MTG/JOU/en/promo/DawnbringerCharioteers.jpg", "PTC.zip/PTC/Dawnbringer Charioteers.full.jpg"); +// singleLinks.put("MTG/JOU/en/promo/DictateOfKruphix.jpg", "PTC.zip/PTC/Dictate of Kruphix.full.jpg"); +// singleLinks.put("MTG/JOU/en/promo/DictateOfTheTwinGods.jpg", "PTC.zip/PTC/Dictate of the Twin Gods.full.jpg"); +// singleLinks.put("MTG/JOU/en/promo/DoomwakeGiant.jpg", "PTC.zip/PTC/Doomwake Giant.full.jpg"); +// singleLinks.put("MTG/JOU/en/promo/EidolonOfBlossoms.jpg", "PTC.zip/PTC/Eidolon of Blossoms.full.jpg"); +// singleLinks.put("MTG/JOU/en/promo/ScourgeOfSkolaVale.jpg", "PTC.zip/PTC/Scourge of Skola Vale.full.jpg"); +// singleLinks.put("MTG/JOU/en/promo/SpawnOfThraxes.jpg", "PTC.zip/PTC/Spawn of Thraxes.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/AbzanAscendancy.jpg", "PTC.zip/PTC/Abzan Ascendancy.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/AnafenzaTheForemost.jpg", "PTC.zip/PTC/Anafenza, the Foremost.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/AnkleShanker.jpg", "PTC.zip/PTC/Ankle Shanker.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/AvalancheTusker.jpg", "PTC.zip/PTC/Avalanche Tusker.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/BloodsoakedChampion.jpg", "PTC.zip/PTC/Bloodsoaked Champion.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/ButcherOfTheHorde.jpg", "PTC.zip/PTC/Butcher of the Horde.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/CracklingDoom.jpg", "PTC.zip/PTC/Crackling Doom.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/CratersClaws.jpg", "PTC.zip/PTC/Crater's Claws.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/DeflectingPalm.jpg", "PTC.zip/PTC/Deflecting Palm.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/DigThroughTime.jpg", "PTC.zip/PTC/Dig Through Time.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/DragonStyleTwins.jpg", "PTC.zip/PTC/Dragon-Style Twins.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/DragonThroneOfTarkir.jpg", "PTC.zip/PTC/Dragon Throne of Tarkir.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/Duneblast.jpg", "PTC.zip/PTC/Duneblast.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/FlyingCraneTechnique.jpg", "PTC.zip/PTC/Flying Crane Technique.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/GrimHaruspex.jpg", "PTC.zip/PTC/Grim Haruspex.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/HardenedScales.jpg", "PTC.zip/PTC/Hardened Scales.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/HeraldOfTorment.jpg", "PTC.zip/PTC/Herald of Torment.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/HighSentinelsOfArashin.jpg", "PTC.zip/PTC/High Sentinels of Arashin.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/IcyBlast.jpg", "PTC.zip/PTC/Icy Blast.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/IvorytuskFortress.jpg", "PTC.zip/PTC/Ivorytusk Fortress.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/JeeringInstigator.jpg", "PTC.zip/PTC/Jeering Instigator.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/JeskaiAscendancy.jpg", "PTC.zip/PTC/Jeskai Ascendancy.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/KheruSpellsnatcher.jpg", "PTC.zip/PTC/Kheru Spellsnatcher.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/MarduAscendancy.jpg", "PTC.zip/PTC/Mardu Ascendancy.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/MasterOfPearls.jpg", "PTC.zip/PTC/Master of Pearls.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/NarsetEnlightenedMaster.jpg", "PTC.zip/PTC/Narset, Enlightened Master.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/NecropolisFiend.jpg", "PTC.zip/PTC/Necropolis Fiend.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/RakshasaVizier.jpg", "PTC.zip/PTC/Rakshasa Vizier.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/RattleclawMystic.jpg", "PTC.zip/PTC/Rattleclaw Mystic.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/SageOfTheInwardEye.jpg", "PTC.zip/PTC/Sage of the Inward Eye.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/SidisiBroodTyrant.jpg", "PTC.zip/PTC/Sidisi, Brood Tyrant.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/SiegeRhino.jpg", "PTC.zip/PTC/Siege Rhino.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/SultaiAscendancy.jpg", "PTC.zip/PTC/Sultai Ascendancy.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/SurrakDragonclaw.jpg", "PTC.zip/PTC/Surrak Dragonclaw.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/TemurAscendancy.jpg", "PTC.zip/PTC/Temur Ascendancy.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/ThousandWinds.jpg", "PTC.zip/PTC/Thousand Winds.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/TrailOfMystery.jpg", "PTC.zip/PTC/Trail of Mystery.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/TrapEssence.jpg", "PTC.zip/PTC/Trap Essence.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/UtterEnd.jpg", "PTC.zip/PTC/Utter End.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/VillainousWealth.jpg", "PTC.zip/PTC/Villainous Wealth.full.jpg"); +// singleLinks.put("MTG/KTK/en/promo/ZurgoHelmsmasher.jpg", "PTC.zip/PTC/Zurgo Helmsmasher.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/ChiefEngineer.jpg", "PTC.zip/PTC/Chief Engineer.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/InGarruksWake.jpg", "PTC.zip/PTC/In Garruk's Wake.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/IndulgentTormentor.jpg", "PTC.zip/PTC/Indulgent Tormentor.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/MercurialPretender.jpg", "PTC.zip/PTC/Mercurial Pretender.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/PhyrexianRevoker.jpg", "PTC.zip/PTC/Phyrexian Revoker.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/Phytotitan.jpg", "PTC.zip/PTC/Phytotitan.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/ResoluteArchangel.jpg", "PTC.zip/PTC/Resolute Archangel.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/SiegeDragon.jpg", "PTC.zip/PTC/Siege Dragon.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/SoulOfRavnica.jpg", "PTC.zip/PTC/Soul of Ravnica.full.jpg"); +// singleLinks.put("MTG/M15/en/promo/SoulOfZendikar.jpg", "PTC.zip/PTC/Soul of Zendikar.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/AzusaLostButSeeking.jpg", "JR.zip/JR/Azusa, Lost but Seeking.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/Bitterblossom.jpg", "JR.zip/JR/Bitterblossom.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/BloodstainedMire.jpg", "JR.zip/JR/Bloodstained Mire.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/CommandBeacon.jpg", "JR.zip/JR/Command Beacon.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/DarkRitual.jpg", "JR.zip/JR/Dark Ritual.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/DecreeOfJustice.jpg", "JR.zip/JR/Decree of Justice.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/DefenseOfTheHeart.jpg", "JR.zip/JR/Defense of the Heart.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/ExaltedAngel.jpg", "JR.zip/JR/Exalted Angel.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/FeldonOfTheThirdPath.jpg", "JR.zip/JR/Feldon of the Third Path.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/ForceOfWill.jpg", "JR.zip/JR/Force of Will.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/GaeasCradle.jpg", "JR.zip/JR/Gaea's Cradle.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/ImperialRecruiter.jpg", "JR.zip/JR/Imperial Recruiter.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/LandTax.jpg", "JR.zip/JR/Land Tax.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/MindsDesire.jpg", "JR.zip/JR/Mind's Desire.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/MishrasFactory.jpg", "JR.zip/JR/Mishra's Factory.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/RishadanPort.jpg", "JR.zip/JR/Rishadan Port.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/ShardlessAgent.jpg", "JR.zip/JR/Shardless Agent.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/ThawingGlaciers.jpg", "JR.zip/JR/Thawing Glaciers.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/Vindicate2007.jpg", "JR.zip/JR/Vindicate.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/Vindicate2013.jpg", "JR.zip/JR/Vindicate 1.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/Wasteland2010.jpg", "JR.zip/JR/Wasteland 1.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/Wasteland2015.jpg", "JR.zip/JR/Wasteland.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/WindsweptHeath.jpg", "JR.zip/JR/Windswept Heath.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/XiahouDunTheOneEyed.jpg", "JR.zip/JR/Xiahou Dun, the One-Eyed.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/YawgmothsWill.jpg", "JR.zip/JR/Yawgmoth's Will.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Judge/ZurtheEnchanter.jpg", "JR.zip/JR/Zur the Enchanter.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AkoumFirebird.jpg", "PTC.zip/PTC/Akoum Firebird.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AkoumHellkite.jpg", "PTC.zip/PTC/Akoum Hellkite.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AlignedHedronNetwork.jpg", "PTC.zip/PTC/Aligned Hedron Network.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AllyEncampment.jpg", "PTC.zip/PTC/Ally Encampment.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/AngelicCaptain.jpg", "PTC.zip/PTC/Angelic Captain.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BarrageTyrant.jpg", "PTC.zip/PTC/Barrage Tyrant.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BeastcallerSavant.jpg", "PTC.zip/PTC/Beastcaller Savant.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BlightHerder.jpg", "PTC.zip/PTC/Blight Herder.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BringToLight.jpg", "PTC.zip/PTC/Bring to Light.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BroodButcher.jpg", "PTC.zip/PTC/Brood Butcher.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/BrutalExpulsion.jpg", "PTC.zip/PTC/Brutal Expulsion.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/CanopyVista.jpg", "PTC.zip/PTC/Canopy Vista.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/CinderGlade.jpg", "PTC.zip/PTC/Cinder Glade.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ConduitOfRuin.jpg", "PTC.zip/PTC/Conduit of Ruin.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DefiantBloodlord.jpg", "PTC.zip/PTC/Defiant Bloodlord.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DesolationTwin.jpg", "PTC.zip/PTC/Desolation Twin.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DragonmasterOutcast.jpg", "PTC.zip/PTC/Dragonmaster Outcast.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DranasChosen.jpg", "PTC.zip/PTC/Drana's Chosen.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DrownerOfHope.jpg", "PTC.zip/PTC/Drowner of Hope.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/DustStalker.jpg", "PTC.zip/PTC/Dust Stalker.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/EmeriaShepherd.jpg", "PTC.zip/PTC/Emeria Shepherd.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/EndlessOne.jpg", "PTC.zip/PTC/Endless One.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ExertInfluence.jpg", "PTC.zip/PTC/Exert Influence.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/FathomFeeder.jpg", "PTC.zip/PTC/Fathom Feeder.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/FelidarSovereign.jpg", "PTC.zip/PTC/Felidar Sovereign.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/FromBeyond.jpg", "PTC.zip/PTC/From Beyond.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GideonAllyOfZendikar.jpg", "PTC.zip/PTC/Gideon, Ally of Zendikar.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GreenwardenOfMurasa.jpg", "PTC.zip/PTC/Greenwarden of Murasa.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GruesomeSlaughter.jpg", "PTC.zip/PTC/Gruesome Slaughter.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GuardianOfTazeem.jpg", "PTC.zip/PTC/Guardian of Tazeem.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/GuulDrazOverseer.jpg", "PTC.zip/PTC/Guul Draz Overseer.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/HeroOfGomaFada.jpg", "PTC.zip/PTC/Hero of Goma Fada.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/HerosDownfall.jpg", "PTC.zip/PTC/Hero's Downfall.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/KioraMasterOfTheDepths.jpg", "PTC.zip/PTC/Kiora, Master of the Depths.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/KioraTheCrashingWave.jpg", "PTC.zip/PTC/Kiora, the Crashing Wave.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/LanternScout.jpg", "PTC.zip/PTC/Lantern Scout.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/LumberingFalls.jpg", "PTC.zip/PTC/Lumbering Falls.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/MarchFromTheTomb.jpg", "PTC.zip/PTC/March from the Tomb.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/MundaAmbushLeader.jpg", "PTC.zip/PTC/Munda, Ambush Leader.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/NissasRenewal.jpg", "PTC.zip/PTC/Nissa's Renewal.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/NoyanDarRoilShaper.jpg", "PTC.zip/PTC/Noyan Dar, Roil Shaper.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ObNixilisReignited.jpg", "PTC.zip/PTC/Ob Nixilis Reignited.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ObNixilisUnshackled.jpg", "PTC.zip/PTC/Ob Nixilis, Unshackled.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/OblivionSower.jpg", "PTC.zip/PTC/Oblivion Sower.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/OmnathLocusOfRage.jpg", "PTC.zip/PTC/Omnath, Locus of Rage.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/OranRiefHydra.jpg", "PTC.zip/PTC/Oran-Rief Hydra.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PainfulTruths.jpg", "PTC.zip/PTC/Painful Truths.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PartTheWaterveil.jpg", "PTC.zip/PTC/Part the Waterveil.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PlanarOutburst.jpg", "PTC.zip/PTC/Planar Outburst.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PrairieStream.jpg", "PTC.zip/PTC/Prairie Stream.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/PrismArray.jpg", "PTC.zip/PTC/Prism Array.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/QuarantineField.jpg", "PTC.zip/PTC/Quarantine Field.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/RadiantFlames.jpg", "PTC.zip/PTC/Radiant Flames.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/RuinousPath.jpg", "PTC.zip/PTC/Ruinous Path.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SanctumOfUgin.jpg", "PTC.zip/PTC/Sanctum of Ugin.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ScatterToTheWinds.jpg", "PTC.zip/PTC/Scatter to the Winds.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SerpentineSpike.jpg", "PTC.zip/PTC/Serpentine Spike.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ShamblingVent.jpg", "PTC.zip/PTC/Shambling Vent.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ShrineOfTheForsakenGods.jpg", "PTC.zip/PTC/Shrine of the Forsaken Gods.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SireOfStagnation.jpg", "PTC.zip/PTC/Sire of Stagnation.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SmolderingMarsh.jpg", "PTC.zip/PTC/Smoldering Marsh.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SmotheringAbomination.jpg", "PTC.zip/PTC/Smothering Abomination.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/SunkenHollow.jpg", "PTC.zip/PTC/Sunken Hollow.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/UginsInsight.jpg", "PTC.zip/PTC/Ugin's Insight.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/UginsNexus.jpg", "PTC.zip/PTC/Ugin's Nexus.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/UlamogTheCeaselessHunger.jpg", "PTC.zip/PTC/Ulamog, the Ceaseless Hunger.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/UndergrowthChampion.jpg", "PTC.zip/PTC/Undergrowth Champion.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/VeteranWarleader.jpg", "PTC.zip/PTC/Veteran Warleader.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/VoidWinnower.jpg", "PTC.zip/PTC/Void Winnower.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/WastelandStrangler.jpg", "PTC.zip/PTC/Wasteland Strangler.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/WoodlandWanderer.jpg", "PTC.zip/PTC/Woodland Wanderer.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/BFZ/ZadaHedronGrinder.jpg", "PTC.zip/PTC/Zada, Hedron Grinder.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AetherfluxReservoir.jpg", "PTC.zip/PTC/Aetherflux Reservoir.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AethersquallAncient.jpg", "PTC.zip/PTC/Aethersquall Ancient.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AetherstormRoc.jpg", "PTC.zip/PTC/Aetherstorm Roc.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AetherworksMarvel.jpg", "PTC.zip/PTC/Aetherworks Marvel.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AngelOfInvention.jpg", "PTC.zip/PTC/Angel of Invention.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AnimationModule.jpg", "PTC.zip/PTC/Animation Module.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ArchitectOfTheUntamed.jpg", "PTC.zip/PTC/Architect of the Untamed.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/AuthorityOfTheConsuls.jpg", "PTC.zip/PTC/Authority of the Consuls.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/BloomingMarsh.jpg", "PTC.zip/PTC/Blooming Marsh.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/BomatCourier.jpg", "PTC.zip/PTC/Bomat Courier.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/BotanicalSanctum.jpg", "PTC.zip/PTC/Botanical Sanctum.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/BristlingHydra.jpg", "PTC.zip/PTC/Bristling Hydra.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CapturedByTheConsulate.jpg", "PTC.zip/PTC/Captured by the Consulate.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CataclysmicGearhulk.jpg", "PTC.zip/PTC/Cataclysmic Gearhulk.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ChandraTorchOfDefiance.jpg", "PTC.zip/PTC/Chandra, Torch of Defiance.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CombustibleGearhulk.jpg", "PTC.zip/PTC/Combustible Gearhulk.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ConcealedCourtyard.jpg", "PTC.zip/PTC/Concealed Courtyard.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ConfiscationCoup.jpg", "PTC.zip/PTC/Confiscation Coup.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CultivatorOfBlades.jpg", "PTC.zip/PTC/Cultivator of Blades.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/CultivatorsCaravan.jpg", "PTC.zip/PTC/Cultivator's Caravan.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DeadlockTrap.jpg", "PTC.zip/PTC/Deadlock Trap.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DemonOfDarkSchemes.jpg", "PTC.zip/PTC/Demon of Dark Schemes.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DepalaPilotExemplar.jpg", "PTC.zip/PTC/Depala, Pilot Exemplar.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DovinBaan.jpg", "PTC.zip/PTC/Dovin Baan.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DubiousChallenge.jpg", "PTC.zip/PTC/Dubious Challenge.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/DynavoltTower.jpg", "PTC.zip/PTC/Dynavolt Tower.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ElectrostaticPummeler.jpg", "PTC.zip/PTC/Electrostatic Pummeler.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/EliminateTheCompetition.jpg", "PTC.zip/PTC/Eliminate the Competition.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/FatefulShowdown.jpg", "PTC.zip/PTC/Fateful Showdown.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/FleetwheelCruiser.jpg", "PTC.zip/PTC/Fleetwheel Cruiser.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/Fumigate.jpg", "PTC.zip/PTC/Fumigate.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/GhirapurOrrery.jpg", "PTC.zip/PTC/Ghirapur Orrery.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/GontiLordOfLuxury.jpg", "PTC.zip/PTC/Gonti, Lord of Luxury.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/InsidiousWill.jpg", "PTC.zip/PTC/Insidious Will.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/InspiringVantage.jpg", "PTC.zip/PTC/Inspiring Vantage.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/InventorsFair.jpg", "PTC.zip/PTC/Inventors' Fair.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/KambalConsulOfAllocation.jpg", "PTC.zip/PTC/Kambal, Consul of Allocation.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/KeyToTheCity.jpg", "PTC.zip/PTC/Key to the City.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/LathnuHellion.jpg", "PTC.zip/PTC/Lathnu Hellion.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/LostLegacy.jpg", "PTC.zip/PTC/Lost Legacy.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MadcapExperiment.jpg", "PTC.zip/PTC/Madcap Experiment.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MarionetteMaster.jpg", "PTC.zip/PTC/Marionette Master.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MasterTrinketeer.jpg", "PTC.zip/PTC/Master Trinketeer.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MetallurgicSummonings.jpg", "PTC.zip/PTC/Metallurgic Summonings.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MetalworkColossus.jpg", "PTC.zip/PTC/Metalwork Colossus.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MidnightOil.jpg", "PTC.zip/PTC/Midnight Oil.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/MultiformWonder.jpg", "PTC.zip/PTC/Multiform Wonder.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/NissaVitalForce.jpg", "PTC.zip/PTC/Nissa, Vital Force.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/NoxiousGearhulk.jpg", "PTC.zip/PTC/Noxious Gearhulk.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/OviyaPashiriSageLifecrafter.jpg", "PTC.zip/PTC/Oviya Pashiri, Sage Lifecrafter.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/PadeemConsulOfInnovation.jpg", "PTC.zip/PTC/Padeem, Consul of Innovation.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/Panharmonicon.jpg", "PTC.zip/PTC/Panharmonicon.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ParadoxicalOutcome.jpg", "PTC.zip/PTC/Paradoxical Outcome.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/PiaNalaar.jpg", "PTC.zip/PTC/Pia Nalaar.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/RashmiEternitiesCrafter.jpg", "PTC.zip/PTC/Rashmi, Eternities Crafter.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SaheeliRai.jpg", "PTC.zip/PTC/Saheeli Rai.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SaheelisArtistry.jpg", "PTC.zip/PTC/Saheeli's Artistry.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ScrapheapScrounger.jpg", "PTC.zip/PTC/Scrapheap Scrounger.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SkyshipStalker.jpg", "PTC.zip/PTC/Skyship Stalker.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SkysovereignConsulFlagship.jpg", "PTC.zip/PTC/Skysovereign, Consul Flagship.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SmugglersCopter.jpg", "PTC.zip/PTC/Smuggler's Copter.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SpirebluffCanal.jpg", "PTC.zip/PTC/Spirebluff Canal.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/SyndicateTrafficker.jpg", "PTC.zip/PTC/Syndicate Trafficker.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/TerritorialGorger.jpg", "PTC.zip/PTC/Territorial Gorger.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/ToolcraftExemplar.jpg", "PTC.zip/PTC/Toolcraft Exemplar.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/TorrentialGearhulk.jpg", "PTC.zip/PTC/Torrential Gearhulk.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/VerdurousGearhulk.jpg", "PTC.zip/PTC/Verdurous Gearhulk.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/KLD/WildestDreams.jpg", "PTC.zip/PTC/Wildest Dreams.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/AyliEternalPilgrim.jpg", "PTC.zip/PTC/Ayli, Eternal Pilgrim.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/BearerOfSilence.jpg", "PTC.zip/PTC/Bearer of Silence.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/BearerOfTheHeavens.jpg", "PTC.zip/PTC/Bearer of the Heavens.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/CallTheGatewatch.jpg", "PTC.zip/PTC/Call the Gatewatch.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/CaptainsClaws.jpg", "PTC.zip/PTC/Captain's Claws.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/ChandraFlamecaller.jpg", "PTC.zip/PTC/Chandra, Flamecaller.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/ChandraPyromaster.jpg", "PTC.zip/PTC/Chandra, Pyromaster.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/CorruptedCrossroads.jpg", "PTC.zip/PTC/Corrupted Crossroads.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/CrushOfTentacles.jpg", "PTC.zip/PTC/Crush of Tentacles.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DeceiverOfForm.jpg", "PTC.zip/PTC/Deceiver of Form.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DeepfathomSkulker.jpg", "PTC.zip/PTC/Deepfathom Skulker.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DimensionalInfiltrator.jpg", "PTC.zip/PTC/Dimensional Infiltrator.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DranaLiberatorOfMalakir.jpg", "PTC.zip/PTC/Drana, Liberator of Malakir.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/DreadDefiler.jpg", "PTC.zip/PTC/Dread Defiler.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziDisplacer.jpg", "PTC.zip/PTC/Eldrazi Displacer.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziMimic.jpg", "PTC.zip/PTC/Eldrazi Mimic.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/EldraziObligator.jpg", "PTC.zip/PTC/Eldrazi Obligator.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/EndHostilities.jpg", "PTC.zip/PTC/End Hostilities.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/Endbringer.jpg", "PTC.zip/PTC/Endbringer.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/FallOfTheTitans.jpg", "PTC.zip/PTC/Fall of the Titans.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/GeneralTazri.jpg", "PTC.zip/PTC/General Tazri.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/GladehartCavalry.jpg", "PTC.zip/PTC/Gladehart Cavalry.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/GoblinDarkDwellers.jpg", "PTC.zip/PTC/Goblin Dark-Dwellers.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/GoblinRabblemaster.jpg", "PTC.zip/PTC/Goblin Rabblemaster.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/HedronAlignment.jpg", "PTC.zip/PTC/Hedron Alignment.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/HissingQuagmire.jpg", "PTC.zip/PTC/Hissing Quagmire.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/InverterOfTruth.jpg", "PTC.zip/PTC/Inverter of Truth.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/JoriEnRuinDiver.jpg", "PTC.zip/PTC/Jori En, Ruin Diver.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/KalitasTraitorOfGhet.jpg", "PTC.zip/PTC/Kalitas, Traitor of Ghet.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/KozilekTheGreatDistortion.jpg", "PTC.zip/PTC/Kozilek, the Great Distortion.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/KozileksReturn.jpg", "PTC.zip/PTC/Kozilek's Return.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/LinvalaThePreserver.jpg", "PTC.zip/PTC/Linvala, the Preserver.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/MatterReshaper.jpg", "PTC.zip/PTC/Matter Reshaper.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/MinaAndDennWildborn.jpg", "PTC.zip/PTC/Mina and Denn, Wildborn.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/Mirrorpool.jpg", "PTC.zip/PTC/Mirrorpool.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/MundasVanguard.jpg", "PTC.zip/PTC/Munda's Vanguard.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/NeedleSpires.jpg", "PTC.zip/PTC/Needle Spires.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/NissaVoiceOfZendikar.jpg", "PTC.zip/PTC/Nissa, Voice of Zendikar.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfChandra.jpg", "PTC.zip/PTC/Oath of Chandra.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfGideon.jpg", "PTC.zip/PTC/Oath of Gideon.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfJace.jpg", "PTC.zip/PTC/Oath of Jace.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OathOfNissa.jpg", "PTC.zip/PTC/Oath of Nissa.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/OverwhelmingDenial.jpg", "PTC.zip/PTC/Overwhelming Denial.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/RealitySmasher.jpg", "PTC.zip/PTC/Reality Smasher.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/RemorselessPunishment.jpg", "PTC.zip/PTC/Remorseless Punishment.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/RuinsOfOranRief.jpg", "PTC.zip/PTC/Ruins of Oran-Rief.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SeaGateWreckage.jpg", "PTC.zip/PTC/Sea Gate Wreckage.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SifterOfSkulls.jpg", "PTC.zip/PTC/Sifter of Skulls.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SphinxOfTheFinalWord.jpg", "PTC.zip/PTC/Sphinx of the Final Word.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/StoneHavenOutfitter.jpg", "PTC.zip/PTC/Stone Haven Outfitter.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/StoneforgeMasterwork.jpg", "PTC.zip/PTC/Stoneforge Masterwork.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SylvanAdvocate.jpg", "PTC.zip/PTC/Sylvan Advocate.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/SylvanCaryatid.jpg", "PTC.zip/PTC/Sylvan Caryatid.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/ThoughtKnotSeer.jpg", "PTC.zip/PTC/Thought-Knot Seer.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/TyrantOfValakut.jpg", "PTC.zip/PTC/Tyrant of Valakut.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/VileRedeemer.jpg", "PTC.zip/PTC/Vile Redeemer.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/WanderingFumarole.jpg", "PTC.zip/PTC/Wandering Fumarole.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/WorldBreaker.jpg", "PTC.zip/PTC/World Breaker.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/OGW/ZendikarResurgent.jpg", "PTC.zip/PTC/Zendikar Resurgent.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AlteredEgo.jpg", "PTC.zip/PTC/Altered Ego.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AlwaysWatching.jpg", "PTC.zip/PTC/Always Watching.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AngelOfDeliverance.jpg", "PTC.zip/PTC/Angel of Deliverance.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AnguishedUnmaking.jpg", "PTC.zip/PTC/Anguished Unmaking.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ArchangelAvacyn.jpg", "PTC.zip/PTC/Archangel Avacyn.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ArlinnKord.jpg", "PTC.zip/PTC/Arlinn Kord.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AsylumVisitor.jpg", "PTC.zip/PTC/Asylum Visitor.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AvacynGuardianAngel.jpg", "PTC.zip/PTC/Avacyn, Guardian Angel.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/AvacynsJudgment.jpg", "PTC.zip/PTC/Avacyn's Judgement.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/BeholdTheBeyond.jpg", "PTC.zip/PTC/Behold the Beyond.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/BrainInAJar.jpg", "PTC.zip/PTC/Brain in a Jar.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/BurnFromWithin.jpg", "PTC.zip/PTC/Burn from Within.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/BygoneBishop.jpg", "PTC.zip/PTC/Bygone Bishop.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ChokedEstuary.jpg", "PTC.zip/PTC/Choked Estuary.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ConfirmSuspicions.jpg", "PTC.zip/PTC/Confirm Suspicions.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/CorruptedGrafstone.jpg", "PTC.zip/PTC/Corrupted Grafstone.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/CryptolithRite.jpg", "PTC.zip/PTC/Cryptolith Rite.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DeathcapCultivator.jpg", "PTC.zip/PTC/Deathcap Cultivator.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DeclarationInStone.jpg", "PTC.zip/PTC/Declaration in Stone.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DescendUponTheSinful.jpg", "PTC.zip/PTC/Descend upon the Sinful.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DevilsPlayground.jpg", "PTC.zip/PTC/Devils' Playground.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DiregrafColossus.jpg", "PTC.zip/PTC/Diregraf Colossus.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DrogskolCavalry.jpg", "PTC.zip/PTC/Drogskol Cavalry.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/DrownyardTemple.jpg", "PTC.zip/PTC/Drownyard Temple.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/EerieInterlude.jpg", "PTC.zip/PTC/Eerie Interlude.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/EngulfTheShore.jpg", "PTC.zip/PTC/Engulf the Shore.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/EpiphanyAtTheDrownyard.jpg", "PTC.zip/PTC/Epiphany at the Drownyard.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/EverAfter.jpg", "PTC.zip/PTC/Ever After.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FalkenrathGorger.jpg", "PTC.zip/PTC/Falkenrath Gorger.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FeveredVisions.jpg", "PTC.zip/PTC/Fevered Visions.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FlamebladeAngel.jpg", "PTC.zip/PTC/Flameblade Angel.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ForebodingRuins.jpg", "PTC.zip/PTC/Foreboding Ruins.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ForgottenCreation.jpg", "PTC.zip/PTC/Forgotten Creation.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FortifiedVillage.jpg", "PTC.zip/PTC/Fortified Village.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/FromUnderTheFloorboards.jpg", "PTC.zip/PTC/From Under the Floorboards.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GameTrail.jpg", "PTC.zip/PTC/Game Trail.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GeierReachBandit.jpg", "PTC.zip/PTC/Geier Reach Bandit.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GeierReachSanitarium.jpg", "PTC.zip/PTC/Geier Reach Sanitarium.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GeralfsMasterpiece.jpg", "PTC.zip/PTC/Geralf's Masterpiece.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/GoldnightCastigator.jpg", "PTC.zip/PTC/Goldnight Castigator.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/HanweirMilitiaCaptain.jpg", "PTC.zip/PTC/Hanweir Militia Captain.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/HarnessTheStorm.jpg", "PTC.zip/PTC/Harness the Storm.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/InexorableBlob.jpg", "PTC.zip/PTC/Inexorable Blob.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/InvocationOfSaintTraft.jpg", "PTC.zip/PTC/Invocation of Saint Traft.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/JaceTheLivingGuildpact.jpg", "PTC.zip/PTC/Jace, the Living Guildpact.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/JaceUnravelerOfSecrets.jpg", "PTC.zip/PTC/Jace, Unraveler of Secrets.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/MarkovDreadknight.jpg", "PTC.zip/PTC/Markov Dreadknight.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/MindwrackDemon.jpg", "PTC.zip/PTC/Mindwrack Demon.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/NahiriTheHarbinger.jpg", "PTC.zip/PTC/Nahiri, the Harbinger.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/NephaliaMoondrakes.jpg", "PTC.zip/PTC/Nephalia Moondrakes.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/OdricLunarchMarshal.jpg", "PTC.zip/PTC/Odric, Lunarch Marshal.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/OliviaMobilizedForWar.jpg", "PTC.zip/PTC/Olivia, Mobilized for War.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/OrmendahlProfanePrince.jpg", "PTC.zip/PTC/Ormendahl, Profane Prince.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/PortTown.jpg", "PTC.zip/PTC/Port Town.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/PrizedAmalgam.jpg", "PTC.zip/PTC/Prized Amalgam.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/Rattlechains.jpg", "PTC.zip/PTC/Rattlechains.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/RelentlessDead.jpg", "PTC.zip/PTC/Relentless Dead.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SageOfAncientLore.jpg", "PTC.zip/PTC/Sage of Ancient Lore.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ScourgeWolf.jpg", "PTC.zip/PTC/Scourge Wolf.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SeasonsPast.jpg", "PTC.zip/PTC/Seasons Past.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SecondHarvest.jpg", "PTC.zip/PTC/Second Harvest.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SigardaHeronsGrace.jpg", "PTC.zip/PTC/Sigarda, Heron's Grace.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SilverfurPartisan.jpg", "PTC.zip/PTC/Silverfur Partisan.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SinProdder.jpg", "PTC.zip/PTC/Sin Prodder.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SlayersPlate.jpg", "PTC.zip/PTC/Slayer's Plate.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SorinGrimNemesis.jpg", "PTC.zip/PTC/Sorin, Grim Nemesis.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SorinSolemnVisitor.jpg", "PTC.zip/PTC/Sorin, Solemn Visitor.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/SoulSwallower.jpg", "PTC.zip/PTC/Soul Swallower.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/StartledAwake.jpg", "PTC.zip/PTC/Startled Awake.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TamiyoFieldResearcher.jpg", "PTC.zip/PTC/Tamiyo, Field Researcher.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TamiyosJournal.jpg", "PTC.zip/PTC/Tamiyo's Journal.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ThaliaHereticCathar.jpg", "PTC.zip/PTC/Thalia, Heretic Cathar.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ThaliasLieutenant.jpg", "PTC.zip/PTC/Thalia's Lieutenant.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TheGitrogMonster.jpg", "PTC.zip/PTC/The Gitrog Monster.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ThingInTheIce.jpg", "PTC.zip/PTC/Thing in the Ice.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TirelessTracker.jpg", "PTC.zip/PTC/Tireless Tracker.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/ToTheSlaughter.jpg", "PTC.zip/PTC/To the Slaughter.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/TraverseTheUlvenwald.jpg", "PTC.zip/PTC/Traverse the Ulvenwald.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/Triskaidekaphobia.jpg", "PTC.zip/PTC/Triskaidekaphobia.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/UlvenwaldObserver.jpg", "PTC.zip/PTC/Ulvenwald Observer.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/WelcomeToTheFold.jpg", "PTC.zip/PTC/Welcome to the Fold.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/WestvaleAbbey.jpg", "PTC.zip/PTC/Westvale Abbey.full.jpg"); +// singleLinks.put("MTG/PRM/en/foil/Prerelease/SOI/WolfOfDevilsBreach.jpg", "PTC.zip/PTC/Wolf of Devil's Breach.full.jpg"); +// singleLinks.put("MTG/THS/en/promo/HerosDownfall.jpg", "PTC.zip/PTC/Hero's Downfall.full.jpg"); +// singleLinks.put("MTG/THS/en/promo/ReaperOfTheWilds.jpg", "PTC.zip/PTC/Reaper of the Wilds.full.jpg"); +// singleLinks.put("MTG/THS/en/promo/WhipOfErebos.jpg", "PTC.zip/PTC/Whip of Erebos.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/AncientTomb.jpg", "EXP.zip/EXP/Ancient Tomb .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/CascadeBluffs.jpg", "EXP.zip/EXP/Cascade Bluffs .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/DustBowl.jpg", "EXP.zip/EXP/Dust Bowl .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/EyeOfUgin.jpg", "EXP.zip/EXP/Eye of Ugin .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/FetidHeath.jpg", "EXP.zip/EXP/Fetid Heath .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/FireLitThicket.jpg", "EXP.zip/EXP/Fire-Lit Thicket .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/FloodedGrove.jpg", "EXP.zip/EXP/Flooded Grove .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/ForbiddenOrchard.jpg", "EXP.zip/EXP/Forbidden Orchard .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/GravenCairns.jpg", "EXP.zip/EXP/Graven Cairns .full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/HorizonCanopy.jpg", "EXP.zip/EXP/Horizon Canopy.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/KorHaven.jpg", "EXP.zip/EXP/Kor Haven.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/ManaConfluence.jpg", "EXP.zip/EXP/Mana Confluence.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/MysticGate.jpg", "EXP.zip/EXP/Mystic Gate.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/RuggedPrairie.jpg", "EXP.zip/EXP/Rugged Prairie.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/StripMine.jpg", "EXP.zip/EXP/Strip Mine.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/SunkenRuins.jpg", "EXP.zip/EXP/Sunken Ruins.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/TectonicEdge.jpg", "EXP.zip/EXP/Tectonic Edge.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/TwilightMire.jpg", "EXP.zip/EXP/Twilight Mire.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/Wasteland.jpg", "EXP.zip/EXP/Wasteland.full.jpg"); +// singleLinks.put("MTG/EXP/en/foil/WoodedBastion.jpg", "EXP.zip/EXP/Wooded Bastion.full.jpg"); +// singleLinks.put("apac/1.jpg", "APAC.zip/APAC/Forest.1.full.jpg"); +// singleLinks.put("apac/10.jpg", "APAC.zip/APAC/Swamp.10.full.jpg"); +// singleLinks.put("apac/11.jpg", "APAC.zip/APAC/Forest.11.full.jpg"); +// singleLinks.put("apac/12.jpg", "APAC.zip/APAC/Island.7.full.jpg"); +// singleLinks.put("apac/13.jpg", "APAC.zip/APAC/Mountain.13.full.jpg"); +// singleLinks.put("apac/14.jpg", "APAC.zip/APAC/Plains.14.full.jpg"); +// singleLinks.put("apac/15.jpg", "APAC.zip/APAC/Swamp.15.full.jpg"); +// singleLinks.put("apac/2.jpg", "APAC.zip/APAC/Island.2.full.jpg"); +// singleLinks.put("apac/3.jpg", "APAC.zip/APAC/Mountain.3.full.jpg"); +// singleLinks.put("apac/4.jpg", "APAC.zip/APAC/Plains.4.full.jpg"); +// singleLinks.put("apac/5.jpg", "APAC.zip/APAC/Swamp.5.full.jpg"); +// singleLinks.put("apac/6.jpg", "APAC.zip/APAC/Forest.6.full.jpg"); +// singleLinks.put("apac/7.jpg", "APAC.zip/APAC/Island.12.full.jpg"); +// singleLinks.put("apac/8.jpg", "APAC.zip/APAC/Mountain.8.full.jpg"); +// singleLinks.put("apac/9.jpg", "APAC.zip/APAC/Plains.9.full.jpg"); +// singleLinks.put("arena/1.jpg", "ARENA.zip/ARENA/Plains.1.full.jpg"); +// singleLinks.put("arena/10.jpg", "ARENA.zip/ARENA/Swamp.10.full.jpg"); +// singleLinks.put("arena/11.jpg", "ARENA.zip/ARENA/Mountain.11.full.jpg"); +// singleLinks.put("arena/12.jpg", "ARENA.zip/ARENA/Forest.12.full.jpg"); +// singleLinks.put("arena/13.jpg", "ARENA.zip/ARENA/Pouncing Jaguar.full.jpg"); +// singleLinks.put("arena/14.jpg", "ARENA.zip/ARENA/Skittering Skirge.full.jpg"); +// singleLinks.put("arena/15.jpg", "ARENA.zip/ARENA/Rewind.full.jpg"); +// singleLinks.put("arena/16.jpg", "ARENA.zip/ARENA/Karn, Silver Golem.full.jpg"); +// singleLinks.put("arena/17.jpg", "ARENA.zip/ARENA/Duress.full.jpg"); +// singleLinks.put("arena/18.jpg", "ARENA.zip/ARENA/Uktabi Orangutan.full.jpg"); +// singleLinks.put("arena/19.jpg", "ARENA.zip/ARENA/Chill.full.jpg"); +// singleLinks.put("arena/2.jpg", "ARENA.zip/ARENA/Island.2.full.jpg"); +// singleLinks.put("arena/20.jpg", "ARENA.zip/ARENA/Pillage.full.jpg"); +// singleLinks.put("arena/21.jpg", "ARENA.zip/ARENA/Enlightened Tutor.full.jpg"); +// singleLinks.put("arena/22.jpg", "ARENA.zip/ARENA/Stupor.full.jpg"); +// singleLinks.put("arena/23.jpg", "ARENA.zip/ARENA/Plains.23.full.jpg"); +// singleLinks.put("arena/24.jpg", "ARENA.zip/ARENA/Island.24.full.jpg"); +// singleLinks.put("arena/25.jpg", "ARENA.zip/ARENA/Swamp.25.full.jpg"); +// singleLinks.put("arena/26.jpg", "ARENA.zip/ARENA/Mountain.26.full.jpg"); +// singleLinks.put("arena/27.jpg", "ARENA.zip/ARENA/Forest.27.full.jpg"); +// singleLinks.put("arena/28.jpg", "ARENA.zip/ARENA/Creeping Mold.full.jpg"); +// singleLinks.put("arena/29.jpg", "ARENA.zip/ARENA/Dismiss.full.jpg"); +// singleLinks.put("arena/3.jpg", "ARENA.zip/ARENA/Swamp.3.full.jpg"); +// singleLinks.put("arena/30.jpg", "ARENA.zip/ARENA/Fling.full.jpg"); +// singleLinks.put("arena/31.jpg", "ARENA.zip/ARENA/Empyrial Armor.full.jpg"); +// singleLinks.put("arena/32.jpg", "ARENA.zip/ARENA/Plains.32.full.jpg"); +// singleLinks.put("arena/33.jpg", "ARENA.zip/ARENA/Island.33.full.jpg"); +// singleLinks.put("arena/34.jpg", "ARENA.zip/ARENA/Swamp.34.full.jpg"); +// singleLinks.put("arena/35.jpg", "ARENA.zip/ARENA/Mountain.35.full.jpg"); +// singleLinks.put("arena/36.jpg", "ARENA.zip/ARENA/Forest.36.full.jpg"); +// singleLinks.put("arena/37.jpg", "ARENA.zip/ARENA/Diabolic Edict.full.jpg"); +// singleLinks.put("arena/38.jpg", "ARENA.zip/ARENA/Gaea's Blessing.full.jpg"); +// singleLinks.put("arena/39.jpg", "ARENA.zip/ARENA/Island.39.full.jpg"); +// singleLinks.put("arena/4.jpg", "ARENA.zip/ARENA/Mountain.4.full.jpg"); +// singleLinks.put("arena/40.jpg", "ARENA.zip/ARENA/Forest.40.full.jpg"); +// singleLinks.put("arena/41.jpg", "ARENA.zip/ARENA/Man-o'-War.full.jpg"); +// singleLinks.put("arena/42.jpg", "ARENA.zip/ARENA/Arc Lightning.full.jpg"); +// singleLinks.put("arena/43.jpg", "ARENA.zip/ARENA/Dauthi Slayer.full.jpg"); +// singleLinks.put("arena/44.jpg", "ARENA.zip/ARENA/Mana Leak.full.jpg"); +// singleLinks.put("arena/45.jpg", "ARENA.zip/ARENA/Plains.45.full.jpg"); +// singleLinks.put("arena/46.jpg", "ARENA.zip/ARENA/Island.46.full.jpg"); +// singleLinks.put("arena/47.jpg", "ARENA.zip/ARENA/Swamp.47.full.jpg"); +// singleLinks.put("arena/48.jpg", "ARENA.zip/ARENA/Mountain.48.full.jpg"); +// singleLinks.put("arena/5.jpg", "ARENA.zip/ARENA/Forest.5.full.jpg"); +// singleLinks.put("arena/50.jpg", "ARENA.zip/ARENA/Skirk Marauder.full.jpg"); +// singleLinks.put("arena/51.jpg", "ARENA.zip/ARENA/Elvish Aberration.full.jpg"); +// singleLinks.put("arena/52.jpg", "ARENA.zip/ARENA/Bonesplitter.full.jpg"); +// singleLinks.put("arena/53.jpg", "ARENA.zip/ARENA/Plains.53.full.jpg"); +// singleLinks.put("arena/54.jpg", "ARENA.zip/ARENA/Island.54.full.jpg"); +// singleLinks.put("arena/55.jpg", "ARENA.zip/ARENA/Swamp.55.full.jpg"); +// singleLinks.put("arena/56.jpg", "ARENA.zip/ARENA/Mountain.56.full.jpg"); +// singleLinks.put("arena/57.jpg", "ARENA.zip/ARENA/Forest.57.full.jpg"); +// singleLinks.put("arena/58.jpg", "ARENA.zip/ARENA/Darksteel Ingot.full.jpg"); +// singleLinks.put("arena/59.jpg", "ARENA.zip/ARENA/Serum Visions.full.jpg"); +// singleLinks.put("arena/6.jpg", "ARENA.zip/ARENA/Disenchant.full.jpg"); +// singleLinks.put("arena/60.jpg", "ARENA.zip/ARENA/Glacial Ray.full.jpg"); +// singleLinks.put("arena/61.jpg", "ARENA.zip/ARENA/Circle of Protection Art.full.jpg"); +// singleLinks.put("arena/62.jpg", "ARENA.zip/ARENA/Mise.full.jpg"); +// singleLinks.put("arena/63.jpg", "ARENA.zip/ARENA/Booster Tutor.full.jpg"); +// singleLinks.put("arena/64.jpg", "ARENA.zip/ARENA/Goblin Mime.full.jpg"); +// singleLinks.put("arena/65.jpg", "ARENA.zip/ARENA/Granny's Payback.full.jpg"); +// singleLinks.put("arena/66.jpg", "ARENA.zip/ARENA/Ashnod's Coupon.full.jpg"); +// singleLinks.put("arena/67.jpg", "ARENA.zip/ARENA/Plains.67.full.jpg"); +// singleLinks.put("arena/68.jpg", "ARENA.zip/ARENA/Island.68.full.jpg"); +// singleLinks.put("arena/69.jpg", "ARENA.zip/ARENA/Swamp.69.full.jpg"); +// singleLinks.put("arena/7.jpg", "ARENA.zip/ARENA/Fireball.full.jpg"); +// singleLinks.put("arena/70.jpg", "ARENA.zip/ARENA/Mountain.70.full.jpg"); +// singleLinks.put("arena/71.jpg", "ARENA.zip/ARENA/Forest.71.full.jpg"); +// singleLinks.put("arena/72.jpg", "ARENA.zip/ARENA/Genju of the Spires.full.jpg"); +// singleLinks.put("arena/73.jpg", "ARENA.zip/ARENA/Okina Nightwatch.full.jpg"); +// singleLinks.put("arena/74.jpg", "ARENA.zip/ARENA/Skyknight Legionnaire.full.jpg"); +// singleLinks.put("arena/75.jpg", "ARENA.zip/ARENA/Plains.75.full.jpg"); +// singleLinks.put("arena/76.jpg", "ARENA.zip/ARENA/Island.76.full.jpg"); +// singleLinks.put("arena/77.jpg", "ARENA.zip/ARENA/Swamp.77.full.jpg"); +// singleLinks.put("arena/78.jpg", "ARENA.zip/ARENA/Mountain.78.full.jpg"); +// singleLinks.put("arena/8.jpg", "ARENA.zip/ARENA/Plains.8.full.jpg"); +// singleLinks.put("arena/80.jpg", "ARENA.zip/ARENA/Castigate.full.jpg"); +// singleLinks.put("arena/81.jpg", "ARENA.zip/ARENA/Wee Dragonauts.full.jpg"); +// singleLinks.put("arena/82.jpg", "ARENA.zip/ARENA/Coiling Oracle.full.jpg"); +// singleLinks.put("arena/83.jpg", "ARENA.zip/ARENA/Surging Flame.full.jpg"); +// singleLinks.put("arena/9.jpg", "ARENA.zip/ARENA/Island.9.full.jpg"); +// singleLinks.put("euro/1.jpg", "EURO.zip/EURO/Forest.1.full.jpg"); +// singleLinks.put("euro/10.jpg", "EURO.zip/EURO/Swamp.10.full.jpg"); +// singleLinks.put("euro/11.jpg", "EURO.zip/EURO/Forest.11.full.jpg"); +// singleLinks.put("euro/12.jpg", "EURO.zip/EURO/Island.12.full.jpg"); +// singleLinks.put("euro/13.jpg", "EURO.zip/EURO/Mountain.13.full.jpg"); +// singleLinks.put("euro/14.jpg", "EURO.zip/EURO/Plains.14.full.jpg"); +// singleLinks.put("euro/15.jpg", "EURO.zip/EURO/Swamp.15.full.jpg"); +// singleLinks.put("euro/2.jpg", "EURO.zip/EURO/Island.2.full.jpg"); +// singleLinks.put("euro/3.jpg", "EURO.zip/EURO/Mountain.3.full.jpg"); +// singleLinks.put("euro/4.jpg", "EURO.zip/EURO/Plains.4.full.jpg"); +// singleLinks.put("euro/5.jpg", "EURO.zip/EURO/Swamp.5.full.jpg"); +// singleLinks.put("euro/6.jpg", "EURO.zip/EURO/Forest.6.full.jpg"); +// singleLinks.put("euro/7.jpg", "EURO.zip/EURO/Island.7.full.jpg"); +// singleLinks.put("euro/8.jpg", "EURO.zip/EURO/Mountain.8.full.jpg"); +// singleLinks.put("euro/9.jpg", "EURO.zip/EURO/Plains.9.full.jpg"); +// singleLinks.put("exp/1.jpg", "EXP.zip/EXP/Prairie Stream.full.jpg"); +// singleLinks.put("exp/10.jpg", "EXP.zip/EXP/Temple Garden.full.jpg"); +// singleLinks.put("exp/11.jpg", "EXP.zip/EXP/Godless Shrine.full.jpg"); +// singleLinks.put("exp/12.jpg", "EXP.zip/EXP/Steam Vents.full.jpg"); +// singleLinks.put("exp/13.jpg", "EXP.zip/EXP/Overgrown Tomb.full.jpg"); +// singleLinks.put("exp/14.jpg", "EXP.zip/EXP/Sacred Foundry.full.jpg"); +// singleLinks.put("exp/15.jpg", "EXP.zip/EXP/Breeding Pool.full.jpg"); +// singleLinks.put("exp/16.jpg", "EXP.zip/EXP/Flooded Strand.full.jpg"); +// singleLinks.put("exp/17.jpg", "EXP.zip/EXP/Polluted Delta.full.jpg"); +// singleLinks.put("exp/18.jpg", "EXP.zip/EXP/Bloodstained Mire.full.jpg"); +// singleLinks.put("exp/19.jpg", "EXP.zip/EXP/Wooded Foothills.full.jpg"); +// singleLinks.put("exp/2.jpg", "EXP.zip/EXP/Sunken Hollow.full.jpg"); +// singleLinks.put("exp/20.jpg", "EXP.zip/EXP/Windswept Heath.full.jpg"); +// singleLinks.put("exp/21.jpg", "EXP.zip/EXP/Marsh Flats.full.jpg"); +// singleLinks.put("exp/22.jpg", "EXP.zip/EXP/Scalding Tarn.full.jpg"); +// singleLinks.put("exp/23.jpg", "EXP.zip/EXP/Verdant Catacombs.full.jpg"); +// singleLinks.put("exp/24.jpg", "EXP.zip/EXP/Arid Mesa.full.jpg"); +// singleLinks.put("exp/25.jpg", "EXP.zip/EXP/Misty Rainforest.full.jpg"); +// singleLinks.put("exp/3.jpg", "EXP.zip/EXP/Smoldering Marsh.full.jpg"); +// singleLinks.put("exp/4.jpg", "EXP.zip/EXP/Cinder Glade.full.jpg"); +// singleLinks.put("exp/5.jpg", "EXP.zip/EXP/Canopy Vista.full.jpg"); +// singleLinks.put("exp/6.jpg", "EXP.zip/EXP/Hallowed Fountain.full.jpg"); +// singleLinks.put("exp/7.jpg", "EXP.zip/EXP/Watery Grave.full.jpg"); +// singleLinks.put("exp/8.jpg", "EXP.zip/EXP/Blood Crypt.full.jpg"); +// singleLinks.put("exp/9.jpg", "EXP.zip/EXP/Stomping Ground.full.jpg"); +// singleLinks.put("fnmp/1.jpg", "FNMP.zip/FNMP/River Boa.full.jpg"); +// singleLinks.put("fnmp/10.jpg", "FNMP.zip/FNMP/Stone Rain.full.jpg"); +// singleLinks.put("fnmp/100.jpg", "FNMP.zip/FNMP/Thirst for Knowledge.full.jpg"); +// singleLinks.put("fnmp/101.jpg", "FNMP.zip/FNMP/Serrated Arrows.full.jpg"); +// singleLinks.put("fnmp/102.jpg", "FNMP.zip/FNMP/Isochron Scepter.full.jpg"); +// singleLinks.put("fnmp/103.jpg", "FNMP.zip/FNMP/Shrapnel Blast.full.jpg"); +// singleLinks.put("fnmp/104.jpg", "FNMP.zip/FNMP/Magma Jet.full.jpg"); +// singleLinks.put("fnmp/105.jpg", "FNMP.zip/FNMP/Myr Enforcer.full.jpg"); +// singleLinks.put("fnmp/106.jpg", "FNMP.zip/FNMP/Kitchen Finks.full.jpg"); +// singleLinks.put("fnmp/107.jpg", "FNMP.zip/FNMP/Merrow Reejerey.full.jpg"); +// singleLinks.put("fnmp/108.jpg", "FNMP.zip/FNMP/Wren's Run Vanquisher.full.jpg"); +// singleLinks.put("fnmp/109.jpg", "FNMP.zip/FNMP/Mulldrifter.full.jpg"); +// singleLinks.put("fnmp/11.jpg", "FNMP.zip/FNMP/Llanowar Elves.full.jpg"); +// singleLinks.put("fnmp/110.jpg", "FNMP.zip/FNMP/Murderous Redcap.full.jpg"); +// singleLinks.put("fnmp/111.jpg", "FNMP.zip/FNMP/Lightning Greaves.full.jpg"); +// singleLinks.put("fnmp/112.jpg", "FNMP.zip/FNMP/Watchwolf.full.jpg"); +// singleLinks.put("fnmp/113.jpg", "FNMP.zip/FNMP/Browbeat.full.jpg"); +// singleLinks.put("fnmp/114.jpg", "FNMP.zip/FNMP/Oblivion Ring.full.jpg"); +// singleLinks.put("fnmp/115.jpg", "FNMP.zip/FNMP/Sakura-Tribe Elder.full.jpg"); +// singleLinks.put("fnmp/116.jpg", "FNMP.zip/FNMP/Tidehollow Sculler.full.jpg"); +// singleLinks.put("fnmp/117.jpg", "FNMP.zip/FNMP/Ghostly Prison.full.jpg"); +// singleLinks.put("fnmp/118.jpg", "FNMP.zip/FNMP/Ancient Ziggurat.full.jpg"); +// singleLinks.put("fnmp/119.jpg", "FNMP.zip/FNMP/Bloodbraid Elf.full.jpg"); +// singleLinks.put("fnmp/12.jpg", "FNMP.zip/FNMP/Swords to Plowshares.full.jpg"); +// singleLinks.put("fnmp/120.jpg", "FNMP.zip/FNMP/Cloudpost.full.jpg"); +// singleLinks.put("fnmp/121.jpg", "FNMP.zip/FNMP/Elvish Visionary.full.jpg"); +// singleLinks.put("fnmp/122.jpg", "FNMP.zip/FNMP/Anathemancer.full.jpg"); +// singleLinks.put("fnmp/123.jpg", "FNMP.zip/FNMP/Krosan Grip.full.jpg"); +// singleLinks.put("fnmp/124.jpg", "FNMP.zip/FNMP/Qasali Pridemage.full.jpg"); +// singleLinks.put("fnmp/125.jpg", "FNMP.zip/FNMP/Rift Bolt.full.jpg"); +// singleLinks.put("fnmp/126.jpg", "FNMP.zip/FNMP/Gatekeeper of Malakir.full.jpg"); +// singleLinks.put("fnmp/127.jpg", "FNMP.zip/FNMP/Wild Nacatl.full.jpg"); +// singleLinks.put("fnmp/128.jpg", "FNMP.zip/FNMP/Everflowing Chalice.full.jpg"); +// singleLinks.put("fnmp/129.jpg", "FNMP.zip/FNMP/Spellstutter Sprite.full.jpg"); +// singleLinks.put("fnmp/13.jpg", "FNMP.zip/FNMP/Ophidian.full.jpg"); +// singleLinks.put("fnmp/130.jpg", "FNMP.zip/FNMP/Wall of Omens.full.jpg"); +// singleLinks.put("fnmp/131.jpg", "FNMP.zip/FNMP/Artisan of Kozilek.full.jpg"); +// singleLinks.put("fnmp/132.jpg", "FNMP.zip/FNMP/Squadron Hawk.full.jpg"); +// singleLinks.put("fnmp/133.jpg", "FNMP.zip/FNMP/Rhox War Monk.full.jpg"); +// singleLinks.put("fnmp/134.jpg", "FNMP.zip/FNMP/Jace's Ingenuity.full.jpg"); +// singleLinks.put("fnmp/135.jpg", "FNMP.zip/FNMP/Cultivate.full.jpg"); +// singleLinks.put("fnmp/136.jpg", "FNMP.zip/FNMP/Teetering Peaks.full.jpg"); +// singleLinks.put("fnmp/137.jpg", "FNMP.zip/FNMP/Contagion Clasp.full.jpg"); +// singleLinks.put("fnmp/138.jpg", "FNMP.zip/FNMP/Go for the Throat.full.jpg"); +// singleLinks.put("fnmp/139.jpg", "FNMP.zip/FNMP/Savage Lands.full.jpg"); +// singleLinks.put("fnmp/14.jpg", "FNMP.zip/FNMP/Jackal Pup.full.jpg"); +// singleLinks.put("fnmp/140.jpg", "FNMP.zip/FNMP/Glistener Elf.full.jpg"); +// singleLinks.put("fnmp/141.jpg", "FNMP.zip/FNMP/Despise.full.jpg"); +// singleLinks.put("fnmp/142.jpg", "FNMP.zip/FNMP/Tectonic Edge.full.jpg"); +// singleLinks.put("fnmp/143.jpg", "FNMP.zip/FNMP/Dismember.full.jpg"); +// singleLinks.put("fnmp/144.jpg", "FNMP.zip/FNMP/Ancient Grudge.full.jpg"); +// singleLinks.put("fnmp/145.jpg", "FNMP.zip/FNMP/Acidic Slime.full.jpg"); +// singleLinks.put("fnmp/146.jpg", "FNMP.zip/FNMP/Forbidden Alchemy.full.jpg"); +// singleLinks.put("fnmp/147.jpg", "FNMP.zip/FNMP/Avacyn's Pilgrim.full.jpg"); +// singleLinks.put("fnmp/148.jpg", "FNMP.zip/FNMP/Lingering Souls.full.jpg"); +// singleLinks.put("fnmp/149.jpg", "FNMP.zip/FNMP/Evolving Wilds.full.jpg"); +// singleLinks.put("fnmp/15.jpg", "FNMP.zip/FNMP/Quirion Ranger.full.jpg"); +// singleLinks.put("fnmp/150.jpg", "FNMP.zip/FNMP/Pillar of Flame.full.jpg"); +// singleLinks.put("fnmp/151.jpg", "FNMP.zip/FNMP/Gitaxian Probe.full.jpg"); +// singleLinks.put("fnmp/152.jpg", "FNMP.zip/FNMP/Searing Spear.full.jpg"); +// singleLinks.put("fnmp/153.jpg", "FNMP.zip/FNMP/Reliquary Tower.full.jpg"); +// singleLinks.put("fnmp/154.jpg", "FNMP.zip/FNMP/Farseek.full.jpg"); +// singleLinks.put("fnmp/155.jpg", "FNMP.zip/FNMP/Call of the Conclave.full.jpg"); +// singleLinks.put("fnmp/156.jpg", "FNMP.zip/FNMP/Judge's Familiar.full.jpg"); +// singleLinks.put("fnmp/157.jpg", "FNMP.zip/FNMP/Izzet Charm.full.jpg"); +// singleLinks.put("fnmp/158.jpg", "FNMP.zip/FNMP/Rakdos Cackler.full.jpg"); +// singleLinks.put("fnmp/159.jpg", "FNMP.zip/FNMP/Dimir Charm.full.jpg"); +// singleLinks.put("fnmp/16.jpg", "FNMP.zip/FNMP/Carnophage.full.jpg"); +// singleLinks.put("fnmp/160.jpg", "FNMP.zip/FNMP/Experiment One.full.jpg"); +// singleLinks.put("fnmp/161.jpg", "FNMP.zip/FNMP/Ghor-Clan Rampager.full.jpg"); +// singleLinks.put("fnmp/162.jpg", "FNMP.zip/FNMP/Grisly Salvage.full.jpg"); +// singleLinks.put("fnmp/163.jpg", "FNMP.zip/FNMP/Sin Collector.full.jpg"); +// singleLinks.put("fnmp/164.jpg", "FNMP.zip/FNMP/Warleader's Helix.full.jpg"); +// singleLinks.put("fnmp/165.jpg", "FNMP.zip/FNMP/Elvish Mystic.full.jpg"); +// singleLinks.put("fnmp/166.jpg", "FNMP.zip/FNMP/Banisher Priest.full.jpg"); +// singleLinks.put("fnmp/167.jpg", "FNMP.zip/FNMP/Encroaching Wastes.full.jpg"); +// singleLinks.put("fnmp/168.jpg", "FNMP.zip/FNMP/Tormented Hero.full.jpg"); +// singleLinks.put("fnmp/169.jpg", "FNMP.zip/FNMP/Dissolve.full.jpg"); +// singleLinks.put("fnmp/17.jpg", "FNMP.zip/FNMP/Impulse.full.jpg"); +// singleLinks.put("fnmp/170.jpg", "FNMP.zip/FNMP/Magma Spray.full.jpg"); +// singleLinks.put("fnmp/171.jpg", "FNMP.zip/FNMP/Bile Blight.full.jpg"); +// singleLinks.put("fnmp/172.jpg", "FNMP.zip/FNMP/Banishing Light.full.jpg"); +// singleLinks.put("fnmp/173.jpg", "FNMP.zip/FNMP/Fanatic of Xenagos.full.jpg"); +// singleLinks.put("fnmp/174.jpg", "FNMP.zip/FNMP/Brain Maggot.full.jpg"); +// singleLinks.put("fnmp/175.jpg", "FNMP.zip/FNMP/Stoke the Flames.full.jpg"); +// singleLinks.put("fnmp/176.jpg", "FNMP.zip/FNMP/Frenzied Goblin.full.jpg"); +// singleLinks.put("fnmp/177.jpg", "FNMP.zip/FNMP/Disdainful Stroke.full.jpg"); +// singleLinks.put("fnmp/178.jpg", "FNMP.zip/FNMP/Hordeling Outburst.full.jpg"); +// singleLinks.put("fnmp/179.jpg", "FNMP.zip/FNMP/Suspension Field.full.jpg"); +// singleLinks.put("fnmp/18.jpg", "FNMP.zip/FNMP/Fireblast.full.jpg"); +// singleLinks.put("fnmp/180.jpg", "FNMP.zip/FNMP/Abzan Beastmaster.full.jpg"); +// singleLinks.put("fnmp/181.jpg", "FNMP.zip/FNMP/Frost Walker.full.jpg"); +// singleLinks.put("fnmp/182.jpg", "FNMP.zip/FNMP/Path to Exile.full.jpg"); +// singleLinks.put("fnmp/183.jpg", "FNMP.zip/FNMP/Serum Visions.full.jpg"); +// singleLinks.put("fnmp/184.jpg", "FNMP.zip/FNMP/Orator of Ojutai.full.jpg"); +// singleLinks.put("fnmp/186.jpg", "FNMP.zip/FNMP/Roast.full.jpg"); +// singleLinks.put("fnmp/187.jpg", "FNMP.zip/FNMP/Anticipate.full.jpg"); +// singleLinks.put("fnmp/188.jpg", "FNMP.zip/FNMP/Nissa's Pilgrimage.full.jpg"); +// singleLinks.put("fnmp/189.jpg", "FNMP.zip/FNMP/Clash of Wills.full.jpg"); +// singleLinks.put("fnmp/19.jpg", "FNMP.zip/FNMP/Soltari Priest.full.jpg"); +// singleLinks.put("fnmp/190.jpg", "FNMP.zip/FNMP/Smash to Smithereens.full.jpg"); +// singleLinks.put("fnmp/191.jpg", "FNMP.zip/FNMP/Blighted Fen.full.jpg"); +// singleLinks.put("fnmp/2.jpg", "FNMP.zip/FNMP/Terror.full.jpg"); +// singleLinks.put("fnmp/20.jpg", "FNMP.zip/FNMP/Albino Troll.full.jpg"); +// singleLinks.put("fnmp/21.jpg", "FNMP.zip/FNMP/Dissipate.full.jpg"); +// singleLinks.put("fnmp/22.jpg", "FNMP.zip/FNMP/Black Knight.full.jpg"); +// singleLinks.put("fnmp/23.jpg", "FNMP.zip/FNMP/Wall of Blossoms.full.jpg"); +// singleLinks.put("fnmp/24.jpg", "FNMP.zip/FNMP/Fireslinger.full.jpg"); +// singleLinks.put("fnmp/25.jpg", "FNMP.zip/FNMP/Drain Life.full.jpg"); +// singleLinks.put("fnmp/26.jpg", "FNMP.zip/FNMP/Aura of Silence.full.jpg"); +// singleLinks.put("fnmp/27.jpg", "FNMP.zip/FNMP/Forbid.full.jpg"); +// singleLinks.put("fnmp/28.jpg", "FNMP.zip/FNMP/Spike Feeder.full.jpg"); +// singleLinks.put("fnmp/29.jpg", "FNMP.zip/FNMP/Mogg Fanatic.full.jpg"); +// singleLinks.put("fnmp/3.jpg", "FNMP.zip/FNMP/Longbow Archer.full.jpg"); +// singleLinks.put("fnmp/30.jpg", "FNMP.zip/FNMP/White Knight.full.jpg"); +// singleLinks.put("fnmp/31.jpg", "FNMP.zip/FNMP/Disenchant.full.jpg"); +// singleLinks.put("fnmp/32.jpg", "FNMP.zip/FNMP/Bottle Gnomes.full.jpg"); +// singleLinks.put("fnmp/33.jpg", "FNMP.zip/FNMP/Muscle Sliver.full.jpg"); +// singleLinks.put("fnmp/34.jpg", "FNMP.zip/FNMP/Crystalline Sliver.full.jpg"); +// singleLinks.put("fnmp/35.jpg", "FNMP.zip/FNMP/Capsize.full.jpg"); +// singleLinks.put("fnmp/36.jpg", "FNMP.zip/FNMP/Priest of Titania.full.jpg"); +// singleLinks.put("fnmp/37.jpg", "FNMP.zip/FNMP/Goblin Bombardment.full.jpg"); +// singleLinks.put("fnmp/38.jpg", "FNMP.zip/FNMP/Scragnoth.full.jpg"); +// singleLinks.put("fnmp/39.jpg", "FNMP.zip/FNMP/Smother.full.jpg"); +// singleLinks.put("fnmp/4.jpg", "FNMP.zip/FNMP/Volcanic Geyser.full.jpg"); +// singleLinks.put("fnmp/40.jpg", "FNMP.zip/FNMP/Whipcorder.full.jpg"); +// singleLinks.put("fnmp/41.jpg", "FNMP.zip/FNMP/Sparksmith.full.jpg"); +// singleLinks.put("fnmp/42.jpg", "FNMP.zip/FNMP/Krosan Tusker.full.jpg"); +// singleLinks.put("fnmp/43.jpg", "FNMP.zip/FNMP/Withered Wretch.full.jpg"); +// singleLinks.put("fnmp/44.jpg", "FNMP.zip/FNMP/Willbender.full.jpg"); +// singleLinks.put("fnmp/45.jpg", "FNMP.zip/FNMP/Slice and Dice.full.jpg"); +// singleLinks.put("fnmp/46.jpg", "FNMP.zip/FNMP/Silver Knight.full.jpg"); +// singleLinks.put("fnmp/47.jpg", "FNMP.zip/FNMP/Krosan Warchief.full.jpg"); +// singleLinks.put("fnmp/48.jpg", "FNMP.zip/FNMP/Lightning Rift.full.jpg"); +// singleLinks.put("fnmp/49.jpg", "FNMP.zip/FNMP/Carrion Feeder.full.jpg"); +// singleLinks.put("fnmp/5.jpg", "FNMP.zip/FNMP/Mind Warp.full.jpg"); +// singleLinks.put("fnmp/50.jpg", "FNMP.zip/FNMP/Treetop Village.full.jpg"); +// singleLinks.put("fnmp/51.jpg", "FNMP.zip/FNMP/Accumulated Knowledge.full.jpg"); +// singleLinks.put("fnmp/52.jpg", "FNMP.zip/FNMP/Avalanche Riders.full.jpg"); +// singleLinks.put("fnmp/53.jpg", "FNMP.zip/FNMP/Reanimate.full.jpg"); +// singleLinks.put("fnmp/54.jpg", "FNMP.zip/FNMP/Mother of Runes.full.jpg"); +// singleLinks.put("fnmp/55.jpg", "FNMP.zip/FNMP/Brainstorm.full.jpg"); +// singleLinks.put("fnmp/56.jpg", "FNMP.zip/FNMP/Rancor.full.jpg"); +// singleLinks.put("fnmp/57.jpg", "FNMP.zip/FNMP/Seal of Cleansing.full.jpg"); +// singleLinks.put("fnmp/58.jpg", "FNMP.zip/FNMP/Flametongue Kavu.full.jpg"); +// singleLinks.put("fnmp/59.jpg", "FNMP.zip/FNMP/Blastoderm.full.jpg"); +// singleLinks.put("fnmp/6.jpg", "FNMP.zip/FNMP/Shock.full.jpg"); +// singleLinks.put("fnmp/60.jpg", "FNMP.zip/FNMP/Cabal Therapy.full.jpg"); +// singleLinks.put("fnmp/61.jpg", "FNMP.zip/FNMP/Fact or Fiction.full.jpg"); +// singleLinks.put("fnmp/62.jpg", "FNMP.zip/FNMP/Juggernaut.full.jpg"); +// singleLinks.put("fnmp/63.jpg", "FNMP.zip/FNMP/Circle of Protection Red.full.jpg"); +// singleLinks.put("fnmp/64.jpg", "FNMP.zip/FNMP/Kird Ape.full.jpg"); +// singleLinks.put("fnmp/65.jpg", "FNMP.zip/FNMP/Duress.full.jpg"); +// singleLinks.put("fnmp/66.jpg", "FNMP.zip/FNMP/Counterspell.full.jpg"); +// singleLinks.put("fnmp/67.jpg", "FNMP.zip/FNMP/Icy Manipulator.full.jpg"); +// singleLinks.put("fnmp/68.jpg", "FNMP.zip/FNMP/Elves of Deep Shadow.full.jpg"); +// singleLinks.put("fnmp/69.jpg", "FNMP.zip/FNMP/Armadillo Cloak.full.jpg"); +// singleLinks.put("fnmp/7.jpg", "FNMP.zip/FNMP/Staunch Defenders.full.jpg"); +// singleLinks.put("fnmp/70.jpg", "FNMP.zip/FNMP/Terminate.full.jpg"); +// singleLinks.put("fnmp/71.jpg", "FNMP.zip/FNMP/Lobotomy.full.jpg"); +// singleLinks.put("fnmp/72.jpg", "FNMP.zip/FNMP/Goblin Warchief.full.jpg"); +// singleLinks.put("fnmp/73.jpg", "FNMP.zip/FNMP/Wild Mongrel.full.jpg"); +// singleLinks.put("fnmp/74.jpg", "FNMP.zip/FNMP/Chainer's Edict.full.jpg"); +// singleLinks.put("fnmp/75.jpg", "FNMP.zip/FNMP/Circular Logic.full.jpg"); +// singleLinks.put("fnmp/76.jpg", "FNMP.zip/FNMP/Astral Slide.full.jpg"); +// singleLinks.put("fnmp/77.jpg", "FNMP.zip/FNMP/Arrogant Wurm.full.jpg"); +// singleLinks.put("fnmp/78a.jpg", "FNMP.zip/FNMP/Life (Life/Death.full.jpg"); +// singleLinks.put("fnmp/78b.jpg", "FNMP.zip/FNMP/Death (Life/Death).full.jpg"); +// singleLinks.put("fnmp/79a.jpg", "FNMP.zip/FNMP/Fire (Fire/Ice).full.jpg"); +// singleLinks.put("fnmp/79b.jpg", "FNMP.zip/FNMP/Ice (Fire/Ice).full.jpg"); +// singleLinks.put("fnmp/8.jpg", "FNMP.zip/FNMP/Giant Growth.full.jpg"); +// singleLinks.put("fnmp/80.jpg", "FNMP.zip/FNMP/Firebolt.full.jpg"); +// singleLinks.put("fnmp/81.jpg", "FNMP.zip/FNMP/Deep Analysis.full.jpg"); +// singleLinks.put("fnmp/82.jpg", "FNMP.zip/FNMP/Gerrard's Verdict.full.jpg"); +// singleLinks.put("fnmp/83.jpg", "FNMP.zip/FNMP/Basking Rootwalla.full.jpg"); +// singleLinks.put("fnmp/84.jpg", "FNMP.zip/FNMP/Wonder.full.jpg"); +// singleLinks.put("fnmp/85.jpg", "FNMP.zip/FNMP/Goblin Legionnaire.full.jpg"); +// singleLinks.put("fnmp/86.jpg", "FNMP.zip/FNMP/Engineered Plague.full.jpg"); +// singleLinks.put("fnmp/87.jpg", "FNMP.zip/FNMP/Goblin Ringleader.full.jpg"); +// singleLinks.put("fnmp/88.jpg", "FNMP.zip/FNMP/Wing Shards.full.jpg"); +// singleLinks.put("fnmp/89.jpg", "FNMP.zip/FNMP/Cabal Coffers.full.jpg"); +// singleLinks.put("fnmp/9.jpg", "FNMP.zip/FNMP/Prodigal Sorcerer.full.jpg"); +// singleLinks.put("fnmp/90.jpg", "FNMP.zip/FNMP/Roar of the Wurm.full.jpg"); +// singleLinks.put("fnmp/91.jpg", "FNMP.zip/FNMP/Force Spike.full.jpg"); +// singleLinks.put("fnmp/92.jpg", "FNMP.zip/FNMP/Remand.full.jpg"); +// singleLinks.put("fnmp/93.jpg", "FNMP.zip/FNMP/Tormod's Crypt.full.jpg"); +// singleLinks.put("fnmp/94.jpg", "FNMP.zip/FNMP/Eternal Witness.full.jpg"); +// singleLinks.put("fnmp/95.jpg", "FNMP.zip/FNMP/Tendrils of Agony.full.jpg"); +// singleLinks.put("fnmp/96.jpg", "FNMP.zip/FNMP/Pendelhaven.full.jpg"); +// singleLinks.put("fnmp/97.jpg", "FNMP.zip/FNMP/Resurrection.full.jpg"); +// singleLinks.put("fnmp/98.jpg", "FNMP.zip/FNMP/Wall of Roots.full.jpg"); +// singleLinks.put("fnmp/99.jpg", "FNMP.zip/FNMP/Desert.full.jpg"); +// singleLinks.put("gpx/1.jpg", "GPX.zip/GPX/Spiritmonger.full.jpg"); +// singleLinks.put("gpx/10.jpg", "GPX.zip/GPX/Batterskull.full.jpg"); +// singleLinks.put("gpx/11.jpg", "GPX.zip/GPX/Griselbrand.full.jpg"); +// singleLinks.put("gpx/12.jpg", "GPX.zip/GPX/Stoneforge Mystic.full.jpg"); +// singleLinks.put("gpx/2.jpg", "GPX.zip/GPX/Call of the Herd.full.jpg"); +// singleLinks.put("gpx/3.jpg", "GPX.zip/GPX/Chrome Mox.full.jpg"); +// singleLinks.put("gpx/4.jpg", "GPX.zip/GPX/Umezawa's Jitte.full.jpg"); +// singleLinks.put("gpx/5.jpg", "GPX.zip/GPX/Maelstrom Pulse.full.jpg"); +// singleLinks.put("gpx/6.jpg", "GPX.zip/GPX/Goblin Guide.full.jpg"); +// singleLinks.put("gpx/7.jpg", "GPX.zip/GPX/Lotus Cobra.full.jpg"); +// singleLinks.put("gpx/8.jpg", "GPX.zip/GPX/Primeval Titan.full.jpg"); +// singleLinks.put("gpx/9.jpg", "GPX.zip/GPX/All Is Dust.full.jpg"); +// singleLinks.put("grc/1.jpg", "GRC.zip/GRC/Wood Elves.full.jpg"); +// singleLinks.put("grc/10.jpg", "GRC.zip/GRC/Mogg Fanatic.full.jpg"); +// singleLinks.put("grc/11.jpg", "GRC.zip/GRC/Mind Stone.full.jpg"); +// singleLinks.put("grc/12.jpg", "GRC.zip/GRC/Dauntless Dourbark.full.jpg"); +// singleLinks.put("grc/13.jpg", "GRC.zip/GRC/Lava Axe.full.jpg"); +// singleLinks.put("grc/14.jpg", "GRC.zip/GRC/Cenn's Tactician.full.jpg"); +// singleLinks.put("grc/15.jpg", "GRC.zip/GRC/Oona's Blackguard.full.jpg"); +// singleLinks.put("grc/16.jpg", "GRC.zip/GRC/Gravedigger.full.jpg"); +// singleLinks.put("grc/17.jpg", "GRC.zip/GRC/Boggart Ram-Gang.full.jpg"); +// singleLinks.put("grc/18.jpg", "GRC.zip/GRC/Wilt-Leaf Cavaliers.full.jpg"); +// singleLinks.put("grc/19.jpg", "GRC.zip/GRC/Duergar Hedge-Mage.full.jpg"); +// singleLinks.put("grc/2.jpg", "GRC.zip/GRC/Icatian Javelineers.full.jpg"); +// singleLinks.put("grc/20.jpg", "GRC.zip/GRC/Selkie Hedge-Mage.full.jpg"); +// singleLinks.put("grc/21.jpg", "GRC.zip/GRC/Sprouting Thrinax.full.jpg"); +// singleLinks.put("grc/22.jpg", "GRC.zip/GRC/Woolly Thoctar.full.jpg"); +// singleLinks.put("grc/24.jpg", "GRC.zip/GRC/Path to Exile.full.jpg"); +// singleLinks.put("grc/25.jpg", "GRC.zip/GRC/Hellspark Elemental.full.jpg"); +// singleLinks.put("grc/26.jpg", "GRC.zip/GRC/Marisi's Twinclaws.full.jpg"); +// singleLinks.put("grc/27.jpg", "GRC.zip/GRC/Slave of Bolas.full.jpg"); +// singleLinks.put("grc/28.jpg", "GRC.zip/GRC/Mycoid Shepherd.full.jpg"); +// singleLinks.put("grc/29.jpg", "GRC.zip/GRC/Naya Sojourners.full.jpg"); +// singleLinks.put("grc/3.jpg", "GRC.zip/GRC/Fiery Temper.full.jpg"); +// singleLinks.put("grc/30.jpg", "GRC.zip/GRC/Mind Control.full.jpg"); +// singleLinks.put("grc/31.jpg", "GRC.zip/GRC/Rise from the Grave.full.jpg"); +// singleLinks.put("grc/32.jpg", "GRC.zip/GRC/Kor Duelist.full.jpg"); +// singleLinks.put("grc/33.jpg", "GRC.zip/GRC/Vampire Nighthawk.full.jpg"); +// singleLinks.put("grc/34.jpg", "GRC.zip/GRC/Nissa's Chosen.full.jpg"); +// singleLinks.put("grc/35.jpg", "GRC.zip/GRC/Emeria Angel.full.jpg"); +// singleLinks.put("grc/36.jpg", "GRC.zip/GRC/Kor Firewalker.full.jpg"); +// singleLinks.put("grc/37.jpg", "GRC.zip/GRC/Leatherback Baloth.full.jpg"); +// singleLinks.put("grc/38.jpg", "GRC.zip/GRC/Hada Freeblade.full.jpg"); +// singleLinks.put("grc/39.jpg", "GRC.zip/GRC/Kalastria Highborn.full.jpg"); +// singleLinks.put("grc/4.jpg", "GRC.zip/GRC/Boomerang.full.jpg"); +// singleLinks.put("grc/40.jpg", "GRC.zip/GRC/Syphon Mind.full.jpg"); +// singleLinks.put("grc/46.jpg", "GRC.zip/GRC/Pathrazer of Ulamog.full.jpg"); +// singleLinks.put("grc/47.jpg", "GRC.zip/GRC/Curse of Wizardry.full.jpg"); +// singleLinks.put("grc/48.jpg", "GRC.zip/GRC/Staggershock.full.jpg"); +// singleLinks.put("grc/49.jpg", "GRC.zip/GRC/Deathless Angel.full.jpg"); +// singleLinks.put("grc/5.jpg", "GRC.zip/GRC/Calciderm.full.jpg"); +// singleLinks.put("grc/50.jpg", "GRC.zip/GRC/Fling.full.jpg"); +// singleLinks.put("grc/51.jpg", "GRC.zip/GRC/Sylvan Ranger.full.jpg"); +// singleLinks.put("grc/59.jpg", "GRC.zip/GRC/Plague Stinger.full.jpg"); +// singleLinks.put("grc/6.jpg", "GRC.zip/GRC/Reckless Wurm.full.jpg"); +// singleLinks.put("grc/60.jpg", "GRC.zip/GRC/Golem's Heart.full.jpg"); +// singleLinks.put("grc/63.jpg", "GRC.zip/GRC/Skinrender.full.jpg"); +// singleLinks.put("grc/64.jpg", "GRC.zip/GRC/Master's Call.full.jpg"); +// singleLinks.put("grc/65.jpg", "GRC.zip/GRC/Plague Myr.full.jpg"); +// singleLinks.put("grc/66.jpg", "GRC.zip/GRC/Signal Pest.full.jpg"); +// singleLinks.put("grc/69.jpg", "GRC.zip/GRC/Fling.full.jpg"); +// singleLinks.put("grc/7.jpg", "GRC.zip/GRC/Yixlid Jailer.full.jpg"); +// singleLinks.put("grc/70.jpg", "GRC.zip/GRC/Sylvan Ranger.full.jpg"); +// singleLinks.put("grc/71.jpg", "GRC.zip/GRC/Vault Skirge.full.jpg"); +// singleLinks.put("grc/72.jpg", "GRC.zip/GRC/Maul Splicer.full.jpg"); +// singleLinks.put("grc/73.jpg", "GRC.zip/GRC/Shrine of Burning Rage.full.jpg"); +// singleLinks.put("grc/76.jpg", "GRC.zip/GRC/Tormented Soul.full.jpg"); +// singleLinks.put("grc/77.jpg", "GRC.zip/GRC/Auramancer.full.jpg"); +// singleLinks.put("grc/78.jpg", "GRC.zip/GRC/Circle of Flame.full.jpg"); +// singleLinks.put("grc/79.jpg", "GRC.zip/GRC/Gather the Townsfolk.full.jpg"); +// singleLinks.put("grc/8.jpg", "GRC.zip/GRC/Zoetic Cavern.full.jpg"); +// singleLinks.put("grc/80.jpg", "GRC.zip/GRC/Curse of the Bloody Tome.full.jpg"); +// singleLinks.put("grc/81.jpg", "GRC.zip/GRC/Curse of Thirst.full.jpg"); +// singleLinks.put("grc/82.jpg", "GRC.zip/GRC/Nearheath Stalker.full.jpg"); +// singleLinks.put("grc/83.jpg", "GRC.zip/GRC/Bloodcrazed Neonate.full.jpg"); +// singleLinks.put("grc/84.jpg", "GRC.zip/GRC/Boneyard Wurm.full.jpg"); +// singleLinks.put("grc/9.jpg", "GRC.zip/GRC/Llanowar Elves.full.jpg"); +// singleLinks.put("jr/1.jpg", "JP.zip/JP/Lightning Bolt.full.jpg"); +// singleLinks.put("jr/10.jpg", "JP.zip/JP/Tradewind Rider.full.jpg"); +// singleLinks.put("jr/100.jpg", "JP.zip/JP/Feldon of the Third Path.full.jpg"); +// singleLinks.put("jr/101.jpg", "JP.zip/JP/Wasteland.full.jpg"); +// singleLinks.put("jr/103.jpg", "JP.zip/JP/Mana Drain.full.jpg"); +// singleLinks.put("jr/105.jpg", "JP.zip/JP/Command Beacon.full.jpg"); +// singleLinks.put("jr/11.jpg", "JP.zip/JP/Intuition.full.jpg"); +// singleLinks.put("jr/12.jpg", "JP.zip/JP/Argothian Enchantress.full.jpg"); +// singleLinks.put("jr/13.jpg", "JP.zip/JP/Living Death.full.jpg"); +// singleLinks.put("jr/14.jpg", "JP.zip/JP/Armageddon.full.jpg"); +// singleLinks.put("jr/15.jpg", "JP.zip/JP/Balance.full.jpg"); +// singleLinks.put("jr/16.jpg", "JP.zip/JP/Time Warp.full.jpg"); +// singleLinks.put("jr/17.jpg", "JP.zip/JP/Phyrexian Negator.full.jpg"); +// singleLinks.put("jr/18.jpg", "JP.zip/JP/Deranged Hermit.full.jpg"); +// singleLinks.put("jr/19.jpg", "JP.zip/JP/Hermit Druid.full.jpg"); +// singleLinks.put("jr/2.jpg", "JP.zip/JP/Stroke of Genius.full.jpg"); +// singleLinks.put("jr/20.jpg", "JP.zip/JP/Gemstone Mine.full.jpg"); +// singleLinks.put("jr/21.jpg", "JP.zip/JP/Regrowth.full.jpg"); +// singleLinks.put("jr/22.jpg", "JP.zip/JP/Sol Ring.full.jpg"); +// singleLinks.put("jr/23.jpg", "JP.zip/JP/Mishra's Factory.full.jpg"); +// singleLinks.put("jr/24.jpg", "JP.zip/JP/Exalted Angel.full.jpg"); +// singleLinks.put("jr/25.jpg", "JP.zip/JP/Grim Lavamancer.full.jpg"); +// singleLinks.put("jr/26.jpg", "JP.zip/JP/Meddling Mage.full.jpg"); +// singleLinks.put("jr/27.jpg", "JP.zip/JP/Pernicious Deed.full.jpg"); +// singleLinks.put("jr/28.jpg", "JP.zip/JP/Ravenous Baloth.full.jpg"); +// singleLinks.put("jr/29.jpg", "JP.zip/JP/Cunning Wish.full.jpg"); +// singleLinks.put("jr/3.jpg", "JP.zip/JP/Gaea's Cradle.full.jpg"); +// singleLinks.put("jr/30.jpg", "JP.zip/JP/Yawgmoth's Will.full.jpg"); +// singleLinks.put("jr/31.jpg", "JP.zip/JP/Vindicate.full.jpg"); +// singleLinks.put("jr/32.jpg", "JP.zip/JP/Decree of Justice.full.jpg"); +// singleLinks.put("jr/33.jpg", "JP.zip/JP/Orim's Chant.full.jpg"); +// singleLinks.put("jr/34.jpg", "JP.zip/JP/Mind's Desire.full.jpg"); +// singleLinks.put("jr/35.jpg", "JP.zip/JP/Demonic Tutor.full.jpg"); +// singleLinks.put("jr/36.jpg", "JP.zip/JP/Goblin Piledriver.full.jpg"); +// singleLinks.put("jr/37.jpg", "JP.zip/JP/Living Wish.full.jpg"); +// singleLinks.put("jr/38.jpg", "JP.zip/JP/Dark Ritual.full.jpg"); +// singleLinks.put("jr/39.jpg", "JP.zip/JP/Maze of Ith.full.jpg"); +// singleLinks.put("jr/4.jpg", "JP.zip/JP/Memory Lapse.full.jpg"); +// singleLinks.put("jr/40.jpg", "JP.zip/JP/Stifle.full.jpg"); +// singleLinks.put("jr/41.jpg", "JP.zip/JP/Survival of the Fittest.full.jpg"); +// singleLinks.put("jr/42.jpg", "JP.zip/JP/Burning Wish.full.jpg"); +// singleLinks.put("jr/43.jpg", "JP.zip/JP/Bloodstained Mire.full.jpg"); +// singleLinks.put("jr/44.jpg", "JP.zip/JP/Flooded Strand.full.jpg"); +// singleLinks.put("jr/45.jpg", "JP.zip/JP/Polluted Delta.full.jpg"); +// singleLinks.put("jr/46.jpg", "JP.zip/JP/Windswept Heath.full.jpg"); +// singleLinks.put("jr/47.jpg", "JP.zip/JP/Wooded Foothills.full.jpg"); +// singleLinks.put("jr/48.jpg", "JP.zip/JP/Sinkhole.full.jpg"); +// singleLinks.put("jr/49.jpg", "JP.zip/JP/Natural Order.full.jpg"); +// singleLinks.put("jr/5.jpg", "JP.zip/JP/Counterspell.full.jpg"); +// singleLinks.put("jr/50.jpg", "JP.zip/JP/Phyrexian Dreadnought.full.jpg"); +// singleLinks.put("jr/51.jpg", "JP.zip/JP/Thawing Glaciers.full.jpg"); +// singleLinks.put("jr/52.jpg", "JP.zip/JP/Land Tax.full.jpg"); +// singleLinks.put("jr/53.jpg", "JP.zip/JP/Morphling.full.jpg"); +// singleLinks.put("jr/54.jpg", "JP.zip/JP/Wheel of Fortune.full.jpg"); +// singleLinks.put("jr/55.jpg", "JP.zip/JP/Wasteland.full.jpg"); +// singleLinks.put("jr/56.jpg", "JP.zip/JP/Entomb.full.jpg"); +// singleLinks.put("jr/57.jpg", "JP.zip/JP/Sword of Fire and Ice.full.jpg"); +// singleLinks.put("jr/58.jpg", "JP.zip/JP/Vendilion Clique.full.jpg"); +// singleLinks.put("jr/59.jpg", "JP.zip/JP/Bitterblossom.full.jpg"); +// singleLinks.put("jr/6.jpg", "JP.zip/JP/Vampiric Tutor.full.jpg"); +// singleLinks.put("jr/60.jpg", "JP.zip/JP/Mana Crypt.full.jpg"); +// singleLinks.put("jr/61.jpg", "JP.zip/JP/Dark Confidant.full.jpg"); +// singleLinks.put("jr/62.jpg", "JP.zip/JP/Doubling Season.full.jpg"); +// singleLinks.put("jr/63.jpg", "JP.zip/JP/Goblin Welder.full.jpg"); +// singleLinks.put("jr/64.jpg", "JP.zip/JP/Xiahou Dun, the One-Eyed.full.jpg"); +// singleLinks.put("jr/65.jpg", "JP.zip/JP/Flusterstorm.full.jpg"); +// singleLinks.put("jr/66.jpg", "JP.zip/JP/Noble Hierarch.full.jpg"); +// singleLinks.put("jr/67.jpg", "JP.zip/JP/Karmic Guide.full.jpg"); +// singleLinks.put("jr/68.jpg", "JP.zip/JP/Sneak Attack.full.jpg"); +// singleLinks.put("jr/69.jpg", "JP.zip/JP/Karakas.full.jpg"); +// singleLinks.put("jr/7.jpg", "JP.zip/JP/Ball Lightning.full.jpg"); +// singleLinks.put("jr/70.jpg", "JP.zip/JP/Sword of Light and Shadow.full.jpg"); +// singleLinks.put("jr/71.jpg", "JP.zip/JP/Command Tower.full.jpg"); +// singleLinks.put("jr/72.jpg", "JP.zip/JP/Swords to Plowshares.full.jpg"); +// singleLinks.put("jr/73.jpg", "JP.zip/JP/Bribery.full.jpg"); +// singleLinks.put("jr/74.jpg", "JP.zip/JP/Imperial Recruiter.full.jpg"); +// singleLinks.put("jr/75.jpg", "JP.zip/JP/Crucible of Worlds.full.jpg"); +// singleLinks.put("jr/76.jpg", "JP.zip/JP/Overwhelming Forces.full.jpg"); +// singleLinks.put("jr/77.jpg", "JP.zip/JP/Show and Tell.full.jpg"); +// singleLinks.put("jr/78.jpg", "JP.zip/JP/Vindicate.full.jpg"); +// singleLinks.put("jr/79.jpg", "JP.zip/JP/Genesis.full.jpg"); +// singleLinks.put("jr/8.jpg", "JP.zip/JP/Oath of Druids.full.jpg"); +// singleLinks.put("jr/80.jpg", "JP.zip/JP/Karador, Ghost Chieftain.full.jpg"); +// singleLinks.put("jr/81.jpg", "JP.zip/JP/Greater Good.full.jpg"); +// singleLinks.put("jr/82.jpg", "JP.zip/JP/Riku of Two Reflections.full.jpg"); +// singleLinks.put("jr/83.jpg", "JP.zip/JP/Force of Will.full.jpg"); +// singleLinks.put("jr/84.jpg", "JP.zip/JP/Hanna, Ship's Navigator.full.jpg"); +// singleLinks.put("jr/85.jpg", "JP.zip/JP/Sword of Feast and Famine.full.jpg"); +// singleLinks.put("jr/86.jpg", "JP.zip/JP/Nekusar, the Mindrazer.full.jpg"); +// singleLinks.put("jr/87.jpg", "JP.zip/JP/Elesh Norn, Grand Cenobite.full.jpg"); +// singleLinks.put("jr/88.jpg", "JP.zip/JP/Oloro, Ageless Ascetic.full.jpg"); +// singleLinks.put("jr/89.jpg", "JP.zip/JP/Plains.full.jpg"); +// singleLinks.put("jr/9.jpg", "JP.zip/JP/Hammer of Bogardan.full.jpg"); +// singleLinks.put("jr/90.jpg", "JP.zip/JP/Island.full.jpg"); +// singleLinks.put("jr/91.jpg", "JP.zip/JP/Swamp.full.jpg"); +// singleLinks.put("jr/92.jpg", "JP.zip/JP/Mountain.full.jpg"); +// singleLinks.put("jr/93.jpg", "JP.zip/JP/Forest.full.jpg"); +// singleLinks.put("jr/97.jpg", "JP.zip/JP/Ravages of War.full.jpg"); +// singleLinks.put("jr/98.jpg", "JP.zip/JP/Damnation.full.jpg"); +// singleLinks.put("jr/99.jpg", "JP.zip/JP/Dualcaster Mage.full.jpg"); +// singleLinks.put("mbp/1.jpg", "MBP.zip/MBP/Arena.full.jpg"); +// singleLinks.put("mbp/10.jpg", "MBP.zip/MBP/Lightning Hounds.full.jpg"); +// singleLinks.put("mbp/100.jpg", "MBP.zip/MBP/Jace, the Living Guildpact.full.jpg"); +// singleLinks.put("mbp/101.jpg", "MBP.zip/MBP/Liliana Vess.full.jpg"); +// singleLinks.put("mbp/102.jpg", "MBP.zip/MBP/Chandra, Pyromaster.full.jpg"); +// singleLinks.put("mbp/103.jpg", "MBP.zip/MBP/Nissa, Worldwaker.full.jpg"); +// singleLinks.put("mbp/104.jpg", "MBP.zip/MBP/Garruk, Apex Predator.full.jpg"); +// singleLinks.put("mbp/105.jpg", "MBP.zip/MBP/Shamanic Revelation.full.jpg"); +// singleLinks.put("mbp/106.jpg", "MBP.zip/MBP/Ojutai's Command.full.jpg"); +// singleLinks.put("mbp/107.jpg", "MBP.zip/MBP/Dragonscale General.full.jpg"); +// singleLinks.put("mbp/108.jpg", "MBP.zip/MBP/Sage-Eye Avengers.full.jpg"); +// singleLinks.put("mbp/109.jpg", "MBP.zip/MBP/Archfiend of Depravity.full.jpg"); +// singleLinks.put("mbp/11.jpg", "MBP.zip/MBP/Spined Wurm.full.jpg"); +// singleLinks.put("mbp/110.jpg", "MBP.zip/MBP/Flamerush Rider.full.jpg"); +// singleLinks.put("mbp/111.jpg", "MBP.zip/MBP/Temur War Shaman.full.jpg"); +// singleLinks.put("mbp/112.jpg", "MBP.zip/MBP/Arashin Sovereign.full.jpg"); +// singleLinks.put("mbp/113.jpg", "MBP.zip/MBP/Pristine Skywise.full.jpg"); +// singleLinks.put("mbp/114.jpg", "MBP.zip/MBP/Necromaster Dragon.full.jpg"); +// singleLinks.put("mbp/115.jpg", "MBP.zip/MBP/Boltwing Marauder.full.jpg"); +// singleLinks.put("mbp/116.jpg", "MBP.zip/MBP/Harbinger of the Hunt.full.jpg"); +// singleLinks.put("mbp/117.jpg", "MBP.zip/MBP/Sultai Charm.full.jpg"); +// singleLinks.put("mbp/118.jpg", "MBP.zip/MBP/Aeronaut Tinkerer.full.jpg"); +// singleLinks.put("mbp/119.jpg", "MBP.zip/MBP/Dragon Fodder.full.jpg"); +// singleLinks.put("mbp/12.jpg", "MBP.zip/MBP/Warmonger.full.jpg"); +// singleLinks.put("mbp/120.jpg", "MBP.zip/MBP/Dragonlord's Servant.full.jpg"); +// singleLinks.put("mbp/121.jpg", "MBP.zip/MBP/Evolving Wilds.full.jpg"); +// singleLinks.put("mbp/122.jpg", "MBP.zip/MBP/Foe-Razer Regent.full.jpg"); +// singleLinks.put("mbp/123.jpg", "MBP.zip/MBP/Relic Seeker.full.jpg"); +// singleLinks.put("mbp/124.jpg", "MBP.zip/MBP/Alhammarret, High Arbiter.full.jpg"); +// singleLinks.put("mbp/125.jpg", "MBP.zip/MBP/Dwynen, Gilt-Leaf Daen.full.jpg"); +// singleLinks.put("mbp/126.jpg", "MBP.zip/MBP/Hixus, Prison Warden.full.jpg"); +// singleLinks.put("mbp/127.jpg", "MBP.zip/MBP/Kothophed, Soul Hoarder.full.jpg"); +// singleLinks.put("mbp/128.jpg", "MBP.zip/MBP/Pia and Kiran Nalaar.full.jpg"); +// singleLinks.put("mbp/129.jpg", "MBP.zip/MBP/Honored Hierarch.full.jpg"); +// singleLinks.put("mbp/13.jpg", "MBP.zip/MBP/Silver Drake.full.jpg"); +// singleLinks.put("mbp/130.jpg", "MBP.zip/MBP/Seeker of the Way.full.jpg"); +// singleLinks.put("mbp/131.jpg", "MBP.zip/MBP/Valorous Stance.full.jpg"); +// singleLinks.put("mbp/132.jpg", "MBP.zip/MBP/Dromoka, the Eternal.full.jpg"); +// singleLinks.put("mbp/133.jpg", "MBP.zip/MBP/Siege Rhino.full.jpg"); +// singleLinks.put("mbp/134.jpg", "MBP.zip/MBP/Sandsteppe Citadel.full.jpg"); +// singleLinks.put("mbp/135.jpg", "MBP.zip/MBP/Ruinous Path.full.jpg"); +// singleLinks.put("mbp/136.jpg", "MBP.zip/MBP/Hero of Goma Fada.full.jpg"); +// singleLinks.put("mbp/137.jpg", "MBP.zip/MBP/Drowner of Hope.full.jpg"); +// singleLinks.put("mbp/138.jpg", "MBP.zip/MBP/Defiant Bloodlord.full.jpg"); +// singleLinks.put("mbp/139.jpg", "MBP.zip/MBP/Barrage Tyrant.full.jpg"); +// singleLinks.put("mbp/14.jpg", "MBP.zip/MBP/Phyrexian Rager.full.jpg"); +// singleLinks.put("mbp/140.jpg", "MBP.zip/MBP/Oran-Rief Hydra.full.jpg"); +// singleLinks.put("mbp/141.jpg", "MBP.zip/MBP/Scythe Leopard.full.jpg"); +// singleLinks.put("mbp/142.jpg", "MBP.zip/MBP/Genesis Hydra.full.jpg"); +// singleLinks.put("mbp/143.jpg", "MBP.zip/MBP/Munda's Vanguard.full.jpg"); +// singleLinks.put("mbp/144.jpg", "MBP.zip/MBP/Deepfathom Skulker.full.jpg"); +// singleLinks.put("mbp/145.jpg", "MBP.zip/MBP/Dread Defiler.full.jpg"); +// singleLinks.put("mbp/146.jpg", "MBP.zip/MBP/Tyrant of Valakut.full.jpg"); +// singleLinks.put("mbp/147.jpg", "MBP.zip/MBP/Gladehart Cavalry.full.jpg"); +// singleLinks.put("mbp/148.jpg", "MBP.zip/MBP/Goblin Dark-Dwellers.full.jpg"); +// singleLinks.put("mbp/15.jpg", "MBP.zip/MBP/Jace Beleren.full.jpg"); +// singleLinks.put("mbp/16.jpg", "MBP.zip/MBP/Garruk Wildspeaker.full.jpg"); +// singleLinks.put("mbp/17.jpg", "MBP.zip/MBP/Brion Stoutarm.full.jpg"); +// singleLinks.put("mbp/18.jpg", "MBP.zip/MBP/Jaya Ballard, Task Mage.full.jpg"); +// singleLinks.put("mbp/19.jpg", "MBP.zip/MBP/Broodmate Dragon.full.jpg"); +// singleLinks.put("mbp/2.jpg", "MBP.zip/MBP/Sewers of Estark.full.jpg"); +// singleLinks.put("mbp/20.jpg", "MBP.zip/MBP/Honor of the Pure.full.jpg"); +// singleLinks.put("mbp/21.jpg", "MBP.zip/MBP/Steward of Valeron.full.jpg"); +// singleLinks.put("mbp/22.jpg", "MBP.zip/MBP/Day of Judgment.full.jpg"); +// singleLinks.put("mbp/23.jpg", "MBP.zip/MBP/Celestial Colonnade.full.jpg"); +// singleLinks.put("mbp/24.jpg", "MBP.zip/MBP/Retaliator Griffin.full.jpg"); +// singleLinks.put("mbp/25.jpg", "MBP.zip/MBP/Kor Skyfisher.full.jpg"); +// singleLinks.put("mbp/26.jpg", "MBP.zip/MBP/Guul Draz Assassin.full.jpg"); +// singleLinks.put("mbp/27.jpg", "MBP.zip/MBP/Nissa Revane.full.jpg"); +// singleLinks.put("mbp/28.jpg", "MBP.zip/MBP/Birds of Paradise.full.jpg"); +// singleLinks.put("mbp/29.jpg", "MBP.zip/MBP/Memoricide.full.jpg"); +// singleLinks.put("mbp/3.jpg", "MBP.zip/MBP/Nalathni Dragon.full.jpg"); +// singleLinks.put("mbp/30.jpg", "MBP.zip/MBP/Liliana Vess.full.jpg"); +// singleLinks.put("mbp/31.jpg", "MBP.zip/MBP/Bloodthrone Vampire.full.jpg"); +// singleLinks.put("mbp/32.jpg", "MBP.zip/MBP/Mirran Crusader.full.jpg"); +// singleLinks.put("mbp/33.jpg", "MBP.zip/MBP/Surgical Extraction.full.jpg"); +// singleLinks.put("mbp/34.jpg", "MBP.zip/MBP/Frost Titan.full.jpg"); +// singleLinks.put("mbp/35.jpg", "MBP.zip/MBP/Grave Titan.full.jpg"); +// singleLinks.put("mbp/36.jpg", "MBP.zip/MBP/Inferno Titan.full.jpg"); +// singleLinks.put("mbp/37.jpg", "MBP.zip/MBP/Chandra's Phoenix.full.jpg"); +// singleLinks.put("mbp/38.jpg", "MBP.zip/MBP/Treasure Hunt.full.jpg"); +// singleLinks.put("mbp/39.jpg", "MBP.zip/MBP/Faithless Looting.full.jpg"); +// singleLinks.put("mbp/4.jpg", "MBP.zip/MBP/Fireball.full.jpg"); +// singleLinks.put("mbp/40.jpg", "MBP.zip/MBP/Devil's Play.full.jpg"); +// singleLinks.put("mbp/41.jpg", "MBP.zip/MBP/Gravecrawler.full.jpg"); +// singleLinks.put("mbp/42.jpg", "MBP.zip/MBP/Electrolyze.full.jpg"); +// singleLinks.put("mbp/43.jpg", "MBP.zip/MBP/Feast of Blood.full.jpg"); +// singleLinks.put("mbp/44.jpg", "MBP.zip/MBP/Silverblade Paladin.full.jpg"); +// singleLinks.put("mbp/45.jpg", "MBP.zip/MBP/Merfolk Mesmerist.full.jpg"); +// singleLinks.put("mbp/46.jpg", "MBP.zip/MBP/Knight Exemplar.full.jpg"); +// singleLinks.put("mbp/47.jpg", "MBP.zip/MBP/Sunblast Angel.full.jpg"); +// singleLinks.put("mbp/48.jpg", "MBP.zip/MBP/Serra Avatar.full.jpg"); +// singleLinks.put("mbp/49.jpg", "MBP.zip/MBP/Primordial Hydra.full.jpg"); +// singleLinks.put("mbp/5.jpg", "MBP.zip/MBP/Blue Elemental Blast.full.jpg"); +// singleLinks.put("mbp/50.jpg", "MBP.zip/MBP/Vampire Nocturnus.full.jpg"); +// singleLinks.put("mbp/51.jpg", "MBP.zip/MBP/Cathedral of War.full.jpg"); +// singleLinks.put("mbp/52.jpg", "MBP.zip/MBP/Terastodon.full.jpg"); +// singleLinks.put("mbp/53.jpg", "MBP.zip/MBP/Arrest.full.jpg"); +// singleLinks.put("mbp/54.jpg", "MBP.zip/MBP/Consume Spirit.full.jpg"); +// singleLinks.put("mbp/55.jpg", "MBP.zip/MBP/Dreg Mangler.full.jpg"); +// singleLinks.put("mbp/56.jpg", "MBP.zip/MBP/Supreme Verdict.full.jpg"); +// singleLinks.put("mbp/57.jpg", "MBP.zip/MBP/Standstill.full.jpg"); +// singleLinks.put("mbp/58.jpg", "MBP.zip/MBP/Breath of Malfegor.full.jpg"); +// singleLinks.put("mbp/59.jpg", "MBP.zip/MBP/Angel of Glory's Rise.full.jpg"); +// singleLinks.put("mbp/6.jpg", "MBP.zip/MBP/Mana Crypt.full.jpg"); +// singleLinks.put("mbp/60.jpg", "MBP.zip/MBP/Turnabout.full.jpg"); +// singleLinks.put("mbp/61.jpg", "MBP.zip/MBP/Nightveil Specter.full.jpg"); +// singleLinks.put("mbp/62.jpg", "MBP.zip/MBP/Voidmage Husher.full.jpg"); +// singleLinks.put("mbp/63.jpg", "MBP.zip/MBP/Ogre Arsonist.full.jpg"); +// singleLinks.put("mbp/64.jpg", "MBP.zip/MBP/Corrupt.full.jpg"); +// singleLinks.put("mbp/65.jpg", "MBP.zip/MBP/Chandra's Fury.full.jpg"); +// singleLinks.put("mbp/66.jpg", "MBP.zip/MBP/Render Silent.full.jpg"); +// singleLinks.put("mbp/67.jpg", "MBP.zip/MBP/Ratchet Bomb.full.jpg"); +// singleLinks.put("mbp/68.jpg", "MBP.zip/MBP/Bonescythe Sliver.full.jpg"); +// singleLinks.put("mbp/69.jpg", "MBP.zip/MBP/Ogre Battledriver.full.jpg"); +// singleLinks.put("mbp/7.jpg", "MBP.zip/MBP/Windseeker Centaur.full.jpg"); +// singleLinks.put("mbp/70.jpg", "MBP.zip/MBP/Scavenging Ooze.full.jpg"); +// singleLinks.put("mbp/71.jpg", "MBP.zip/MBP/Hamletback Goliath.full.jpg"); +// singleLinks.put("mbp/72.jpg", "MBP.zip/MBP/Ajani, Caller of the Pride.full.jpg"); +// singleLinks.put("mbp/73.jpg", "MBP.zip/MBP/Jace, Memory Adept.full.jpg"); +// singleLinks.put("mbp/74.jpg", "MBP.zip/MBP/Liliana of the Dark Realms.full.jpg"); +// singleLinks.put("mbp/75.jpg", "MBP.zip/MBP/Chandra, Pyromaster.full.jpg"); +// singleLinks.put("mbp/76.jpg", "MBP.zip/MBP/Garruk, Caller of Beasts.full.jpg"); +// singleLinks.put("mbp/77.jpg", "MBP.zip/MBP/Sylvan Caryatid.full.jpg"); +// singleLinks.put("mbp/78.jpg", "MBP.zip/MBP/Karametra's Acolyte.full.jpg"); +// singleLinks.put("mbp/79.jpg", "MBP.zip/MBP/Fated Conflagration.full.jpg"); +// singleLinks.put("mbp/8.jpg", "MBP.zip/MBP/Giant Badger.full.jpg"); +// singleLinks.put("mbp/80.jpg", "MBP.zip/MBP/High Tide.full.jpg"); +// singleLinks.put("mbp/81.jpg", "MBP.zip/MBP/Gaze of Granite.full.jpg"); +// singleLinks.put("mbp/82.jpg", "MBP.zip/MBP/Wash Out.full.jpg"); +// singleLinks.put("mbp/83.jpg", "MBP.zip/MBP/Acquire.full.jpg"); +// singleLinks.put("mbp/84.jpg", "MBP.zip/MBP/Duress.full.jpg"); +// singleLinks.put("mbp/85.jpg", "MBP.zip/MBP/Eidolon of Blossoms.full.jpg"); +// singleLinks.put("mbp/86.jpg", "MBP.zip/MBP/Magister of Worth.full.jpg"); +// singleLinks.put("mbp/87.jpg", "MBP.zip/MBP/Soul of Ravnica.full.jpg"); +// singleLinks.put("mbp/88.jpg", "MBP.zip/MBP/Soul of Zendikar.full.jpg"); +// singleLinks.put("mbp/89.jpg", "MBP.zip/MBP/Stealer of Secrets.full.jpg"); +// singleLinks.put("mbp/9.jpg", "MBP.zip/MBP/Scent of Cinder.full.jpg"); +// singleLinks.put("mbp/90.jpg", "MBP.zip/MBP/Angelic Skirmisher.full.jpg"); +// singleLinks.put("mbp/91.jpg", "MBP.zip/MBP/Xathrid Necromancer.full.jpg"); +// singleLinks.put("mbp/92.jpg", "MBP.zip/MBP/Rattleclaw Mystic.full.jpg"); +// singleLinks.put("mbp/93.jpg", "MBP.zip/MBP/Ankle Shanker.full.jpg"); +// singleLinks.put("mbp/94.jpg", "MBP.zip/MBP/Avalanche Tusker.full.jpg"); +// singleLinks.put("mbp/95.jpg", "MBP.zip/MBP/Ivorytusk Fortress.full.jpg"); +// singleLinks.put("mbp/96.jpg", "MBP.zip/MBP/Rakshasa Vizier.full.jpg"); +// singleLinks.put("mbp/97.jpg", "MBP.zip/MBP/Sage of the Inward Eye.full.jpg"); +// singleLinks.put("mbp/98.jpg", "MBP.zip/MBP/Goblin Rabblemaster.full.jpg"); +// singleLinks.put("mbp/99.jpg", "MBP.zip/MBP/Ajani Steadfast.full.jpg"); +// singleLinks.put("mgdc/1.jpg", "MGDC.zip/MGDC/Reya Dawnbringer.full.jpg"); +// singleLinks.put("mgdc/10.jpg", "MGDC.zip/MGDC/Stormblood Berserker.full.jpg"); +// singleLinks.put("mgdc/11.jpg", "MGDC.zip/MGDC/Dungrove Elder.full.jpg"); +// singleLinks.put("mgdc/12.jpg", "MGDC.zip/MGDC/Diregraf Ghoul.full.jpg"); +// singleLinks.put("mgdc/13.jpg", "MGDC.zip/MGDC/Elite Inquisitor.full.jpg"); +// singleLinks.put("mgdc/14.jpg", "MGDC.zip/MGDC/Zombie Apocalypse.full.jpg"); +// singleLinks.put("mgdc/15.jpg", "MGDC.zip/MGDC/Strangleroot Geist.full.jpg"); +// singleLinks.put("mgdc/16.jpg", "MGDC.zip/MGDC/Suture Priest.full.jpg"); +// singleLinks.put("mgdc/17.jpg", "MGDC.zip/MGDC/Pristine Talisman.full.jpg"); +// singleLinks.put("mgdc/18.jpg", "MGDC.zip/MGDC/Latch Seeker.full.jpg"); +// singleLinks.put("mgdc/19.jpg", "MGDC.zip/MGDC/Killing Wave.full.jpg"); +// singleLinks.put("mgdc/2.jpg", "MGDC.zip/MGDC/Liliana's Specter.full.jpg"); +// singleLinks.put("mgdc/20.jpg", "MGDC.zip/MGDC/Magmaquake.full.jpg"); +// singleLinks.put("mgdc/21.jpg", "MGDC.zip/MGDC/Mwonvuli Beast Tracker.full.jpg"); +// singleLinks.put("mgdc/22.jpg", "MGDC.zip/MGDC/Cryptborn Horror.full.jpg"); +// singleLinks.put("mgdc/23.jpg", "MGDC.zip/MGDC/Dryad Militant.full.jpg"); +// singleLinks.put("mgdc/24.jpg", "MGDC.zip/MGDC/Firemane Avenger.full.jpg"); +// singleLinks.put("mgdc/25.jpg", "MGDC.zip/MGDC/Zameck Guildmage.full.jpg"); +// singleLinks.put("mgdc/26.jpg", "MGDC.zip/MGDC/Melek, Izzet Paragon.full.jpg"); +// singleLinks.put("mgdc/27.jpg", "MGDC.zip/MGDC/Trostani's Summoner.full.jpg"); +// singleLinks.put("mgdc/28.jpg", "MGDC.zip/MGDC/Hive Stirrings.full.jpg"); +// singleLinks.put("mgdc/29.jpg", "MGDC.zip/MGDC/Goblin Diplomats.full.jpg"); +// singleLinks.put("mgdc/3.jpg", "MGDC.zip/MGDC/Mitotic Slime.full.jpg"); +// singleLinks.put("mgdc/30.jpg", "MGDC.zip/MGDC/Phalanx Leader.full.jpg"); +// singleLinks.put("mgdc/31.jpg", "MGDC.zip/MGDC/Nighthowler.full.jpg"); +// singleLinks.put("mgdc/32.jpg", "MGDC.zip/MGDC/Pain Seer.full.jpg"); +// singleLinks.put("mgdc/33.jpg", "MGDC.zip/MGDC/Kiora's Follower.full.jpg"); +// singleLinks.put("mgdc/34.jpg", "MGDC.zip/MGDC/Squelching Leeches.full.jpg"); +// singleLinks.put("mgdc/35.jpg", "MGDC.zip/MGDC/Dictate of Kruphix.full.jpg"); +// singleLinks.put("mgdc/36.jpg", "MGDC.zip/MGDC/Hall of Triumph.full.jpg"); +// singleLinks.put("mgdc/37.jpg", "MGDC.zip/MGDC/Heir of the Wilds.full.jpg"); +// singleLinks.put("mgdc/38.jpg", "MGDC.zip/MGDC/Utter End.full.jpg"); +// singleLinks.put("mgdc/39.jpg", "MGDC.zip/MGDC/Reclamation Sage.full.jpg"); +// singleLinks.put("mgdc/4.jpg", "MGDC.zip/MGDC/Memnite.full.jpg"); +// singleLinks.put("mgdc/40.jpg", "MGDC.zip/MGDC/Chief Engineer.full.jpg"); +// singleLinks.put("mgdc/41.jpg", "MGDC.zip/MGDC/Mardu Shadowspear.full.jpg"); +// singleLinks.put("mgdc/42.jpg", "MGDC.zip/MGDC/Supplant Form.full.jpg"); +// singleLinks.put("mgdc/43.jpg", "MGDC.zip/MGDC/Thunderbreak Regent.full.jpg"); +// singleLinks.put("mgdc/44.jpg", "MGDC.zip/MGDC/Scaleguard Sentinels.full.jpg"); +// singleLinks.put("mgdc/45.jpg", "MGDC.zip/MGDC/Conclave Naturalists.full.jpg"); +// singleLinks.put("mgdc/46.jpg", "MGDC.zip/MGDC/Languish.full.jpg"); +// singleLinks.put("mgdc/47.jpg", "MGDC.zip/MGDC/Stasis Snare.full.jpg"); +// singleLinks.put("mgdc/48.jpg", "MGDC.zip/MGDC/Radiant Flames.full.jpg"); +// singleLinks.put("mgdc/49.jpg", "MGDC.zip/MGDC/Immolating Glare.full.jpg"); +// singleLinks.put("mgdc/5.jpg", "MGDC.zip/MGDC/Tempered Steel.full.jpg"); +// singleLinks.put("mgdc/50.jpg", "MGDC.zip/MGDC/Jori En, Ruin Diver.full.jpg"); +// singleLinks.put("mgdc/6.jpg", "MGDC.zip/MGDC/Treasure Mage.full.jpg"); +// singleLinks.put("mgdc/7.jpg", "MGDC.zip/MGDC/Black Sun's Zenith.full.jpg"); +// singleLinks.put("mgdc/8.jpg", "MGDC.zip/MGDC/Myr Superion.full.jpg"); +// singleLinks.put("mgdc/9.jpg", "MGDC.zip/MGDC/Priest of Urabrask.full.jpg"); +// singleLinks.put("mlp/1.jpg", "MLP.zip/MLP/Earwig Squad.full.jpg"); +// singleLinks.put("mlp/10.jpg", "MLP.zip/MLP/Lord of Shatterskull Pass.full.jpg"); +// singleLinks.put("mlp/11.jpg", "MLP.zip/MLP/Ancient Hellkite.full.jpg"); +// singleLinks.put("mlp/12.jpg", "MLP.zip/MLP/Steel Hellkite.full.jpg"); +// singleLinks.put("mlp/13.jpg", "MLP.zip/MLP/Thopter Assembly.full.jpg"); +// singleLinks.put("mlp/14.jpg", "MLP.zip/MLP/Phyrexian Metamorph.full.jpg"); +// singleLinks.put("mlp/15.jpg", "MLP.zip/MLP/Garruk's Horde.full.jpg"); +// singleLinks.put("mlp/16a.jpg", "MLP.zip/MLP/Ludevic's Test Subject.full.jpg"); +// singleLinks.put("mlp/16b.jpg", "MLP.zip/MLP/Ludevic's Abomination.full.jpg"); +// singleLinks.put("mlp/17a.jpg", "MLP.zip/MLP/Mondronen Shaman.full.jpg"); +// singleLinks.put("mlp/17b.jpg", "MLP.zip/MLP/Tovolar's Magehunter.full.jpg"); +// singleLinks.put("mlp/18.jpg", "MLP.zip/MLP/Restoration Angel.full.jpg"); +// singleLinks.put("mlp/19.jpg", "MLP.zip/MLP/Staff of Nin.full.jpg"); +// singleLinks.put("mlp/2.jpg", "MLP.zip/MLP/Vexing Shusher.full.jpg"); +// singleLinks.put("mlp/20.jpg", "MLP.zip/MLP/Deadbridge Goliath.full.jpg"); +// singleLinks.put("mlp/21.jpg", "MLP.zip/MLP/Skarrg Goliath.full.jpg"); +// singleLinks.put("mlp/22a.jpg", "MLP.zip/MLP/Breaking (Breaking/Entering).full.jpg"); +// singleLinks.put("mlp/22b.jpg", "MLP.zip/MLP/Entering (Breaking/Entering).full.jpg"); +// singleLinks.put("mlp/23.jpg", "MLP.zip/MLP/Colossal Whale.full.jpg"); +// singleLinks.put("mlp/24.jpg", "MLP.zip/MLP/Bident of Thassa.full.jpg"); +// singleLinks.put("mlp/25.jpg", "MLP.zip/MLP/Tromokratis.full.jpg"); +// singleLinks.put("mlp/26.jpg", "MLP.zip/MLP/Dictate of the Twin Gods.full.jpg"); +// singleLinks.put("mlp/27.jpg", "MLP.zip/MLP/Dragone Throne of Tarkir.full.jpg"); +// singleLinks.put("mlp/28.jpg", "MLP.zip/MLP/In Garruk's Wake.full.jpg"); +// singleLinks.put("mlp/29.jpg", "MLP.zip/MLP/Sandsteppe Mastodon.full.jpg"); +// singleLinks.put("mlp/3.jpg", "MLP.zip/MLP/Figure of Destiny.full.jpg"); +// singleLinks.put("mlp/31.jpg", "MLP.zip/MLP/Deathbringer Regent.full.jpg"); +// singleLinks.put("mlp/32.jpg", "MLP.zip/MLP/Mizzium Meddler.full.jpg"); +// singleLinks.put("mlp/33.jpg", "MLP.zip/MLP/Blight Herder.full.jpg"); +// singleLinks.put("mlp/34.jpg", "MLP.zip/MLP/Endbringer.full.jpg"); +// singleLinks.put("mlp/4.jpg", "MLP.zip/MLP/Ajani Vengeant.full.jpg"); +// singleLinks.put("mlp/5.jpg", "MLP.zip/MLP/Obelisk of Alara.full.jpg"); +// singleLinks.put("mlp/6.jpg", "MLP.zip/MLP/Knight of New Alara.full.jpg"); +// singleLinks.put("mlp/7.jpg", "MLP.zip/MLP/Ant Queen.full.jpg"); +// singleLinks.put("mlp/8.jpg", "MLP.zip/MLP/Valakut, the Molten Pinnacle.full.jpg"); +// singleLinks.put("mlp/9.jpg", "MLP.zip/MLP/Joraga Warcaller.full.jpg"); +// singleLinks.put("mprp/1.jpg", "MPRP.zip/MPRP/Wasteland.full.jpg"); +// singleLinks.put("mprp/10.jpg", "MPRP.zip/MPRP/Hypnotic Specter.full.jpg"); +// singleLinks.put("mprp/11.jpg", "MPRP.zip/MPRP/Hinder.full.jpg"); +// singleLinks.put("mprp/12.jpg", "MPRP.zip/MPRP/Pyroclasm.full.jpg"); +// singleLinks.put("mprp/13.jpg", "MPRP.zip/MPRP/Giant Growth.full.jpg"); +// singleLinks.put("mprp/14.jpg", "MPRP.zip/MPRP/Putrefy.full.jpg"); +// singleLinks.put("mprp/15.jpg", "MPRP.zip/MPRP/Zombify.full.jpg"); +// singleLinks.put("mprp/16.jpg", "MPRP.zip/MPRP/Lightning Helix.full.jpg"); +// singleLinks.put("mprp/17.jpg", "MPRP.zip/MPRP/Wrath of God.full.jpg"); +// singleLinks.put("mprp/18.jpg", "MPRP.zip/MPRP/Condemn.full.jpg"); +// singleLinks.put("mprp/19.jpg", "MPRP.zip/MPRP/Mortify.full.jpg"); +// singleLinks.put("mprp/2.jpg", "MPRP.zip/MPRP/Voidmage Prodigy.full.jpg"); +// singleLinks.put("mprp/20.jpg", "MPRP.zip/MPRP/Psionic Blast.full.jpg"); +// singleLinks.put("mprp/21.jpg", "MPRP.zip/MPRP/Cruel Edict.full.jpg"); +// singleLinks.put("mprp/22.jpg", "MPRP.zip/MPRP/Disenchant.full.jpg"); +// singleLinks.put("mprp/23.jpg", "MPRP.zip/MPRP/Recollect.full.jpg"); +// singleLinks.put("mprp/24.jpg", "MPRP.zip/MPRP/Damnation.full.jpg"); +// singleLinks.put("mprp/25.jpg", "MPRP.zip/MPRP/Tidings.full.jpg"); +// singleLinks.put("mprp/26.jpg", "MPRP.zip/MPRP/Incinerate.full.jpg"); +// singleLinks.put("mprp/27.jpg", "MPRP.zip/MPRP/Mana Tithe.full.jpg"); +// singleLinks.put("mprp/28.jpg", "MPRP.zip/MPRP/Harmonize.full.jpg"); +// singleLinks.put("mprp/29.jpg", "MPRP.zip/MPRP/Ponder.full.jpg"); +// singleLinks.put("mprp/3.jpg", "MPRP.zip/MPRP/Powder Keg.full.jpg"); +// singleLinks.put("mprp/30.jpg", "MPRP.zip/MPRP/Corrupt.full.jpg"); +// singleLinks.put("mprp/31.jpg", "MPRP.zip/MPRP/Cryptic Command.full.jpg"); +// singleLinks.put("mprp/32.jpg", "MPRP.zip/MPRP/Flame Javelin.full.jpg"); +// singleLinks.put("mprp/33.jpg", "MPRP.zip/MPRP/Unmake.full.jpg"); +// singleLinks.put("mprp/34.jpg", "MPRP.zip/MPRP/Nameless Inversion.full.jpg"); +// singleLinks.put("mprp/35.jpg", "MPRP.zip/MPRP/Remove Soul.full.jpg"); +// singleLinks.put("mprp/36.jpg", "MPRP.zip/MPRP/Blightning.full.jpg"); +// singleLinks.put("mprp/37.jpg", "MPRP.zip/MPRP/Rampant Growth.full.jpg"); +// singleLinks.put("mprp/38.jpg", "MPRP.zip/MPRP/Negate.full.jpg"); +// singleLinks.put("mprp/39.jpg", "MPRP.zip/MPRP/Terminate.full.jpg"); +// singleLinks.put("mprp/4.jpg", "MPRP.zip/MPRP/Psychatog.full.jpg"); +// singleLinks.put("mprp/40.jpg", "MPRP.zip/MPRP/Lightning Bolt.full.jpg"); +// singleLinks.put("mprp/41.jpg", "MPRP.zip/MPRP/Cancel.full.jpg"); +// singleLinks.put("mprp/42.jpg", "MPRP.zip/MPRP/Sign in Blood.full.jpg"); +// singleLinks.put("mprp/43.jpg", "MPRP.zip/MPRP/Infest.full.jpg"); +// singleLinks.put("mprp/44.jpg", "MPRP.zip/MPRP/Volcanic Fallout.full.jpg"); +// singleLinks.put("mprp/45.jpg", "MPRP.zip/MPRP/Celestial Purge.full.jpg"); +// singleLinks.put("mprp/46.jpg", "MPRP.zip/MPRP/Bituminous Blast.full.jpg"); +// singleLinks.put("mprp/47.jpg", "MPRP.zip/MPRP/Burst Lightning.full.jpg"); +// singleLinks.put("mprp/48.jpg", "MPRP.zip/MPRP/Harrow.full.jpg"); +// singleLinks.put("mprp/49.jpg", "MPRP.zip/MPRP/Day of Judgment.full.jpg"); +// singleLinks.put("mprp/5.jpg", "MPRP.zip/MPRP/Terror.full.jpg"); +// singleLinks.put("mprp/50.jpg", "MPRP.zip/MPRP/Brave the Elements.full.jpg"); +// singleLinks.put("mprp/51.jpg", "MPRP.zip/MPRP/Doom Blade.full.jpg"); +// singleLinks.put("mprp/52.jpg", "MPRP.zip/MPRP/Treasure Hunt.full.jpg"); +// singleLinks.put("mprp/53.jpg", "MPRP.zip/MPRP/Searing Blaze.full.jpg"); +// singleLinks.put("mprp/6.jpg", "MPRP.zip/MPRP/Fireball.full.jpg"); +// singleLinks.put("mprp/7.jpg", "MPRP.zip/MPRP/Oxidize.full.jpg"); +// singleLinks.put("mprp/8.jpg", "MPRP.zip/MPRP/Mana Leak.full.jpg"); +// singleLinks.put("mprp/9.jpg", "MPRP.zip/MPRP/Reciprocate.full.jpg"); +// singleLinks.put("mpskld/1.jpg", "MPS.zip/MPS/Cataclysmic Gearhulk.full.jpg"); +// singleLinks.put("mpskld/10.jpg", "MPS.zip/MPS/Cloudstone Curio.full.jpg"); +// singleLinks.put("mpskld/11.jpg", "MPS.zip/MPS/Crucible of Worlds.full.jpg"); +// singleLinks.put("mpskld/12.jpg", "MPS.zip/MPS/Gauntlet of Power.full.jpg"); +// singleLinks.put("mpskld/13.jpg", "MPS.zip/MPS/Hangarback Walker.full.jpg"); +// singleLinks.put("mpskld/14.jpg", "MPS.zip/MPS/Lightning Greaves.full.jpg"); +// singleLinks.put("mpskld/15.jpg", "MPS.zip/MPS/Lotus Petal.full.jpg"); +// singleLinks.put("mpskld/16.jpg", "MPS.zip/MPS/Mana Crypt.full.jpg"); +// singleLinks.put("mpskld/17.jpg", "MPS.zip/MPS/Mana Vault.full.jpg"); +// singleLinks.put("mpskld/18.jpg", "MPS.zip/MPS/Mind's Eye.full.jpg"); +// singleLinks.put("mpskld/19.jpg", "MPS.zip/MPS/Mox Opal.full.jpg"); +// singleLinks.put("mpskld/2.jpg", "MPS.zip/MPS/Torrential Gearhulk.full.jpg"); +// singleLinks.put("mpskld/20.jpg", "MPS.zip/MPS/Painter's Servant.full.jpg"); +// singleLinks.put("mpskld/21.jpg", "MPS.zip/MPS/Rings of Brighthearth.full.jpg"); +// singleLinks.put("mpskld/22.jpg", "MPS.zip/MPS/Scroll Rack.full.jpg"); +// singleLinks.put("mpskld/23.jpg", "MPS.zip/MPS/Sculpting Steel.full.jpg"); +// singleLinks.put("mpskld/24.jpg", "MPS.zip/MPS/Sol Ring.full.jpg"); +// singleLinks.put("mpskld/25.jpg", "MPS.zip/MPS/Solemn Simulacrum.full.jpg"); +// singleLinks.put("mpskld/26.jpg", "MPS.zip/MPS/Static Orb.full.jpg"); +// singleLinks.put("mpskld/27.jpg", "MPS.zip/MPS/Steel Overseer.full.jpg"); +// singleLinks.put("mpskld/28.jpg", "MPS.zip/MPS/Sword of Feast and Famine.full.jpg"); +// singleLinks.put("mpskld/29.jpg", "MPS.zip/MPS/Sword of Fire and Ice.full.jpg"); +// singleLinks.put("mpskld/3.jpg", "MPS.zip/MPS/Noxious Gearhulk.full.jpg"); +// singleLinks.put("mpskld/30.jpg", "MPS.zip/MPS/Sword of Light and Shadow.full.jpg"); +// singleLinks.put("mpskld/4.jpg", "MPS.zip/MPS/Combustible Gearhulk.full.jpg"); +// singleLinks.put("mpskld/5.jpg", "MPS.zip/MPS/Verdurous Gearhulk.full.jpg"); +// singleLinks.put("mpskld/6.jpg", "MPS.zip/MPS/Aether Vial.full.jpg"); +// singleLinks.put("mpskld/7.jpg", "MPS.zip/MPS/Champion's Helm.full.jpg"); +// singleLinks.put("mpskld/8.jpg", "MPS.zip/MPS/Chromatic Lantern.full.jpg"); +// singleLinks.put("mpskld/9.jpg", "MPS.zip/MPS/Chrome Mox.full.jpg"); +// singleLinks.put("ptc/1.jpg", "PTC.zip/PTC/Dirtcowl Wurm.full.jpg"); +// singleLinks.put("ptc/10.jpg", "PTC.zip/PTC/Rathi Assassin.full.jpg"); +// singleLinks.put("ptc/100.jpg", "PTC.zip/PTC/Flying Crane Technique.full.jpg"); +// singleLinks.put("ptc/101.jpg", "PTC.zip/PTC/Grim Haruspex.full.jpg"); +// singleLinks.put("ptc/102.jpg", "PTC.zip/PTC/Hardened Scales.full.jpg"); +// singleLinks.put("ptc/103.jpg", "PTC.zip/PTC/Herald of Anafenza.full.jpg"); +// singleLinks.put("ptc/104.jpg", "PTC.zip/PTC/High Sentinels of Arashin.full.jpg"); +// singleLinks.put("ptc/105.jpg", "PTC.zip/PTC/Icy Blast.full.jpg"); +// singleLinks.put("ptc/106.jpg", "PTC.zip/PTC/Ivorytusk Fortress.full.jpg"); +// singleLinks.put("ptc/107.jpg", "PTC.zip/PTC/Jeering Instigator.full.jpg"); +// singleLinks.put("ptc/108.jpg", "PTC.zip/PTC/Jeskai Ascendancy.full.jpg"); +// singleLinks.put("ptc/109.jpg", "PTC.zip/PTC/Kheru Lich Lord.full.jpg"); +// singleLinks.put("ptc/11.jpg", "PTC.zip/PTC/Avatar of Hope.full.jpg"); +// singleLinks.put("ptc/110.jpg", "PTC.zip/PTC/Mardu Ascendancy.full.jpg"); +// singleLinks.put("ptc/111.jpg", "PTC.zip/PTC/Master of Pearls.full.jpg"); +// singleLinks.put("ptc/112.jpg", "PTC.zip/PTC/Narset, Enlightened Master.full.jpg"); +// singleLinks.put("ptc/113.jpg", "PTC.zip/PTC/Necropolis Fiend.full.jpg"); +// singleLinks.put("ptc/114.jpg", "PTC.zip/PTC/Rakshasa Vizier.full.jpg"); +// singleLinks.put("ptc/115.jpg", "PTC.zip/PTC/Rattleclaw Mystic.full.jpg"); +// singleLinks.put("ptc/116.jpg", "PTC.zip/PTC/Sage of the Inward Eye.full.jpg"); +// singleLinks.put("ptc/117.jpg", "PTC.zip/PTC/Sidisi, Brood Tyrant.full.jpg"); +// singleLinks.put("ptc/118.jpg", "PTC.zip/PTC/Siege Rhino.full.jpg"); +// singleLinks.put("ptc/119.jpg", "PTC.zip/PTC/Sultai Ascendacy.full.jpg"); +// singleLinks.put("ptc/12.jpg", "PTC.zip/PTC/Raging Kavu.full.jpg"); +// singleLinks.put("ptc/120.jpg", "PTC.zip/PTC/Surrak Dragonclaw.full.jpg"); +// singleLinks.put("ptc/121.jpg", "PTC.zip/PTC/Temur Ascendancy.full.jpg"); +// singleLinks.put("ptc/122.jpg", "PTC.zip/PTC/Thousand Winds.full.jpg"); +// singleLinks.put("ptc/123.jpg", "PTC.zip/PTC/Trail of Mystery.full.jpg"); +// singleLinks.put("ptc/124.jpg", "PTC.zip/PTC/Trap Essence.full.jpg"); +// singleLinks.put("ptc/125.jpg", "PTC.zip/PTC/Utter End.full.jpg"); +// singleLinks.put("ptc/126.jpg", "PTC.zip/PTC/Villainous Wealth.full.jpg"); +// singleLinks.put("ptc/127.jpg", "PTC.zip/PTC/Zurgo Helmsmasher.full.jpg"); +// singleLinks.put("ptc/128.jpg", "PTC.zip/PTC/Alesha, Who Smiles at Death.full.jpg"); +// singleLinks.put("ptc/129.jpg", "PTC.zip/PTC/Arcbond.full.jpg"); +// singleLinks.put("ptc/13.jpg", "PTC.zip/PTC/Questing Phelddagrif.full.jpg"); +// singleLinks.put("ptc/130.jpg", "PTC.zip/PTC/Archfiend of Depravity.full.jpg"); +// singleLinks.put("ptc/131.jpg", "PTC.zip/PTC/Atarka, World Render.full.jpg"); +// singleLinks.put("ptc/132.jpg", "PTC.zip/PTC/Brutal Hordechief.full.jpg"); +// singleLinks.put("ptc/133.jpg", "PTC.zip/PTC/Daghatar the Adamant.full.jpg"); +// singleLinks.put("ptc/134.jpg", "PTC.zip/PTC/Dragonscale General.full.jpg"); +// singleLinks.put("ptc/135.jpg", "PTC.zip/PTC/Dromoka, the Eternal.full.jpg"); +// singleLinks.put("ptc/136.jpg", "PTC.zip/PTC/Flamerush Rider.full.jpg"); +// singleLinks.put("ptc/137.jpg", "PTC.zip/PTC/Flamewake Phoenix.full.jpg"); +// singleLinks.put("ptc/138.jpg", "PTC.zip/PTC/Jeskai Infiltrator.full.jpg"); +// singleLinks.put("ptc/14.jpg", "PTC.zip/PTC/Fungal Shambler.full.jpg"); +// singleLinks.put("ptc/141.jpg", "PTC.zip/PTC/Mastery of the Unseen.full.jpg"); +// singleLinks.put("ptc/142.jpg", "PTC.zip/PTC/Ojutai, Soul of Winter.full.jpg"); +// singleLinks.put("ptc/143.jpg", "PTC.zip/PTC/Rally the Ancestors.full.jpg"); +// singleLinks.put("ptc/145.jpg", "PTC.zip/PTC/Sandsteppe Mastodon.full.jpg"); +// singleLinks.put("ptc/147.jpg", "PTC.zip/PTC/Shamanic Revelation.full.jpg"); +// singleLinks.put("ptc/15.jpg", "PTC.zip/PTC/Stone-Tongue Basilisk.full.jpg"); +// singleLinks.put("ptc/150.jpg", "PTC.zip/PTC/Soulfire Grand Master.full.jpg"); +// singleLinks.put("ptc/151.jpg", "PTC.zip/PTC/Soulflayer.full.jpg"); +// singleLinks.put("ptc/152.jpg", "PTC.zip/PTC/Supplant Form.full.jpg"); +// singleLinks.put("ptc/153.jpg", "PTC.zip/PTC/Tasigur, the Golden Fang.full.jpg"); +// singleLinks.put("ptc/154.jpg", "PTC.zip/PTC/Torrent Elemental.full.jpg"); +// singleLinks.put("ptc/157.jpg", "PTC.zip/PTC/Yasova Dragonclaw.full.jpg"); +// singleLinks.put("ptc/16.jpg", "PTC.zip/PTC/Laquatus's Champion.full.jpg"); +// singleLinks.put("ptc/166.jpg", "PTC.zip/PTC/Crater Elemental.full.jpg"); +// singleLinks.put("ptc/168.jpg", "PTC.zip/PTC/Deathbringer Regent.full.jpg"); +// singleLinks.put("ptc/17.jpg", "PTC.zip/PTC/Glory.full.jpg"); +// singleLinks.put("ptc/18.jpg", "PTC.zip/PTC/Silent Specter.full.jpg"); +// singleLinks.put("ptc/181.jpg", "PTC.zip/PTC/Kolaghan's Command.full.jpg"); +// singleLinks.put("ptc/183.jpg", "PTC.zip/PTC/Myth Realized.full.jpg"); +// singleLinks.put("ptc/185.jpg", "PTC.zip/PTC/Ojutai's Command.full.jpg"); +// singleLinks.put("ptc/19.jpg", "PTC.zip/PTC/Feral Throwback.full.jpg"); +// singleLinks.put("ptc/196.jpg", "PTC.zip/PTC/Volcanic Vision.full.jpg"); +// singleLinks.put("ptc/198.jpg", "PTC.zip/PTC/Abbot of Keral Keep.full.jpg"); +// singleLinks.put("ptc/2.jpg", "PTC.zip/PTC/Revenant.full.jpg"); +// singleLinks.put("ptc/20.jpg", "PTC.zip/PTC/Soul Collector.full.jpg"); +// singleLinks.put("ptc/21.jpg", "PTC.zip/PTC/Sword of Kaldra.full.jpg"); +// singleLinks.put("ptc/210.jpg", "PTC.zip/PTC/Gilt-Leaf Winnower.full.jpg"); +// singleLinks.put("ptc/212.jpg", "PTC.zip/PTC/Graveblade Marauder.full.jpg"); +// singleLinks.put("ptc/216.jpg", "PTC.zip/PTC/Jace, Vryn's Prodigy.full.jpg"); +// singleLinks.put("ptc/22.jpg", "PTC.zip/PTC/Shield of Kaldra.full.jpg"); +// singleLinks.put("ptc/225.jpg", "PTC.zip/PTC/Nissa's Revelation.full.jpg"); +// singleLinks.put("ptc/227.jpg", "PTC.zip/PTC/Outland Colossus.full.jpg"); +// singleLinks.put("ptc/23.jpg", "PTC.zip/PTC/Helm of Kaldra.full.jpg"); +// singleLinks.put("ptc/238.jpg", "PTC.zip/PTC/Akoum Firebird.full.jpg"); +// singleLinks.put("ptc/239.jpg", "PTC.zip/PTC/Akoum Hellkite.full.jpg"); +// singleLinks.put("ptc/24.jpg", "PTC.zip/PTC/Ryusei, the Falling Star.full.jpg"); +// singleLinks.put("ptc/240.jpg", "PTC.zip/PTC/Aligned Hedron Network.full.jpg"); +// singleLinks.put("ptc/241.jpg", "PTC.zip/PTC/Ally Encampment.full.jpg"); +// singleLinks.put("ptc/242.jpg", "PTC.zip/PTC/Angelic Captain.full.jpg"); +// singleLinks.put("ptc/243.jpg", "PTC.zip/PTC/Barrage Tyrant.full.jpg"); +// singleLinks.put("ptc/244.jpg", "PTC.zip/PTC/Beastcaller Savant.full.jpg"); +// singleLinks.put("ptc/245.jpg", "PTC.zip/PTC/Blight Herder.full.jpg"); +// singleLinks.put("ptc/246.jpg", "PTC.zip/PTC/Bring to Light.full.jpg"); +// singleLinks.put("ptc/247.jpg", "PTC.zip/PTC/Brood Butcher.full.jpg"); +// singleLinks.put("ptc/248.jpg", "PTC.zip/PTC/Brutal Expulsion.full.jpg"); +// singleLinks.put("ptc/249.jpg", "PTC.zip/PTC/Canopy Vista.full.jpg"); +// singleLinks.put("ptc/25.jpg", "PTC.zip/PTC/Ink-Eyes, Servant of Oni.full.jpg"); +// singleLinks.put("ptc/250.jpg", "PTC.zip/PTC/Cinder Glade.full.jpg"); +// singleLinks.put("ptc/251.jpg", "PTC.zip/PTC/Conduit of Ruin.full.jpg"); +// singleLinks.put("ptc/252.jpg", "PTC.zip/PTC/Defiant Bloodlord.full.jpg"); +// singleLinks.put("ptc/253.jpg", "PTC.zip/PTC/Desolation Twin.full.jpg"); +// singleLinks.put("ptc/254.jpg", "PTC.zip/PTC/Dragonmaster Outcast.full.jpg"); +// singleLinks.put("ptc/255.jpg", "PTC.zip/PTC/Drana, Liberator of Malakir.full.jpg"); +// singleLinks.put("ptc/256.jpg", "PTC.zip/PTC/Drowner of Hope.full.jpg"); +// singleLinks.put("ptc/257.jpg", "PTC.zip/PTC/Dust Stalker.full.jpg"); +// singleLinks.put("ptc/258.jpg", "PTC.zip/PTC/Emeria Shepherd.full.jpg"); +// singleLinks.put("ptc/259.jpg", "PTC.zip/PTC/Endless One.full.jpg"); +// singleLinks.put("ptc/26.jpg", "PTC.zip/PTC/Kiyomaro, First to Stand.full.jpg"); +// singleLinks.put("ptc/260.jpg", "PTC.zip/PTC/Exert Influence.full.jpg"); +// singleLinks.put("ptc/261.jpg", "PTC.zip/PTC/Fathom Feeder.full.jpg"); +// singleLinks.put("ptc/262.jpg", "PTC.zip/PTC/Felidar Sovereign.full.jpg"); +// singleLinks.put("ptc/263.jpg", "PTC.zip/PTC/From Beyond.full.jpg"); +// singleLinks.put("ptc/264.jpg", "PTC.zip/PTC/Gideon, Ally of Zendikar.full.jpg"); +// singleLinks.put("ptc/265.jpg", "PTC.zip/PTC/Greenwarden of Murasa.full.jpg"); +// singleLinks.put("ptc/266.jpg", "PTC.zip/PTC/Gruesome Slaughter.full.jpg"); +// singleLinks.put("ptc/267.jpg", "PTC.zip/PTC/Guardian of Tazeem.full.jpg"); +// singleLinks.put("ptc/268.jpg", "PTC.zip/PTC/Guul Draz Overseer.full.jpg"); +// singleLinks.put("ptc/27.jpg", "PTC.zip/PTC/Gleancrawler.full.jpg"); +// singleLinks.put("ptc/271.jpg", "PTC.zip/PTC/Lantern Scout.full.jpg"); +// singleLinks.put("ptc/272.jpg", "PTC.zip/PTC/Lumbering Falls.full.jpg"); +// singleLinks.put("ptc/273.jpg", "PTC.zip/PTC/March from the Tomb.full.jpg"); +// singleLinks.put("ptc/274.jpg", "PTC.zip/PTC/Munda, Ambush Leader.full.jpg"); +// singleLinks.put("ptc/275.jpg", "PTC.zip/PTC/Nissa's Renewal.full.jpg"); +// singleLinks.put("ptc/276.jpg", "PTC.zip/PTC/Noyan Dar, Roil Shaper.full.jpg"); +// singleLinks.put("ptc/277.jpg", "PTC.zip/PTC/Ob Nixilis Reignited.full.jpg"); +// singleLinks.put("ptc/278.jpg", "PTC.zip/PTC/Oblivion Sower.full.jpg"); +// singleLinks.put("ptc/279.jpg", "PTC.zip/PTC/Omnath, Locus of Rage.full.jpg"); +// singleLinks.put("ptc/28.jpg", "PTC.zip/PTC/Djinn Illuminatus.full.jpg"); +// singleLinks.put("ptc/280.jpg", "PTC.zip/PTC/Oran-Rief Hydra.full.jpg"); +// singleLinks.put("ptc/281.jpg", "PTC.zip/PTC/Painful Truths.full.jpg"); +// singleLinks.put("ptc/282.jpg", "PTC.zip/PTC/Part the Waterveil.full.jpg"); +// singleLinks.put("ptc/283.jpg", "PTC.zip/PTC/Planar Outburst.full.jpg"); +// singleLinks.put("ptc/284.jpg", "PTC.zip/PTC/Prairie Stream.full.jpg"); +// singleLinks.put("ptc/285.jpg", "PTC.zip/PTC/Prism Array.full.jpg"); +// singleLinks.put("ptc/286.jpg", "PTC.zip/PTC/Quarantine Field.full.jpg"); +// singleLinks.put("ptc/287.jpg", "PTC.zip/PTC/Radiant Flames.full.jpg"); +// singleLinks.put("ptc/288.jpg", "PTC.zip/PTC/Ruinous Path.full.jpg"); +// singleLinks.put("ptc/289.jpg", "PTC.zip/PTC/Sanctum of Ugin.full.jpg"); +// singleLinks.put("ptc/29.jpg", "PTC.zip/PTC/Avatar of Discord.full.jpg"); +// singleLinks.put("ptc/290.jpg", "PTC.zip/PTC/Scatter to the Winds.full.jpg"); +// singleLinks.put("ptc/291.jpg", "PTC.zip/PTC/Serpentine Spike.full.jpg"); +// singleLinks.put("ptc/292.jpg", "PTC.zip/PTC/Shambling Vent.full.jpg"); +// singleLinks.put("ptc/293.jpg", "PTC.zip/PTC/Shrine of the Forsaken Gods.full.jpg"); +// singleLinks.put("ptc/294.jpg", "PTC.zip/PTC/Sire of Stagnation.full.jpg"); +// singleLinks.put("ptc/295.jpg", "PTC.zip/PTC/Smoldering Marsh.full.jpg"); +// singleLinks.put("ptc/296.jpg", "PTC.zip/PTC/Smothering Abomination.full.jpg"); +// singleLinks.put("ptc/297.jpg", "PTC.zip/PTC/Sunken Hollow.full.jpg"); +// singleLinks.put("ptc/298.jpg", "PTC.zip/PTC/Ugin's Insight.full.jpg"); +// singleLinks.put("ptc/299.jpg", "PTC.zip/PTC/Ulamog, the Ceaseless Hunger.full.jpg"); +// singleLinks.put("ptc/3.jpg", "PTC.zip/PTC/Monstrous Hound.full.jpg"); +// singleLinks.put("ptc/30.jpg", "PTC.zip/PTC/Allosaurus Rider.full.jpg"); +// singleLinks.put("ptc/300.jpg", "PTC.zip/PTC/Undergrowth Champion.full.jpg"); +// singleLinks.put("ptc/301.jpg", "PTC.zip/PTC/Veteran Warleader.full.jpg"); +// singleLinks.put("ptc/302.jpg", "PTC.zip/PTC/Void Winnower.full.jpg"); +// singleLinks.put("ptc/303.jpg", "PTC.zip/PTC/Wasteland Strangler.full.jpg"); +// singleLinks.put("ptc/304.jpg", "PTC.zip/PTC/Woodland Wanderer.full.jpg"); +// singleLinks.put("ptc/305.jpg", "PTC.zip/PTC/Zada, Hedron Grinder.full.jpg"); +// singleLinks.put("ptc/31.jpg", "PTC.zip/PTC/Lotus Bloom.full.jpg"); +// singleLinks.put("ptc/32.jpg", "PTC.zip/PTC/Oros, the Avenger.full.jpg"); +// singleLinks.put("ptc/33.jpg", "PTC.zip/PTC/Korlash, Heir to Blackblade.full.jpg"); +// singleLinks.put("ptc/34.jpg", "PTC.zip/PTC/Wren's Run Packmaster.full.jpg"); +// singleLinks.put("ptc/35.jpg", "PTC.zip/PTC/Door of Destinies.full.jpg"); +// singleLinks.put("ptc/36.jpg", "PTC.zip/PTC/Demigod of Revenge.full.jpg"); +// singleLinks.put("ptc/37.jpg", "PTC.zip/PTC/Overbeing of Myth.full.jpg"); +// singleLinks.put("ptc/38.jpg", "PTC.zip/PTC/Ajani Vengeant.full.jpg"); +// singleLinks.put("ptc/39.jpg", "PTC.zip/PTC/Malfegor.full.jpg"); +// singleLinks.put("ptc/4.jpg", "PTC.zip/PTC/Lightning Dragon.full.jpg"); +// singleLinks.put("ptc/40.jpg", "PTC.zip/PTC/Dragon Broodmother.full.jpg"); +// singleLinks.put("ptc/41.jpg", "PTC.zip/PTC/Vampire Nocturnus.full.jpg"); +// singleLinks.put("ptc/42.jpg", "PTC.zip/PTC/Rampaging Baloths.full.jpg"); +// singleLinks.put("ptc/43.jpg", "PTC.zip/PTC/Comet Storm.full.jpg"); +// singleLinks.put("ptc/44.jpg", "PTC.zip/PTC/Emrakul, the Aeons Torn.full.jpg"); +// singleLinks.put("ptc/45.jpg", "PTC.zip/PTC/Sun Titan.full.jpg"); +// singleLinks.put("ptc/46.jpg", "PTC.zip/PTC/Wurmcoil Engine.full.jpg"); +// singleLinks.put("ptc/47.jpg", "PTC.zip/PTC/Hero of Bladehold.full.jpg"); +// singleLinks.put("ptc/48.jpg", "PTC.zip/PTC/Glissa, the Traitor.full.jpg"); +// singleLinks.put("ptc/49.jpg", "PTC.zip/PTC/Sheoldred, Whispering One.full.jpg"); +// singleLinks.put("ptc/5.jpg", "PTC.zip/PTC/Beast of Burden.full.jpg"); +// singleLinks.put("ptc/50.jpg", "PTC.zip/PTC/Bloodlord of Vaasgoth.full.jpg"); +// singleLinks.put("ptc/51a.jpg", "PTC.zip/PTC/Mayor of Avabruck.full.jpg"); +// singleLinks.put("ptc/51b.jpg", "PTC.zip/PTC/Howlpack Alpha.full.jpg"); +// singleLinks.put("ptc/52a.jpg", "PTC.zip/PTC/Ravenous Demon.full.jpg"); +// singleLinks.put("ptc/52b.jpg", "PTC.zip/PTC/Archdemon of Greed.full.jpg"); +// singleLinks.put("ptc/53.jpg", "PTC.zip/PTC/Moonsilver Spear.full.jpg"); +// singleLinks.put("ptc/54.jpg", "PTC.zip/PTC/Xathrid Gorgon.full.jpg"); +// singleLinks.put("ptc/55.jpg", "PTC.zip/PTC/Archon of the Triumvirate.full.jpg"); +// singleLinks.put("ptc/56.jpg", "PTC.zip/PTC/Hypersonic Dragon.full.jpg"); +// singleLinks.put("ptc/57.jpg", "PTC.zip/PTC/Carnival Hellsteed.full.jpg"); +// singleLinks.put("ptc/58.jpg", "PTC.zip/PTC/Corpsejack Menace.full.jpg"); +// singleLinks.put("ptc/59.jpg", "PTC.zip/PTC/Grove of the Guardian.full.jpg"); +// singleLinks.put("ptc/6.jpg", "PTC.zip/PTC/Lu Bu, Master-at-Arms.full.jpg"); +// singleLinks.put("ptc/60.jpg", "PTC.zip/PTC/Consuming Aberration.full.jpg"); +// singleLinks.put("ptc/61.jpg", "PTC.zip/PTC/Fathom Mage.full.jpg"); +// singleLinks.put("ptc/62.jpg", "PTC.zip/PTC/Foundry Champion.full.jpg"); +// singleLinks.put("ptc/63.jpg", "PTC.zip/PTC/Rubblehulk.full.jpg"); +// singleLinks.put("ptc/64.jpg", "PTC.zip/PTC/Treasury Thrull.full.jpg"); +// singleLinks.put("ptc/65.jpg", "PTC.zip/PTC/Maze's End.full.jpg"); +// singleLinks.put("ptc/66.jpg", "PTC.zip/PTC/Plains.66.full.jpg"); +// singleLinks.put("ptc/67.jpg", "PTC.zip/PTC/Megantic Sliver.full.jpg"); +// singleLinks.put("ptc/68.jpg", "PTC.zip/PTC/Celestial Archon.full.jpg"); +// singleLinks.put("ptc/69.jpg", "PTC.zip/PTC/Shipbreaker Kraken.full.jpg"); +// singleLinks.put("ptc/7.jpg", "PTC.zip/PTC/False Prophet.full.jpg"); +// singleLinks.put("ptc/70.jpg", "PTC.zip/PTC/Abhorrent Overlord.full.jpg"); +// singleLinks.put("ptc/71.jpg", "PTC.zip/PTC/Ember Swallower.full.jpg"); +// singleLinks.put("ptc/72.jpg", "PTC.zip/PTC/Anthousa, Setessan Hero.full.jpg"); +// singleLinks.put("ptc/73.jpg", "PTC.zip/PTC/Silent Sentinel.full.jpg"); +// singleLinks.put("ptc/74.jpg", "PTC.zip/PTC/Arbiter of the Ideal.full.jpg"); +// singleLinks.put("ptc/75.jpg", "PTC.zip/PTC/Eater of Hope.full.jpg"); +// singleLinks.put("ptc/76.jpg", "PTC.zip/PTC/Forgestoker Dragon.full.jpg"); +// singleLinks.put("ptc/77.jpg", "PTC.zip/PTC/Nessian Wilds Ravager.full.jpg"); +// singleLinks.put("ptc/78.jpg", "PTC.zip/PTC/Dawnbringer Charioteers.full.jpg"); +// singleLinks.put("ptc/79.jpg", "PTC.zip/PTC/Scourge of Fleets.full.jpg"); +// singleLinks.put("ptc/8.jpg", "PTC.zip/PTC/Lu Bu, Master-at-Arms.full.jpg"); +// singleLinks.put("ptc/80.jpg", "PTC.zip/PTC/Doomwake Giant.full.jpg"); +// singleLinks.put("ptc/81.jpg", "PTC.zip/PTC/Spawn of Thraxes.full.jpg"); +// singleLinks.put("ptc/82.jpg", "PTC.zip/PTC/Heroes' Bane.full.jpg"); +// singleLinks.put("ptc/83.jpg", "PTC.zip/PTC/Resolute Archangel.full.jpg"); +// singleLinks.put("ptc/84.jpg", "PTC.zip/PTC/Mercurial Pretender.full.jpg"); +// singleLinks.put("ptc/85.jpg", "PTC.zip/PTC/Indulgent Tormentor.full.jpg"); +// singleLinks.put("ptc/86.jpg", "PTC.zip/PTC/Siege Dragon.full.jpg"); +// singleLinks.put("ptc/87.jpg", "PTC.zip/PTC/Phytotitan.full.jpg"); +// singleLinks.put("ptc/88.jpg", "PTC.zip/PTC/Abzan Ascendancy.full.jpg"); +// singleLinks.put("ptc/89.jpg", "PTC.zip/PTC/Anafenza, the Foremost.full.jpg"); +// singleLinks.put("ptc/9.jpg", "PTC.zip/PTC/Overtaker.full.jpg"); +// singleLinks.put("ptc/90.jpg", "PTC.zip/PTC/Ankle Shanker.full.jpg"); +// singleLinks.put("ptc/91.jpg", "PTC.zip/PTC/Avalanche Tusker.full.jpg"); +// singleLinks.put("ptc/92.jpg", "PTC.zip/PTC/Bloodsoaked Champion.full.jpg"); +// singleLinks.put("ptc/93.jpg", "PTC.zip/PTC/Butcher of the Horde.full.jpg"); +// singleLinks.put("ptc/94.jpg", "PTC.zip/PTC/Crackling Doom.full.jpg"); +// singleLinks.put("ptc/95.jpg", "PTC.zip/PTC/Crater's Claws.full.jpg"); +// singleLinks.put("ptc/96.jpg", "PTC.zip/PTC/Deflecting Palm.full.jpg"); +// singleLinks.put("ptc/97.jpg", "PTC.zip/PTC/Dig Through Time.full.jpg"); +// singleLinks.put("ptc/98.jpg", "PTC.zip/PTC/Dragon-Style Twins.full.jpg"); +// singleLinks.put("ptc/99.jpg", "PTC.zip/PTC/Duneblast.full.jpg"); +// singleLinks.put("sus/1.jpg", "SUS.zip/SUS/Thran Quarry.full.jpg"); +// singleLinks.put("sus/10.jpg", "SUS.zip/SUS/Slith Firewalker.full.jpg"); +// singleLinks.put("sus/11.jpg", "SUS.zip/SUS/Royal Assassin.full.jpg"); +// singleLinks.put("sus/12.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); +// singleLinks.put("sus/13.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); +// singleLinks.put("sus/14.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); +// singleLinks.put("sus/15.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); +// singleLinks.put("sus/16.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); +// singleLinks.put("sus/17.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); +// singleLinks.put("sus/18.jpg", "SUS.zip/SUS/Mad Auntie.full.jpg"); +// singleLinks.put("sus/19.jpg", "SUS.zip/SUS/Slith Firewalker.full.jpg"); +// singleLinks.put("sus/2.jpg", "SUS.zip/SUS/Serra Avatar.full.jpg"); +// singleLinks.put("sus/20.jpg", "SUS.zip/SUS/Royal Assassin.full.jpg"); +// singleLinks.put("sus/21.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); +// singleLinks.put("sus/22.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); +// singleLinks.put("sus/23.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); +// singleLinks.put("sus/24.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); +// singleLinks.put("sus/25.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); +// singleLinks.put("sus/26.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); +// singleLinks.put("sus/27.jpg", "SUS.zip/SUS/Sakura-Tribe Elder.full.jpg"); +// singleLinks.put("sus/28.jpg", "SUS.zip/SUS/Shard Phoenix.full.jpg"); +// singleLinks.put("sus/29.jpg", "SUS.zip/SUS/Soltari Priest.full.jpg"); +// singleLinks.put("sus/3.jpg", "SUS.zip/SUS/Lord of Atlantis.full.jpg"); +// singleLinks.put("sus/30.jpg", "SUS.zip/SUS/Whirling Dervish.full.jpg"); +// singleLinks.put("sus/31.jpg", "SUS.zip/SUS/Glorious Anthem.full.jpg"); +// singleLinks.put("sus/32.jpg", "SUS.zip/SUS/Elvish Champion.full.jpg"); +// singleLinks.put("sus/4.jpg", "SUS.zip/SUS/Crusade.full.jpg"); +// singleLinks.put("sus/5.jpg", "SUS.zip/SUS/Elvish Lyrist.full.jpg"); +// singleLinks.put("sus/6.jpg", "SUS.zip/SUS/City of Brass.full.jpg"); +// singleLinks.put("sus/7.jpg", "SUS.zip/SUS/Volcanic Hammer.full.jpg"); +// singleLinks.put("sus/8.jpg", "SUS.zip/SUS/Giant Growth.full.jpg"); +// singleLinks.put("sus/9.jpg", "SUS.zip/SUS/Two-Headed Dragon.full.jpg"); +// singleLinks.put("ugin/1.jpg", "UGIN.zip/UGIN/Ugin, the Spirit Dragon.full.jpg"); +// singleLinks.put("ugin/113.jpg", "UGIN.zip/UGIN/Jeering Instigator.full.jpg"); +// singleLinks.put("ugin/123.jpg", "UGIN.zip/UGIN/Arashin War Beast.full.jpg"); +// singleLinks.put("ugin/129.jpg", "UGIN.zip/UGIN/Formless Nurturing.full.jpg"); +// singleLinks.put("ugin/131.jpg", "UGIN.zip/UGIN/Dragonscale Boon.full.jpg"); +// singleLinks.put("ugin/146.jpg", "UGIN.zip/UGIN/Wildcall.full.jpg"); +// singleLinks.put("ugin/161.jpg", "UGIN.zip/UGIN/Hewed Stone Retainers.full.jpg"); +// singleLinks.put("ugin/164.jpg", "UGIN.zip/UGIN/Ugin's Construct.full.jpg"); +// singleLinks.put("ugin/19.jpg", "UGIN.zip/UGIN/Mastery of the Unseen.full.jpg"); +// singleLinks.put("ugin/216.jpg", "UGIN.zip/UGIN/Altar of the Brood.full.jpg"); +// singleLinks.put("ugin/217.jpg", "UGIN.zip/UGIN/Briber's Purse.full.jpg"); +// singleLinks.put("ugin/220.jpg", "UGIN.zip/UGIN/Ghostfire Blade.full.jpg"); +// singleLinks.put("ugin/24.jpg", "UGIN.zip/UGIN/Smite the Monstrous.full.jpg"); +// singleLinks.put("ugin/26.jpg", "UGIN.zip/UGIN/Soul Summons.full.jpg"); +// singleLinks.put("ugin/30.jpg", "UGIN.zip/UGIN/Watcher of the Roost.full.jpg"); +// singleLinks.put("ugin/36.jpg", "UGIN.zip/UGIN/Jeskai Infiltrator.full.jpg"); +// singleLinks.put("ugin/46.jpg", "UGIN.zip/UGIN/Reality Shift.full.jpg"); +// singleLinks.put("ugin/48.jpg", "UGIN.zip/UGIN/Mystic of the Hidden Way.full.jpg"); +// singleLinks.put("ugin/59.jpg", "UGIN.zip/UGIN/Write into Being.full.jpg"); +// singleLinks.put("ugin/68.jpg", "UGIN.zip/UGIN/Debilitating Injury.full.jpg"); +// singleLinks.put("ugin/73.jpg", "UGIN.zip/UGIN/Grim Haruspex.full.jpg"); +// singleLinks.put("ugin/85.jpg", "UGIN.zip/UGIN/Sultai Emissary.full.jpg"); +// singleLinks.put("ugin/88.jpg", "UGIN.zip/UGIN/Ruthless Ripper.full.jpg"); +// singleLinks.put("ugin/96.jpg", "UGIN.zip/UGIN/Ainok Tracker.full.jpg"); +// singleLinks.put("ugin/97.jpg", "UGIN.zip/UGIN/Arc Lightning.full.jpg"); +// singleLinks.put("ugin/98.jpg", "UGIN.zip/UGIN/Fierce Invocation.full.jpg"); +// singleLinks.put("wmcq/1.jpg", "WMCQ.zip/WMCQ/Vengevine.full.jpg"); +// singleLinks.put("wmcq/2.jpg", "WMCQ.zip/WMCQ/Geist of Saint Traft.full.jpg"); +// singleLinks.put("wmcq/3.jpg", "WMCQ.zip/WMCQ/Thalia, Guardian of Thraben.full.jpg"); +// singleLinks.put("wmcq/4.jpg", "WMCQ.zip/WMCQ/Liliana of the Veil.full.jpg"); +// singleLinks.put("wmcq/5.jpg", "WMCQ.zip/WMCQ/Snapcaster Mage.full.jpg"); } @Override @@ -1697,11 +1958,11 @@ public enum GrabbagImageSource implements CardImageSource { @Override public int getTotalImages() { - if (copyUrlToImage == null) { + if (singleLinks == null) { setupLinks(); } - if (copyUrlToImage != null) { - return copyImageToUrl.size(); + if (singleLinks != null) { + return singleLinks.size(); } return -1; } @@ -1711,9 +1972,11 @@ public enum GrabbagImageSource implements CardImageSource { return false; } - private String getSourceName(String httpImageUrl) { - if (httpImageUrl.startsWith("MTG")) { + private String getSourceName(CardDownloadData card, String httpImageUrl) { + if (card.getSet().equals("MTG")) { return "http://static.starcitygames.com/sales/cardscans/"; + } else if (card.getSet().equals("SWS")) { + return "http://i.imgur.com/"; } else { return "http://magiccards.info/scans/en/"; } @@ -1735,4 +1998,18 @@ public enum GrabbagImageSource implements CardImageSource { } } } + + @Override + public boolean isImageProvided(String setCode, String cardName) { + if (singleLinks == null) { + setupLinks(); + } + return singleLinks.containsKey(setCode + "/" + cardName); + } + + @Override + public boolean isSetSupportedComplete(String setCode) { + return false; + } + } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index be4345dadf..ee30aa0f71 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -294,7 +294,9 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab for (CardDownloadData data : allCardsMissingImage) { if ((data.isToken() && tokens) || (!data.isToken() && selectedSetCodes != null && selectedSetCodes.contains(data.getSet()))) { - cardsToDownload.add(data); + if (cardImageSource.isSetSupportedComplete(data.getSet()) || cardImageSource.isImageProvided(data.getSet(), data.getName())) { + cardsToDownload.add(data); + } } } int numberTokenImagesAvailable = 0; From 96034c4c2b267e8ddbcaeca5dfedab65a18d1e77 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 8 Sep 2017 15:22:09 +0200 Subject: [PATCH 5/9] Updated some logic. --- .../card/dl/sources/GrabbagImageSource.java | 23 ++- .../dl/sources/MythicspoilerComSource.java | 173 +++++++++++++++++- 2 files changed, 189 insertions(+), 7 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java index 501b1c61e9..ef5fa334df 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GrabbagImageSource.java @@ -33,6 +33,7 @@ import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.logging.Level; import org.apache.log4j.Logger; import org.mage.plugins.card.images.CardDownloadData; @@ -415,6 +416,21 @@ public enum GrabbagImageSource implements CardImageSource { singleLinks.put("SWS/Yoda, Jedi Master", "6arN1Hl.png"); singleLinks.put("SWS/Y-Wing", "aQQ5zwA.jpg"); singleLinks.put("SWS/Zam Wesell", "ToG0C1r.jpg"); + // Emblems + singleLinks.put("SWS/Obi-Wan Kenobi", "Qyc10aT.png"); + singleLinks.put("SWS/Aurra Sing", "BLWbVJC.png"); + singleLinks.put("SWS/Yoda", "zH0sYxg.png"); + // Tokens + singleLinks.put("SWS/Ewok", "N2MvJyr.png"); + singleLinks.put("SWS/B-Wing", "oH62AUD.png"); + singleLinks.put("SWS/Hunter", "oJiawFA.png"); + singleLinks.put("SWS/TIE Fighter", "CLOuJ05.png"); + singleLinks.put("SWS/Trooper", "2XKqdX5.png"); + singleLinks.put("SWS/AT-AT", "Tv5b7h1.png"); + singleLinks.put("SWS/Rebel", "pVoShnF.png"); + singleLinks.put("SWS/Royal Guard", "9tqE8vL.png"); + singleLinks.put("SWS/Tusken Raider", "gPMiSmP.png"); + singleLinks.put("SWS/Droid", "4PRrWFF.png"); // singleLinks.put("MTG/FRF/en/promo/prerelease/AleshaWhoSmilesAtDeath.jpg", "PTC.zip/PTC/Alesha, Who Smiles at Death.full.jpg"); // singleLinks.put("MTG/FRF/en/promo/prerelease/Arcbond.jpg", "PTC.zip/PTC/Arcbond.full.jpg"); @@ -1953,6 +1969,11 @@ public enum GrabbagImageSource implements CardImageSource { @Override public String generateTokenUrl(CardDownloadData card) throws IOException { + try { + return generateURL(card); + } catch (Exception ex) { + java.util.logging.Logger.getLogger(GrabbagImageSource.class.getName()).log(Level.SEVERE, null, ex); + } return null; } @@ -1969,7 +1990,7 @@ public enum GrabbagImageSource implements CardImageSource { @Override public boolean isTokenSource() { - return false; + return true; } private String getSourceName(CardDownloadData card, String httpImageUrl) { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java index cf81ee5957..93bd2a6d11 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MythicspoilerComSource.java @@ -72,24 +72,185 @@ public enum MythicspoilerComSource implements CardImageSource { MythicspoilerComSource() { supportedSets = new LinkedHashSet<>(); - supportedSets.add("V16"); +// supportedSets.add("LEA"); + supportedSets.add("LEB"); +// supportedSets.add("2ED"); + supportedSets.add("ARN"); + supportedSets.add("ATQ"); + supportedSets.add("3ED"); + supportedSets.add("LEG"); + supportedSets.add("DRK"); + supportedSets.add("FEM"); +// supportedSets.add("4ED"); + supportedSets.add("ICE"); + supportedSets.add("CHR"); + supportedSets.add("HML"); + supportedSets.add("ALL"); + supportedSets.add("MIR"); + supportedSets.add("VIS"); +// supportedSets.add("5ED"); +// supportedSets.add("POR"); + supportedSets.add("WTH"); + supportedSets.add("TMP"); + supportedSets.add("STH"); + supportedSets.add("EXO"); +// supportedSets.add("P02"); +// supportedSets.add("UGL"); + supportedSets.add("USG"); +// supportedSets.add("DD3DVD"); +// supportedSets.add("DD3EVG"); +// supportedSets.add("DD3GVL"); +// supportedSets.add("DD3JVC"); + +// supportedSets.add("ULG"); +// supportedSets.add("6ED"); + supportedSets.add("UDS"); + supportedSets.add("PTK"); +// supportedSets.add("S99"); + supportedSets.add("MMQ"); + // supportedSets.add("BRB");Battle Royale Box Set + supportedSets.add("NEM"); +// supportedSets.add("S00"); + supportedSets.add("PCY"); + supportedSets.add("INV"); + // supportedSets.add("BTD"); // Beatdown Boxset + supportedSets.add("PLS"); + supportedSets.add("7ED"); + supportedSets.add("APC"); + supportedSets.add("ODY"); + // supportedSets.add("DKM"); // Deckmasters 2001 + supportedSets.add("TOR"); + supportedSets.add("JUD"); + supportedSets.add("ONS"); + supportedSets.add("LGN"); + supportedSets.add("SCG"); + supportedSets.add("8ED"); + supportedSets.add("MRD"); + supportedSets.add("DST"); + supportedSets.add("5DN"); + supportedSets.add("CHK"); + supportedSets.add("UNH"); + supportedSets.add("BOK"); + supportedSets.add("SOK"); + supportedSets.add("9ED"); + supportedSets.add("RAV"); + supportedSets.add("GPT"); + supportedSets.add("DIS"); + supportedSets.add("CSP"); + supportedSets.add("TSP"); + supportedSets.add("TSB"); + supportedSets.add("PLC"); + supportedSets.add("FUT"); + supportedSets.add("10E"); + supportedSets.add("MED"); + supportedSets.add("LRW"); + supportedSets.add("EVG"); + supportedSets.add("MOR"); + supportedSets.add("SHM"); + supportedSets.add("EVE"); + supportedSets.add("DRB"); +// supportedSets.add("ME2"); + supportedSets.add("ALA"); +// supportedSets.add("DD2"); + supportedSets.add("CON"); +// supportedSets.add("DDC"); + supportedSets.add("ARB"); + supportedSets.add("M10"); + // supportedSets.add("TD0"); // Magic Online Deck Series +// supportedSets.add("V09"); + supportedSets.add("HOP"); +// supportedSets.add("ME3"); + supportedSets.add("ZEN"); +// supportedSets.add("DDD"); + supportedSets.add("H09"); + supportedSets.add("WWK"); +// supportedSets.add("DDE"); + supportedSets.add("ROE"); + supportedSets.add("DPA"); + supportedSets.add("ARC"); + supportedSets.add("M11"); +// supportedSets.add("V10"); +// supportedSets.add("DDF"); + supportedSets.add("SOM"); +// supportedSets.add("TD0"); // Commander Theme Decks +// supportedSets.add("PD2"); +// supportedSets.add("ME4"); + supportedSets.add("MBS"); +// supportedSets.add("DDG"); + supportedSets.add("NPH"); + supportedSets.add("CMD"); + supportedSets.add("M12"); + supportedSets.add("V11"); +// supportedSets.add("DDH"); + supportedSets.add("ISD"); + supportedSets.add("PD3"); + supportedSets.add("DKA"); +// supportedSets.add("DDI"); + supportedSets.add("AVR"); +// supportedSets.add("PC2"); + supportedSets.add("M13"); +// supportedSets.add("V12"); +// supportedSets.add("DDJ"); + supportedSets.add("RTR"); +// supportedSets.add("CM1"); + // supportedSets.add("TD2"); // Duel Decks: Mirrodin Pure vs. New Phyrexia + supportedSets.add("GTC"); +// supportedSets.add("DDK"); + supportedSets.add("DGM"); +// supportedSets.add("MMA"); + supportedSets.add("M14"); + supportedSets.add("V13"); +// supportedSets.add("DDL"); + supportedSets.add("THS"); + supportedSets.add("C13"); + supportedSets.add("BNG"); +// supportedSets.add("DDM"); + supportedSets.add("JOU"); + // supportedSets.add("MD1"); // Modern Event Deck +// supportedSets.add("CNS"); +// supportedSets.add("VMA"); + supportedSets.add("M15"); + supportedSets.add("V14"); + supportedSets.add("DDN"); + supportedSets.add("KTK"); + supportedSets.add("C14"); + // supportedSets.add("DD3"); // Duel Decks Anthology + supportedSets.add("FRF"); +// supportedSets.add("DDO"); +// supportedSets.add("DTK"); +// supportedSets.add("TPR"); + supportedSets.add("MM2"); + supportedSets.add("ORI"); +// supportedSets.add("V15"); +// supportedSets.add("DDP"); + supportedSets.add("BFZ"); +// supportedSets.add("EXP"); + supportedSets.add("C15"); + // supportedSets.add("PZ1"); // Legendary Cube + supportedSets.add("OGW"); +// supportedSets.add("DDQ"); +// supportedSets.add("W16"); + supportedSets.add("SOI"); + supportedSets.add("EMA"); + supportedSets.add("EMN"); +// supportedSets.add("V16"); supportedSets.add("CN2"); - supportedSets.add("DDR"); +// supportedSets.add("DDR"); supportedSets.add("KLD"); - supportedSets.add("MPS"); +// supportedSets.add("MPS"); // supportedSets.add("PZ2"); supportedSets.add("C16"); - supportedSets.add("PCA"); +// supportedSets.add("PCA"); supportedSets.add("AER"); supportedSets.add("MM3"); - supportedSets.add("DDS"); - supportedSets.add("W17"); +// supportedSets.add("W17"); supportedSets.add("AKH"); supportedSets.add("MPS"); supportedSets.add("CMA"); supportedSets.add("E01"); supportedSets.add("HOU"); supportedSets.add("C17"); + supportedSets.add("XLN"); sets = new LinkedHashMap<>(); setsAliases = new HashMap<>(); From a2806055917e82c6c42c22e3a8f665ba8e9aa1fd Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 10 Sep 2017 10:19:14 +0200 Subject: [PATCH 6/9] Some updates. --- .../card/dl/sources/TokensMtgImageSource.java | 101 +++++++++++------- .../plugins/card/images/DownloadPictures.java | 51 ++++----- .../main/resources/tokens-mtg-onl-list.csv | 23 +++- .../game/permanent/token/HellionToken.java | 3 +- 4 files changed, 112 insertions(+), 66 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java index 7f932f3536..95f4294a05 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java @@ -36,6 +36,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; import org.apache.log4j.Logger; import org.mage.plugins.card.images.CardDownloadData; @@ -48,7 +49,8 @@ public enum TokensMtgImageSource implements CardImageSource { instance; private static final Logger logger = Logger.getLogger(TokensMtgImageSource.class); - private List tokensData; + // [[EXP/Name, TokenData> + private HashMap> tokensData; private final Object tokensDataSync = new Object(); @@ -98,7 +100,12 @@ public enum TokensMtgImageSource implements CardImageSource { "Sorin", "Tamiyo", "Teferi", - "Venser",}; + "Venser", + // Custom Emblems + "Yoda", + "Obi-Wan Kenobi", + "Aurra Sing" + }; private static final Map SET_NAMES_REPLACEMENT = new HashMap() { { @@ -132,38 +139,31 @@ public enum TokensMtgImageSource implements CardImageSource { // e.g. http://tokens.mtg.onl/tokens/ORI_010-Thopter.jpg -- token number 010 // We don't know these numbers, but we can take them from a file // with tokens information that can be downloaded from the site. - List newTokensData = getTokensData(); - - if (newTokensData.isEmpty()) { + if (tokensData.isEmpty()) { logger.info("Source " + getSourceName() + " provides no token data."); return null; } - List matchedTokens = new ArrayList<>(); - for (TokenData token : newTokensData) { - if (name.equalsIgnoreCase(token.getName()) && set.equalsIgnoreCase(token.getExpansionSetCode())) { - matchedTokens.add(token); - } - } - - if (matchedTokens.isEmpty()) { + String key = set + "/" + name; + List list = tokensData.get(key); + if (list == null) { logger.info("Could not find data for token " + name + ", set " + set + "."); return null; } TokenData tokenData; if (type == 0) { - if (matchedTokens.size() > 1) { + if (list.size() > 1) { logger.info("Multiple images were found for token " + name + ", set " + set + '.'); } logger.info("Token found: " + name + ", set " + set + '.'); - tokenData = matchedTokens.get(0); + tokenData = list.get(0); } else { - if (type > matchedTokens.size()) { + if (type > list.size()) { logger.warn("Not enough images for token with type " + type + ", name " + name + ", set " + set + '.'); return null; } - tokenData = matchedTokens.get(card.getType() - 1); + tokenData = list.get(card.getType() - 1); } String url = "http://tokens.mtg.onl/tokens/" + tokenData.getExpansionSetCode().trim() + '_' @@ -172,15 +172,24 @@ public enum TokensMtgImageSource implements CardImageSource { return url; } - private List getTokensData() throws IOException { + private HashMap> getTokensData() throws IOException { synchronized (tokensDataSync) { if (tokensData == null) { - tokensData = new ArrayList<>(); + tokensData = new HashMap<>(); // get tokens data from resource file try (InputStream inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv")) { List fileTokensData = parseTokensData(inputStream); - tokensData.addAll(fileTokensData); + for (TokenData tokenData : fileTokensData) { + String key = tokenData.getExpansionSetCode() + "/" + tokenData.getName(); + ArrayList list = tokensData.get(key); + if (list == null) { + list = new ArrayList<>(); + tokensData.put(key, list); + logger.info("Added key: " + key); + } + list.add(tokenData); + } } catch (Exception exception) { logger.warn("Failed to get tokens description from resource file tokens-mtg-onl-list.csv", exception); } @@ -190,23 +199,26 @@ public enum TokensMtgImageSource implements CardImageSource { URL url = new URL("http://tokens.mtg.onl/data/SetsWithTokens.csv"); try (InputStream inputStream = url.openStream()) { List siteTokensData = parseTokensData(inputStream); - List newTokensData = new ArrayList<>(); for (TokenData siteData : siteTokensData) { - boolean isNew = true; - for (TokenData fileData : tokensData) { - if (siteData.getName().equalsIgnoreCase(fileData.getName()) - && siteData.getNumber().equalsIgnoreCase(fileData.getNumber()) - && siteData.getExpansionSetCode().equalsIgnoreCase(fileData.getExpansionSetCode())) { - isNew = false; - break; + String key = siteData.getExpansionSetCode() + "/" + siteData.getName(); + ArrayList list = tokensData.get(key); + if (list == null) { + list = new ArrayList<>(); + tokensData.put(key, list); + list.add(siteData); + } else { + boolean newToken = true; + for (TokenData tokenData : list) { + if (siteData.getNumber().equals(tokenData.number)) { + newToken = false; + break; + } + } + if (newToken) { + list.add(siteData); } } - if (isNew) { - newTokensData.add(siteData); - } } - - tokensData.addAll(newTokensData); } catch (Exception exception) { logger.warn("Failed to get tokens description from tokens.mtg.onl", exception); } @@ -290,14 +302,12 @@ public enum TokensMtgImageSource implements CardImageSource { @Override public int getTokenImages() { - int number = 0; try { - List newTokensData = getTokensData(); - number = newTokensData.size(); + getTokensData(); } catch (IOException ex) { logger.error(getSourceName() + ": Loading available data failed. " + ex.getMessage()); } - return number; + return tokensData.size(); } @Override @@ -308,4 +318,21 @@ public enum TokensMtgImageSource implements CardImageSource { @Override public void doPause(String httpImageUrl) { } + + @Override + public boolean isImageProvided(String setCode, String cardName) { + try { + getTokensData(); + } catch (IOException ex) { + java.util.logging.Logger.getLogger(TokensMtgImageSource.class.getName()).log(Level.SEVERE, null, ex); + } + String key = setCode + "/" + cardName; + return (tokensData.containsKey(key)); + } + + @Override + public boolean isSetSupportedComplete(String setCode) { + return false; + } + } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index ee30aa0f71..2e81ebd36c 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -46,9 +46,9 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab private static final Logger logger = Logger.getLogger(DownloadPictures.class); - public static final String ALL_CARDS = "- All cards from that source"; - public static final String ALL_STANDARD_CARDS = "- All cards from standard from that source"; - public static final String ALL_TOKENS = "- All token images from that source"; + public static final String ALL_IMAGES = "- All images from that source"; + public static final String ALL_STANDARD_IMAGES = "- All images from standard from that source"; + public static final String ALL_TOKENS = "- Only all token images from that source"; private final JProgressBar bar; private final JOptionPane dlg; @@ -204,7 +204,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab bar.setStringPainted(true); Dimension d = bar.getPreferredSize(); - d.width = 300; + d.width = 400; bar.setPreferredSize(d); // JOptionPane @@ -232,8 +232,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab ArrayList supportedSets = cardImageSource.getSupportedSets(); List setNames = new ArrayList<>(); if (supportedSets != null) { - setNames.add(ALL_CARDS); - setNames.add(ALL_STANDARD_CARDS); + setNames.add(ALL_IMAGES); + setNames.add(ALL_STANDARD_IMAGES); } if (cardImageSource.isTokenSource()) { setNames.add(ALL_TOKENS); @@ -258,16 +258,15 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab private void updateCardsToDownload(String itemText) { selectedSetCodes.clear(); - boolean tokens = false; switch (itemText) { - case ALL_CARDS: + case ALL_IMAGES: if (cardImageSource.getSupportedSets() == null) { selectedSetCodes = cardImageSource.getSupportedSets(); } else { selectedSetCodes.addAll(cardImageSource.getSupportedSets()); } break; - case ALL_STANDARD_CARDS: + case ALL_STANDARD_IMAGES: List standardSets = ConstructedFormats.getSetsByFormat(ConstructedFormats.STANDARD); for (String setCode : cardImageSource.getSupportedSets()) { if (standardSets.contains(setCode)) { @@ -277,9 +276,6 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } } break; - case ALL_TOKENS: - tokens = true; - break; default: int nonSetEntries = 0; if (cardImageSource.getSupportedSets() != null) { @@ -291,19 +287,24 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab selectedSetCodes.add(cardImageSource.getSupportedSets().get(jComboBoxSet.getSelectedIndex() - nonSetEntries)); } cardsToDownload.clear(); + int numberTokenImagesAvailable = 0; + int numberCardImagesAvailable = 0; for (CardDownloadData data : allCardsMissingImage) { - if ((data.isToken() && tokens) - || (!data.isToken() && selectedSetCodes != null && selectedSetCodes.contains(data.getSet()))) { - if (cardImageSource.isSetSupportedComplete(data.getSet()) || cardImageSource.isImageProvided(data.getSet(), data.getName())) { + if (data.isToken() && cardImageSource.isTokenSource()) { + if (cardImageSource.isImageProvided(data.getSet(), data.getName())) { + numberTokenImagesAvailable++; cardsToDownload.add(data); } + } else { + if (selectedSetCodes != null && selectedSetCodes.contains(data.getSet())) { + if (cardImageSource.isSetSupportedComplete(data.getSet()) || cardImageSource.isImageProvided(data.getSet(), data.getName())) { + numberCardImagesAvailable++; + cardsToDownload.add(data); + } + } } } - int numberTokenImagesAvailable = 0; - if (tokens) { - cardImageSource.getTokenImages(); - } - updateProgressText(cardsToDownload.size() + numberTokenImagesAvailable); + updateProgressText(numberCardImagesAvailable, numberTokenImagesAvailable); } private void comboBoxSetItemSelected(ItemEvent event) { @@ -311,7 +312,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab updateCardsToDownload(event.getItem().toString()); } - private void updateProgressText(int cardCount) { + private void updateProgressText(int cardCount, int tokenCount) { missingTokens = 0; for (CardDownloadData card : allCardsMissingImage) { if (card.isToken()) { @@ -320,10 +321,10 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } missingCards = allCardsMissingImage.size() - missingTokens; jLabelAllMissing.setText("Missing: " + missingCards + " card images / " + missingTokens + " token images"); - - float mb = (cardCount * cardImageSource.getAverageSize()) / 1024; - bar.setString(String.format(cardIndex == cardCount ? "%d of %d image downloads finished! Please close!" - : "%d of %d image downloads finished! Please wait! [%.1f Mb]", 0, cardCount, mb)); + int imageSum = cardCount + tokenCount; + float mb = (imageSum * cardImageSource.getAverageSize()) / 1024; + bar.setString(String.format(cardIndex == imageSum ? "%d of %d (%d cards/%d tokens) image downloads finished! Please close!" + : "%d of %d (%d cards/%d tokens) image downloads finished! Please wait! [%.1f Mb]", 0, imageSum, cardCount, tokenCount, mb)); } private static String createDownloadName(CardInfo card) { diff --git a/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv b/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv index 1d2ea50d5c..4343e5257e 100644 --- a/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv +++ b/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv @@ -222,7 +222,7 @@ Eldrazi Spawn, 1a, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice Eldrazi Spawn, 1b, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 1c, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1} to your mana pool. Elemental, 2, R, *|*, -, Creature - Elemental, Jung Park, - -Hellion, 3, R, 4|4, -, Creature - Hellion, Anthony Francisco, - +Hellion, 1, R, 4|4, -, Creature - Hellion, Anthony Francisco, - Ooze, 4, G, *|*, -, Creature - Ooze, Daniel Ljunggren, - Tuktuk The Returned, 5, -, 5|5, -, Legendary Artifact Creature - Goblin Golem, Franz Vohwinkel, - @@ -344,7 +344,7 @@ Soldier, 3, W, 1|1, -, Creature - Soldier, Greg Staples, - Drake, 4, U, 2|2, -, Creature - Drake, Svetlin Velinov, Flying Zombie, 5, B, 2|2, -, Creature - Zombie, Lucas Graciano, - Goblin, 6, R, 1|1, -, Creature - Goblin, Karl Kopinski, - -Hellion, 7, R, 4|4, -, Creature - Hellion, Anthony Francisco, - +Hellion, 1, R, 4|4, -, Creature - Hellion, Anthony Francisco, - Beast, 8, G, 3|3, -, Creature - Beast, John Donahue, - Saproling, 9, G, 1|1, -, Creature - Saproling, Brad Rigney, - Wurm, 10, G, 6|6, -, Creature - Wurm, Anthony Francisco, - @@ -664,7 +664,7 @@ DDP - Duel Decks: Zendikar vs. Eldrazi (2015-08-28) Eldrazi Spawn, 076, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 077, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 078, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1} to your mana pool. -Hellion, 079, R, 4|4, -, Creature - Hellion, Anthony Francisco, - +Hellion, 1, R, 4|4, -, Creature - Hellion, Anthony Francisco, - Plant, 080, G, -, -, Creature - Plant, Daren Bader, - BFZ - Battle for Zendikar (2015-10-09) @@ -745,3 +745,20 @@ Clue, 015, -, -, -, Artifact - Clue, James Paick, {2}‚ Sacrifice this Artifact Clue, 016, -, -, -, Artifact - Clue, Franz Vohwinkel, {2}‚ Sacrifice this Artifact: Draw a card. Jace Emblem, 017, -, -, -, Emblem - Jace, Tyler Jacobson, Whenever an opponent casts his or her first spell each turn� counter that spell. Arlinn Emblem, 018, -, -, -, Emblem - Arlinn, Winona Nelson, Creatures you control have haste and '{T}: This creature deals damage equal to its power to target creature or player.' + + +SWS - Star Wars Custom set + +Rebel, 001, W, 1|1, -, Creature - Rebel, Alex Konstad, - +Trooper, 002, W, 1|1, -, Creature - Trooper, Darren Tan, - +Tusken Raider, 003, W, 1|1, -, Creature - Tusken Raider, William O'Connor, - +Ewok, 004, G, 1|1, -, Creature - Ewok, Chris NG, - +Hunter, 005, R, 4|4, -, Creature - Hunter, Steve Argyle, - +Royal Guard, 006, R, 2|2, -, Creature - Soldier, Aldo Katayanagi, First Strike +AT-AT, 007, -, 5|5, -, Artifact Creature - AT-AT, Prokhoda, When this creature dies� create two 1/1 white Trooper creature tokens. +B-Wing, 008, -, 1|1, -, Artifact Creature - Rebel Starship, Anthony Devine, Spaceflight +Droid, 009, -, 1|1, -, Artifact Creature - Droid, PeetuGee, - +TIE Fighter, 010, -, 1|1, -, Artifact Creature - Starship, Darren Tan, Spaceflight +Yoda Emblem, 011, -, -, -, Emblem - Yoda, Jerry Vanderstelt, Hexproof� you and your creatures have. +Obi-Wan Kenobi Emblem, 012, -, -, -, Emblem - Obi-Wan Kenobi, Jerry Vanderstelt, Creatures you control get +1/+1 and have vigilance� first strike� and lifelink. +Aurra Sing Emblem, 013, -, -, -, Emblem - Aurra Sing, Willman1701, Whenever a nontoken creature you control leaves the battlefield� discard a card. diff --git a/Mage/src/main/java/mage/game/permanent/token/HellionToken.java b/Mage/src/main/java/mage/game/permanent/token/HellionToken.java index a4672fb64e..31eed72112 100644 --- a/Mage/src/main/java/mage/game/permanent/token/HellionToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/HellionToken.java @@ -29,6 +29,7 @@ package mage.game.permanent.token; import mage.MageInt; import mage.constants.CardType; +import mage.constants.SubType; /** * @@ -40,7 +41,7 @@ public class HellionToken extends Token { super("Hellion", "4/4 red Hellion creature token"); cardType.add(CardType.CREATURE); color.setRed(true); - subtype.add("Hellion"); + subtype.add(SubType.HELLION); power = new MageInt(4); toughness = new MageInt(4); } From d95a3e470ce3b4d72ae58326fd5225d2029c6e51 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Tue, 12 Sep 2017 17:25:18 +0200 Subject: [PATCH 7/9] Updated some logic. --- .../card/dl/sources/TokensMtgImageSource.java | 19 ++- .../plugins/card/images/DownloadPictures.java | 123 ++++++++++++++---- 2 files changed, 117 insertions(+), 25 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java index 95f4294a05..f04dad377e 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java @@ -34,11 +34,14 @@ import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import org.apache.log4j.Logger; import org.mage.plugins.card.images.CardDownloadData; +import org.mage.plugins.card.images.DownloadPictures; /** * @@ -51,6 +54,7 @@ public enum TokensMtgImageSource implements CardImageSource { // [[EXP/Name, TokenData> private HashMap> tokensData; + private static final Set supportedSets = new LinkedHashSet(); private final Object tokensDataSync = new Object(); @@ -175,6 +179,7 @@ public enum TokensMtgImageSource implements CardImageSource { private HashMap> getTokensData() throws IOException { synchronized (tokensDataSync) { if (tokensData == null) { + DownloadPictures.getInstance().updateAndViewMessage("Creating token data..."); tokensData = new HashMap<>(); // get tokens data from resource file @@ -186,6 +191,7 @@ public enum TokensMtgImageSource implements CardImageSource { if (list == null) { list = new ArrayList<>(); tokensData.put(key, list); + supportedSets.add(tokenData.getExpansionSetCode()); logger.info("Added key: " + key); } list.add(tokenData); @@ -219,8 +225,10 @@ public enum TokensMtgImageSource implements CardImageSource { } } } - } catch (Exception exception) { - logger.warn("Failed to get tokens description from tokens.mtg.onl", exception); + DownloadPictures.getInstance().updateAndViewMessage(""); + } catch (Exception ex) { + logger.warn("Failed to get tokens description from tokens.mtg.onl", ex); + DownloadPictures.getInstance().updateAndViewMessage(ex.getMessage()); } } } @@ -319,6 +327,13 @@ public enum TokensMtgImageSource implements CardImageSource { public void doPause(String httpImageUrl) { } + @Override + public ArrayList getSupportedSets() { + ArrayList supportedSetsCopy = new ArrayList<>(); + supportedSetsCopy.addAll(supportedSets); + return supportedSetsCopy; + } + @Override public boolean isImageProvided(String setCode, String cardName) { try { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index 2e81ebd36c..92e0d20c1a 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -26,6 +26,7 @@ import mage.cards.Sets; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; +import mage.client.MageFrame; import mage.client.constants.Constants; import mage.client.dialog.PreferencesDialog; import mage.client.util.sets.ConstructedFormats; @@ -44,12 +45,15 @@ import org.mage.plugins.card.utils.CardImageUtils; public class DownloadPictures extends DefaultBoundedRangeModel implements Runnable { + private static DownloadPictures instance; + private static final Logger logger = Logger.getLogger(DownloadPictures.class); public static final String ALL_IMAGES = "- All images from that source"; public static final String ALL_STANDARD_IMAGES = "- All images from standard from that source"; public static final String ALL_TOKENS = "- Only all token images from that source"; + private JDialog dialog; private final JProgressBar bar; private final JOptionPane dlg; private boolean cancel; @@ -57,7 +61,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab private final JButton startDownloadButton; private int cardIndex; private List allCardsMissingImage; - List cardsToDownload = new ArrayList<>(); + private List cardsToDownload; private int missingCards = 0; private int missingTokens = 0; @@ -65,6 +69,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab List selectedSetCodes = new ArrayList<>(); private final JComboBox jComboBoxServer; + private final JLabel jLabelMessage; private final JLabel jLabelAllMissing; private final JLabel jLabelServer; @@ -107,6 +112,10 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } + public static DownloadPictures getInstance() { + return instance; + } + public static void main(String[] args) { startDownload(); } @@ -118,18 +127,15 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab * JOptionPane.showMessageDialog(null, * "All card pictures have been downloaded."); return; } */ - DownloadPictures download = new DownloadPictures(); - JDialog dlg = download.getDlg(null); - dlg.setVisible(true); - dlg.dispose(); - download.cancel = true; + instance = new DownloadPictures(MageFrame.getInstance()); + Thread t1 = new Thread(new LoadMissingCardData(instance)); + t1.start(); + instance.getDlg().setVisible(true); + instance.getDlg().dispose(); + instance.cancel = true; } - public JDialog getDlg(JFrame frame) { - String title = "Downloading images"; - - final JDialog dialog = this.dlg.createDialog(frame, title); - closeButton.addActionListener(e -> dialog.setVisible(false)); + public JDialog getDlg() { return dialog; } @@ -137,12 +143,23 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab this.cancel = cancel; } - public DownloadPictures() { + static int WIDTH = 400; + + public DownloadPictures(JFrame frame) { + + cardsToDownload = new ArrayList<>(); + JPanel p0 = new JPanel(); p0.setLayout(new BoxLayout(p0, BoxLayout.Y_AXIS)); p0.add(Box.createVerticalStrut(5)); + jLabelMessage = new JLabel(); + jLabelMessage.setAlignmentX(Component.CENTER_ALIGNMENT); + jLabelMessage.setText("Initializing image download..."); + p0.add(jLabelMessage); + p0.add(Box.createVerticalStrut(5)); + jLabelAllMissing = new JLabel(); jLabelAllMissing.setAlignmentX(Component.LEFT_ALIGNMENT); @@ -153,6 +170,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab jLabelServer = new JLabel(); jLabelServer.setText("Please select image source:"); jLabelServer.setAlignmentX(Component.LEFT_ALIGNMENT); + jLabelServer.setVisible(false); p0.add(jLabelServer); p0.add(Box.createVerticalStrut(5)); @@ -160,12 +178,18 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab jComboBoxServer = new JComboBox(); jComboBoxServer.setModel(new DefaultComboBoxModel(DownloadSources.values())); jComboBoxServer.setAlignmentX(Component.LEFT_ALIGNMENT); + jComboBoxServer.setAlignmentY(Component.LEFT_ALIGNMENT); jComboBoxServer.addItemListener((ItemEvent event) -> { if (event.getStateChange() == ItemEvent.SELECTED) { comboBoxServerItemSelected(event); } }); + Dimension d = jComboBoxServer.getPreferredSize(); + d.width = WIDTH; + jComboBoxServer.setPreferredSize(d); p0.add(jComboBoxServer); + jComboBoxServer.setVisible(false); + // set the first source as default cardImageSource = WizardCardsImageSource.instance; @@ -175,10 +199,11 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab jLabelSet = new JLabel(); jLabelSet.setText("Please select sets to download the images for:"); jLabelSet.setAlignmentX(Component.LEFT_ALIGNMENT); + jLabelSet.setVisible(false); p0.add(jLabelSet); jComboBoxSet = new JComboBox(); - jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); +// jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); jComboBoxSet.setAlignmentX(Component.LEFT_ALIGNMENT); jComboBoxSet.addItemListener((ItemEvent event) -> { if (event.getStateChange() == ItemEvent.SELECTED) { @@ -187,6 +212,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab }); p0.add(jComboBoxSet); + jComboBoxSet.setVisible(false); p0.add(Box.createVerticalStrut(5)); @@ -203,28 +229,58 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab p0.add(bar); bar.setStringPainted(true); - Dimension d = bar.getPreferredSize(); - d.width = 400; + d = bar.getPreferredSize(); + d.width = WIDTH; bar.setPreferredSize(d); + bar.setVisible(false); // JOptionPane Object[] options = {startDownloadButton, closeButton = new JButton("Cancel")}; - dlg = new JOptionPane(p0, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[1]); + startDownloadButton.setVisible(false); + closeButton.addActionListener(e -> dialog.setVisible(false)); + closeButton.setVisible(false); - setAllMissingCards(); + dlg = new JOptionPane(p0, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[1]); + dialog = this.dlg.createDialog(frame, "Downloading images"); } public void setAllMissingCards() { + updateAndViewMessage("Get all available cards from the repository..."); List cards = CardRepository.instance.findCards(new CardCriteria()); + updateAndViewMessage("Check which images are missing ..."); this.allCardsMissingImage = getNeededCards(cards); + updateAndViewMessage("Check which images the current source is providing ..."); + jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); + updateCardsToDownload(jComboBoxSet.getSelectedItem().toString()); + + jComboBoxServer.setVisible(true); + jLabelServer.setVisible(true); + jComboBoxSet.setVisible(true); + jLabelSet.setVisible(true); + bar.setVisible(true); + startDownloadButton.setVisible(true); + closeButton.setVisible(true); + + updateAndViewMessage(""); } private void comboBoxServerItemSelected(ItemEvent evt) { - cardImageSource = ((DownloadSources) evt.getItem()).getSource(); - // update the available sets / token comboBox - jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); - updateCardsToDownload(jComboBoxSet.getSelectedItem().toString()); + if (jComboBoxServer.isEnabled()) { + cardImageSource = ((DownloadSources) evt.getItem()).getSource(); + // update the available sets / token comboBox + jComboBoxSet.setModel(new DefaultComboBoxModel<>(getSetsForCurrentImageSource())); + updateCardsToDownload(jComboBoxSet.getSelectedItem().toString()); + } + } + + public void updateAndViewMessage(String text) { + jLabelMessage.setText(text); + if (dialog != null) { + dialog.pack(); + dialog.validate(); + dialog.repaint(); + } } private Object[] getSetsForCurrentImageSource() { @@ -290,8 +346,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab int numberTokenImagesAvailable = 0; int numberCardImagesAvailable = 0; for (CardDownloadData data : allCardsMissingImage) { - if (data.isToken() && cardImageSource.isTokenSource()) { - if (cardImageSource.isImageProvided(data.getSet(), data.getName())) { + if (data.isToken()) { + if (cardImageSource.isTokenSource() && cardImageSource.isImageProvided(data.getSet(), data.getName())) { numberTokenImagesAvailable++; cardsToDownload.add(data); } @@ -809,4 +865,25 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } private static final long serialVersionUID = 1L; + +} + +class LoadMissingCardData implements Runnable { + + private static DownloadPictures downloadPictures; + + public LoadMissingCardData(DownloadPictures downloadPictures) { + LoadMissingCardData.downloadPictures = downloadPictures; + } + + @Override + public void run() { + downloadPictures.setAllMissingCards(); + } + + public static void main() { + + (new Thread(new LoadMissingCardData(downloadPictures))).start(); + } + } From 3fc3d96fe0ddeeafb279a2d37724a9c4b91ddf07 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 15 Sep 2017 23:18:40 +0200 Subject: [PATCH 8/9] Some updates to image download. --- .../card/dl/sources/MtgOnlTokensImageSource.java | 6 ++++++ .../card/dl/sources/TokensMtgImageSource.java | 14 ++++++++++++++ .../mage/plugins/card/images/DownloadPictures.java | 13 ++++++++----- .../target/maven-archiver/pom.properties | 2 +- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java index 41207d6b9c..618b4cf464 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MtgOnlTokensImageSource.java @@ -376,4 +376,10 @@ public enum MtgOnlTokensImageSource implements CardImageSource { @Override public void doPause(String httpImageUrl) { } + + @Override + public boolean isImageProvided(String setCode, String cardName) { + return true; + } + } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java index 95f4294a05..c009da8916 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java @@ -34,8 +34,10 @@ import java.io.InputStreamReader; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import org.apache.log4j.Logger; import org.mage.plugins.card.images.CardDownloadData; @@ -53,6 +55,11 @@ public enum TokensMtgImageSource implements CardImageSource { private HashMap> tokensData; private final Object tokensDataSync = new Object(); + private final Set supportedSets; + + private TokensMtgImageSource() { + this.supportedSets = new LinkedHashSet<>(); + } @Override public String getSourceName() { @@ -201,6 +208,7 @@ public enum TokensMtgImageSource implements CardImageSource { List siteTokensData = parseTokensData(inputStream); for (TokenData siteData : siteTokensData) { String key = siteData.getExpansionSetCode() + "/" + siteData.getName(); + supportedSets.add(siteData.getExpansionSetCode()); ArrayList list = tokensData.get(key); if (list == null) { list = new ArrayList<>(); @@ -335,4 +343,10 @@ public enum TokensMtgImageSource implements CardImageSource { return false; } + @Override + public ArrayList getSupportedSets() { + ArrayList supportedSetsCopy = new ArrayList<>(); + supportedSetsCopy.addAll(supportedSets); + return supportedSetsCopy; + } } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index 2e81ebd36c..1396082fc7 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -81,12 +81,12 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab WIZARDS("wizards.com", WizardCardsImageSource.instance), MYTHICSPOILER("mythicspoiler.com", MythicspoilerComSource.instance), TOKENS("tokens.mtg.onl", TokensMtgImageSource.instance), - MTG_ONL("mtg.onl", MtgOnlTokensImageSource.instance), + // MTG_ONL("mtg.onl", MtgOnlTokensImageSource.instance), ALTERNATIVE("alternative.mtg.onl", AltMtgOnlTokensImageSource.instance), GRAB_BAG("GrabBag", GrabbagImageSource.instance), MAGIDEX("magidex.com", MagidexImageSource.instance), - SCRYFALL("scryfall.com", ScryfallImageSource.instance), - MAGICCARDS("magiccards.info", MagicCardsImageSource.instance); + SCRYFALL("scryfall.com", ScryfallImageSource.instance); + // MAGICCARDS("magiccards.info", MagicCardsImageSource.instance) private final String text; private final CardImageSource source; @@ -276,6 +276,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } } break; + case ALL_TOKENS: + break; default: int nonSetEntries = 0; if (cardImageSource.getSupportedSets() != null) { @@ -290,8 +292,9 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab int numberTokenImagesAvailable = 0; int numberCardImagesAvailable = 0; for (CardDownloadData data : allCardsMissingImage) { - if (data.isToken() && cardImageSource.isTokenSource()) { - if (cardImageSource.isImageProvided(data.getSet(), data.getName())) { + if (data.isToken()) { + if (cardImageSource.isTokenSource() + && cardImageSource.isImageProvided(data.getSet(), data.getName())) { numberTokenImagesAvailable++; cardsToDownload.add(data); } diff --git a/Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target/maven-archiver/pom.properties b/Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target/maven-archiver/pom.properties index 03ac9e7681..9ea86aa6e9 100644 --- a/Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target/maven-archiver/pom.properties +++ b/Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Sun Sep 03 07:46:59 CEST 2017 +#Fri Sep 15 22:14:29 CEST 2017 version=1.4.26 groupId=org.mage artifactId=mage-game-pennydreadfulcommanderfreeforall From eebc412ad9e1f86836cc922c457e6f75646e97ab Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 15 Sep 2017 23:19:11 +0200 Subject: [PATCH 9/9] Some updates to image download. --- .../java/org/mage/plugins/card/images/DownloadPictures.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index 1396082fc7..f96075139c 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -81,7 +81,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab WIZARDS("wizards.com", WizardCardsImageSource.instance), MYTHICSPOILER("mythicspoiler.com", MythicspoilerComSource.instance), TOKENS("tokens.mtg.onl", TokensMtgImageSource.instance), - // MTG_ONL("mtg.onl", MtgOnlTokensImageSource.instance), + // MTG_ONL("mtg.onl", MtgOnlTokensImageSource.instance), Not working correctly yet ALTERNATIVE("alternative.mtg.onl", AltMtgOnlTokensImageSource.instance), GRAB_BAG("GrabBag", GrabbagImageSource.instance), MAGIDEX("magidex.com", MagidexImageSource.instance),