From 0c53c8918a2e23fa6f1a30c38433c52b32f778c5 Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Sun, 27 Nov 2022 13:00:34 +0100 Subject: [PATCH] Improved conductivity tracking of Terminal Strip --- .../src/org/diylc/netlist/NetlistBuilder.java | 1 - .../src/org/diylc/presenter/update.xml | 4 + diylc/diylc-library/lib/diylc-core.jar | Bin 390540 -> 390379 bytes .../components/boards/TerminalStrip.java | 845 +++++++++--------- diylc/diylc-swing/lib/diylc-core.jar | Bin 390540 -> 390379 bytes diylc/diylc-swing/library/main.jar | Bin 906962 -> 907041 bytes 6 files changed, 435 insertions(+), 415 deletions(-) diff --git a/diylc/diylc-core/src/org/diylc/netlist/NetlistBuilder.java b/diylc/diylc-core/src/org/diylc/netlist/NetlistBuilder.java index 6acfa74e..a7818f55 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/NetlistBuilder.java +++ b/diylc/diylc-core/src/org/diylc/netlist/NetlistBuilder.java @@ -22,7 +22,6 @@ import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index a5668f5f..ee4719cb 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -4194,6 +4194,10 @@ IMPROVEMENT Potentiometer bodies are no longer considered as conductive surfaces to avoid unwanted shorts + + IMPROVEMENT + Improved conductivity tracking of Terminal Strip + BUG_FIX Do not apply any user-default property values when creating a standard datasheet model (e.g. a capacitor) diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 8cebd825a265679ec2ad6153b8a4f28e3603b72b..55f2232be95dd592036dfaebf82bff422b6e4486 100644 GIT binary patch delta 15189 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 delta 15250 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 qY#oYKSlvs*SK8W{nVeFoKN^J8E&;r{^kphfNg diff --git a/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java index 713a2814..8793416f 100644 --- a/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java +++ b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java @@ -1,26 +1,23 @@ /* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + * + */ +package org.diylc.components.boards; - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. - - This file is part of DIYLC. - - DIYLC is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DIYLC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with DIYLC. If not, see . - -*/ -package org.diylc.components.boards; - import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Composite; @@ -49,399 +46,419 @@ import org.diylc.core.annotations.PositiveNonZeroMeasureValidator; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; - -@ComponentDescriptor(name = "Terminal Strip", author = "Branislav Stojkovic", category = "Boards", - instanceNamePrefix = "TS", description = "Row of terminals for point-to-point construction", - zOrder = IDIYComponent.BOARD, keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, transformer = TerminalStripTransformer.class) -public class TerminalStrip extends AbstractTransparentComponent implements IContinuity { - - private static final long serialVersionUID = 1L; - - public static Color BOARD_COLOR = PHENOLIC_DARK_COLOR; - public static Color TERMINAL_COLOR = Color.lightGray; - public static Color TERMINAL_BORDER_COLOR = TERMINAL_COLOR.darker(); - public static int EDGE_RADIUS = 2; - public static Size HOLE_SIZE = new Size(0.06d, SizeUnit.in); - public static Size MOUNTING_HOLE_SIZE = new Size(0.07d, SizeUnit.in); - - private String value = ""; - private Orientation orientation = Orientation.DEFAULT; - private int terminalCount = 10; - private Size boardWidth = new Size(0.35d, SizeUnit.in); - private Size terminalSpacing = new Size(0.25d, SizeUnit.in); - private Size holeSpacing = new Size(0.5d, SizeUnit.in); - private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0)}; + +@ComponentDescriptor(name = "Terminal Strip", author = "Branislav Stojkovic", category = "Boards", + instanceNamePrefix = "TS", description = "Row of terminals for point-to-point construction", + zOrder = IDIYComponent.BOARD, keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, + transformer = TerminalStripTransformer.class) +public class TerminalStrip extends AbstractTransparentComponent implements IContinuity { + + private static final long serialVersionUID = 1L; + + public static Color BOARD_COLOR = PHENOLIC_DARK_COLOR; + public static Color TERMINAL_COLOR = Color.lightGray; + public static Color TERMINAL_BORDER_COLOR = TERMINAL_COLOR.darker(); + public static int EDGE_RADIUS = 2; + public static Size HOLE_SIZE = new Size(0.06d, SizeUnit.in); + public static Size MOUNTING_HOLE_SIZE = new Size(0.07d, SizeUnit.in); + + private String value = ""; + private Orientation orientation = Orientation.DEFAULT; + private int terminalCount = 10; + private Size boardWidth = new Size(0.35d, SizeUnit.in); + private Size terminalSpacing = new Size(0.25d, SizeUnit.in); + private Size holeSpacing = new Size(0.5d, SizeUnit.in); + private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0)}; private Color boardColor = BOARD_COLOR; @SuppressWarnings("unused") - @Deprecated - private transient Color borderColor; - private boolean centerHole = false; - - transient private Area[] body; - - public TerminalStrip() { - super(); - updateControlPoints(); - } - - @EditableProperty - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - @EditableProperty - public Orientation getOrientation() { - return orientation; - } - - public void setOrientation(Orientation orientation) { - this.orientation = orientation; - updateControlPoints(); - // Reset body shape. - body = null; - } - - @EditableProperty(name = "Terminals") - public int getTerminalCount() { - return terminalCount; - } - - public void setTerminalCount(int terminalCount) { - this.terminalCount = terminalCount; - updateControlPoints(); - // Reset body shape; - body = null; - } - - @EditableProperty(name = "Terminal Spacing", validatorClass = PositiveNonZeroMeasureValidator.class) - public Size getTerminalSpacing() { - return terminalSpacing; - } - - public void setTerminalSpacing(Size pinSpacing) { - this.terminalSpacing = pinSpacing; - updateControlPoints(); - // Reset body shape; - body = null; - } - - @EditableProperty(name = "Hole Spacing", validatorClass = PositiveNonZeroMeasureValidator.class) - public Size getHoleSpacing() { - return holeSpacing; - } - - public void setHoleSpacing(Size rowSpacing) { - this.holeSpacing = rowSpacing; - updateControlPoints(); - // Reset body shape; - body = null; - } - - @EditableProperty(name = "Center Terminal") - public boolean getCenterHole() { - return centerHole; - } - - public void setCenterHole(boolean centerHole) { - this.centerHole = centerHole; - updateControlPoints(); - // Reset body shape; - body = null; - } - - @EditableProperty(name = "Board Width", validatorClass = PositiveNonZeroMeasureValidator.class) - public Size getBoardWidth() { - return boardWidth; - } - - public void setBoardWidth(Size boardWidth) { - this.boardWidth = boardWidth; - // Reset body shape; - body = null; - } - - @Override - public int getControlPointCount() { - return controlPoints.length; - } - - @Override - public Point2D getControlPoint(int index) { - return controlPoints[index]; - } - - @Override - public boolean isControlPointSticky(int index) { - return true; - } - - @Override - public VisibilityPolicy getControlPointVisibilityPolicy(int index) { - return VisibilityPolicy.NEVER; - } - - @Override - public void setControlPoint(Point2D point, int index) { - controlPoints[index].setLocation(point); - body = null; - } - - private void updateControlPoints() { - Point2D firstPoint = controlPoints[0]; - controlPoints = new Point2D[getTerminalCount() * (getCenterHole() ? 3 : 2)]; - controlPoints[0] = firstPoint; - int pinSpacing = (int) this.terminalSpacing.convertToPixels(); - int rowSpacing = (int) this.holeSpacing.convertToPixels(); - // Update control points. - int dx1; - int dy1; - int dx2; - int dy2; - int cx; - int cy; - for (int i = 0; i < getTerminalCount(); i++) { - switch (orientation) { - case DEFAULT: - dx1 = 0; - dy1 = i * pinSpacing; - dx2 = rowSpacing; - dy2 = i * pinSpacing; - cx = rowSpacing / 2; - cy = i * pinSpacing; - break; - case _90: - dx1 = -i * pinSpacing; - dy1 = 0; - dx2 = -i * pinSpacing; - dy2 = rowSpacing; - cx = -i * pinSpacing; - cy = rowSpacing / 2; - break; - case _180: - dx1 = 0; - dy1 = -i * pinSpacing; - dx2 = -rowSpacing; - dy2 = -i * pinSpacing; - cx = -rowSpacing / 2; - cy = -i * pinSpacing; - break; - case _270: - dx1 = i * pinSpacing; - dy1 = 0; - dx2 = i * pinSpacing; - dy2 = -rowSpacing; - cx = i * pinSpacing; - cy = -rowSpacing / 2; - break; - default: - throw new RuntimeException("Unexpected orientation: " + orientation); - } - controlPoints[i] = new Point2D.Double(firstPoint.getX() + dx1, firstPoint.getY() + dy1); - controlPoints[i + getTerminalCount()] = new Point2D.Double(firstPoint.getX() + dx2, firstPoint.getY() + dy2); - if (centerHole) - controlPoints[i + 2 * getTerminalCount()] = new Point2D.Double(firstPoint.getX() + cx, firstPoint.getY() + cy); - } - } - - public Area[] getBody() { - if (body == null) { - body = new Area[1 + getTerminalCount()]; - double x = controlPoints[0].getX(); - double y = controlPoints[0].getY(); - int width; - int height; - int holeSize = (int) HOLE_SIZE.convertToPixels(); - int terminalSpacing = (int) getTerminalSpacing().convertToPixels(); - int holeSpacing = (int) getHoleSpacing().convertToPixels(); - int boardWidth = (int) getBoardWidth().convertToPixels(); - int boardLength = (getTerminalCount() - 1) * terminalSpacing + 2 * boardWidth; - Area indentation = null; - - int mountingHoleSize = getClosestOdd(MOUNTING_HOLE_SIZE.convertToPixels()); - switch (orientation) { - case DEFAULT: - width = boardWidth; - height = boardLength; - x += holeSpacing / 2 - boardWidth / 2; - y -= boardWidth; - indentation = - new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize / 2, y + boardWidth / 2 - - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize)); - indentation.add(new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize / 2, y + boardLength - - boardWidth / 2, mountingHoleSize, mountingHoleSize))); - break; - case _90: - width = boardLength; - height = boardWidth; - x += boardWidth - boardLength; - y += holeSpacing / 2 - boardWidth / 2; - indentation = - new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize, y + boardWidth / 2 - - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize)); - indentation.add(new Area(new Ellipse2D.Double(x + boardLength - boardWidth / 2, y + boardWidth / 2 - - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize))); - break; - case _180: - width = boardWidth; - height = boardLength; - x -= holeSpacing / 2 + boardWidth / 2; - y += boardWidth - boardLength; - indentation = - new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize / 2, y + boardWidth / 2 - - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize)); - indentation.add(new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize / 2, y + boardLength - - boardWidth / 2, mountingHoleSize, mountingHoleSize))); - break; - case _270: - width = boardLength; - height = boardWidth; - x -= boardWidth; - y -= holeSpacing / 2 + boardWidth / 2; - indentation = - new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize, y + boardWidth / 2 - - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize)); - indentation.add(new Area(new Ellipse2D.Double(x + boardLength - boardWidth / 2, y + boardWidth / 2 - - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize))); - break; - default: - throw new RuntimeException("Unexpected orientation: " + orientation); - } - Area bodyArea = new Area(new RoundRectangle2D.Double(x, y, width, height, EDGE_RADIUS, EDGE_RADIUS)); - bodyArea.subtract(indentation); - body[0] = bodyArea; - - - for (int i = 0; i < getTerminalCount(); i++) { - Point2D p1 = getControlPoint(i); - Point2D p2 = getControlPoint(i + getTerminalCount()); - if (p2.getX() < p1.getX() || p2.getY() < p1.getY()) { - Point2D p = p1; - p1 = p2; - p2 = p; - } - - Area terminal = - new Area(new RoundRectangle2D.Double(p1.getX() - holeSize, p1.getY() - holeSize, p2.getX() - p1.getX() + holeSize * 2, p2.getY() - - p1.getY() + holeSize * 2, holeSize, holeSize)); - - terminal.subtract(new Area(new Ellipse2D.Double(p1.getX() - holeSize / 2, p1.getY() - holeSize / 2, holeSize, holeSize))); - terminal.subtract(new Area(new Ellipse2D.Double(p2.getX() - holeSize / 2, p2.getY() - holeSize / 2, holeSize, holeSize))); - if (centerHole) { - Point2D p3 = getControlPoint(i + 2 * getTerminalCount()); - Area centerHole = - new Area(new Ellipse2D.Double(p3.getX() - holeSize / 2, p3.getY() - holeSize / 2, holeSize, holeSize)); - terminal.subtract(centerHole); - bodyArea.subtract(centerHole); - } - - body[1 + i] = terminal; - } - - } - return body; - } - - @Override - public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, - IDrawingObserver drawingObserver) { - if (checkPointsClipped(g2d.getClip())) { - return; - } - Area[] body = getBody(); - Area mainArea = getBody()[0]; - - Composite oldComposite = g2d.getComposite(); - if (alpha < MAX_ALPHA) { - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); - } - g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : getBoardColor()); - g2d.fill(mainArea); - - Color finalBorderColor; - if (outlineMode) { - Theme theme = - (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); - finalBorderColor = - componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : theme.getOutlineColor(); - } else { - finalBorderColor = - componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : getBoardColor().darker(); - } - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); - - g2d.setColor(finalBorderColor); - g2d.draw(mainArea); - - g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : TERMINAL_COLOR); - drawingObserver.startTrackingContinuityArea(true); - for (int i = 1; i < body.length; i++) - g2d.fill(body[i]); - drawingObserver.stopTrackingContinuityArea(); - - Color finalTerminalBorderColor; - if (outlineMode) { - Theme theme = - (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); - finalTerminalBorderColor = - componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : theme.getOutlineColor(); - } else { - finalTerminalBorderColor = - componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : TERMINAL_BORDER_COLOR; - } - - g2d.setColor(finalTerminalBorderColor); - for (int i = 1; i < body.length; i++) - g2d.draw(body[i]); - - g2d.setComposite(oldComposite); - } - - @Override - public void drawIcon(Graphics2D g2d, int width, int height) { - int radius = 6 * width / 32; - int holeSize = 3 * width / 32; - g2d.setColor(BOARD_COLOR); - g2d.fillRect(width / 4, 1, width / 2, height - 4); - g2d.setColor(BOARD_COLOR.darker()); - g2d.drawRect(width / 4, 1, width / 2, height - 4); - int terminalSize = getClosestOdd(height / 5); - Area terminal = - new Area(new RoundRectangle2D.Double(2 * width / 32, height / 5, width - 4 * width / 32, terminalSize, radius, - radius)); - terminal.subtract(new Area(new Ellipse2D.Double(2 * width / 32 + holeSize, height * 3 / 10 - holeSize / 2, holeSize, holeSize))); - terminal.subtract(new Area(new Ellipse2D.Double(width - 2 * width / 32 - holeSize * 2, height * 3 / 10 - holeSize / 2, holeSize, holeSize))); - - g2d.setColor(TERMINAL_COLOR); - g2d.fill(terminal); - g2d.setColor(TERMINAL_BORDER_COLOR); - g2d.draw(terminal); - g2d.translate(0, height * 2 / 5); - g2d.setColor(TERMINAL_COLOR); - g2d.fill(terminal); - g2d.setColor(TERMINAL_BORDER_COLOR); - g2d.draw(terminal); - } - - @EditableProperty(name = "Board") - public Color getBoardColor() { - if (boardColor == null) { - boardColor = BOARD_COLOR; - } - return boardColor; - } - - public void setBoardColor(Color bodyColor) { - this.boardColor = bodyColor; + @Deprecated + private transient Color borderColor; + private boolean centerHole = false; + + transient private Area[] body; + + public TerminalStrip() { + super(); + updateControlPoints(); } - + + @EditableProperty + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + // Reset body shape. + body = null; + } + + @EditableProperty(name = "Terminals") + public int getTerminalCount() { + return terminalCount; + } + + public void setTerminalCount(int terminalCount) { + this.terminalCount = terminalCount; + updateControlPoints(); + // Reset body shape; + body = null; + } + + @EditableProperty(name = "Terminal Spacing", + validatorClass = PositiveNonZeroMeasureValidator.class) + public Size getTerminalSpacing() { + return terminalSpacing; + } + + public void setTerminalSpacing(Size pinSpacing) { + this.terminalSpacing = pinSpacing; + updateControlPoints(); + // Reset body shape; + body = null; + } + + @EditableProperty(name = "Hole Spacing", validatorClass = PositiveNonZeroMeasureValidator.class) + public Size getHoleSpacing() { + return holeSpacing; + } + + public void setHoleSpacing(Size rowSpacing) { + this.holeSpacing = rowSpacing; + updateControlPoints(); + // Reset body shape; + body = null; + } + + @EditableProperty(name = "Center Terminal") + public boolean getCenterHole() { + return centerHole; + } + + public void setCenterHole(boolean centerHole) { + this.centerHole = centerHole; + updateControlPoints(); + // Reset body shape; + body = null; + } + + @EditableProperty(name = "Board Width", validatorClass = PositiveNonZeroMeasureValidator.class) + public Size getBoardWidth() { + return boardWidth; + } + + public void setBoardWidth(Size boardWidth) { + this.boardWidth = boardWidth; + // Reset body shape; + body = null; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public Point2D getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + public void setControlPoint(Point2D point, int index) { + controlPoints[index].setLocation(point); + body = null; + } + + private void updateControlPoints() { + Point2D firstPoint = controlPoints[0]; + controlPoints = new Point2D[getTerminalCount() * (getCenterHole() ? 3 : 2)]; + controlPoints[0] = firstPoint; + int pinSpacing = (int) this.terminalSpacing.convertToPixels(); + int rowSpacing = (int) this.holeSpacing.convertToPixels(); + // Update control points. + int dx1; + int dy1; + int dx2; + int dy2; + int cx; + int cy; + for (int i = 0; i < getTerminalCount(); i++) { + switch (orientation) { + case DEFAULT: + dx1 = 0; + dy1 = i * pinSpacing; + dx2 = rowSpacing; + dy2 = i * pinSpacing; + cx = rowSpacing / 2; + cy = i * pinSpacing; + break; + case _90: + dx1 = -i * pinSpacing; + dy1 = 0; + dx2 = -i * pinSpacing; + dy2 = rowSpacing; + cx = -i * pinSpacing; + cy = rowSpacing / 2; + break; + case _180: + dx1 = 0; + dy1 = -i * pinSpacing; + dx2 = -rowSpacing; + dy2 = -i * pinSpacing; + cx = -rowSpacing / 2; + cy = -i * pinSpacing; + break; + case _270: + dx1 = i * pinSpacing; + dy1 = 0; + dx2 = i * pinSpacing; + dy2 = -rowSpacing; + cx = i * pinSpacing; + cy = -rowSpacing / 2; + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + controlPoints[i] = new Point2D.Double(firstPoint.getX() + dx1, firstPoint.getY() + dy1); + controlPoints[i + getTerminalCount()] = + new Point2D.Double(firstPoint.getX() + dx2, firstPoint.getY() + dy2); + if (centerHole) + controlPoints[i + 2 * getTerminalCount()] = + new Point2D.Double(firstPoint.getX() + cx, firstPoint.getY() + cy); + } + } + + public Area[] getBody() { + if (body == null) { + body = new Area[1 + getTerminalCount() * 2]; + double x = controlPoints[0].getX(); + double y = controlPoints[0].getY(); + int width; + int height; + int holeSize = (int) HOLE_SIZE.convertToPixels(); + int terminalSpacing = (int) getTerminalSpacing().convertToPixels(); + int holeSpacing = (int) getHoleSpacing().convertToPixels(); + int boardWidth = (int) getBoardWidth().convertToPixels(); + int boardLength = (getTerminalCount() - 1) * terminalSpacing + 2 * boardWidth; + Area indentation = null; + + int mountingHoleSize = getClosestOdd(MOUNTING_HOLE_SIZE.convertToPixels()); + switch (orientation) { + case DEFAULT: + width = boardWidth; + height = boardLength; + x += holeSpacing / 2 - boardWidth / 2; + y -= boardWidth; + indentation = new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize / 2, + y + boardWidth / 2 - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize)); + indentation.add(new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize / 2, + y + boardLength - boardWidth / 2, mountingHoleSize, mountingHoleSize))); + break; + case _90: + width = boardLength; + height = boardWidth; + x += boardWidth - boardLength; + y += holeSpacing / 2 - boardWidth / 2; + indentation = new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize, + y + boardWidth / 2 - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize)); + indentation.add(new Area(new Ellipse2D.Double(x + boardLength - boardWidth / 2, + y + boardWidth / 2 - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize))); + break; + case _180: + width = boardWidth; + height = boardLength; + x -= holeSpacing / 2 + boardWidth / 2; + y += boardWidth - boardLength; + indentation = new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize / 2, + y + boardWidth / 2 - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize)); + indentation.add(new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize / 2, + y + boardLength - boardWidth / 2, mountingHoleSize, mountingHoleSize))); + break; + case _270: + width = boardLength; + height = boardWidth; + x -= boardWidth; + y -= holeSpacing / 2 + boardWidth / 2; + indentation = new Area(new Ellipse2D.Double(x + boardWidth / 2 - mountingHoleSize, + y + boardWidth / 2 - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize)); + indentation.add(new Area(new Ellipse2D.Double(x + boardLength - boardWidth / 2, + y + boardWidth / 2 - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize))); + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + Area bodyArea = + new Area(new RoundRectangle2D.Double(x, y, width, height, EDGE_RADIUS, EDGE_RADIUS)); + bodyArea.subtract(indentation); + body[0] = bodyArea; + + + for (int i = 0; i < getTerminalCount(); i++) { + Point2D p1 = getControlPoint(i); + Point2D p2 = getControlPoint(i + getTerminalCount()); + if (p2.getX() < p1.getX() || p2.getY() < p1.getY()) { + Point2D p = p1; + p1 = p2; + p2 = p; + } + + Area terminal = new Area(new RoundRectangle2D.Double(p1.getX() - holeSize, + p1.getY() - holeSize, p2.getX() - p1.getX() + holeSize * 2, + p2.getY() - p1.getY() + holeSize * 2, holeSize, holeSize)); + + terminal.subtract(new Area(new Ellipse2D.Double(p1.getX() - holeSize / 2, + p1.getY() - holeSize / 2, holeSize, holeSize))); + terminal.subtract(new Area(new Ellipse2D.Double(p2.getX() - holeSize / 2, + p2.getY() - holeSize / 2, holeSize, holeSize))); + if (centerHole) { + Point2D p3 = getControlPoint(i + 2 * getTerminalCount()); + Area centerHole = new Area(new Ellipse2D.Double(p3.getX() - holeSize / 2, + p3.getY() - holeSize / 2, holeSize, holeSize)); + terminal.subtract(centerHole); + bodyArea.subtract(centerHole); + } + + body[1 + i] = terminal; + + body[1 + i + getTerminalCount()] = + new Area(new RoundRectangle2D.Double(p1.getX() - holeSize, p1.getY() - holeSize, + p2.getX() - p1.getX() + holeSize * 2, p2.getY() - p1.getY() + holeSize * 2, + holeSize, holeSize)); // save the terminal without holes for continuity tracking + } + + } + return body; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, + Project project, IDrawingObserver drawingObserver) { + if (checkPointsClipped(g2d.getClip())) { + return; + } + Area[] body = getBody(); + Area mainArea = getBody()[0]; + + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : getBoardColor()); + g2d.fill(mainArea); + + Color finalBorderColor; + if (outlineMode) { + Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, + Constants.DEFAULT_THEME); + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING + ? SELECTION_COLOR + : theme.getOutlineColor(); + } else { + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING + ? SELECTION_COLOR + : getBoardColor().darker(); + } + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + + g2d.setColor(finalBorderColor); + g2d.draw(mainArea); + + + g2d.setColor(Constants.TRANSPARENT_COLOR); + drawingObserver.startTrackingContinuityArea(true); + for (int i = 0; i < getTerminalCount(); i++) + g2d.fill(body[i + getTerminalCount() + 1]); + drawingObserver.stopTrackingContinuityArea(); + + if (!outlineMode) { + g2d.setColor(TERMINAL_COLOR); + for (int i = 0; i < getTerminalCount(); i++) + g2d.fill(body[i + 1]); + } + + Color finalTerminalBorderColor; + if (outlineMode) { + Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, + Constants.DEFAULT_THEME); + finalTerminalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING + ? SELECTION_COLOR + : theme.getOutlineColor(); + } else { + finalTerminalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING + ? SELECTION_COLOR + : TERMINAL_BORDER_COLOR; + } + + g2d.setColor(finalTerminalBorderColor); + for (int i = 1; i < body.length; i++) + g2d.draw(body[i]); + + g2d.setComposite(oldComposite); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int radius = 6 * width / 32; + int holeSize = 3 * width / 32; + g2d.setColor(BOARD_COLOR); + g2d.fillRect(width / 4, 1, width / 2, height - 4); + g2d.setColor(BOARD_COLOR.darker()); + g2d.drawRect(width / 4, 1, width / 2, height - 4); + int terminalSize = getClosestOdd(height / 5); + Area terminal = new Area(new RoundRectangle2D.Double(2 * width / 32, height / 5, + width - 4 * width / 32, terminalSize, radius, radius)); + terminal.subtract(new Area(new Ellipse2D.Double(2 * width / 32 + holeSize, + height * 3 / 10 - holeSize / 2, holeSize, holeSize))); + terminal.subtract(new Area(new Ellipse2D.Double(width - 2 * width / 32 - holeSize * 2, + height * 3 / 10 - holeSize / 2, holeSize, holeSize))); + + g2d.setColor(TERMINAL_COLOR); + g2d.fill(terminal); + g2d.setColor(TERMINAL_BORDER_COLOR); + g2d.draw(terminal); + g2d.translate(0, height * 2 / 5); + g2d.setColor(TERMINAL_COLOR); + g2d.fill(terminal); + g2d.setColor(TERMINAL_BORDER_COLOR); + g2d.draw(terminal); + } + + @EditableProperty(name = "Board") + public Color getBoardColor() { + if (boardColor == null) { + boardColor = BOARD_COLOR; + } + return boardColor; + } + + public void setBoardColor(Color bodyColor) { + this.boardColor = bodyColor; + } + @Override public String getControlPointNodeName(int index) { return "TerminalStrip" + index; @@ -451,9 +468,9 @@ public class TerminalStrip extends AbstractTransparentComponent implemen public boolean arePointsConnected(int index1, int index2) { return Math.abs(index1 - index2) == getTerminalCount(); } - + @Override public boolean canPointMoveFreely(int pointIndex) { return false; - } -} + } +} diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 8cebd825a265679ec2ad6153b8a4f28e3603b72b..55f2232be95dd592036dfaebf82bff422b6e4486 100644 GIT binary patch delta 15189 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 delta 15250 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 qY#oYKSlvs*SK8W{nVeFoKN^J8E&;r{^kphfNg diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index f2801c3282b3d871b83d32e2719dee505cbc833f..988499896265a517af953011c7f5be4b0ee2167b 100644 GIT binary patch delta 22910 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

