From 48f2018af6ade3b06b9ce6b5ebbca08e4e660d9a Mon Sep 17 00:00:00 2001 From: magenoxx Date: Sat, 16 Jun 2012 19:33:03 +0400 Subject: [PATCH] New stack dialog (experimental) --- .../src/main/java/mage/client/MageFrame.java | 5 + .../main/java/mage/client/cards/Cards.java | 14 +- .../client/components/ext/MageFloatPane.java | 31 +++ .../client/components/ext/MessageDlg.java | 13 + .../components/ext/TestMageFloatPane.java | 36 +++ .../components/ext/dlg/DialogContainer.java | 217 +++++++++++++++++ .../components/ext/dlg/DialogManager.java | 230 ++++++++++++++++++ .../client/components/ext/dlg/DlgParams.java | 148 +++++++++++ .../components/ext/dlg/IDialogPanel.java | 74 ++++++ .../components/ext/dlg/impl/StackDialog.java | 188 ++++++++++++++ .../main/java/mage/client/game/GamePanel.java | 34 +++ .../mage/client/util/SettingsManager.java | 7 + .../mage/plugins/card/utils/ImageManager.java | 5 + .../card/utils/impl/ImageManagerImpl.java | 76 ++++-- .../main/resources/dlg/dlg.cancel.hover.png | Bin 0 -> 8282 bytes .../src/main/resources/dlg/dlg.cancel.png | Bin 0 -> 6946 bytes .../src/main/resources/dlg/dlg.next.hover.png | Bin 0 -> 7208 bytes .../src/main/resources/dlg/dlg.next.png | Bin 0 -> 6098 bytes .../src/main/resources/dlg/dlg.ok.hover.png | Bin 0 -> 8031 bytes Mage.Client/src/main/resources/dlg/dlg.ok.png | Bin 0 -> 6901 bytes .../src/main/resources/dlg/dlg.prev.hover.png | Bin 0 -> 7374 bytes .../src/main/resources/dlg/dlg.prev.png | Bin 0 -> 6194 bytes Mage.Common/src/mage/view/CardView.java | 9 + Mage.Common/src/mage/view/GameView.java | 29 +++ 24 files changed, 1095 insertions(+), 21 deletions(-) create mode 100644 Mage.Client/src/main/java/mage/client/components/ext/MageFloatPane.java create mode 100644 Mage.Client/src/main/java/mage/client/components/ext/MessageDlg.java create mode 100644 Mage.Client/src/main/java/mage/client/components/ext/TestMageFloatPane.java create mode 100644 Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java create mode 100644 Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java create mode 100644 Mage.Client/src/main/java/mage/client/components/ext/dlg/DlgParams.java create mode 100644 Mage.Client/src/main/java/mage/client/components/ext/dlg/IDialogPanel.java create mode 100644 Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/StackDialog.java create mode 100644 Mage.Client/src/main/resources/dlg/dlg.cancel.hover.png create mode 100644 Mage.Client/src/main/resources/dlg/dlg.cancel.png create mode 100644 Mage.Client/src/main/resources/dlg/dlg.next.hover.png create mode 100644 Mage.Client/src/main/resources/dlg/dlg.next.png create mode 100644 Mage.Client/src/main/resources/dlg/dlg.ok.hover.png create mode 100644 Mage.Client/src/main/resources/dlg/dlg.ok.png create mode 100644 Mage.Client/src/main/resources/dlg/dlg.prev.hover.png create mode 100644 Mage.Client/src/main/resources/dlg/dlg.prev.png diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 2343989dcad..4f28c5e4b71 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -42,6 +42,7 @@ import mage.client.components.MageComponents; import mage.client.components.MageJDesktop; import mage.client.components.MageRoundPane; import mage.client.components.MageUI; +import mage.client.components.ext.dlg.DialogManager; import mage.client.constants.Constants.DeckEditorMode; import mage.client.deckeditor.DeckEditorPane; import mage.client.deckeditor.collection.viewer.CollectionViewerPane; @@ -183,6 +184,10 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { initComponents(); setSize(1024, 768); SettingsManager.getInstance().setScreenWidthAndHeight(1024, 768); + DialogManager.getManager().setScreenWidth(1024); + DialogManager.getManager().setScreenHeight(768); + DialogManager.getManager().setBounds(0, 0, 1024, 768); + DialogManager.getManager().setVisible(false); this.setExtendedState(JFrame.MAXIMIZED_BOTH); session = new SessionImpl(this); diff --git a/Mage.Client/src/main/java/mage/client/cards/Cards.java b/Mage.Client/src/main/java/mage/client/cards/Cards.java index 035951f573a..b63608b8c43 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Cards.java +++ b/Mage.Client/src/main/java/mage/client/cards/Cards.java @@ -42,11 +42,8 @@ import mage.view.*; import javax.swing.border.Border; import java.awt.*; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.UUID; /** * @@ -122,8 +119,13 @@ public class Cards extends javax.swing.JPanel { changed = true; } } - - for (CardView card: cardsView.values()) { + + java.util.List orderedList = new ArrayList(); + for (CardView card: cardsView.values()) { + orderedList.add(0, card); + } + + for (CardView card: orderedList) { if (dontDisplayTapped) { if (card instanceof PermanentView) { ((PermanentView)card).overrideTapped(false); diff --git a/Mage.Client/src/main/java/mage/client/components/ext/MageFloatPane.java b/Mage.Client/src/main/java/mage/client/components/ext/MageFloatPane.java new file mode 100644 index 00000000000..b076702f251 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/MageFloatPane.java @@ -0,0 +1,31 @@ +package mage.client.components.ext; + +import org.mage.card.arcane.UI; + +import javax.swing.*; +import java.awt.*; + +/** + * @author noxx + */ +public class MageFloatPane extends JEditorPane { + + public MageFloatPane() { + UI.setHTMLEditorKit(this); + setEditable(false); + setBackground(Color.white); + JButton jb = new JButton("Done"); + jb.setLocation(50, 50); + jb.setSize(100, 50); + add(jb); + } + + public void setCard(final String text) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + setText(text); + setCaretPosition(0); + } + }); + } +} \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/components/ext/MessageDlg.java b/Mage.Client/src/main/java/mage/client/components/ext/MessageDlg.java new file mode 100644 index 00000000000..a09b8ca7962 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/MessageDlg.java @@ -0,0 +1,13 @@ +package mage.client.components.ext; + +/** + * @author mw, noxx + */ +public class MessageDlg { + + MessageDlg() {} + + public enum Types { + Info, Warning, Error, FlashInfo + } +} \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/components/ext/TestMageFloatPane.java b/Mage.Client/src/main/java/mage/client/components/ext/TestMageFloatPane.java new file mode 100644 index 00000000000..a8a684bc59b --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/TestMageFloatPane.java @@ -0,0 +1,36 @@ +package mage.client.components.ext; + +import mage.client.components.MageRoundPane; + +import javax.swing.*; + +/** + * @author ayratn + */ +public class TestMageFloatPane { + + public static void main(String... args) { + JFrame f = new JFrame(); + + f.setSize(600, 400); + f.setVisible(true); + + MageFloatPane fp = new MageFloatPane(); + fp.setCard("Card"); + + MageRoundPane popupContainer = new MageRoundPane(); + popupContainer.setLayout(null); + + popupContainer.add(fp); + //popupContainer.setVisible(false); + popupContainer.setBounds(0, 0, 320 + 80, 201 + 80); + + + JDialog floatOnParent = new JDialog(f, false); + floatOnParent.setUndecorated(true); + floatOnParent.getContentPane().add(popupContainer); + + floatOnParent.setBounds(300, 100, 300, 200); + floatOnParent.setVisible(true); + } +} diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java new file mode 100644 index 00000000000..0dbb7142b03 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogContainer.java @@ -0,0 +1,217 @@ +package mage.client.components.ext.dlg; + +import mage.client.components.ext.MessageDlg; +import mage.client.components.ext.dlg.impl.StackDialog; + +import javax.swing.*; +import java.awt.*; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; + +/** + * @author mw, noxx + */ +public class DialogContainer extends JPanel { + + private static int X_OFFSET = 30; + private static int Y_OFFSET = 30; + private BufferedImage shadow = null; + //private DialogManager.MTGDialogs dialogType; + //private DlgParams params; + private Color backgroundColor = new Color(0, 255, 255, 60); + private int alpha = 50; + + private boolean isGradient = false; + private TexturePaint tp = null; + private Image gradient = null; + private BufferedImage b; + + private boolean drawContainer = true; + private DialogManager.MTGDialogs dialogType; + + public DialogContainer(DialogManager.MTGDialogs dialogType, DlgParams params) { + setOpaque(false); + this.dialogType = dialogType; + + setLayout(null); + drawContainer = true; + + if (dialogType == DialogManager.MTGDialogs.MessageDialog) { + //backgroundColor = new Color(0, 255, 255, 60); + if (params.type.equals(MessageDlg.Types.Warning)) { + backgroundColor = new Color(255, 0, 0, 90); + } else { + backgroundColor = new Color(0, 0, 0, 90); + } + alpha = 0; + //MessageDlg dlg = new MessageDlg(params); + //add(dlg); + //dlg.setLocation(X_OFFSET + 10, Y_OFFSET); + //dlg.updateSize(params.rect.width, params.rect.height); + } else if (dialogType == DialogManager.MTGDialogs.StackDialog) { + //backgroundColor = new Color(0, 255, 255, 60); + backgroundColor = new Color(0, 0, 0, 50); + alpha = 0; + StackDialog dlg = new StackDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + //int width = Math.min(params.rect.width - 80, 600); + int width = params.rect.width; + int height = params.rect.height - 80; + dlg.updateSize(width, height); + } + /* + else if (dialogType == DialogManager.MTGDialogs.CombatDialog) { + backgroundColor = new Color(0, 0, 0, 60); + alpha = 0; + CombatDialog dlg = new CombatDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + } else if (dialogType == DialogManager.MTGDialogs.ChoiceDialog) { + + //backgroundColor = new Color(200, 200, 172, 120); + //backgroundColor = new Color(180, 150, 200, 120); + //backgroundColor = new Color(0, 255, 0, 60); + + //latest: + backgroundColor = new Color(139, 46, 173, 20); + //backgroundColor = new Color(139, 46, 173, 0); + + alpha = 0; + ChoiceDialog dlg = new ChoiceDialog(params); + add(dlg); + GameManager.getManager().setCurrentChoiceDlg(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + } else if (dialogType == DialogManager.MTGDialogs.GraveDialog) { + backgroundColor = new Color(20, 20, 20, 120); + alpha = 0; + GraveDialog dlg = new GraveDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + } else if (dialogType == DialogManager.MTGDialogs.RevealDialog) { + backgroundColor = new Color(90, 135, 190, 80); + alpha = 0; + RevealDialog dlg = new RevealDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + } else if (dialogType == DialogManager.MTGDialogs.AssignDamageDialog) { + backgroundColor = new Color(255, 255, 255, 130); + alpha = 0; + AssignDamageDialog dlg = new AssignDamageDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + } else if (dialogType == DialogManager.MTGDialogs.ManaChoiceDialog) { + backgroundColor = new Color(0, 255, 255, 60); + alpha = 20; + ManaChoiceDialog dlg = new ManaChoiceDialog(params); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + dlg.updateSize(params.rect.width - 80, params.rect.height - 80); + + //isGradient = true; + gradient = ImageManager.getGradientImage(); + if (gradient != null) { + b = ImageToBufferedImage.toBufferedImage(gradient); + b = Transparency.makeImageTranslucent(b, 0.35); + Rectangle2D tr = new Rectangle2D.Double(0, 0, params.rect.width, params.rect.height); + //gradient = gradient.getScaledInstance(w, h, Image.SCALE_SMOOTH); + tp = new TexturePaint(b, tr); + } + } else if (dialogType == DialogManager.MTGDialogs.ChooseDeckDialog) { + MWDeckPanel deckPanel = new MWDeckPanel(params.getDeckList(), params.isAI); + deckPanel.setVisible(true); + deckPanel.setBounds(0,0,480,320); + add(deckPanel); + drawContainer = false; + } else if (dialogType == DialogManager.MTGDialogs.ChooseCommonDialog) { + MWChoosePanel choosePanel = new MWChoosePanel(params.getObjectList(), params.getTitle()); + choosePanel.setVisible(true); + choosePanel.setBounds(0,0,440,240); + add(choosePanel); + drawContainer = false; + } else if (dialogType == DialogManager.MTGDialogs.AboutDialog) { + backgroundColor = new Color(255, 255, 255, 120); + alpha = 0; + AboutDialog dlg = new AboutDialog(); + add(dlg); + dlg.setLocation(X_OFFSET + 10, Y_OFFSET + 10); + } + */ + } + + @Override + protected void paintComponent(Graphics g) { + + if (!drawContainer) { + return; + } + + int x = X_OFFSET; + int y = Y_OFFSET; + int w = getWidth() - 2 * X_OFFSET; + int h = getHeight() - 2 * Y_OFFSET; + int arc = 30; + + Graphics2D g2 = (Graphics2D) g.create(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + if (shadow != null) { + int xOffset = (shadow.getWidth() - w) / 2; + int yOffset = (shadow.getHeight() - h) / 2; + g2.drawImage(shadow, x - xOffset, y - yOffset, null); + } + + // //////////////////////////////////////////////////////////////// + // fill content + + /** + * Add white translucent substrate + */ + if (alpha != 0) { + g2.setColor(new Color(255, 255, 255, alpha)); + g2.fillRoundRect(x, y, w, h, arc, arc); + } + + if (!isGradient) { + g2.setColor(backgroundColor); + g2.fillRoundRect(x, y, w, h, arc, arc); + } else { + RoundRectangle2D r = new RoundRectangle2D.Float(x, y, w, h, arc, arc); + g2.setPaint(tp); + g2.fill(r); + } + // //////////////////////////////////////////////////////////////// + + // //////////////////////////////////////////////////////////////// + // draw border + g2.setStroke(new BasicStroke(3f)); + g2.setColor(Color.BLACK); + //g2.setColor(Color.GRAY); + g2.drawRoundRect(x, y, w, h, arc, arc); + // //////////////////////////////////////////////////////////////// + + g2.dispose(); + } + + public void showDialog(boolean bShow) { + setVisible(bShow); + } + + public DialogManager.MTGDialogs getType() { + return this.dialogType; + } + + /** + * Default UID. + */ + private static final long serialVersionUID = 1L; +} diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java new file mode 100644 index 00000000000..a6ec6855493 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java @@ -0,0 +1,230 @@ +package mage.client.components.ext.dlg; + +import mage.client.cards.BigCard; +import mage.client.game.FeedbackPanel; +import mage.view.CardsView; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.util.UUID; + +/** + * @author mw, noxx + */ +public class DialogManager extends JComponent implements MouseListener, + MouseMotionListener { + + private static DialogManager dialogManager = null; + //private static final Logger log = Logger.getLogger(DialogManager.class); + + public static DialogManager getManager() { + if (dialogManager == null) { + dialogManager = new DialogManager(); + dialogManager.setVisible(true); + } + return dialogManager; + } + + public enum MTGDialogs { + none, AboutDialog, MessageDialog, StackDialog, AssignDamageDialog, ManaChoiceDialog, ChoiceDialog, GraveDialog, DialogContainer, CombatDialog, + ChooseDeckDialog, ChooseCommonDialog, RevealDialog + } + + private MTGDialogs currentDialog = MTGDialogs.none; + + private DialogContainer dialogContainer = null; + + private int screen_width = 0; + private int screen_height = 0; + + // /////////////////////////////// *** for drag and drop *** + // ///////////////////////////////// + private boolean bDragged = false; + private int dx, dy; + private int mx, my; + private Rectangle rec, oldRec; + private JComponent j; + + public DialogManager() { + addMouseListener(this); + addMouseMotionListener(this); + //addMouseWheelListener(this); + } + + public void setScreenWidth(int screen_width) { + this.screen_width = screen_width; + } + + public void setScreenHeight(int screen_height) { + this.screen_height = screen_height; + } + + public void showStackDialog(CardsView cards, BigCard bigCard, FeedbackPanel feedbackPanel, UUID gameId) { + + int w = (int) (screen_width * 0.7); + //int h = (int) (screen_height * 0.5); + int h = 360; + + /*if (h < 200) { + h = 200; + }*/ + + if (w > 800) { + w = 800; + } + + int height = getHeight(); + int width = getWidth(); + + int x = ((width - w) / 2); + int y = ((height - h) / 2); + + DlgParams params = new DlgParams(); + params.rect = new Rectangle(x, y, w, h); + params.bigCard = bigCard; + params.gameId = gameId; + params.feedbackPanel = feedbackPanel; + params.setCards(cards); + dialogContainer = new DialogContainer(MTGDialogs.StackDialog, params); + dialogContainer.setVisible(true); + add(dialogContainer); + + this.currentDialog = MTGDialogs.DialogContainer; + + setDlgBounds(new Rectangle(x, y, w, h)); + + dialogContainer.showDialog(true); + + setVisible(true); + } + + public void setDlgBounds(Rectangle r) { + if (currentDialog == MTGDialogs.DialogContainer) { + dialogContainer.setBounds(r.x, r.y, r.width, r.height); + } + } + + public void fadeOut() { + + if (dialogContainer != null) { + dialogContainer.showDialog(false); + removeAll(); + } + + this.currentDialog = MTGDialogs.none; + + setVisible(false); + + repaint(); + } + + public void fadeOut(DialogContainer dc) { + //log.debug("start:fadeOut:"+dc.toString()); + + dc.showDialog(false); + remove(dc); + + Component[] components = getComponents(); + boolean bFound = false; + for (int i = 0; i < components.length; i++) { + if (components[i] instanceof DialogContainer) { + bFound = true; + } + } + + if (!bFound) { + setVisible(false); + } + + //revalidate(); + validate(); + } + + public void mouseDragged(MouseEvent e) { + if (bDragged == true) { + dx = e.getX() - mx; + dy = e.getY() - my; + + rec.x += dx; + rec.y += dy; + mx = e.getX(); + my = e.getY(); + if (oldRec == null) { + oldRec = new Rectangle(rec); + } + int i = Math.abs(oldRec.x - rec.x) + Math.abs(oldRec.y - rec.y); + if (i > 3) { + oldRec = new Rectangle(rec); + j.setBounds(oldRec); + } + } + } + + public void mouseMoved(MouseEvent e) { + } + + public void mouseClicked(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + if (e.getButton() == MouseEvent.BUTTON1) { + j = (JComponent) getComponentAt(e.getX(), e.getY()); + + if (j != null && j instanceof DialogContainer) { + rec = j.getBounds(); + bDragged = true; + mx = e.getX(); + my = e.getY(); + } + } + } + + public void mouseReleased(MouseEvent e) { + bDragged = false; + if (j instanceof DialogManager) { + return; + } + + if (j != null && rec != null) { + j.setBounds(rec); + } + oldRec = null; + if (rec == null) + return; + if (rec.x < 0) { + rec.x = 0; + if (j != null) + j.setBounds(rec); + } + if (rec.y < 0) { + rec.y = 0; + if (j != null) + j.setBounds(rec); + } + j = null; + } + + public void mouseWheelMoved(MouseWheelEvent e) { + int notches = e.getWheelRotation(); + System.out.println("outx:"+notches); + if (currentDialog != null && currentDialog.equals(MTGDialogs.ChooseCommonDialog)) { + System.out.println("out:"+1); + } + } + + /** + * Default UID. + */ + private static final long serialVersionUID = 1L; + +} diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DlgParams.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DlgParams.java new file mode 100644 index 00000000000..781c2bc3a1d --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DlgParams.java @@ -0,0 +1,148 @@ +package mage.client.components.ext.dlg; + +import mage.client.cards.BigCard; +import mage.client.components.ext.MessageDlg; +import mage.client.game.FeedbackPanel; +import mage.view.CardsView; + +import java.awt.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.UUID; + +/** + * Class is used to save parameters and to send them to dialog. + * + * @author mw, noxx + */ +public class DlgParams { + + public Rectangle rect; + public MessageDlg.Types type; + public BigCard bigCard; + public FeedbackPanel feedbackPanel; + public UUID gameId; + + private int playerID; + + private CardsView cards; + private ArrayList stringList; + //private ArrayList deckList; + private ArrayList objectList; + + private String title; + private int opponentID; + boolean isOptional = false; + boolean isChooseAbility = false; + boolean isCancelStopsPlaying = true; + + boolean isAI = false; + + public HashSet manaChoices = new HashSet(); + + public int getPlayerID() { + return playerID; + } + + public void setPlayerID(int playerID) { + this.playerID = playerID; + } + + public int getOpponentID() { + return opponentID; + } + + public void setOpponentID(int opponentID) { + this.opponentID = opponentID; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public HashSet getManaChoices() { + return manaChoices; + } + + public void setManaChoices(HashSet manaChoices) { + this.manaChoices = manaChoices; + } + + public boolean isOptional() { + return isOptional; + } + + public void setOptional(boolean isOptional) { + this.isOptional = isOptional; + } + + public boolean isChooseAbility() { + return isChooseAbility; + } + + public void setChooseAbility(boolean isChooseAbility) { + this.isChooseAbility = isChooseAbility; + } + + public ArrayList getStringList() { + return stringList; + } + + public void setStringList(ArrayList stringList) { + this.stringList = stringList; + } + + /*public ArrayList getDeckList() { + return deckList; + } + + public void setDeckList(ArrayList deckList) { + this.deckList = deckList; + }*/ + + public ArrayList getObjectList() { + return objectList; + } + + public void setObjectList(ArrayList objectList) { + this.objectList = objectList; + } + + public boolean isAI() { + return isAI; + } + + public void setAI(boolean isAI) { + this.isAI = isAI; + } + + public boolean isCancelStopsPlaying() { + return isCancelStopsPlaying; + } + + public void setCancelStopsPlaying(boolean isCancelStopsPlaying) { + this.isCancelStopsPlaying = isCancelStopsPlaying; + } + + public CardsView getCards() { + return cards; + } + + public void setCards(CardsView cards) { + this.cards = cards; + } +} \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/IDialogPanel.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/IDialogPanel.java new file mode 100644 index 00000000000..fd5fa4291f7 --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/IDialogPanel.java @@ -0,0 +1,74 @@ +package mage.client.components.ext.dlg; + +import mage.client.components.ImageButton; +import org.jdesktop.swingx.JXPanel; + +import javax.swing.*; +import java.awt.*; + +/** + * @author mw, noxx + */ +abstract public class IDialogPanel extends JXPanel { + + private DlgParams params; + + public DlgParams getDlgParams() { + return params; + } + + public void setDlgParams(DlgParams params) { + this.params = params; + } + + public IDialogPanel(DlgParams params) { + super(); + this.params = params; + } + + protected void updateSize(int newWidth, int newHeight) { + + Rectangle r0 = getBounds(); + + r0.width = newWidth; + r0.height = newHeight; + + setBounds(r0); + } + + /** + * Make inner component transparent. + */ + protected void makeTransparent() { + + setOpaque(false); + + for (int i = 0; i < getComponentCount(); i++) { + Component c = getComponent(i); + if (c instanceof AbstractButton && !(c instanceof JButton)) { + ((AbstractButton) c).setContentAreaFilled(false); + } else if (c instanceof ImageButton) { + ((AbstractButton) c).setContentAreaFilled(false); + } + } + } + + protected void makeTransparent(JLayeredPane jLayeredPane) { + + setOpaque(false); + + for (int i = 0; i < getComponentCount(); i++) { + Component c = jLayeredPane.getComponent(i); + if (c instanceof AbstractButton && !(c instanceof JButton)) { + ((AbstractButton) c).setContentAreaFilled(false); + } else if (c instanceof ImageButton) { + ((AbstractButton) c).setContentAreaFilled(false); + } + } + } + + /** + * Default UID. + */ + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/StackDialog.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/StackDialog.java new file mode 100644 index 00000000000..93cbd3be52f --- /dev/null +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/impl/StackDialog.java @@ -0,0 +1,188 @@ +package mage.client.components.ext.dlg.impl; + +import mage.cards.MageCard; +import mage.client.cards.BigCard; +import mage.client.components.HoverButton; +import mage.client.components.ext.dlg.DialogContainer; +import mage.client.components.ext.dlg.DialogManager; +import mage.client.components.ext.dlg.DlgParams; +import mage.client.components.ext.dlg.IDialogPanel; +import mage.client.game.FeedbackPanel; +import mage.client.plugins.impl.Plugins; +import mage.client.util.Command; +import mage.client.util.Config; +import mage.client.util.SettingsManager; +import mage.view.CardView; +import mage.view.CardsView; +import mage.view.StackAbilityView; +import org.mage.plugins.card.utils.impl.ImageManagerImpl; + +import javax.swing.*; +import java.awt.*; +import java.util.UUID; + +/** + * @author mw, noxx + */ +public class StackDialog extends IDialogPanel { + + private static final long serialVersionUID = 1L; + private JLabel jTitle = null; + private JLabel jTitle2 = null; + private HoverButton jButtonAccept = null; + private HoverButton jButtonResponse = null; + + private JLayeredPane jLayeredPane; + private FeedbackPanel feedbackPanel; + + private class CustomLabel extends JLabel { + + @Override + public void paintComponent(Graphics g) { + Graphics2D g2D = (Graphics2D)g; + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + g2D.setColor(Color.black); + g2D.drawString(getText(), 1, 11); + g2D.setColor(Color.white); + g2D.drawString(getText(), 0, 10); + } + + private static final long serialVersionUID = 1L; + }; + + /** + * This is the default constructor + */ + public StackDialog(DlgParams params) { + super(params); + this.feedbackPanel = params.feedbackPanel; + initialize(); + displayStack(params.getCards(), params.gameId, params.bigCard); + } + + /** + * This method initializes this + * + * @return void + */ + private void initialize() { + + int w = getDlgParams().rect.width; + int h = getDlgParams().rect.height; + + jLayeredPane = new JLayeredPane(); + add(jLayeredPane); + jLayeredPane.setSize(w, h); + jLayeredPane.setVisible(true); + jLayeredPane.setOpaque(false); + + jTitle = new CustomLabel(); + jTitle.setBounds(new Rectangle(5, 3, w, 16)); + jTitle.setFont(new Font("Dialog", Font.BOLD, 14)); + jTitle.setText("Current stack: "); + + /*jTitle2 = new CustomLabel(); + jTitle2.setBounds(new Rectangle(5, 5 + SettingsManager.getInstance().getCardSize().height + 30, 129, 20)); + jTitle2.setFont(new Font("Dialog", Font.BOLD, 14)); + jTitle2.setText("Spell targets:");*/ + + this.setLayout(null); + jLayeredPane.setLayout(null); + + jLayeredPane.add(jTitle, null); + //jLayeredPane.add(jTitle2, null); + jLayeredPane.add(getJButtonAccept(), null); + jLayeredPane.add(getJButtonResponse(), null); + + makeTransparent(jLayeredPane); + } + + private void displayStack(CardsView cards, UUID gameId, BigCard bigCard) { + + if (cards == null || cards.size() == 0) { + return; + } + + /** + * Display spells and theis targets above them + */ + int dx = (SettingsManager.getInstance().getCardSize().width + 15) * (cards.size() - 1); + int dy = 30; + + for (CardView card : cards.values()) { + + if (card instanceof StackAbilityView) { + CardView tmp = ((StackAbilityView)card).getSourceCard(); + tmp.overrideRules(card.getRules()); + tmp.setIsAbility(true); + tmp.overrideTargets(card.getTargets()); + tmp.overrideId(card.getId()); + card = tmp; + } + + MageCard cardImg = Plugins.getInstance().getMageCard(card, bigCard, getCardDimension(), gameId, true); + //cardImg.setBorder(BorderFactory.createLineBorder(Color.red)); + cardImg.setLocation(dx, dy); + + jLayeredPane.add(cardImg, JLayeredPane.DEFAULT_LAYER, 1); + + dx -= (SettingsManager.getInstance().getCardSize().width + 15); + } + } + + private Dimension getCardDimension() { + if (cardDimension == null) { + cardDimension = new Dimension(Config.dimensions.frameWidth, Config.dimensions.frameHeight); + } + return cardDimension; + } + + private HoverButton getJButtonAccept() { + if (jButtonAccept == null) { + jButtonAccept = new HoverButton("", ImageManagerImpl.getInstance().getDlgAcceptButtonImage(), + ImageManagerImpl.getInstance().getDlgActiveAcceptButtonImage(), + ImageManagerImpl.getInstance().getDlgAcceptButtonImage(), + new Rectangle(60, 60)); + int w = getDlgParams().rect.width - 90; + int h = getDlgParams().rect.height - 90; + jButtonAccept.setBounds(new Rectangle(w / 2 - 80, h - 50, 60, 60)); + //jButtonAccept.setBorder(BorderFactory.createLineBorder(Color.red)); + + jButtonAccept.setObserver(new Command() { + @Override + public void execute() { + DialogManager.getManager().fadeOut((DialogContainer)getParent()); + //GameManager.getInputControl().getInput().selectButtonOK(); + StackDialog.this.feedbackPanel.doClick(); + } + private static final long serialVersionUID = 1L; + }); + } + return jButtonAccept; + } + + private HoverButton getJButtonResponse() { + if (jButtonResponse == null) { + jButtonResponse = new HoverButton("", ImageManagerImpl.getInstance().getDlgCancelButtonImage(), + ImageManagerImpl.getInstance().getDlgActiveCancelButtonImage(), + ImageManagerImpl.getInstance().getDlgCancelButtonImage(), + new Rectangle(60, 60)); + int w = getDlgParams().rect.width - 90; + int h = getDlgParams().rect.height - 90; + jButtonResponse.setBounds(new Rectangle(w / 2 + 5, h - 48, 60, 60)); + + jButtonResponse.setObserver(new Command() { + @Override + public void execute() { + DialogManager.getManager().fadeOut((DialogContainer)getParent()); + } + private static final long serialVersionUID = 1L; + }); + } + return jButtonResponse; + } + + private Dimension cardDimension; + } \ No newline at end of file diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index a1aee0ba074..6cee4e6a96c 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -36,8 +36,10 @@ package mage.client.game; import mage.Constants; import mage.client.MageFrame; +import mage.client.cards.BigCard; import mage.client.chat.ChatPanel; import mage.client.components.MageComponents; +import mage.client.components.ext.dlg.DialogManager; import mage.client.dialog.*; import mage.client.game.FeedbackPanel.FeedbackMode; import mage.client.plugins.impl.Plugins; @@ -85,6 +87,8 @@ public class GamePanel extends javax.swing.JPanel { private JLayeredPane jLayeredPane; private String chosenHandKey = "You"; private boolean smallMode = false; + + private int cachedStackSize; /** Creates new form GamePanel */ public GamePanel() { @@ -204,6 +208,10 @@ public class GamePanel extends javax.swing.JPanel { } } } + + DialogManager.getManager().setScreenWidth(rect.width); + DialogManager.getManager().setScreenHeight(rect.height); + DialogManager.getManager().setBounds(0, 0, rect.width, rect.height); } public synchronized void showGame(UUID gameId, UUID playerId) { @@ -399,6 +407,7 @@ public class GamePanel extends javax.swing.JPanel { this.stack.loadCards(game.getStack(), bigCard, gameId, null); GameManager.getInstance().setStackSize(game.getStack().size()); + displayStack(game, bigCard, feedbackPanel, gameId); for (ExileView exile: game.getExile()) { if (!exiles.containsKey(exile.getId())) { @@ -421,6 +430,30 @@ public class GamePanel extends javax.swing.JPanel { this.repaint(); } + private void displayStack(GameView game, BigCard bigCard, FeedbackPanel feedbackPanel, UUID gameId) { + if (game.getStack().size() > 0) { + if (game.getStack().size() != cachedStackSize) { + boolean allPaid = true; + for (CardView cardView : game.getStack().values()) { + if (!cardView.isPaid()) { + allPaid = false; + break; + } + } + if (allPaid) { + DialogManager.getManager().fadeOut(); + cachedStackSize = game.getStack().size(); + DialogManager.getManager().showStackDialog(game.getStack(), bigCard, feedbackPanel, gameId); + } + } else { + // do nothing + } + } else { + cachedStackSize = game.getStack().size(); + DialogManager.getManager().fadeOut(); + } + } + /** * Update phase buttons\labels. */ @@ -946,6 +979,7 @@ public class GamePanel extends javax.swing.JPanel { public void installComponents() { jLayeredPane.setOpaque(false); jLayeredPane.add(abilityPicker); + jLayeredPane.add(DialogManager.getManager(), JLayeredPane.MODAL_LAYER, 0); abilityPicker.setVisible(false); } diff --git a/Mage.Client/src/main/java/mage/client/util/SettingsManager.java b/Mage.Client/src/main/java/mage/client/util/SettingsManager.java index cb24375b68f..a5b529691ff 100644 --- a/Mage.Client/src/main/java/mage/client/util/SettingsManager.java +++ b/Mage.Client/src/main/java/mage/client/util/SettingsManager.java @@ -1,6 +1,8 @@ package mage.client.util; +import org.mage.card.arcane.CardPanel; + import java.awt.*; /** @@ -36,6 +38,10 @@ public class SettingsManager { this.screenHeight = screenHeight; } + public Rectangle getCardSize() { + return cardSize; + } + /** * Get centered component position. Depends on screen width and height. * @@ -63,4 +69,5 @@ public class SettingsManager { private int screenWidth; private int screenHeight; + private Rectangle cardSize = CardPanel.CARD_SIZE_FULL; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java index 70052493eb1..40ee6e10687 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/ImageManager.java @@ -6,4 +6,9 @@ public interface ImageManager { public Image getSicknessImage(); public Image getDayImage(); public Image getNightImage(); + + public Image getDlgAcceptButtonImage(); + public Image getDlgActiveAcceptButtonImage(); + public Image getDlgCancelButtonImage(); + public Image getDlgActiveCancelButtonImage(); } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java index 61452458d9f..a02a9aadda4 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/impl/ImageManagerImpl.java @@ -1,20 +1,16 @@ package org.mage.plugins.card.utils.impl; -import java.awt.Color; -import java.awt.Image; -import java.awt.Rectangle; -import java.awt.Toolkit; -import java.awt.image.BufferedImage; -import java.awt.image.CropImageFilter; -import java.awt.image.FilteredImageSource; -import java.net.URL; - -import javax.imageio.ImageIO; - import mage.client.util.gui.BufferedImageBuilder; import org.mage.plugins.card.utils.ImageManager; import org.mage.plugins.card.utils.Transparency; +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.CropImageFilter; +import java.awt.image.FilteredImageSource; +import java.net.URL; + public class ImageManagerImpl implements ImageManager { private static ImageManagerImpl fInstance = new ImageManagerImpl(); @@ -52,7 +48,39 @@ public class ImageManagerImpl implements ImageManager { return imageNight; } - protected static Image getImageFromResourceTransparent(String path, Color mask, Rectangle rec) { + @Override + public Image getDlgCancelButtonImage() { + if (imageDlgCancelButton == null) { + imageDlgCancelButton = getBufferedImageFromResource("/dlg/dlg.cancel.png"); + } + return imageDlgCancelButton; + } + + @Override + public Image getDlgActiveCancelButtonImage() { + if (imageDlgActiveCancelButton == null) { + imageDlgActiveCancelButton = getBufferedImageFromResource("/dlg/dlg.cancel.hover.png"); + } + return imageDlgActiveCancelButton; + } + + @Override + public Image getDlgAcceptButtonImage() { + if (imageDlgAcceptButton == null) { + imageDlgAcceptButton = getBufferedImageFromResource("/dlg/dlg.ok.png"); + } + return imageDlgAcceptButton; + } + + @Override + public Image getDlgActiveAcceptButtonImage() { + if (imageDlgActiveAcceptButton == null) { + imageDlgActiveAcceptButton = getBufferedImageFromResource("/dlg/dlg.ok.hover.png"); + } + return imageDlgActiveAcceptButton; + } + + protected static Image getImageFromResourceTransparent(String path, Color mask, Rectangle rec) { BufferedImage image = null; Image imageCardTransparent = null; Image resized = null; @@ -71,7 +99,25 @@ public class ImageManagerImpl implements ImageManager { return resized; } - private static BufferedImage imageSickness = null; - private static BufferedImage imageDay = null; - private static BufferedImage imageNight = null; + protected static BufferedImage getBufferedImageFromResource(String path) { + URL imageURL = ImageManager.class.getResource(path); + BufferedImage image = null; + + try { + image = ImageIO.read(imageURL); + } catch (Exception e) { + e.printStackTrace(); + } + + return image; + } + + private static BufferedImage imageSickness; + private static BufferedImage imageDay; + private static BufferedImage imageNight; + + private static BufferedImage imageDlgAcceptButton; + private static BufferedImage imageDlgActiveAcceptButton; + private static BufferedImage imageDlgCancelButton; + private static BufferedImage imageDlgActiveCancelButton; } diff --git a/Mage.Client/src/main/resources/dlg/dlg.cancel.hover.png b/Mage.Client/src/main/resources/dlg/dlg.cancel.hover.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d1964f8f7d7b56b902c6f797f9a64833c4c414 GIT binary patch literal 8282 zcmV-gAf?}lP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000$*NklDw`pT~XAof!@}q(lxW$uwofvP_A3))f_5acVn-0o4z+ zmgOLUYoPtwAZUtIM$*7;gQ8zrw5f|kuA3l_PiY(!4f;yapiLavjb&S=NQyJVdEdG3 z^FI6059i#O%Ml;Lq(V`|7dSYV_s-pC{q|aW@3sGHQ&?;H%k+}`C40Gh?}Rwa-;1fc znELnh%T8TP-T&XTe;|V0yD&tQ5h2U>&H=-w4bkP@l$X7OVefYPcLh9oxGeAPflE#q zWB_&G(&gv+7Dm0>?cWvf#25$g%Bu?aK&8A-jGa6*1Jd%I0C{4}L4($bJI zFaU;AVHw}z`R_*iw}f^N0b8FkWFA-m7AzbAW^D1jYe8E`Y+*zf*p<++;JY_YKojF- z>7m+Pwm$%RQ|){1{%k%ydEFG+y~CKD7&8YP1&#wJY;hg$UU=q3xwwe-J=|~q8R|2i zWac0L((f7A0oH+rD8kZl_kq(X;L3sa7t8kVv9P#x@gpyKLV)KIU%ra-@=F}~M_>9q z16#nlg_9;H^T z;;gNszWQs#pZX;2fBKdGr3-^rfE6FsJlJxeUyeUrc51y0-($duvi&9C)YfxWXxeu-nh{N+E=uv)gi?7^xJn{MIx@zi9dIgmXizf?<0i3UcE;Cul_aR%P-UX$}fJ?!nTELPGQt_ z4|bixpuBuev+U4GXPyBTx1Rs##oEz%nt$bKY@T72!YWOCa`kv#Yb9; z<4C-7@1gp4zDVQiUnltaUwGUUUOT7Zy$T*suw>vQaBq2?q=391I14OpfB0h;>x&Dt zp8XKQ8bp#HIy+zu_51GQT+L){BcKQAA7nDnV9s8_30d=H^D(inu42+srQpx=6n=%4=z$>070{;NOt zEf+?>vJ2}T^jye9(Xs6^f|e{acV77T#oDnWw4VJCs2n>Up;uP0#z4Iev$I%Z2`*n{ z`M>-(W?uOm^??nv$_h#6mE(lY`+g$<1d}$$kR^||N3vD|G}4DNMRv_BR!bef%+EsJGa;v zO?%iWLwRppnZmmd_I~`Y|BSPAFWD0ps7=8NYmn9=v_=>MN+Dbq8cnd4{L))=|K(Rn zKK}|cU;c$}`;d8{T~Gq-B%9cN{-YOb$L4AM)dH3h)*7?F2M_{_Aaz|L->2#MB+J(s zzWyD8x4--Q5qwv}_Z+zD!}=NMEQ39kiI*J#zJUsHf_m}^>h&7F=OT?kVhhh& zTU=Tr@*Kuv*zI7ILZ7@B=d+)|dF^YAf9}=u8TdIk3S0xyfY`kFV;3v)Z5mHLfr&!Q zppUwC4V~v$tue-6ti@PMlxK{>kXoLjwZ^&k9$JgXh@n1$W*-_|s0_flb_);Rc0a5^ zXb=XddM>W(VRD5vrhqi2096XI43xqq3AWoMUcSb7JfiuY2WWlvGsM68t91X~&rYCS z1@7uI&pqqU%}~E^9vzHPy)N0+tEeQw`Y@QdeNkS9^jMvwxZ*HQ( zfb_^b3xDGiB(J^3TR;7U^C@^&&p-aO-)>NQ`2DESh`hT?cI_G}NlH7|x{dJ_{ezFTV8g zYHt_u%F9>*R^`-%z{&FhHchc{OdJFRK|sS8RFV+7F7?x=F~-op^cJ0e|NGdPCMVu| zmf1%i16_91_I43DLSThJNC`raSW5&n{R)W?V<@JS5;D z38(!}e)b`McL(|6Cs28Yjw71JkWXNZArHfS*gR*HWi;At+=T^9o`cp{t+7dh>Gk$! z;}RArNlVyPrNS6c(xKg&L2Y+!`o{l`vR)@xv$neh>$~vw7_KPzfrV8ATMIDyc}VXn zwHy~-J{iMV0}ncIPQqgS)1N!%ZEavb`Vmwd5spSUNlbeJ8wAvqBF}TiSwc@9)_&@hn2@!}>l$AQzI^Mho2^SbgPkLT4*jv$nSdTf49_f~yf+HE_*^ zjRy2jL-Ykuw*!91<{^WbE-WT+Du)Lwob%zVgoXNNUODTmt&%?TB*WnVFU@GGjAR0v zWen3I&Ozsl}p$k1(Y{ynLyq&@_Fbsd|-(F6R zpCJ9O|D6T`m1SHX4Dm|XQJPY>7NHcnoNaZUqsC+MP6w4`Xr=Z)&vU{oW1MDGjA18E zh_aj-f_P^Ky|SFR-JNjTnBfj|daxG2Y7EOctXbHWFw7yI*;hZf)AsNk0zeFn0NN28 zkBhD0Sqbm0!&wCl=M$ego3C6We&7ryj>zJKidM9&MQV*!3awP(U1RnV32W^QI%}L| zL|INXP1qHJG|g!{65;yzd6u>Yz46GHa2>XG;Cdh44&iDFD>kh0-*s4Om1z{C3dk5G%sg~11 zx2i%aA@*RLLtn!{!oV$qVD1n9^X1`%C(f#C*Kn3jql{uD&p83OT4R*L^m^!iA7c!5 zN`9;YYqc67&=itTYmDQX`?4f-w9*bJ3u700HRx#Au0UrFh7|||WV@j51ba7?2PnK? z9WY**b{fcS(X&{<@AqjRKThk^y{IHX2LWn(8y$w|%}q?6?+H!QusJa2IGj0l3=NFZ zjA*xOygbuRxx1=D(kh^bb4B(TRv~SJu7G*;|3c+qy7VzwswxgtB~%SmEL2pXCaTR3 zJbM0Uqe}h$`%!U>i6V5TgWlM{^m;ecL=M6xKqUx>0CVIBZO^B1bio{O4cJavsx zGax)L8njbDQUf^)Vs3wj_vaSkZ>3AOfjI&5vJeL94w&l~o_V}k^QoSF02PIpB*tuS zqpx1YgyCK-=l0S+xRn0S&L%aaU_l@r$3E z1H*1u`rQp1>9?a^=F>@P`%<(dEYry5MYv|fW3Sf8^<^3rZqE7y2HAviRx2ajR|zeOO(3zLZk$DHY87EL1n1 zec{=f?^1pLLu6r4cy?Pc!J`~Z0rL0W9_ z%o}fDqv)n%)(5tQAOenCdxK}iRB6yyLmo!t#!_v!aik-Ix!L*U(MaAWrFG+2X)t!G za_GKOfVX!77B>;`riJ)Z7VZO%Y=8J;7i$jGA3IN;CVMJ}x%3t`4BrvP1(aZ03IYUm zpeHO9YpGd#1FW9RJl2rKF&UQHOdHQ}WiZp8T^SC|nX0uiNwhA1VvA)EEhN<5jAgkVETVgwBY8c4ASVX2zp zueG&%uzQk=HRN$ZZlN(VgK!*~&9vtU198T2APjQ@nTFUDb*I$dFQ4i=jp1nzPk`IN z5nFn=^J5>sSksE;(@&uD9I_1C??IMfzVl}{44N275%@x|Aq9z)G=wC!5P&^eisT~< zb*qb5v~~|xO?x^?h_QIh7H!v)y=H692_x=l$=Hm?0WeY!Du@gu)uQU44l`-pN|!#i z`@&B=SIbkHPd$#wQf!uCM?-hC2U0qHl;*64s9V(Lg2fOT9QJ?Y3{lL z2LWRP6|)bmrlwj0B-WsklomjvMd~7*W@FBY9{Ns`PMK_QUVJLjV2?6bZYf^oqOl243=})5wPn+ zKPyyA=lD&$?A}S2)=)8{G4%`Q$+Hv>TL^X*gp`=?e)q;O7J{0P>_~}rT-wq>OKDry zBr|awI@TBgW+n=Aui4Vu$~2IUr^^bMXNsX`tlgUfyt4G4SxY_77)BAQYN@*wscVge z2--2Ub&-@*eQ=jNKc#c2` z$*kj0aXqBtVC%JP4Bi0zvrzfFNb-sHg7WRgsEDf4*$;-7uPo?c?(PrrpNACx1} zSFaEWu?HJEF52~(^?YzWTf@fnU>tU>9j(Lm7OZyQ$^d>4!Ve<&K>%0V!FcP8q|-vA zRoBCHU4-MHWHHfIg+NP5<~TGxmzM8S^{dP_>RGb0c6|VLP#pRY17H_ydW*zE-om>% z#o87s7-rC~{>Il{7fVa5{mJWC*T*r2@nA$O9h#0q?6?@OfVG})JwaR@527t=`kS!5 z4Xa&vdkB{jcr!0V^EY#NGlDDiFxWaH?QUC$Y~J_FBKQ+ZhcZ8A3XOYyepRIypoxZKr@!AhIyf&`n`mz`Xxk|L*(x)1P~2{ZGHe zk%f73-=}U231D59S+7Fu`c~>J7QvB+LQF_vP?aE1 z_cvR1RX7XAt5h86h|tksEpyVL<$1KdDkmDXtiH1`UXQ|IAI2jX28CnB77_z_=a9Ly zorH4@pzi(l*PZNBf9u@!|M|z9s5VeqgMeAbBk+8yRT}I5?s&`EL8pWr z!Ey@AqB!fZwacG!j8KCB0@62Y|`mVMYVFla$so>L0bV#TpJ7zHMV+zH0X z;*89zR8Iu8MpX+TT!Ec&M4EOs2dhau>Orp$n`2l@U|qqMf}Sq*t;ND|hw|`5mlmox zZqzG}Cpe|+RRpp4&99B;fAWiuC#%;9(~NO%J6ylK(is>t8bWUb8)I0_U?qcP3mbW% zNd*$}qadn~`^B!umaBrwAWb2*qha8-#h^96c+OTEbrS{Q&hq80VUk1x7zD5r!dg`5 z(yLig`gvdBk0Gl znZcSa=7x0-Iub@R~m3}If(jGYn8j-g%xrx}bibSP%_9Rs}yti4f6os2IvTNJQu z6?6@<6e3;9!2!&TpcQ~0fX#{y@0%iT?f|{!zGt()s4hK$wvECADu%QMaTf+zaW1Nv z6u=@a&H{uM2Gyb{KdhBuY;Ud`?=2m3V0XdPL8XvaArvsmVK;+%Ic!W;bX;g)WMSAS zI{&s|d^fuE4bZJ3~5Fv;$i0>34n>`Bl&(Z#Ya_JBM-_j3(e+c~lKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000n8Nkl{)6=lM*R8K#^#G!7g^WXU^yRe&=`j&QOU6e@chLpV)B|_$Kg8;G4iV zf&V`rnX7%Nl)CEIsYO$%Q&Oj~e{(&_{)We2s>aA%=RzsKz1ZCyXS%xZ@_Aa19;LEx zA0PYS57z@4i0!Ke^w?W(33dUMQiM^2U$0Xt77-DA-*3D(hVHxXR)E{TV@JH+b#d}} zE}l9?%ac#?!2bP9j=$1HRadLDma(t`+)F(@arRT6qPBZCZG{5ap&^3rf1kmxe1&^| z^rMdefjuL8>dE)t7c6Wo4O^>GDi$%uu(hvG0q!e1cgEe_-E4gDK_p3-9~j{ELx(Vr zKFa5xd1lG+7eg<_wp!rJu=n0e{l5EXD-_6Qvna1=wS^-yZjF-_GXGeXbFyf&dvFMm!HSJ&gj^?A*zxzVHR= z2M+M;qmM2*ek$NymxZsi>;n(b*4j!-E{9_b3UG`8tx>LvYH0xx;!~#>{oeN&e)36n z|KJC^fk|L)ktLdkd+hex8xU{Q1e*re1&Egn?(@c;ejZ9E0b<)D&V2rni^2 z#~)|wkAKWBo_ONbMedgea<6{$qtVuF+t~2ngP3|9Ge1uu+_^*|YDv2N{LPo?Dmt}ljiCPUVB(Q%A4A&qH(CJ96lBnc7( z$jl7&p&_cC$GW~gy1w~Ma?d=&3*Y!g6S^H}JG^5@t*fhxjy-$OwHnFX9MRdcBw>h& zW0E96YmL^LS{O1PMHC%}S`bk2JPMf%HDk0LZ*6KJv&-#cX9dA3le^^>c=~B{y^b-4 zI1DjbUkMw>4cH){=6O^{MktPtlhkU&n>W+w?x49S1i_8n9uA)a%qe56|-`8bcBUc&1RJ9DVMpmua6D)+|vk9VTepjG(1NsL@AWxfKmh^_#%{YIecUAMJVUfFa;4Fbqrqo`}TP4Ge5Kv1iZW&T5tH-+cp7Kpaz23OA0CdYzi* z;myxe6d|eAsQNxdtx3vdymjj+Dn&Fjgf~3QhEIH=QB;H>GC7IZtRPB(1x~|OMW`F0 z*pg@P+`0H4-+5=?l^{4RB2yOfyoDYGW&re1>FLYS*uvsCgd+GrIhSMB7-}Mv3k8NQ zUerGr7Er$!dXJ8wA>b4qz*=?fBlk2RBYlk@?b>kSL<& zd1S(nwHCbUd9)@8aU4^PB3c1g1Zio(l*>qxG+-;01=yx#QR*^mHp@)YjSB^aM@P+% z&z>FpWf-0^#>`u|Q42f*j5V!m(~`NKJe;!uVT}#{TY#?D_wN1Yj`4BKLk}_U`?SUh zZAKF`VWWt-Fr;V;6Qgy*BXT(;pU2G3Vp2s#vy%#dnh3>gmT6<~fl@xt*u;eSmx~vN zei=n4v@vtQv;`bV<=|8@Yz+O@wlGJ?M24svl!97Yt3rp?yZI!Vw;(y*>E z9{_GzxE@8+qKJGDFacD9fL0M^MC1jnM}8j1zfZJoT6TPqWt*@8kk|@NZlqhfD)e)A z-L-$y_&Dy)op|*+d1L5w99*r@aolj{#jqmiY86wjQ?FL3B?)<8R4F{AXay=pq(7gV z_|GKyU8MD_1xs6YY&qButvy^0`uRKW+@Bd6W6k#M5Xa~^VY33)!fLG>ut|ccRM7MD zm^g0iSv%;cQdE_q1(*|&SF+j3|2F3JAW13~Y$6q)#;vuhwsyV(_Cpl_mVoXAwj8?S zj{R*@Q?zWqg*cATaZINOnK;HI31(&nU8!JBwgtFUC{PulMJeW@h<6<){CC%V zbvg)|F57hDVQblG+XpWR`(bHXV%xgNM#FT8>a$;wt2As3w7V`n8#fXg!$c5pdSaqp)wl| zZXNA?eI!AEsnyVvljxBV%*+fXHLJz20g(4RYCy7X9UF2v9^SB_d~RZ*=hu!i95vEV z)2(OiBCHzrMs#UODTl#JANk1JTRS@F`1r>gdo&0zUlUbGdMt7 zF6Zv+==j(dL_XP7C}dOGRoyOjyc)IgMrGQCqyN@hXFJ>5X}|MMl6oBzhM2K2^qDhA zy}kgt9BlJ_-M%-TN8K1Q?d`0|X0v~@e*K-f>FMBTsdRqG^SA+>`-Uv60Qbnwo#D21 z>)3G5J&hb2h7HRO3@pGl&n9d>rLVSF%hv7Z%KmLwt5L61&?1yvH}mkib$@ZM?|->( z?bGCqzud9tBLE#byFU|cC`z-EyJ%cfzI zW`L;GaEu|_)<&D_<{xTrf7q>5@+})S{L}Ht$gH!bKnUcDMY4{Qzq_sNvub)e-?C-P{^KJf?=G6-H7)I|7PcpsW8>bv4RtY&k-0gD zW6X&YSLBDfwQdf$Xf2xorbIYnj8TYarI=O@;c~D|_YMMPt5xb+v(|N6?kbfY>KPgN z)?MA*x7pTp#g@*j#*KR%hmCvpHkx;>k!lr0kdr5oB)QxOq|(hrYuP+7En-e&v(>3= zb}sb&^|vY2suXG(hq5#@?j~%Kf)9WoiYNf4P{2_tcXw;+r{%&0V|sgkczkGRV5OGM ztOWMApZ;{b>B0p%tYrnDR%iyG7mdLL#5;J_ls_$%5nwCN-XR~ zv$Jg6vxg{-$w5Q00F>ikPM!LI8yA3KrSNIMj*6HUGMTeSv>r%|sR6<7>-EWevFJy> z|M8uUv))yx5Qk#Q(rMUc-p<7_zA*%jLoP}3U2vbR=gp#>VXnu*4&WxnV3fiUA&O!$ z$~G2JggJW_Y}yH|N-%0uPbjPHT~>t${rtIO_Yux>%eR-`{(S<8(L* zHEW@xC1A6*yRU1Ft2GKmf@G}{6QypSrbEE$b!m6U4o)6EjIl~gB%npmgM%M{ttdqu zC@IB+i2ko!cJQ#)r?p60mbqkA#`C}N{g>Y?PRl68 zEF#nE)=gWHagCkARd1-R1lYOn(4kwWySsVw@L`Nn3((1#GgrXQ*@>2baS?qemwW%^ zBsslEmKnC{;spzR;T6yO)rnH+`S*+&^F^eNB2;Q2hi9$Xs!E}h!YG&rxv*x<_-pz6 z3sy=l*wB%=8rO;okH38BrTZthY~hXm{)T(U5py#$4c#f#zLbFx5&e@~ZtzG0wvv)% znhN7^s*xWChJWXI{in+1=g)|YI*18TRFuNCuyaZ^3KXUAfV1WDwu zXr(2oA}IP|fBz%not?bi-;Xyuyio9a))Hmll8An`rRBYs~lwcU#<3^X>0qBGa{Gjh;fv|oN|~|3dg#!Cn9G{rSaFaexou!KbI=agVb$Ub0ffs z-9A1r_vQZn$A&j;;_#6pS9Cok;Jk=_rcgN3A4Tt4H=apZcGSL~vOR4xfHfCo5*Rx^ zKmW?x0_(=wQFtO|uv8j5X3X)b?^o<^E2*adYId&6=HY7rr*nVRT4dsH zj~sb2zV}{^*;Ob3=RhB9Z9VgH6b+awEt`f-Yf#OHQJRa{R5iv6Ktt2^nXmaw6I7zBp zz6COtf}Kfuf0CMzvVkUN!@*j6mt)h8_VzpfJfHt+L8+}1aQ@}l+27Ub^_pF@sYT;Y zTZ`A4;=mt5m)>l1;2IktwYAn%3V1nKSrlxVw{=?6(Dv-G*UnfA&Zn%KhOMU`Y`I<$ zZ#m&^@#jrouj%@WTx~gZQBw79xJ6IYGpA22QZJ)xbxbR550`>&2DHFVAZI67 zTS9QFUqf(P3@xb`lGrg@?R?`@u&dbdYb({bR?`nJhBo#hHM{pR&A#1!@1=^cm8gqp z=xC8p=-CYDq!zhmw@FFmwX9ZUY+krIuA6#pLzd`@R{S*W^#U*Tc<KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000qFNklAouho^g{XFP+AUxax%@P-W$ zVAudFvw#KrS@91L>hR0w1cM||88!9(605>}q065wG;cX}PTmTRN z48Q^~0Md~${F}`N=f?2$PvrR8r)M9z?@V|e<<3J`Cj%@1@Ul@DfgXNYl7mSBB-w~_ zw4q9ig9jawAxPAuP%Wmr|8j{?Xdm+%y7|>C5 z^UC@Ff^3wsb20b$5QKB;#u;RkJ;%*Wf&Blw5NKzDy7~D#oUdLEcnZLDb}r?h-5h|; zsT%^yCZo!;MWt#?|zc_^Xja?n~>u53Gw?qy*d z0qA7!;f^eFH0CpWY|y98VHyE0WWYm(D*&oHn};{v`Pt?dqT~K73=ck*qfn~(?N24PAAax^j;*seAKAMHm-)xodbd%2*YiBNBoqwMNC4u+=3J_>{G^A<5=Xm1Kr-k%rSmzh6Vv?BZJ8y1% zkyCbFyIsdue)VZA*L*A%3H{XKFaQ1xeEnbERsZ|F_ny^?y!ET|_n6_apdb(j0ws?s zjEjJFChWiC=5k(Xf9rnpdavEDIwc?BTpfS(j~nPl32v14Vgg^i4EjUWyAO89O z=zHIM`zb}F*RRfbmc?Zz%@BfsCf+4Zvx)!X-f9&s4F~5p=^8{n+B$ zZyw{fw`J}1 z>3D7$9US9eV-IED#naOTcn(1XU`^ONjPbRM|wkk8TC0naa(cn9!{Fh84m6MFAqDF6zh5poP za4PV)vT!u{C=lQgQLwa9iIc?Cjt@Fh$J-51;A6VvBVdb`$yOOf=tTzK{h*6$3m$&u zQ|ma465M@jhjw<`mD+5{On}A+=r06)R^ZXZ;}NwpU|$jZ)wP+#vXq;RcF^8!LIplb zegVEo(GhwG-81-~dm*mQdHC!rt2mAfK6q!BcJ?}z+DysRYNb(V8MBs*tCdfMJ_|67 zF#+@lxJ!Vm6!}Cbtgp>j5Cx6>PO)=v1ReMY3J&}r&cN^5$?^G(az|?A`aSP|D>O4Vp zId4dhOE_qxlpCl{Py}ciz&k{6*4JtxN)?)ot{)wDpga$r0=#}7p>ko>5SsC`?H-n^ z1-$U=62iX0=KTXYXml&pnZVYn!SLhDnB8J@tK@Op=6QfIrivLm2v7h4l&KEV>#J23 zQtrV)$M1DQkXL{wf})it(dbrcwZK-Z!7xB2 zS6}nUkO^PFiP~pXc%1w3;XM1~FGMsT*C6P%OI1rs6`BWKFAjTv>%g%LHw@7$_^^7A z(Z&hmy+$AN(+;j(TR;>WG`5duztOGKs)4Omivl|F$A*>>PcZ++hWS|)#woe#qwv|Y z1Vksv48dKkS5hb{95zEQjT1mSa7+p(>>~DyC(ud4_@EhMrsUxA_y;!;4(|WJoK%70`%=$^=$ySb7!k85+ezGIL#J8(B4{I$tk->L= z-o}fUr%=1H1STLnY}1eLY_EY-y0TP`0108K%a9O)P#(32PxHynR347o7V_PMp#|Fm z5Q?BHK$}^P4a=dia+DYeQ!B~sTlMXmH|y=dFQ8Z~z$q1>!w}wEZvjycmK3Z2-M+z{ z`(5lF#qcjJLeJIE>!tM0ySrDywyZdcDq5kehyo%M>0vbKoG(7HpipNhFl1cCl$%FM z&W`QLAk;!;=^B={vC>V9B&n6;m6z(Tu45x_7@YFJDj`qh`$b{7|>6AeOn zaSjV#dKJ~n%P2X5VnIREAlpccpdDF|;{c8WQbt4dN{+^qRw!vgQ4u@>92z7-kM+l# za{|+Z)mn`kB7^5JgAL@wlluPmH&+gtQ9-#5X0NY;%ToxW1dcdxH6vw#R-!DKbDq1B)CFCoCD?(rG1cE?KvZKxm zJgHQ4$N1I5uHqv@WZ+G{@y@~3d+#4EvLal5zK-Hd31O5%`5Ia&Xl3DQ87K^bD1~xA zgbRzQa==etsf9&fn7C|h61ah)P@<=XyuHMqPrdnRv zVouE=WEBJFv6kI-?msxbzOmD(r-pI;6Z2SFo`M)g!Ba3+;3_~V0x5#)C=`Uy-EF~5 zQ14s0J8wf4>r2jH+Q@BIJQ_? zuVH2;fHf9=L80gp3XVcAVOS9`DUb#B?;XQ*lYz3g7sJ)1AhuQ#Yq@8vbS%q}WocTL z1`8T2a+IaBkqolE$IfAOhHXgawwXuTr8(Fk=q!NR#&-Am)_$iRCyes)G>T;pacaRV zCrc?X2xZ4nC^#B>TOEY00qhrUFNLd1L1I~AVI*OzKf`D0GFUi!_fkrFj9MBmf+s~7LE>M zRI5Hdduu+tv{+0mOWzpj8Ot4G<;bw?8I~Qxvdw~B79236&4Ne-eR(*CaUS4F7qz$} z7qyI2cxGcSdU|(1s`pbyuULSqHK=F7EkIw>)}Fu~8kRj{Wyi8?@<82v9;n-uLB(cIv3kyRQHwt1qL%z(Ro&X}J<~Yo*ZV1> z2@T7HLNA4J2+RtE!Cp%=czY(n)`K>hhY2dxB7XUkvtfO~ORSaHu=I@KjvIob)5);AV_?(sUbcAFMJvB>o!B?ccKUobva3l7Z1e?BU%Is^Y2n68wU~OIM2FV#VoOE6E^T%#w-=gneA+0lBUN=bXs|KwR|I zhE}vy>gr3i&7bpvG@K z9}Dc`fO(7+d*VM65G|DGyGLFA&H4HARPec*IBK-O%qZ8&D3t@aB=YQv8_rLw$S@~7 zuxz`A<PZ3T)pbS;0WAV8A|wJSdSa(F?P*2R zir^FA7$eL;$}ADHw5*i_GXUJqVE3{@;6h->0q5JK`5$WNESyi;83I5=gqbW8j3G7v z^;slTpa3M!Ai5m3-uvLFADZ7t2B@4DV-=U17-RQL}2L(p(O;L ziH2PX3rHe@Fmo5XEa(WNpMy0Q1$$aZ)0o9;+}@nBAXY$+1)&feCb&f6(8KpIndj6K qkv0!lN}&5XSF#|jGo|33h}vJPJl(QOt00000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000dANklNeTrp1B zmAJ}Dp^Y6WFRCChF_8@gBsL(hRJK!jR1p%##3Td=AOjWw5d=a=XjgA(rCsfNW@lz+ zrXTm-{4u?&kq{4SXIDuvRkylpW_o(QKKGnH=XY)kYb_tAm*ivi`q%+G=X;oeG~rlx-!T%Jus+ivx`A-bKuq(E14oCt0zyOd2hT_jE3SHr#rEegNmNv|uMzG*=e)XX?d_QE>{0aQ< ztMhsIt{X@uJs!B{8AWpWtr)+F?Djn|a4nFGr@A~VqK9KSy+;9TufSRw=gpxr3xOYj zg;(~bx%R$2{Ium_?!SF4fi^sJ-+w7;R^5n=YRJ8|52ymXIG7Csj|=qq0~?V+==0CC zgg69{I(7nMH1is&Nw_MG(vseEz^z;N^TM7qcmLV-eC?apgKs3YYgbac@={C1%N z_K%0zzCXpEd~+?o^?Pd}u#(!fD=q}|`2!mXmiutzgQi&I;Pcx#)!s?1E1B<=BGNGQ zKqlmmA3w^g2hz0Mb}gU(-8B#xLG9XcxAf?%rH=1x6pq?#f`B70?V#smH#Jf)SA=-O z@y3-5WJB)!>2dz&P@1oQ{nLErt7{-aGGW~cYOfkM=!%qww&Ob+l_wuHQN*zwZ_(G? zOO>#EA}ZoqQ~HmtBs~!fD4FaKUKlVn)msKF$P_d`-rhxPM~>@1 zw~UoHE<;->-ASKW;Z9tA$yh;G%))BUUBl2}VgI)_C}FlpV@S7mkjocwe4nQ7PE;6z zl%NE;g66Ruy&UWsV%4u-&abSy9D@+f)SH%jO{>Sm(iPRT+k5t z-Mtk25Vu&Mv7;Ro_#@CmMa>g$_H(2=&+>IkS+aU5Rw&_3zj?XWw5Hlw3cFOkYZ#}LwP0~JBsvAL+6W{XWkj0y|=(6tCuiu{@|OSK6|dJ-9{*rB$Z?Dq)_RDGfusaz71W;D6=i<*H6z{J?vlga{E zxolKf#bd$E>p*}Bhp?uUPzXfn`W6HtFF<7wXas_qnUC4dC%;^}Wp%#s7j?5&uf}re zgyzY}t1d%MnM~0SDIzHbhRBql2Zth>5+2e^;#B7xuU;noKB{7Aw-^h68DOwX1(mV> zT{+;IsZD@D7d@;APirxvJYM=>BLo5kO#0GKY~SNwGxxYpF_lx*8t*7 z#nozn*Jaix=aQUUkMBpgNr|ICN>TbH3t8Wy0Mna7NI{f2oDNg_Gi7ZY zRo2;%?;{9~X>aL+lak18R>ro-q|3q;b7`2~fbU0mLQxDQQfLGQYc1NA=4^Fp0Gk;C zf*^bB*^VgJS&T2|aN8y-+czJkYmXbSYvg93ZHr2}Tz2(brp#&}3^WO$@I#A|1|e*z z(`F&G0;exUBAvx3Vbi<+{y;c*EMEp$jQuqq`*AVuU_=)j*hg*Fh88#Jux!;_X3lQJ zL>i+MK_qdM0a5A{Xak{vptB#7$zl~|VAqdYbL}tp#;{@Bm&(Rni&Px2axrvygKqqR zBk69|RV`rtF?g6#vk%Yb{! ztn0sDvN5I>7Lj=v#Cqkq)Xi$3y0MBN)I>@VYKtFPhI~UYEctAt;oZHx96OT6afIo5 z?a{W>{-?V?0QOWo%BOO9bhhILEDW2KkS*2~*rpm}O@bgWgcAHn;D#k@YGYASV1V84 z^l|7=8s!Re>XnCE2il(M`6Xe0slIZ>fE9AHlA^^3$R-nbu0s%Ld3p9S77>lis=BQFzws^rmb(!&$`D8c2vOGQ?--pn*BSh5tu}hbUt@FyE2x1 zpb^-(5U_;WqK7~gG*TIJ{Du45df)lCafKb#ec11AxK6oZhDsz*36DUVGm5exvgCY2 z&NpNV8s%HO5QM@U-*$g%&)ZLoJM5@{r(HcT!x|6aICvNm^1UT!s4dx|ra>y|9Tz0# z*mL)`_UwA1=R&}aQqxie zu%q%}NAm_sMMfAW)zgnX(TOWv!scf1Jjmsk)jW~8jWtA3XbwNUskQ6PpIlJbQCYZi zS>w+9l;o31H^GD%%@m40;l5UQ@nz(W*O^zXm_KJa2F#(SHoe=m^IwL2c6j;W;5lHs z#}XDsv-A*H@bmt;bN)N^pQhSfTo}re>gd8+OJnmCY8odH77Nkgr@p)MBPirpuOtvg)6_nf1|s~Bu$SJR&P2!MKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000zLUB|z_-&*@J_j9#lJ8^>TTxzFHi=gG!s!%`zA)Y}zB3{bB z#0wIy6+G|+NG(z&0tiS;)6`Ba z@4oh-+y8wV|4%P!9C^oaeXh2ytyl9iq;U+5(@4DXn<1V8k$G_3s9G~)NH~j0D9}++)#bJww3i;iyP-?SOe={5bQ2Uy>-3|d|Tlr ztXr-1IqkR?uYUo4yA2(!;C3CGiZ^|^sjh1*+kmAlbprs>zW~2&s@jB$S1a0DO{HlI zz&Akc>OE!)R6f(7_4ey;@4SBJ2X{Wsl-Fh(H&(J*O?chmPV2V5bN#3Or_&C#lOMYu zpLzJT`L1Ej4zq6tHT8cMr7wWx9k5AbrK@Xc6S@jj^26y5|6o#%zpO)a@9608Z)P+b z3&es@tzgwwP{URP|Lje=0lLp`Rl{$as-}(AS{)MrF@ch#O26<@>zBUtYUj1~S^oI* z?>&C^FRvXx|E;MW|4$$(K`22_sk;V@R#u?a(VKP@9`qUc>^{(FOVL(iwHv@GfTZo) zm!Fd>e|DvP5E0IcG2VIf_O##a|NT%8|3j2yq$r0V2O|fN11JELjb#8Bb^6WI z?VH?n{nxE}8@F@tje)0GUTItqBH$4z;{uiBUTpdID&wcW`ZWHD=oFhZ`F=&h4%n&2d-^} z;|qdR7eH5u8n~tZl^d6D^xA0~%VdF6r_ikHK;;~qbaO%J*F&OAc|^JUYqd-)>-65fz0HXFX#C1>_bTx>9AUs5GSdKv_v6cgjgb|P!PDy zffACY!g@!mwkz^(ParN*SnW}`(*W)fsGFGNh12Bn%a_`hm1|j0%!pK-g1qza)*DVZ``=@OGztDF^i{Y=@t}J4Qo6i9U-`YvMk|)$7C_ZY%#_7{M@Nr zPpvlskANU`t0-jYqu$sx>ubHII7qe%gniKT34zn54-2H1PxCMQ>giW{gLHsdGDD&h zXwnESz}p(uI}cMChzKT&31*8KhU1~6WjZZvZV_N1QUX+fB!fZ*O$8#VC?N+$juP_N z^3#1COtVLgeoKG#8#?Ge^$72MPyXw#<}xp~zJmyxF~V<#Oi|+r&ag z8k#i337mC^b&TKwOjY;vvuuv>e1hq60_4c5qAcNIB}fS%gTfq4Gm2?WF)g{x1tny- z#kQ&Nb|tl|lSu$1hd8=?*WdkeJG9Bc-#C!NKlkMSHbYi!C8b>oZ&W5wCke^1cG0aH zr#EzxB(*847T^Kr+(ubzEC`Hcxxi>PLSE*WoKH+t>Sb_Z#Y-iE41^geOc2wU+dNS{ zUT~KSZnJ4N54(Wl9i?CTIo$sBGdlZ?FX>-?@tVE{D^}ev@82q`@=rv|Kjz3P5QPbgU}GKEDjNqTg>iL`yXSZDljTp~hCU2j ze{M`=;G~iu8GtzyO(?=SwP?&8p7B5}RZkV%VoNc(ZQ$*S=&6pTFa75p@uT1RYVx%g zK9|0RR+M7lGiXw*G+%#f{$GFGiMnrQoMn4d-nfes$97_$zkPgXaF`w?C?hlr{ zEFcijQ^m*Xdmu_oG8pK=^DhowQk)R1wumHx_Z~@Oqk!Xk)kS4rYzKI9Y0TrJzVJ#&9u{2&8@XotW@yG0GWbt z4oxFUdB`oEa8E5Mp^_9;6w^92t;f2eceI2WfWCq&FMY@#{_*c6zklV8_7`y4K85J| z|FzRL3Mn8Y&^?WI*}_eK6X7IuzWe06uO0Uef3(ocC4(hU2(^7P#k2V4Yp0*<9>xb) z#tSGg;DLK|4|j{ZaFqiw0S1st;7bo*IM5U_@PoOjDkGIt;v|zGGYH0rXhbQUQ=2B- z%&U9qF93xec!!3M!CDf^OPDg$hfzgo+eODN#vHd$x*l*I@TzqMCLN6SRqgV1;Pw-w5g3(`BiA8lYe~YA6~wFbbEYvdN=)p*Z;74 z(mKKW@*du--ozqWfLskrs-bKM@VSS}9eBo}>)Ufv84HV2ykzj0t^9T!m8ab1Id?gy zluC-o?10^D&8X9Fo*r+Sgn&eXBz^P;Vnx00-hb(U4_Fcb5y6Rtjx{Q&O&Ss4*~5^5 zC5ylTGp-AW%jqRNH@Kp|bNAcb-+B2P>C4A2^ZW81{;B#Wlu-%tRGYCPu;a}JNhk$w z=^*nU2j+0$a$Aa#Dp<+H%M^qmm>yG$&bZA()l=u(<%R02oFb|k`%6vV-847q^qZ$g zn{*_I;SoQ{&RkiP^ULzw;Rkql+Eaa=`#It`1^`r{0!0K-0<-#Yc2qu_Ngeo9`Pb_v5V%x1S>|$O$uU+DW(x6T$^&27Zg)LnheE1W6H7xy_tACy~i35#EOR# zZ%ga$XZPQI;pBSz9lUe(#leeQ4N5=*UGCH-$N`3GXutYlCQwlL01xrQ>TSH0zlA~< z_3e}Z>AHC%vx>|CkV4=x2h2r!p*OdcF=Dn-kfsqL8d94k+~Gwd1)0W9VzbbYt;Zvv ze`eb;z(8Omz#xe6&Q~8ie(>ahQDQMeo zpDKQIbN5_C925))B^V`$azJt)LjK|TPd|K)uJL>F{_*w8*QtWRu^ge@YJzXrq>{a#oy_66zF0jC0a7q?FFN!_!p? z%2%drcbKy5Qgz3NBYb>Np+&hpsLFX<~oTB zfrN0sypMm${spAyBV|_sifnDhBm{DVPz1Q#f#wwYp+EJdt6)%wl_i{v!FYn09&<{M zxvS1qPffUP4oZrt+EZZ2c64q6w>L#cfFdTY=R!~run05+L;?+n%1q`D_&^PdVXD)J zEG(D^5k+8OjLZn%&A$s#Qk!l?V9g*`!!t7&3^;<60WR|h3oipZScJkCs}!^pFH-;` zXnIU3opFbssO}~O70;4_wqctl?EyH_WW4+6~ykr0$v(eU6P!cXRBbc#zj z`{426$@8ZyAwU9

g>w|AwFf*fPXO{Tpm;%B)ty5C^~td|ubeX_=N{LLN*o!GuB_ z77&cV7*UMTroiZN#$7HNe(QIba@YmB%ZC|&B}FU{UKySSu>yp^fy96iKoWq_e28P5 z$mrqdke(+Mj9{dPSj3Bsnut~!c!1(MC6Olt8{i8MS9qv}axIrGT;+@yDa6SFf++}N zifBj)kGRDX?(mXgT9=L&Ra1M_Z33^dVr|+hXvJU_777#y%mfI*3B&_I1f%&-j(aCE zdN4XlFDL3J$xontJvgU`>N?r4n$4B5i4*vu&bP7%q3;i7zVww;Qi+uu9y1|~NnwbX zMymCmGi{H3?n`k}h?k`VnUcZ?ik?t}y2tJDT=i75 zbaXo=7@r7s4UA6!4N@c!4h#ta!9&Qyixr3!Cw4lU*>2gh@N|7SSSCS*+6PvVIUdCe znaM(|RPs?%a1MnUHrZ5D3u;lh<+m4AQ+QV3_2agF&u-u*Adn&vFQAkJj6gyjft`e4 z5MW`Yf)}%x&8lA2Gh*dN)?Kzl>d3CnsnBO?C^l3QBo|;#gfSuviD^g)4Y|t`Zqb4g zx@dawsnlHqH{aZZcDufSmC}J?3M}k`1V^4Mycn^l#KMS2HJ{8)JMUC-9A3%VS(i%q zeV_mcq$mg^P(q%C zJpx<^sK`o1Mk*00#Y?#u&#QjXH{GM|bvJe8;(R_8h(o{<3KIZBis%dqPk3ETb<~oQ zO_18G(+$eirCvpzx$Ah!e*NTLKIM zO0iN=B~>U<3ZZ~U8EnYKN?V+eKuRc@k)kK0=nNW9xW{82s5y7I;FK#$eg=4F3i_n# zHi174bN~=YlM{%ege`Yr#EB6rrIb=g5egv`5G*C2jQ|!w#f%vUXV4f@%42TPl)Id( zo+>HXJwX3?{B|Gkvp{b@a2-}kdl7M*l0}azc$88~8450uha8MK2&+kfRKm1iP3M&G zSao^AU6pZ{D+%HV=pcIt7J@ zVk(IMcuKfb2dY#9&efr=xXYH?y!UU7J}cOZfG>h>HW}-i+C14q3As=N#eFu~XakQD z+G|=uizTemnpFcf`jWQ#R6FkQF2J9wqWUzz`=HV2p{4OhQJXG{TkOIzusTu>5LN?b zKV=G~fEa-XDo{*8pJ*puu*ZBqQ_yDx-iDS2Sh(OZW8yB?orYBe0P0vb?L;Jqr~?&t h1Ven*e%pNg?*MO?*X331KJ@?q002ovPDHLkV1f>b5N!Ye literal 0 HcmV?d00001 diff --git a/Mage.Client/src/main/resources/dlg/dlg.ok.png b/Mage.Client/src/main/resources/dlg/dlg.ok.png new file mode 100644 index 0000000000000000000000000000000000000000..17a992a7fce884b686cadd2f0ae5d19feb60c04b GIT binary patch literal 6901 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 literal 0 HcmV?d00001 diff --git a/Mage.Client/src/main/resources/dlg/dlg.prev.hover.png b/Mage.Client/src/main/resources/dlg/dlg.prev.hover.png new file mode 100644 index 0000000000000000000000000000000000000000..3247784eed0250fb55f43f4123ada193974c5d50 GIT binary patch literal 7374 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 Ah5!Hn literal 0 HcmV?d00001 diff --git a/Mage.Client/src/main/resources/dlg/dlg.prev.png b/Mage.Client/src/main/resources/dlg/dlg.prev.png new file mode 100644 index 0000000000000000000000000000000000000000..fca4c220956868228542831033eb24ebe695a9d1 GIT binary patch literal 6194 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 oCZ`3QXt$|7! zxVB1BTO1Ehr0}!=Pt$7>no194Qg1hN^}s)0p=Dp=*Il+EimTv2wL%x~M;QIo^%;I|Ez`U0Zdi)}E?S zl&UGhO>H}znPS>mg08An?WwE{DykMRbszqn1g?dSrff4}%ICbFy3_v;03Dssh0_`h Q%m4rY07*qoM6N<$f>n6jh5!Hn literal 0 HcmV?d00001 diff --git a/Mage.Common/src/mage/view/CardView.java b/Mage.Common/src/mage/view/CardView.java index c17f90a0281..0d186d3804c 100644 --- a/Mage.Common/src/mage/view/CardView.java +++ b/Mage.Common/src/mage/view/CardView.java @@ -77,6 +77,7 @@ public class CardView extends SimpleCardView { protected List targets; protected UUID pairedCard; + protected boolean paid; public CardView(Card card, UUID cardId) { this(card); @@ -389,4 +390,12 @@ public class CardView extends SimpleCardView { public int getType() { return type; } + + public boolean isPaid() { + return paid; + } + + public void setPaid(boolean paid) { + this.paid = paid; + } } diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java index 7a6023c616a..1770340ccab 100644 --- a/Mage.Common/src/mage/view/GameView.java +++ b/Mage.Common/src/mage/view/GameView.java @@ -32,6 +32,7 @@ import mage.Constants; import mage.Constants.PhaseStep; import mage.Constants.TurnPhase; import mage.MageObject; +import mage.abilities.costs.Cost; import mage.cards.Card; import mage.game.ExileZone; import mage.game.Game; @@ -90,6 +91,7 @@ public class GameView implements Serializable { if (card.canTransform()) { updateLatestCardView(game, card, stackObject.getId()); } + checkPaid(stackObject.getId(), (StackAbility)stackObject); } else if (object != null) { StackAbility stackAbility = ((StackAbility)object); stackAbility.newId(); @@ -103,10 +105,12 @@ public class GameView implements Serializable { } stack.put(stackObject.getId(), new CardView(stackAbility)); + checkPaid(stackObject.getId(), stackAbility); } } else { stack.put(stackObject.getId(), new CardView((Spell)stackObject)); + checkPaid(stackObject.getId(), (Spell)stackObject); } //stackOrder.add(stackObject.getId()); } @@ -134,6 +138,31 @@ public class GameView implements Serializable { this.special = state.getSpecialActions().getControlledBy(state.getPriorityPlayerId()).size() > 0; } + private void checkPaid(UUID uuid, StackAbility stackAbility) { + for (Cost cost : stackAbility.getManaCostsToPay()) { + if (!cost.isPaid()) { + return; + } + } + CardView cardView = stack.get(uuid); + cardView.paid = true; + } + + private void checkPaid(UUID uuid, Spell spell) { + for (Cost cost : spell.getSpellAbility().getManaCostsToPay()) { + if (!cost.isPaid()) { + return; + } + } + CardView cardView = stack.get(uuid); + cardView.paid = true; + } + + private void setPaid(UUID uuid) { + CardView cardView = stack.get(uuid); + cardView.paid = true; + } + private void updateLatestCardView(Game game, Card card, UUID stackId) { if (!card.canTransform()) { return;