# HG changeset patch # User Thomas Wuerthinger # Date 1327707543 -3600 # Node ID 217e0a60c7118cd8983c489d95896ffe9d62227e # Parent 591bed21c1a8d4336ea9869dddae6e2cfa6326a0 Removed everything related to cluster nodes. diff -r 591bed21c1a8 -r 217e0a60c711 src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java --- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java Sat Jan 28 00:26:03 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.hierarchicallayout; - -import com.sun.hotspot.igv.layout.Link; -import com.sun.hotspot.igv.layout.Port; -import java.awt.Point; -import java.util.List; - -/** - * - * @author Thomas Wuerthinger - */ -public class ClusterEdge implements Link { - - private ClusterNode from; - private ClusterNode to; - private List points; - - public ClusterEdge(ClusterNode from, ClusterNode to) { - assert from != null; - assert to != null; - this.from = from; - this.to = to; - } - - @Override - public Port getTo() { - return to.getInputSlot(); - } - - @Override - public Port getFrom() { - return from.getInputSlot(); - } - - @Override - public void setControlPoints(List p) { - this.points = p; - } - - @Override - public List getControlPoints() { - return points; - } -} diff -r 591bed21c1a8 -r 217e0a60c711 src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java --- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java Sat Jan 28 00:26:03 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.hierarchicallayout; - -import com.sun.hotspot.igv.layout.Link; -import com.sun.hotspot.igv.layout.Port; -import java.awt.Point; -import java.util.ArrayList; -import java.util.List; - -/** - * - * @author Thomas Wuerthinger - */ -public class ClusterIngoingConnection implements Link { - - private List controlPoints; - private ClusterInputSlotNode inputSlotNode; - private Link connection; - private Port inputSlot; - private Port outputSlot; - - public ClusterIngoingConnection(ClusterInputSlotNode inputSlotNode, Link c) { - this.inputSlotNode = inputSlotNode; - this.connection = c; - this.controlPoints = new ArrayList<>(); - - inputSlot = c.getTo(); - outputSlot = inputSlotNode.getOutputSlot(); - } - - public Link getConnection() { - return connection; - } - - public ClusterInputSlotNode getInputSlotNode() { - return inputSlotNode; - } - - @Override - public Port getTo() { - return inputSlot; - } - - @Override - public Port getFrom() { - return outputSlot; - } - - @Override - public void setControlPoints(List p) { - this.controlPoints = p; - } - - @Override - public List getControlPoints() { - return controlPoints; - } -} diff -r 591bed21c1a8 -r 217e0a60c711 src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java --- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java Sat Jan 28 00:26:03 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.hierarchicallayout; - -import com.sun.hotspot.igv.layout.Cluster; -import com.sun.hotspot.igv.layout.Port; -import com.sun.hotspot.igv.layout.Vertex; -import java.awt.Dimension; -import java.awt.Point; - -/** - * - * @author Thomas Wuerthinger - */ -public class ClusterInputSlotNode implements Vertex { - - private final int SIZE = 0; - private Point position; - private Port inputSlot; - private Port outputSlot; - private ClusterNode blockNode; - private InterClusterConnection interBlockConnection; - private Cluster cluster; - private ClusterIngoingConnection conn; - - public void setIngoingConnection(ClusterIngoingConnection c) { - conn = c; - } - - public ClusterIngoingConnection getIngoingConnection() { - return conn; - } - private String id; - - @Override - public String toString() { - return id; - } - - public ClusterInputSlotNode(ClusterNode n, String id) { - this.blockNode = n; - this.id = id; - - n.addSubNode(this); - - final Vertex thisNode = this; - final ClusterNode thisBlockNode = blockNode; - - outputSlot = new Port() { - - @Override - public Point getRelativePosition() { - return new Point(0, 0); - } - - @Override - public Vertex getVertex() { - return thisNode; - } - - @Override - public String toString() { - return "OutPort of " + thisNode.toString(); - } - }; - - inputSlot = new Port() { - - @Override - public Point getRelativePosition() { - Point p = new Point(thisNode.getPosition()); - p.x += ClusterNode.BORDER; - p.y = 0; - return p; - } - - @Override - public Vertex getVertex() { - return thisBlockNode; - } - - @Override - public String toString() { - return "InPort of " + thisNode.toString(); - } - }; - } - - public Port getInputSlot() { - return inputSlot; - } - - public InterClusterConnection getInterBlockConnection() { - return interBlockConnection; - } - - public Port getOutputSlot() { - return outputSlot; - } - - @Override - public Dimension getSize() { - return new Dimension(SIZE, SIZE); - } - - @Override - public void setPosition(Point p) { - this.position = p; - } - - @Override - public Point getPosition() { - return position; - } - - public void setInterBlockConnection(InterClusterConnection interBlockConnection) { - this.interBlockConnection = interBlockConnection; - } - - @Override - public Cluster getCluster() { - return cluster; - } - - @Override - public boolean isRoot() { - return true; - } - - @Override - public int compareTo(Vertex o) { - return toString().compareTo(o.toString()); - } -} diff -r 591bed21c1a8 -r 217e0a60c711 src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java --- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java Sat Jan 28 00:26:03 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,243 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.hierarchicallayout; - -import com.sun.hotspot.igv.layout.Cluster; -import com.sun.hotspot.igv.layout.Link; -import com.sun.hotspot.igv.layout.Port; -import com.sun.hotspot.igv.layout.Vertex; -import java.awt.Dimension; -import java.awt.Point; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * - * @author Thomas Wuerthinger - */ -public class ClusterNode implements Vertex { - - private Cluster cluster; - private Port inputSlot; - private Port outputSlot; - private Set subNodes; - private Dimension size; - private Point position; - private Set subEdges; - private boolean dirty; - private boolean root; - private String name; - public static final int BORDER = 20; - - public ClusterNode(Cluster cluster, String name) { - this.subNodes = new HashSet<>(); - this.subEdges = new HashSet<>(); - this.cluster = cluster; - position = new Point(0, 0); - this.name = name; - } - - public void addSubNode(Vertex v) { - subNodes.add(v); - } - - public void addSubEdge(Link l) { - subEdges.add(l); - } - - public Set getSubEdges() { - return Collections.unmodifiableSet(subEdges); - } - - public void updateSize() { - - - calculateSize(); - - final ClusterNode widget = this; - inputSlot = new Port() { - - @Override - public Point getRelativePosition() { - return new Point(size.width / 2, 0); - } - - @Override - public Vertex getVertex() { - return widget; - } - }; - - outputSlot = new Port() { - - @Override - public Point getRelativePosition() { - return new Point(size.width / 2, 0);//size.height); - } - - @Override - public Vertex getVertex() { - return widget; - } - }; - } - - private void calculateSize() { - - if (subNodes.size() == 0) { - size = new Dimension(0, 0); - } - - int minX = Integer.MAX_VALUE; - int maxX = Integer.MIN_VALUE; - int minY = Integer.MAX_VALUE; - int maxY = Integer.MIN_VALUE; - - - for (Vertex n : subNodes) { - Point p = n.getPosition(); - minX = Math.min(minX, p.x); - minY = Math.min(minY, p.y); - maxX = Math.max(maxX, p.x + n.getSize().width); - maxY = Math.max(maxY, p.y + n.getSize().height); - } - - for (Link l : subEdges) { - List points = l.getControlPoints(); - for (Point p : points) { - if (p != null) { - minX = Math.min(minX, p.x); - maxX = Math.max(maxX, p.x); - minY = Math.min(minY, p.y); - maxY = Math.max(maxY, p.y); - } - } - } - - size = new Dimension(maxX - minX, maxY - minY); - - // Normalize coordinates - for (Vertex n : subNodes) { - n.setPosition(new Point(n.getPosition().x - minX, n.getPosition().y - minY)); - } - - for (Link l : subEdges) { - List points = new ArrayList<>(l.getControlPoints()); - for (Point p : points) { - p.x -= minX; - p.y -= minY; - } - l.setControlPoints(points); - - } - - size.width += 2 * BORDER; - size.height += 2 * BORDER; - } - - public Port getInputSlot() { - return inputSlot; - - } - - public Port getOutputSlot() { - return outputSlot; - } - - @Override - public Dimension getSize() { - return size; - } - - @Override - public Point getPosition() { - return position; - } - - @Override - public void setPosition(Point pos) { - - this.position = pos; - for (Vertex n : subNodes) { - Point cur = new Point(n.getPosition()); - cur.translate(pos.x + BORDER, pos.y + BORDER); - n.setPosition(cur); - } - - for (Link e : subEdges) { - List arr = e.getControlPoints(); - ArrayList newArr = new ArrayList<>(arr.size()); - for (Point p : arr) { - if (p != null) { - Point p2 = new Point(p); - p2.translate(pos.x + BORDER, pos.y + BORDER); - newArr.add(p2); - } else { - newArr.add(null); - } - } - - e.setControlPoints(newArr); - } - } - - @Override - public Cluster getCluster() { - return cluster; - } - - public void setCluster(Cluster c) { - cluster = c; - } - - public void setDirty(boolean b) { - dirty = b; - } - - public void setRoot(boolean b) { - root = b; - } - - @Override - public boolean isRoot() { - return root; - } - - @Override - public int compareTo(Vertex o) { - return toString().compareTo(o.toString()); - } - - @Override - public String toString() { - return name; - } - - public Set getSubNodes() { - return subNodes; - } -} diff -r 591bed21c1a8 -r 217e0a60c711 src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java --- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java Sat Jan 28 00:26:03 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.hierarchicallayout; - -import com.sun.hotspot.igv.layout.Link; -import com.sun.hotspot.igv.layout.Port; -import java.awt.Point; -import java.util.ArrayList; -import java.util.List; - -/** - * - * @author Thomas Wuerthinger - */ -public class ClusterOutgoingConnection implements Link { - - private List intermediatePoints; - private ClusterOutputSlotNode outputSlotNode; - private Link connection; - private Port inputSlot; - private Port outputSlot; - - public ClusterOutgoingConnection(ClusterOutputSlotNode outputSlotNode, Link c) { - this.outputSlotNode = outputSlotNode; - this.connection = c; - this.intermediatePoints = new ArrayList<>(); - - outputSlot = c.getFrom(); - inputSlot = outputSlotNode.getInputSlot(); - } - - @Override - public Port getTo() { - return inputSlot; - } - - @Override - public Port getFrom() { - return outputSlot; - } - - @Override - public void setControlPoints(List p) { - this.intermediatePoints = p; - } - - @Override - public List getControlPoints() { - return intermediatePoints; - } -} diff -r 591bed21c1a8 -r 217e0a60c711 src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java --- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java Sat Jan 28 00:26:03 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.hierarchicallayout; - -import com.sun.hotspot.igv.layout.Cluster; -import com.sun.hotspot.igv.layout.Port; -import com.sun.hotspot.igv.layout.Vertex; -import java.awt.Dimension; -import java.awt.Point; - -/** - * - * @author Thomas Wuerthinger - */ -public class ClusterOutputSlotNode implements Vertex { - - private final int SIZE = 0; - private Point position; - private Port inputSlot; - private Port outputSlot; - private ClusterNode blockNode; - private boolean root; - private Cluster cluster; - private ClusterOutgoingConnection conn; - private String id; - - public void setOutgoingConnection(ClusterOutgoingConnection c) { - this.conn = c; - } - - public ClusterOutgoingConnection getOutgoingConnection() { - return conn; - } - - @Override - public String toString() { - return id; - } - - public ClusterOutputSlotNode(ClusterNode n, String id) { - this.blockNode = n; - this.id = id; - - n.addSubNode(this); - - final Vertex thisNode = this; - final ClusterNode thisBlockNode = blockNode; - - inputSlot = new Port() { - - @Override - public Point getRelativePosition() { - return new Point(0, 0); - } - - @Override - public Vertex getVertex() { - return thisNode; - } - - @Override - public String toString() { - return "InPort of " + thisNode.toString(); - } - }; - - outputSlot = new Port() { - - @Override - public Point getRelativePosition() { - Point p = new Point(thisNode.getPosition()); - p.x += ClusterNode.BORDER; - p.y = 0;//thisBlockNode.getSize().height; - return p; - } - - @Override - public Vertex getVertex() { - return thisBlockNode; - } - - @Override - public String toString() { - return "OutPort of " + thisNode.toString(); - } - }; - } - - @Override - public Dimension getSize() { - return new Dimension(SIZE, SIZE); - } - - @Override - public void setPosition(Point p) { - this.position = p; - } - - @Override - public Point getPosition() { - return position; - } - - public Port getInputSlot() { - return inputSlot; - } - - public Port getOutputSlot() { - return outputSlot; - } - - public void setCluster(Cluster c) { - cluster = c; - } - - public void setRoot(boolean b) { - root = b; - } - - @Override - public Cluster getCluster() { - return cluster; - } - - @Override - public boolean isRoot() { - return root; - } - - @Override - public int compareTo(Vertex o) { - return toString().compareTo(o.toString()); - } -} diff -r 591bed21c1a8 -r 217e0a60c711 src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java --- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java Sat Jan 28 00:26:03 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code 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 - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.hierarchicallayout; - -import com.sun.hotspot.igv.layout.Link; -import com.sun.hotspot.igv.layout.Port; -import java.awt.Point; -import java.util.ArrayList; -import java.util.List; - -/** - * - * @author Thomas Wuerthinger - */ -public class InterClusterConnection implements Link { - - private Port inputSlot; - private Port outputSlot; - private List intermediatePoints; - private ClusterInputSlotNode inputSlotNode; - private ClusterOutputSlotNode outputSlotNode; - - public InterClusterConnection(ClusterOutputSlotNode outputSlotNode, ClusterInputSlotNode inputSlotNode) { - this.outputSlotNode = outputSlotNode; - this.inputSlotNode = inputSlotNode; - this.inputSlot = inputSlotNode.getInputSlot(); - this.outputSlot = outputSlotNode.getOutputSlot(); - intermediatePoints = new ArrayList<>(); - } - - public ClusterOutputSlotNode getOutputSlotNode() { - return outputSlotNode; - } - - @Override - public Port getTo() { - return inputSlot; - } - - @Override - public Port getFrom() { - return outputSlot; - } - - @Override - public void setControlPoints(List p) { - this.intermediatePoints = p; - } - - @Override - public List getControlPoints() { - return intermediatePoints; - } - - @Override - public String toString() { - return "InterClusterConnection[from=" + getFrom() + ", to=" + getTo() + "]"; - } -}