;a)zIij^7LugEtXw5GcvO|24SA`A|pI$)Z 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 ZFE+qcvLfJL1)o9O6Kp9Rn7|aG{2#Zm*pC1J delta 22794 zcmZu(cRaTKLYiRuRSKQ`x3yGj5ls-5f>BdN$qa%`kvxa^=|(o^i;2Hr{v*~xHXu;Ch%xcg zTEvj}86~1i{45ihM*Qp&nT0!ZL6V{?Of)QMPeh2u1okvhqOnM^5J4l#rHGQRQ%@$K zQ2o6!L}PS;3F0xbDMyXhcJGOhT<8e3ql!WkZV89AnWv~ElD;Ugyh>IAr=2m43+uL= zrxF^}qx_N1_-H1D;9vWyrev!KiFB6^!auN-fQ2o_0`)GK;)R~L7!iU+Ept-k9bpn_ zlmhbNMU+yVU(hb392iC(>`h{l39d=|laJIxE*UDYv>+p{+LTemRhfDWH9RwHWC?b& z33=<8kiDM_uD1yh?5QaS=og-rO+uVPXLL}A^e<>5pS>!a7(_41Ya9_}>;^BMI=54i z)b+Z2)L31AU5;SZe!&Y`aGwo=F7&6NhW*=dGXv1e{lkTU6fca*sq)zF z=i1(GzNP|XZhs=>rxugzGJhh~IiD&rU($B^q#2AUmumx7+fp@Wy={oKF7|9+v3`B& zqo}-PCp<1nPRf0FqP*N;dB@YI9-f}-y+g{E{k-yNyfG>?!%?&O*Qcl>T|0ZK)>OVe z{=R#3#lzt6uCjPYU=&YzMlz-Ij{SMzY7QJ zNgK;uIh9(|_afoDq?~X4%~mhXQQwUIjY3y$Jn-%1oUz|@B68Ov*=oH9Muk_j{~+ zizm0-NimXT-8#Zt6%*8~Pw*ajt+R#BbA|9 z+pnrE3{yL+EzkP8mm`ezhTTe$>C-y#-Y8DvR@7q`wWq>Qa$g!cR&?*<=!i~UdVFtC zEo)od4Zk_^zPAF(vo0~4lO)W=hdX!oTKsIb2vvLf@;x?{ViS2*QGXq+r@wGow`%Nk zLx010@{IX=SCl_pT~?u$H%Ixt+MNCo3R}ZpyErTTeb?$WS-XucalSlV&6%#(HLu{% zbqj-Pw<&iHOFNX_kxGkt6%%Z8)zCHii~2it{fwAd7Y3eBxp9h=xZ}=K2?LfVH?E2- z-kiC@z-xxoqh;;dt_NCAOHYOFeWG<&XVJ{JNEKQT~0!fLY9J7=DT}_^6Zm^H>jSi<2K-oL9xHW;OU@%P4!Qr zpB-8Kx_P>;Y0r@oTU*-Y$1CP|wksZ5&XsFy#c!JV%Ijha@g^4B^HUZLRqmt)9mhsPo7ZYXVIu!)Nxp(>Cjp2 zb|&@O#Nt?^L}e3gRfKt&8LQm9p+nd_UXsFQk(*6mDu<9s~uTjwQDkcx4U0r z#H2NHL7UU>bQ=E3xWipLwm#`&^Qco=nA)Uwo>3czmR?W|D*dcr^Kej1^g3fCV12Hm zhJue{x~$s+MPI`wG7CH|&WK4Uow+iOlfJa+*!#x^9uGm-G$ql^H#7x2U!?NKO2yc8lj~k0iC(n)kPil=w@{ zsO#UfNr>tFhL!2I_rko#a$oNpQaBR%B`A zHgG0BW$caLT{0&u!e(!Nb!}^I$*Mcj8g=v;MRREm`|KVqia8=SC;USHqJDREkyqQ} zUyKioWmvrP)9rf}d*bfiq(h4=RSnc$x%*CHS{pwMz8P|0cggdw#Wx2NsgG!r1HR@O zZ27s!M|-s4?SXZt_m!Qom3J>&6*b8t@1Xw{lbN0zOgnN(l}&sk^}x$)(eU89d;4b| z-)Kaw*swQ8tJU_)^{28{T}C9cIdu4${iK%S6|$C zad7hd>nXk$=LH7NIUDFacfIw~sG@4C*YVqG40<}gue@rvnX|pLF`3?Gvt9bDq1oht z5$l%w&o(DJRTgfy%^IFjm;6c0;FtOaJO6W8^Yfnj>87|QzIkcWYI1rw`MZ{)`Ss1W zR;20m*>mJX?yR*6%;2}{>zq$b5j$dh9)6b_b2!Gi z-SlQm*F4oZQ9P86edX*-{p9)j_2~9vzR%?he_d+S?_KfudRAl2O3+yIs?KniyWcLb zazRN@=zBKy<B#X$PFnxs8*dCBrRZ+{bzy`f zG5gHm81=W?>zYqTjmKr4=9OQh%(Z^aePem7N7i$$jdM?L&EVK+gWsIz-<|{i$oWpg zIf^xBhG}E^0UsO-n%~N1&v>@4tzRtesZH#W8H484Q8ONlpP8@6-uhznKxGf7;o8Ox zR~HqXc>O|mYDV!`ZX9Lc*t=I``@{3onETfF&ssN|rLgH^TUHjBUAAseVbjF@7J0>T z`wo6NEOWHAEk`JN$UXe5T7@KMyTnR!`t0}#BchX|)wV>oZF62JFwr}sma~8VYz2EK|p0@k&BUOu@FRl{rr#yd0UdOYK6Abk3 zEjyEvnO(dvBInSTx3uI-Q_f10_gFivJGK1#rSPf{ww;Ll(j>*i6MchXqqDONC)QF= zST#&kAF%dL&#`-b%%I}(BG-=T6VKdQ>&3Z{VR1?ZJ9%b((BQh@=9ps*Pc4FJ#X9eNpVL%9cRqadG|IX=;McVZ$dVFv@==QKjlXK z&-H_Q)K|2PNmCxT|CmxT)74UGEp7J<-@|=B{Cb>S-Cr_8A9tRt&zaFQ^Eai$WNy}> z!1aqc4i}`C>1AK&nQmJob$-Q{>+ff~g>N#AbLw6*JfsWgMtp7Wkc zd8F7RioV>nTKi`2w}nR3^K}cXt6Er|nQz8*DS3Lwg|>Z>4Ap(JXXH@Qz;*rci%ISl z#^Lf)Q^H9btJ}hkxY#*YCpFL4CM(EQ7oXb}5SD+Nqdd1q@5B-esJ#4Kq__P};ZnB} z^>nv~<@Ec3Pfjl>j!pp{9=++`giEY{SjR4mV$#H7Qxv zHrz8<6LXe#+a7x$NZWeq-f-oJt8shpPK_w~G5`Lu3+8q2T+EAA46_HCmRDJatZ6S; zw`}}2vvFb^=j?#K;m?&9Y-W`HxG(c8;SF;{_Q!#%QzK<+L~S>n*llsFRL%KS{+U{n zfryJew>tFi#!0kf3{>4}x6UvPC|6PMR5`y~?()}^f*t0;r4Ccps9srkw+f7yrmby! zb>e}{kxg;In{KyP#1{u#iZD+<-FUy#A@%CF<^b`W^YJF_k2t0VGP)<~*rM`5 zY{9dDf`xYRm>N8_y?LgGp) zzqjMPb92(}>KX2o9co(k zP*cHK(@^1F-T`rL%U6!B)stCq1Ez(}J^7uB@{AqxK3h+zd~-hQo3p$9)rqGL2bt2p zTyNN&W~0^NgcY;f)ho326t9DJ@7L(KVpr(S0cPTIGfNo+f$Mz@9#tly9Xe-|88CQMGAu z%X@S`J3TOnD-~VO+^2IfS*2k$bE%f}7Z2x3(fn?bOK7%*D`V}%r}N$2jvg(3>M2(K zbez$?%e?q$V9~V=F6%e!E!)lsu--ZE?z5N`VQaFoKNMzfkg2sk9WN9pe$2oAZFF|3 z>b-|=p9SwWKD-k9woYni%+$l0kK6hKKMYqJ%(z%6uV}h@N2A!Ac+EWH5#hjdfd|gc zOWHfx?&jgbPZ~SA3d48X-JEUpD)aC=hk{iOOU_L$9y_vY)e?7#yh~ury5e;{4>(g6 zHI)p+=k?o!jU;Q=%TS#TZxk}MT&&$lIS_y9ZSjJl3yXwKD`j1C+_vKNCAa0tt?aR7 zT^3pXv?uSz?=Cx>7jUJ>GymR{2iHDN3SX+Ad;ZZCd+*(w=jl(#yE$oBa%*p07kSsb zhZ2WoKHE5UJhmrdwCa|}8l8yrFC9^{QIVy zX-jlDND?meJ+x0pF8pY9&9?@sHV3r0 z6u1WNGhdtbe2-yreUXFr;o`iX1rFXby41uw^r^BvP&s8no<&d zkrl*Ya%R`XMkt<@tK3%idgrTkzw#`Rnf6uCJyBI7Ic5dN-}$PH{Q2>Tr)pw+|=o%%u_o~wAgQnmd}g# znVz}6@fW+ElXvoMg!4|a>o01Vkuyz1Vw!57iT<1&wv}|h_F3kwxZcdmVyy;J-&WfCJvS4*ZxoiZ z_ma}(rb*$PqkWv8KPUBcoO*mKO5@(QV}%VLwZig}kHnNNWG+vVKCL*_%W%o%kboiY z+VvwkiC!hW#9$XsSc+-7jbR z&TFmPRJy+YoobQ4_`$@xLJ1q}5?AZ1=6UQFjZl2vf67I4;imSx`&mo)khgZ`15 z^M7`Wyt6hoPtTH}d+&6Q6p#F=uqtAQ>cBfVjD%+$RzgNHPao7Ca z+Dx|r#Sfmje22bsd2y%TvBUn?M1IfsJ?TE9SLXMD@J?T&F0IbxH^$6^qBksRi(Yl?@XOzk zKjRO)pjJsOS2biEQj*vaJJ9~o$3snd*krp(RGRF8U{BNS&mLVJYmL;%<6K$>`jcDj zzEIllG#G!MG9rEBk*Vz-8()r8@tG%|4S)VPI<;r1vv1$jGW{Xxb~(*aZRdbkGs+37 z9W&}gRu$(ln7GP`#56C8wLYF7>*VN>Pfg8g-N#rT6tGfp+e+rOu!&(Bc9&Kruiksu zTUN_X`lPM&n#nG{FQ$G@qxYC_+V@Xff8zU~iS;wN*BU2H)ug^@eO8=zDrVC2ppmIF zZ>}*oW_D70LH3n(mW~&f%<4R~=lw<5l&b9cE4Q?Mc~^AQ{p9;>hi@BI-uFlDNJ_XY z@_SLgoeB1yef);oyWa06=}}&d9e(}B$L|?^S{bRN+BomZ;cr6{V{)g@JH7}>h)?EJ zqz$jT?`U>sqjZPI!IyJ0e9RtgG;HE}-LLahc`h}rX;am!Kp(&DNpkMpuWn}~j|P+` zDV51wyXA2&>5=w^^C}PSmqm1~GCk^9esolN@L1RCsN>65`1WrZJleH#JbK>x)KOQ@ zxm%xTZ$D9}7ZFs?z*-9add&#Ua z)tC7k&F|-){18)IHuv<+AI8k6d*N%#^(U5Ym|y;6ZIq~6-Tf)AZa&g--np*8>&=q{ zW?!J~er5lDt9x74*i}>>-&{Dk)a_UDqOrC&So+zWYgD6bekED>_;m}bYE&EGF?CY$MF9}D_jJUo`}BG0u6dLnxGVaH7SazmB% zX&L@IKA0Jw2)a$bl)R+Q|DpRw;~lY1RjGx8R~=HWx;)+HRq$|Wa_hy3_e<`pT{++F zej$08deE`i_9r-6WOGzQd9%$Zjjx#3XLr9JiM%XYtY|8iRK$^6ptM(+Wq@XdQ(4kSFgaqdnk+4=&2#1#MCwK5)YzJ@NxK zey5jJ?{SmUH(LH`ReKKS^1hWLThm&~7XHrt)+fBL#XQ`XThj7#Bu09+{5b1&#e^Lz zPN-;2XkIukO5|H}ZmMir=WnuBrBsLTWR_903)T14%x}%Eyub)fUW^rexZL2o7z2ZT^1 zd_sJUygt0q4_i6OI@?wB>qR!_sEGco=i{WoZ>sDQcfxEn6raB=OKbDE|9*UKo{NXk z499``p149gw$W>)VsX2b%pOOZ&(jRzL*q_%Eu41k*xu33&9olNn*Pc+GToM({*TR` zkw$u9-7A%318b1LTbtUUIVc7@Qt}dfTvwRp$4;q%#5Q{jRMU+VJ=R zIjycBc(K{-V0R(SRPgEeUgMZ2_fD@{+;%+iWbiKf+|8V?CxagkKfkQ6w^ET*GwtS zlC9?XsWzuVjTR~7{d#tB;gtvV&o*a78MP~MHZnAS_nki)l2n`&ytMAalDEDAN0?>{ zSS`mz6l8mkR~|9hJaa;lar>Rr^o2!dZN4l`_u7=(6D+yg-|Nn+8OIxEt-3p9mj5XO zvE;l4ll=Y3eI=x(7a^xVeQFt@_)VbRqqXnxQW4#jHneI=h}jvp@%`_>FOJZEHA6ZH zFVxWX3k9-?QcP&N&@)uBS)400k515%P6^eZqRiq_AqG)f;(DGD+9Xb(Ej2=;M2(Ew za7So1DrxPKvA?~NK_WFu00}u^UW*Yr?^0~+~kQ9VT za?47En`8;bT{nd1BStk=-vEDijEF$u2NZDBW}oX1_$CCnf*@JgrJ z+mKacp#OtB6HMqAW^ga|2+JTR8hV9gQRy;Gd&sd#l|*7%1EDxL0v5%>l3d9BMwKv4 zr;^i=6S>M{GbG%rLXMUv&;TPc3njvq?#Gv+VX?AD1TU&i1JR~rCikK-`4AGZH6;(C z)@%#%an$OtBA-FQ+3!o%LDA-}BG)3-J9d(7QJ?cT=NfIH>JgFDLrF>?cPCk$%icxy zMq1WIlfNU0piJ^=q@^XB{9S=?@Il3YwAok5zYxvnA$cj{OX?tV(LmX}B=?|hPW?gl zM4IEr$PTCy8$|XiHIjnmT`hjpCApZCh^rKl4keg`!v|Qm6e0f!A?ThWLOWTYDS~tr zO%ZV>D%9NXrXsIV$TSo-y}Jen-Dn2UFFf#IC|ZODOt)ZCTth37JIJG7D@4d-QCOjO z!)E(0cb`NeNiG86W_Trhi8l7LfrGi2tg|SH_x72W9ZJ>HnM25S# zPUH!NVAXjbLYE?fJ^Q&xFH))aQX~MiVqS^NL1Dl4ON1jrNSKi+D-fDVp}>U%H#4&2 ziJ7AWiDWn##V|SwQvw@yVN|XHgR)El!+8#z)0}$>CPH|srHwLx9AeDxJhQbQ+fm}*jt5pBm5iU_hBqf2Q;v}O8~?-K~S;A@Wf0316q8DAw}c1@wsxST~4 zCSpunOo^5v6pHy%v=PlDkn$PPW^AVbM7zI}@)%BO;JxgttHT#QQRM!%$( zAcZyklx9_eafZgI{X5tb26`?4)Z#H!aBm?^g8PO_eI-PwZKhMh$wVw)r9Jkrfw2@x zO-WJ)L-Cj{H-k-eK^_f=Ql*q|feLM^1#)BM^x^4Ma0-}d5swiFH-MftRf4-)m-;}8 z@SvdiTuO@=iS$DixX9AfxKS3=J~09r63$9|1y}hXN&NMI8aLUQD$F2|mMu4Tc*70k zh7_^>*H%&~+!}XkG(yiPw%C+FFRLhM;^8m|T}@?jxB64-k+Ta{Q~N}T-swb8XCj*4 zR%)Iw(a$*|iz2?lU0@6NeUGjT2>tpys0u7X!Xb{Tk0hevsY)oKM-NbMvkBP*uinI5 zX#F7AU_|E09t70eNMczQHClqu@}!iij%efM)GUmkWmQrc#5);o(Jg8nnkixRaGxU3 z0}WJO-hWJ}JoElSw2k(9%Sm#GTYe zwG$__guSGGL;6Dcsa+_A?7mass|z@E-0eT98EEXb%9LVNFa`(Z_%Q|+hv6FI{EPa4 zNieH1Xc`#)fQY+Lme$53TFUCQYAS&~)1rMsooSgt<4}l!vt56_q8R4o7>yX3R0}d4 z{GLIB+kYA+!#!?9yMPj{-}cqr9%!5f&c3Bj0;cH@1@mZcnS_=Pmki|arISSlp+@jY z4Ahd5fr*3ibd1i0$vY}UuvKO}zpAZ5B4t~_9%w)gSuWj4mMwuvqZ`{Op3;xT(NeC^Y0iEpih1#WF3%>ngHG?k`>7Kb^2W`&X>DxWrpw5%hAOi=GTG zIG|>?vjc}N7KoBanX2d&5;jnRd=9cs!* zLiT=}Gb&Mds%#lrNY`rzMhQaGoEVnK*T+j3ff__VEw(V65PE1EgBJxXlA(t@GK*m( zsu6q-@)*Xb@62+>LX`aZZ{9_Gfqfcc63GvsZ_?Z(E`x<~^Jo=A6uD4V%NRpON^dfB z(BAXp5n}<$Ahm9WA{sT**Nn%=u>5-lZv*ChWE??S6o(mRXz%f)Gxs3bUNPo#G@t#C zht-ncLZrjn2=PF1zsoS?Q5p z$9yIS^(xYi$vZf7I53Y$6ZU@Og(Wbc-wVkZ47L(zJ`WesY$a20fC3 zhvs@cd>xEra`S1}Y zCRLHpP;#E>g=maR%q3_C_qoR$LSIWR&CJ6n+Wj5Orzo8z5|~Tdq5csHZ##VfBk=et zJjc^}m_10>KreGE+6G$}$%(epNF+zGj4t@O0bg0tz=29kjGH^i?4c2R)fV5(=lw9Q zqu@E0qKsH9uEB?jA1Yy3Zwxbs&`PTNd&Al%G9;3*KJku^&nUqi{=$5T(&Gt><&0d= z6=gM{0sbY)+AT+fMt|6EdpBJ8duW6+&3Y^v_pCPS8yc(Xp{%KBeqD)R1tJOcZLDQTVh4w%iAKoF z{CK?x93clhuav=bR~7?I-^Y>$$+uxZKgO{{3E7H$tfNTucrt4h%C{On2iL1`3aEvEWN3mKQsWX+>6@CA0~gpCChVCKov1_^bT0ypP4OANVnE|)cc zxR0M?@m86S#jGXB-hy*1SHySp0&5eZNmR0U+s~RR7L!KAykOOqHVW*BEivOXf%tt) z5+vP+ov69>pQV;NEJdW@!vmHd((2O8I)-SUI#{1k@cN&z%20Urla`I*%Y`)=sDFWd zRDR8p1YIXt;@sDLEMcVKT|a9p(y;mis~q)2_6zFR*>}GXh)*cCCe?i7lcCf9HvB!~YL&PT@&E|c~jO=D7p%Z;<4toq8v-X^4 zFF|~dFR}L!P63}r_D4doa})aEywfyCHpb)(wX~R94j%z`9RS^Y!1HGf!>9f zIlesu4I50KXt>#6h6I#kgUuxx_iQi=qQSPs9EgU8EoMVB3T-i4qVdrdTSRC!x5JhY z4alPe&e&nZV{4G-0RQ#f4$~$uO?xPY`w?!BE&jvZZO`Mz9Iyoh+0_BFCmK-RnrOUr zz)Xn76i1ABJPv{!vH64#ryVgnqVdBKO5we;S%kR|jiZY&N1`#XhzA)tLCZMLekW`N z(dcu+e2K=w#n=X-!Cj1b6Ad|M%#Ud7aK`+J#&c($W&;<@m7pZJV1Yzq*aZtA8h%T# zbws0S3AUDKm@dVFiAM2K%!6o9U3o@>TrnSla?cg>A{tZNu;oN!w;Se5T&j#;liKzY zsC!^C;I|uQMt~N}u+>DPcp1;E>~fx5*m7(o0XV+*<#W}7` zdq$rCzvOe_y~8xppFf2$rQo_398}1Z;f*N?OQnNPKA0SQ=S>6I=|W0RM0apMNUR{T)8g>hIHhDg)H`V3I_isPl9xO5k#P683ABfR+d_*j+TwiFU_#QIS<%_8k;qZe*k2XX!@xwF-*U!h=q-n#m zn;ZPJ(Gk#>*@?5tgOtU>Y*65b5!XJT64%1+MbMBRhI*yE5>jb{d@2TfR$|1R7>L55 z+~L2V=_5jHaDOFl7@p$z=3jr=Qd)({5WW?JZn92-*OLm0{|-Yo4SWi~CIKBf^euW7 zPgU|Ns47AVLCvc$Eh6GSaB7JxpUMQ*{uuEaBf!HSLfRS#g7>OSaKayxCZw+6P|##P zggT=f0I7$kBdT`*CQta8V)b$LOSpD_gySNZF1mAZ)+wN7F1$~k>xHq2F_hJBebNoj z^5@|dn65y~J;6`_M*M~g&#i<2b5%t|_Yy!c{UIVF-X*g95 zSggTj5zg3s@VTA`@4C7*{!RPa8GKfFce94)OgFBj8qOd>OR=yfND1Z5xIY)iB+^`g zeo;&L{3;+5-X{|doeqMkCf?vf#N{yy>jHkok99vgn|qf8>nnUF}c1svLG#n-|BHXC@u?6m=EndZxf zL_pC7OpOS}Jsk2}^%o=+im4FuYpPH8@*y}M72seAu8}IhIh40X=7d7|;3!;v4uIG2 zEbtp9BcWO}3_{}3IAjD?h4F$JK9%H6g&M2j%4;p)J3AA3k()_YA%aP08NjtfWFu&L zIB&F^!yz@if-k@Xx#7IIJ&-CrSgJrG6~Unr%(16e{^FO~$cz5ejZjr*8-hYN!V?$V zyFeaJozcOgJ|v3)xh!5ZS(_j<_yR$kmoT-019&5U_-=3={r}DH2j3BY%@~;hZf)W% zkDa(GoiRQn2BvT3MbCUQgtkk9Ly<6nVR1nU9Dxuq{C^4z{|-N06Y=BK1~9UjXN463 zRoPGBLvUM(;8|IZL&r=J^k20B19cIYCJ}}q9FMmY#EDW6@ZAET{1tpi99-H0S3mp& z*^EP{JpY0;x5D7z(7de>@`~m|ifE*9s04>*#PXo6ykqHvZIEgl&!vniBmrmAgb67_~DyWC_)D&aQRS!xLdWn*rA>9x5k$IPm)Y8 z`b(&(2%37fmuKqUcBoXShL5WgstyYWd^ryjS_@uiI|w9n!VSaXb0P-5Hxioi`-O{YgDFw)?1P8Z z5td@o-nc?I&7}ar|NQf5J^vuq@fV`97Y2cMOE4FXls{z&4I2Rf$6v zRw2lFH%14)V&D#q_uWXgiCGQ{F?Lhn9h*R`o(J&xiEAmaemB(8z70{s_P{w|5CT^S zydU*A6uR>-NPG`AkqEAe$+(Io+-uC{{ria!09^L)zWY-4K>4AgNdEpFxJct#2XU(U zaXys^rpKbfBXEp`kXk+;Vt|xbcz(xwWJcRz{~8X|513K<0zKLRuE%0#M7O`F%I(yV zgugqh@vm2>uOOw*V_^sR5%i9O_9itTsJsCtB0j4Ldy}(0s1NP#h)&*6f8lDBjBhION~Yha|zTe#&2~#ycFJ4S&Zs86Nsz6;6kca*Bu4 z&2&Ch9*8oif2Geg9DlA-}GxfX5b6}OhQ2pPm zeiMjN4&4>z1c~T%GftS@WI3%+5FX;GIswC)1;Cb-@$4_nN;|jnc zkq0eKgwV%W1T9X2PdU;Od0IzCfy=XRj7yRsuQu_Cc#QXrCpQuuS zuq3F31`rii5tV@XAztTaEY1tIfJ>P^{H~cSFadsKB7XKkOpY+PKMUIuXfe*k>N5Q)R zdti~woA{h$C@Ni#L~EfzVoaXnRJ{g1l?t>{c(zPZAhf0lhm^sGCaM_mJx6p#ptvc} znT%FGKMk}&RRsT_u=Hpl?06A$Qt+TB{SxsXeMwaz;)(=$a^y!7m?Nk9Hx9H&0Va$lQ3)D%4-58L;3CbWK z6<#RdSA~%{wN?#LFX2>tay-DPF_3`dT^F4Rgwi20YK-{Jpdo^PB~H~^h*S0P@+~@g{3+c2 z8<8OJJRP$l!eF&!nqeGV+ZVzuP4K(pyMDH+hzO?YhzZ3CwrGz~D6 z!JEdvaj13=f^q=7=~hj{B-8{8!T)|L&ram?YY~092cVYohjFSZFiEA&1alVgBB;Fi zZR#LgBGutV0{j@`|0#^=%HZ=W01lv0!R4boug)HU`qc9g{_Y4bj^de+DprQ5j+wkA zg_K*Lp#qN}#<1!yI1ATaLae7Vc`M-qT*1RCMD?krNrT#ao<-d(2=&&1b6J=Hh`tNU z@*cN%+n*oT^l1q6{uoSa!5lCLXS3iZIX?P7aQWY_k?NiSm_v3);pY<$`5uLk+W;S$ zfWCtvRT1i25G#5=m;b>g|pqI4)mcq6#KyqzcYD8L(C9ihrh>?EEuXNszYz zPHaJ6qO=e{Hia&!^Y@;MXQ^k&^?T}Y=q-N!o2B0HSuF3u-XsTl*lv&1_~v35NXX$G zGp^u}juRgeB_;qdZ6@SG==KUeq(Pj9*53O1UKGYx2Bw7I&6p|3%f&1RruV@Kqz!Oe zD1u)Rf&-D2k%w6m^J~G0V?ht#U}Yr!JNRBHxXoGMNFHyMI-3VQi8+E()qrR=9e%pP z77^z0sb?u$;T<0r9t3pwvx@|;koO$r^J74_nwLFc`B2sTQUo=Y(xv{)fhHV!agi?t z7en}Nfym)$1rVCT#UWMvHG>90O~$Dc?jY)Y$V>FSFn{4$3S2L3VBZD5BQk+dA#VxW z6lro6FNe*6n~H&e+aKF``X1B8zzi?mDSqG2*PpMzVLm*OM4BnUZ~2(dF9W_8@|K-w z19i{WaM`&i`!B!!TRuMqTu$)x+mC&bR))T~!7ntyd%>6y#J_8lE(6rQz}VNG;Kj1( z1nmFFH$JWjbW3@VMG=Ig#}IUU3?}-4G~Rmh5R>rbz^*62NvA8&6>V_62;R!#i^gwU zepmsxl*5_={)8k-k%0k4cuh!*`k&Vw|4yz^_?E03etY6iJwX0RYy!cbxYgAs40cZp z=9{&EO|Qv(enp^q3X>wna72-ovjFk~$nPe=uMb>KVF85FKTk#e{R-{ZmKcK}8FM{#=4dZ7e z;9G(NpH&>_Ix{f5~k;sLer5;_>dS#D&?K3 zoQLFugrI#Ls7^2y`yz0DEznl4R!+cz@*POEU>T+TbH zy;~kD^##V^HT)_TT%1mq;retycR6oq|4|Md`UY*x_7%C>*^G zI4tmko&TpW=Gr^Nx_B7Al=6BHr%(2OA3LmbP?g5Vzi@9zArfUL4po2VLo%Q`lQ&5f zSgy@8;RJdQJ0uwA-!yRO5)4}kohb>r|C`iXtr~tMz>|O(96-U-K%5xj-+vyPNLW36 z9$F2OK~(tYNEH13Z(Kw#KHt5uu}sV}zU)S1AS%iH+2sR; z!dFf*MC2k3Lmyv+_v%UT_yQx$|5F%aeFU*)T;`n#%PvC&PUpdlEAY5Eewlap&oVXI z{~J!q8E~2i#;Y7mzrs6d?zjR)h40}CH9^%CY$9>veRH+$Wm}kQT)0OH-U)qa!dc~0 ztI1TbtC=YU|EoG)xXrIZO$R#uz&oz;)~!FUt^S>gYr6kqr-9b1ycOBcTlmr}xS%+} zNeNGH{6B>;2Ydgp%fDceqOm;(phl$td_9vKHPA!Dm<^;Kwyg8kAjw)ph*z>}C9D$qu-w9Q&X7 z*9_n0{Vha1Oaaoq5@J0LQho`8a&htIZPobK)(Wy+->sOzLBB+_d>Y z!;fxGdVC?7KS#HD)li@3OdL`N>kZ)>soyhMbildJTW?r}A`82qJ`Xq)f+y}?1HO<- zMgx!i&)c$p?{DSjB6j%DOburzW=(Vrw9Yg`NOcXb_%Mi5*IMwYvcSBScRiy1*iDiO z$I#(_R@z(;R?B-KQ&kJ)f7{{mhCu8(Pqe-I%@982ouH`TM>)-sPd&C9#_eTKnO2srjGja_tD> zx6NcJ@r^91gPMLELkN7hH<=hN?y$?lOt?Lq|DQe5Etk(K0lXS`hp(;R?h5?BJe&)M zSMV#*>Lj>+ADal&N?6#R;oWf;T1_qHLsEQyI&tL9S%h%z!QYMH=Y+*Q2$^5tL#T}P zakHf}o>?Z)wBUAr=_+D9QpFMlL-%-}6z$K%Br0Loe*DjQhE>Jqm*)EuTn~-P-$KZL zZw^uMp#_H`?(m^WMCj(YE8NBB*K+8OVEyIr1Dtg({%8^9!-CnhHP$d6F2j5fTp8f* z09nz55^I2F(mQa123Xv{I|+y5)C13u@v{vWGXCc|VV@GkXBFr1T>w z>H%-#xSLk_Xax*W8w`wp^>EwkpY-qH zlJgB`l?N8`Y!Oh}$aCFSD`ajkjGHseUBMGzCLNq>f>*-qCfuuCyP&I0!|Yz z5wCeM`$M6YRZxrIedlNRKYljB;y;|D8O>0>N)G?GHt1~S?F(Kw^@ci5RR(qw*$Uuv zGjEZt!XY(d1f4WyOA+TRG*kEwH~(jgvqt>z6{pmn%VOg&JKs|1;F2i$>*bOh(4Z)9}iyS^bD#Tg0 zuJ~vRZ-$fMs0!|cKC1NbZJ)tyy$QSg~K!yJZ->VA9{$H z5lqzK$6y}3&d7qB(KLabIuhu$^Nttm+u