public void drawU(UGraphic ug) {
		for (Cluster cluster : dotStringFactory.getBibliotekon().allCluster()) {
			cluster.drawU(ug, clusterBorder, dotData, new UStroke(1.5));
		}

		final Set<Double> xdots = new TreeSet<Double>();

		for (Shape shape : dotStringFactory.getBibliotekon().allShapes()) {
			final double minX = shape.getMinX();
			final double minY = shape.getMinY();
			final UGraphic ug2 = shape.isHidden() ? ug.apply(UHidden.HIDDEN) : ug;
			shape.getImage().drawU(ug2.apply(new UTranslate(minX, minY)));
			if (hasVerticalLine) {
				xdots.add(minX);
				xdots.add(minX + shape.getWidth());
			}
		}

		for (Line line : dotStringFactory.getBibliotekon().allLines()) {
			final UGraphic ug2 = line.isHidden() ? ug.apply(UHidden.HIDDEN) : ug;
			final HtmlColor color = rose.getHtmlColor(dotData.getSkinParam(), getArrowColorParam(), null);
			line.drawU(ug2, 0, 0, color);
		}

		final double THICKNESS_BORDER = 1.5;
		final int DASH = 8;

		if (xdots.size() > 0) {
			final double height = calculateDimension(ug.getStringBounder()).getHeight();
			ug = ug.apply(new UStroke(DASH, 10, THICKNESS_BORDER)).apply(new UChangeColor(clusterBorder));
			for (Double xv : middeling(xdots)) {
				ug.apply(new UTranslate(xv, 0)).draw(new ULine(0, height));
			}
		}
	}