merge trunk to common sl branch

git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1691843 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/build.xml b/build.xml
index ca705de..d7b5482 100644
--- a/build.xml
+++ b/build.xml
@@ -107,6 +107,12 @@
     <property name="scratchpad.output.test.dir" location="build/scratchpad-test-classes"/>
     <property name="scratchpad.testokfile" location="build/scratchpad-testokfile.txt"/>
 
+    <!-- Scratchpad/Geometry -->
+	<property name="geometry.schema" value="src/resources/ooxml/org/apache/poi/xslf/usermodel/presetShapeDefinitions.xml"/>
+	<property name="geometry.pkg" value="org.apache.poi.sl.draw.binding"/>
+	<property name="geometry.output.tmpdir" value="build/geometry-java"/>
+	
+	
     <!-- Examples: -->
     <property name="examples.src" location="src/examples/src"/>
     <property name="examples.output.dir" location="build/examples-classes"/>
@@ -378,6 +384,7 @@
         <mkdir dir="${scratchpad.output.dir}"/>
         <mkdir dir="${scratchpad.output.test.dir}"/>
         <mkdir dir="${scratchpad.reports.test}"/>
+    	<mkdir dir="${geometry.output.tmpdir}"/>
         <mkdir dir="${ooxml.output.dir}"/>
         <mkdir dir="${ooxml.output.test.dir}"/>
         <mkdir dir="${ooxml.reports.test}"/>
@@ -702,7 +709,39 @@
         </copy>
     </target>
 
-    <target name="compile-scratchpad" depends="compile-main">
+	<target name="generate-geometry" depends="fetch-ooxml-xsds">
+		<delete dir="${geometry.output.tmpdir}"/>
+		<!-- taskdef xjc -->
+		<!-- "D:\Program Files\Java\jdk1.6.0_45\bin\xjc" -p org.apache.poi.sl.model.geom.binding -readOnly -Xlocator -mark-generated ooxml-schemas\dml-shapeGeometry.xsd -->
+		<unzip src="${ooxml.lib}/${ooxml.xsds.izip.1}" dest="${geometry.output.tmpdir}"/>
+		<exec executable="${env.JAVA_HOME}/bin/xjc">
+			<arg value="-p"/>
+			<arg value="${geometry.pkg}"/>
+			<arg value="-b"/>
+			<arg file="src/types/definitions/dml-shapeGeometry.xjb"/>
+			<arg value="-readOnly"/>
+			<arg value="-npa"/>
+			<arg value="-no-header"/>
+			<!--arg value="-mark-generated"/ -->
+			<!--arg value="-Xlocator"/ -->
+			<arg file="${geometry.output.tmpdir}/dml-shapeGeometry.xsd"/>
+			<arg value="-d"/>
+			<arg file="${geometry.output.tmpdir}"/>
+		</exec>
+		<copy file="src/java/org/apache/poi/POIDocument.java" tofile="${geometry.output.tmpdir}/apache-license.txt">
+			<filterchain>
+			<headfilter lines="16"/>
+			</filterchain>
+		</copy>
+		<copy todir="${main.src}">
+			<fileset dir="${geometry.output.tmpdir}" includes="**/*.java"/>
+		     <filterchain>
+		         <concatfilter prepend="${geometry.output.tmpdir}/apache-license.txt"/>
+		     </filterchain>
+		</copy>
+	</target>
+	
+	<target name="compile-scratchpad" depends="compile-main,generate-geometry">
         <javac target="${jdk.version.class}"
                source="${jdk.version.source}"
                destdir="${scratchpad.output.dir}"
diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java
index 25f1eab..ce6bf5d 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java
@@ -17,13 +17,16 @@
 
 package org.apache.poi.hslf.examples;
 
-import org.apache.poi.hslf.usermodel.*;
+import java.awt.*;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+
 import org.apache.poi.hslf.model.*;
 import org.apache.poi.hslf.record.TextHeaderAtom;
-
-import java.io.IOException;
-import java.io.FileOutputStream;
-import java.awt.*;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.ShapeType;
+import org.apache.poi.sl.usermodel.VerticalAlignment;
 
 /**
  * Presentation for Fast Feather Track on ApacheconEU 2008
@@ -33,7 +36,7 @@
 public final class ApacheconEU08 {
 
     public static void main(String[] args) throws IOException {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
         ppt.setPageSize(new Dimension(720, 540));
 
         slide1(ppt);
@@ -55,48 +58,43 @@
 
     }
 
-    public static void slide1(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide1(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE);
-        tr1.setText("POI-HSLF");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE);
+        box1.setText("POI-HSLF");
         box1.setAnchor(new Rectangle(54, 78, 612, 115));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE);
-        tr2.setText("Java API To Access Microsoft PowerPoint Format Files");
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE);
+        box2.setText("Java API To Access Microsoft PowerPoint Format Files");
         box2.setAnchor(new Rectangle(108, 204, 504, 138));
         slide.addShape(box2);
 
-        TextBox box3 = new TextBox();
-        TextRun tr3 = box3.getTextRun();
-        tr3.getRichTextRuns()[0].setFontSize(32);
-        box3.setHorizontalAlignment(TextBox.AlignCenter);
-        tr3.setText(
+        HSLFTextBox box3 = new HSLFTextBox();
+        box3.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32d);
+        box3.setText(
                 "Yegor Kozlov\r" +
                 "yegor - apache - org");
+        box3.setHorizontalCentered(true);
         box3.setAnchor(new Rectangle(206, 348, 310, 84));
         slide.addShape(box3);
     }
 
-    public static void slide2(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide2(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.TITLE_TYPE);
-        tr1.setText("What is HSLF?");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.TITLE_TYPE);
+        box1.setText("What is HSLF?");
         box1.setAnchor(new Rectangle(36, 21, 648, 90));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr2.setText("HorribleSLideshowFormat is the POI Project's pure Java implementation " +
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.setRunType(TextHeaderAtom.BODY_TYPE);
+        box2.setText("HorribleSLideshowFormat is the POI Project's pure Java implementation " +
                 "of the Powerpoint binary file format. \r" +
                 "POI sub-project since 2005\r" +
                 "Started by Nick Birch, Yegor Kozlov joined soon after");
@@ -106,74 +104,66 @@
 
     }
 
-    public static void slide3(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide3(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.TITLE_TYPE);
-        tr1.setText("HSLF in a Nutshell");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.TITLE_TYPE);
+        box1.setText("HSLF in a Nutshell");
         box1.setAnchor(new Rectangle(36, 15, 648, 65));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr2.setText(
-                "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" +
-                "Pure Java API - you don't need PowerPoint to read and write *.ppt files\r" +
-                "Comprehensive support of PowerPoint objects");
-        tr2.getRichTextRuns()[0].setFontSize(28);
-        box2.setAnchor(new Rectangle(36, 80, 648, 200));
-        slide.addShape(box2);
-
-        TextBox box3 = new TextBox();
-        TextRun tr3 = box3.getTextRun();
-        tr3.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr3.setText(
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.setRunType(TextHeaderAtom.BODY_TYPE);
+        box2.setText(
+            "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" +
+            "Pure Java API - you don't need PowerPoint to read and write *.ppt files\r" +
+            "Comprehensive support of PowerPoint objects\r" +
                 "Rich text\r" +
                 "Tables\r" +
                 "Shapes\r" +
                 "Pictures\r" +
-                "Master slides");
-        tr3.getRichTextRuns()[0].setFontSize(24);
-        tr3.getRichTextRuns()[0].setIndentLevel(1);
-        box3.setAnchor(new Rectangle(36, 265, 648, 150));
-        slide.addShape(box3);
+                "Master slides\r" +
+            "Access to low level data structures"
+        );
 
-        TextBox box4 = new TextBox();
-        TextRun tr4 = box4.getTextRun();
-        tr4.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr4.setText("Access to low level data structures");
-        box4.setAnchor(new Rectangle(36, 430, 648, 50));
-        slide.addShape(box4);
+        List<HSLFTextParagraph> tp = box2.getTextParagraphs();
+        for (int i : new byte[]{0,1,2,8}) {
+            tp.get(i).getTextRuns().get(0).setFontSize(28d);
+        }
+        for (int i : new byte[]{3,4,5,6,7}) {
+            tp.get(i).getTextRuns().get(0).setFontSize(24d);
+            tp.get(i).setIndentLevel(1);
+        }
+        box2.setAnchor(new Rectangle(36, 80, 648, 400));
+        slide.addShape(box2);
     }
 
-    public static void slide4(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide4(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
         String[][] txt1 = {
             {"Note"},
             {"This presentation was created programmatically using POI HSLF"}
         };
-        Table table1 = new Table(2, 1);
+        HSLFTable table1 = new HSLFTable(2, 1);
         for (int i = 0; i < txt1.length; i++) {
             for (int j = 0; j < txt1[i].length; j++) {
-                TableCell cell = table1.getCell(i, j);
+                HSLFTableCell cell = table1.getCell(i, j);
                 cell.setText(txt1[i][j]);
-                cell.getTextRun().getRichTextRuns()[0].setFontSize(10);
-                RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];
-                rt.setFontName("Arial");
+                HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
+                rt.setFontSize(10d);
+                rt.setFontFamily("Arial");
                 rt.setBold(true);
                 if(i == 0){
-                    rt.setFontSize(32);
+                    rt.setFontSize(32d);
                     rt.setFontColor(Color.white);
                     cell.getFill().setForegroundColor(new Color(0, 153, 204));
                 } else {
-                    rt.setFontSize(28);
+                    rt.setFontSize(28d);
                     cell.getFill().setForegroundColor(new Color(235, 239, 241));
                 }
-                cell.setVerticalAlignment(TextBox.AnchorMiddle);
+                cell.setVerticalAlignment(VerticalAlignment.MIDDLE);
             }
         }
 
@@ -194,32 +184,28 @@
 
         table1.moveTo(100, 100);
 
-        TextBox box1 = new TextBox();
-        box1.setHorizontalAlignment(TextBox.AlignCenter);
-        TextRun tr1 = box1.getTextRun();
-        tr1.setText("The source code is available at\r" +
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setHorizontalCentered(true);
+        box1.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(24d);
+        box1.setText("The source code is available at\r" +
                 "http://people.apache.org/~yegor/apachecon_eu08/");
-        RichTextRun rt = tr1.getRichTextRuns()[0];
-        rt.setFontSize(24);
         box1.setAnchor(new Rectangle(80, 356, 553, 65));
         slide.addShape(box1);
 
     }
 
-    public static void slide5(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide5(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.TITLE_TYPE);
-        tr1.setText("HSLF in Action - 1\rData Extraction");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.TITLE_TYPE);
+        box1.setText("HSLF in Action - 1\rData Extraction");
         box1.setAnchor(new Rectangle(36, 21, 648, 100));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr2.setText(
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.setRunType(TextHeaderAtom.BODY_TYPE);
+        box2.setText(
                 "Text from slides and notes\r" +
                 "Images\r" +
                 "Shapes and their properties (type, position in the slide, color, font, etc.)");
@@ -229,90 +215,88 @@
 
     }
 
-    public static void slide6(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide6(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.TITLE_TYPE);
-        tr1.setText("HSLF in Action - 2");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.TITLE_TYPE);
+        box1.setText("HSLF in Action - 2");
         box1.setAnchor(new Rectangle(36, 20, 648, 90));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.getRichTextRuns()[0].setFontSize(18);
-        tr2.setText("Creating a simple presentation from scratch");
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18d);
+        box2.setText("Creating a simple presentation from scratch");
         box2.setAnchor(new Rectangle(170, 100, 364, 30));
         slide.addShape(box2);
 
-        TextBox box3 = new TextBox();
-        TextRun tr3 = box3.getTextRun();
-        RichTextRun rt3 = tr3.getRichTextRuns()[0];
-        rt3.setFontName("Courier New");
-        rt3.setFontSize(8);
-        tr3.setText(
-                "        SlideShow ppt = new SlideShow();\r" +
-                "        Slide slide = ppt.createSlide();\r" +
-                "\r" +
-                "        TextBox box2 = new TextBox();\r" +
-                "        box2.setHorizontalAlignment(TextBox.AlignCenter);\r" +
-                "        box2.setVerticalAlignment(TextBox.AnchorMiddle);\r" +
-                "        box2.getTextRun().setText(\"Java Code\");\r" +
-                "        box2.getFill().setForegroundColor(new Color(187, 224, 227));\r" +
-                "        box2.setLineColor(Color.black);\r" +
-                "        box2.setLineWidth(0.75);\r" +
-                "        box2.setAnchor(new Rectangle(66, 243, 170, 170));\r" +
-                "        slide.addShape(box2);\r" +
-                "\r" +
-                "        TextBox box3 = new TextBox();\r" +
-                "        box3.setHorizontalAlignment(TextBox.AlignCenter);\r" +
-                "        box3.setVerticalAlignment(TextBox.AnchorMiddle);\r" +
-                "        box3.getTextRun().setText(\"*.ppt file\");\r" +
-                "        box3.setLineWidth(0.75);\r" +
-                "        box3.setLineColor(Color.black);\r" +
-                "        box3.getFill().setForegroundColor(new Color(187, 224, 227));\r" +
-                "        box3.setAnchor(new Rectangle(473, 243, 170, 170));\r" +
-                "        slide.addShape(box3);\r" +
-                "\r" +
-                "        AutoShape box4 = new AutoShape(ShapeTypes.Arrow);\r" +
-                "        box4.getFill().setForegroundColor(new Color(187, 224, 227));\r" +
-                "        box4.setLineWidth(0.75);\r" +
-                "        box4.setLineColor(Color.black);\r" +
-                "        box4.setAnchor(new Rectangle(253, 288, 198, 85));\r" +
-                "        slide.addShape(box4);\r" +
-                "\r" +
-                "        FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\r" +
-                "        ppt.write(out);\r" +
-                "        out.close();");
+        HSLFTextBox box3 = new HSLFTextBox();
+        HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0);
+        rt3.setFontFamily("Courier New");
+        rt3.setFontSize(8d);
+        box3.setText(
+                "SlideShow ppt = new SlideShow();\u000b" +
+                "Slide slide = ppt.createSlide();\u000b" +
+                "\u000b" +
+                "TextBox box2 = new TextBox();\u000b" +
+                "box2.setHorizontalAlignment(TextBox.AlignCenter);\u000b" +
+                "box2.setVerticalAlignment(TextBox.AnchorMiddle);\u000b" +
+                "box2.getTextRun().setText(\"Java Code\");\u000b" +
+                "box2.getFill().setForegroundColor(new Color(187, 224, 227));\u000b" +
+                "box2.setLineColor(Color.black);\u000b" +
+                "box2.setLineWidth(0.75);\u000b" +
+                "box2.setAnchor(new Rectangle(66, 243, 170, 170));\u000b" +
+                "slide.addShape(box2);\u000b" +
+                "\u000b" +
+                "TextBox box3 = new TextBox();\u000b" +
+                "box3.setHorizontalAlignment(TextBox.AlignCenter);\u000b" +
+                "box3.setVerticalAlignment(TextBox.AnchorMiddle);\u000b" +
+                "box3.getTextRun().setText(\"*.ppt file\");\u000b" +
+                "box3.setLineWidth(0.75);\u000b" +
+                "box3.setLineColor(Color.black);\u000b" +
+                "box3.getFill().setForegroundColor(new Color(187, 224, 227));\u000b" +
+                "box3.setAnchor(new Rectangle(473, 243, 170, 170));\u000b" +
+                "slide.addShape(box3);\u000b" +
+                "\u000b" +
+                "AutoShape box4 = new AutoShape(ShapeTypes.Arrow);\u000b" +
+                "box4.getFill().setForegroundColor(new Color(187, 224, 227));\u000b" +
+                "box4.setLineWidth(0.75);\u000b" +
+                "box4.setLineColor(Color.black);\u000b" +
+                "box4.setAnchor(new Rectangle(253, 288, 198, 85));\u000b" +
+                "slide.addShape(box4);\u000b" +
+                "\u000b" +
+                "FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\u000b" +
+                "ppt.write(out);\u000b" +
+                "out.close();");
         box3.setAnchor(new Rectangle(30, 150, 618, 411));
+        box3.setHorizontalCentered(true);
         slide.addShape(box3);
     }
 
-    public static void slide7(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide7(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box2 = new TextBox();
-        box2.setHorizontalAlignment(TextBox.AlignCenter);
-        box2.setVerticalAlignment(TextBox.AnchorMiddle);
-        box2.getTextRun().setText("Java Code");
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.setHorizontalCentered(true);
+        box2.setVerticalAlignment(VerticalAlignment.MIDDLE);
+        box2.setText("Java Code");
         box2.getFill().setForegroundColor(new Color(187, 224, 227));
         box2.setLineColor(Color.black);
         box2.setLineWidth(0.75);
         box2.setAnchor(new Rectangle(66, 243, 170, 170));
         slide.addShape(box2);
 
-        TextBox box3 = new TextBox();
-        box3.setHorizontalAlignment(TextBox.AlignCenter);
-        box3.setVerticalAlignment(TextBox.AnchorMiddle);
-        box3.getTextRun().setText("*.ppt file");
+        HSLFTextBox box3 = new HSLFTextBox();
+        box3.setHorizontalCentered(true);
+        box3.setVerticalAlignment(VerticalAlignment.MIDDLE);
+        box3.setText("*.ppt file");
         box3.setLineWidth(0.75);
         box3.setLineColor(Color.black);
         box3.getFill().setForegroundColor(new Color(187, 224, 227));
         box3.setAnchor(new Rectangle(473, 243, 170, 170));
         slide.addShape(box3);
 
-        AutoShape box4 = new AutoShape(ShapeTypes.Arrow);
+        HSLFAutoShape box4 = new HSLFAutoShape(ShapeType.RIGHT_ARROW);
         box4.getFill().setForegroundColor(new Color(187, 224, 227));
         box4.setLineWidth(0.75);
         box4.setLineColor(Color.black);
@@ -320,20 +304,18 @@
         slide.addShape(box4);
     }
 
-    public static void slide8(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide8(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.TITLE_TYPE);
-        tr1.setText("Wait, there is more!");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.TITLE_TYPE);
+        box1.setText("Wait, there is more!");
         box1.setAnchor(new Rectangle(36, 21, 648, 90));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr2.setText(
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.setRunType(TextHeaderAtom.BODY_TYPE);
+        box2.setText(
                 "Rich text\r" +
                 "Tables\r" +
                 "Pictures (JPEG, PNG, BMP, WMF, PICT)\r" +
@@ -342,72 +324,70 @@
         slide.addShape(box2);
     }
 
-    public static void slide9(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide9(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.TITLE_TYPE);
-        tr1.setText("HSLF in Action - 3");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.TITLE_TYPE);
+        box1.setText("HSLF in Action - 3");
         box1.setAnchor(new Rectangle(36, 20, 648, 50));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.getRichTextRuns()[0].setFontSize(18);
-        tr2.setText("PPGraphics2D: PowerPoint Graphics2D driver");
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18d);
+        box2.setText("PPGraphics2D: PowerPoint Graphics2D driver");
         box2.setAnchor(new Rectangle(178, 70, 387, 30));
         slide.addShape(box2);
 
-        TextBox box3 = new TextBox();
-        TextRun tr3 = box3.getTextRun();
-        RichTextRun rt3 = tr3.getRichTextRuns()[0];
-        rt3.setFontName("Courier New");
-        rt3.setFontSize(8);
-        tr3.setText(
-                "        //bar chart data. The first value is the bar color, the second is the width\r" +
-                "        Object[] def = new Object[]{\r" +
-                "            Color.yellow, new Integer(100),\r" +
-                "            Color.green, new Integer(150),\r" +
-                "            Color.gray, new Integer(75),\r" +
-                "            Color.red, new Integer(200),\r" +
-                "        };\r" +
-                "\r" +
-                "        SlideShow ppt = new SlideShow();\r" +
-                "        Slide slide = ppt.createSlide();\r" +
-                "\r" +
-                "        ShapeGroup group = new ShapeGroup();\r" +
-                "        //define position of the drawing in the slide\r" +
-                "        Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);\r" +
-                "        group.setAnchor(bounds);\r" +
-                "        slide.addShape(group);\r" +
-                "        Graphics2D graphics = new PPGraphics2D(group);\r" +
-                "\r" +
-                "        //draw a simple bar graph\r" +
-                "        int x = bounds.x + 50, y = bounds.y + 50;\r" +
-                "        graphics.setFont(new Font(\"Arial\", Font.BOLD, 10));\r" +
-                "        for (int i = 0, idx = 1; i < def.length; i+=2, idx++) {\r" +
-                "            graphics.setColor(Color.black);\r" +
-                "            int width = ((Integer)def[i+1]).intValue();\r" +
-                "            graphics.drawString(\"Q\" + idx, x-20, y+20);\r" +
-                "            graphics.drawString(width + \"%\", x + width + 10, y + 20);\r" +
-                "            graphics.setColor((Color)def[i]);\r" +
-                "            graphics.fill(new Rectangle(x, y, width, 30));\r" +
-                "            y += 40;\r" +
-                "        }\r" +
-                "        graphics.setColor(Color.black);\r" +
-                "        graphics.setFont(new Font(\"Arial\", Font.BOLD, 14));\r" +
-                "        graphics.draw(bounds);\r" +
-                "        graphics.drawString(\"Performance\", x + 70, y + 40);\r" +
-                "\r" +
-                "        FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\r" +
-                "        ppt.write(out);\r" +
-                "        out.close();");
+        HSLFTextBox box3 = new HSLFTextBox();
+        HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0);
+        rt3.setFontFamily("Courier New");
+        rt3.setFontSize(8d);
+        box3.setText(
+                "//bar chart data. The first value is the bar color, the second is the width\u000b" +
+                "Object[] def = new Object[]{\u000b" +
+                "    Color.yellow, new Integer(100),\u000b" +
+                "    Color.green, new Integer(150),\u000b" +
+                "    Color.gray, new Integer(75),\u000b" +
+                "    Color.red, new Integer(200),\u000b" +
+                "};\u000b" +
+                "\u000b" +
+                "SlideShow ppt = new SlideShow();\u000b" +
+                "Slide slide = ppt.createSlide();\u000b" +
+                "\u000b" +
+                "ShapeGroup group = new ShapeGroup();\u000b" +
+                "//define position of the drawing in the slide\u000b" +
+                "Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);\u000b" +
+                "group.setAnchor(bounds);\u000b" +
+                "slide.addShape(group);\u000b" +
+                "Graphics2D graphics = new PPGraphics2D(group);\u000b" +
+                "\u000b" +
+                "//draw a simple bar graph\u000b" +
+                "int x = bounds.x + 50, y = bounds.y + 50;\u000b" +
+                "graphics.setFont(new Font(\"Arial\", Font.BOLD, 10));\u000b" +
+                "for (int i = 0, idx = 1; i < def.length; i+=2, idx++) {\u000b" +
+                "    graphics.setColor(Color.black);\u000b" +
+                "    int width = ((Integer)def[i+1]).intValue();\u000b" +
+                "    graphics.drawString(\"Q\" + idx, x-20, y+20);\u000b" +
+                "    graphics.drawString(width + \"%\", x + width + 10, y + 20);\u000b" +
+                "    graphics.setColor((Color)def[i]);\u000b" +
+                "    graphics.fill(new Rectangle(x, y, width, 30));\u000b" +
+                "    y += 40;\u000b" +
+                "}\u000b" +
+                "graphics.setColor(Color.black);\u000b" +
+                "graphics.setFont(new Font(\"Arial\", Font.BOLD, 14));\u000b" +
+                "graphics.draw(bounds);\u000b" +
+                "graphics.drawString(\"Performance\", x + 70, y + 40);\u000b" +
+                "\u000b" +
+                "FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\u000b" +
+                "ppt.write(out);\u000b" +
+                "out.close();");
         box3.setAnchor(new Rectangle(96, 110, 499, 378));
+        box3.setHorizontalCentered(true);
         slide.addShape(box3);
     }
 
-    public static void slide10(SlideShow ppt) throws IOException {
+    public static void slide10(HSLFSlideShow ppt) throws IOException {
         //bar chart data. The first value is the bar color, the second is the width
         Object[] def = new Object[]{
             Color.yellow, new Integer(100),
@@ -416,9 +396,9 @@
             Color.red, new Integer(200),
         };
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
-        ShapeGroup group = new ShapeGroup();
+        HSLFGroupShape group = new HSLFGroupShape();
         //define position of the drawing in the slide
         Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);
         group.setAnchor(bounds);
@@ -444,69 +424,51 @@
 
     }
 
-    public static void slide11(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide11(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.TITLE_TYPE);
-        tr1.setText("HSLF Development Plans");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.TITLE_TYPE);
+        box1.setText("HSLF Development Plans");
         box1.setAnchor(new Rectangle(36, 21, 648, 90));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr2.getRichTextRuns()[0].setFontSize(32);
-        tr2.setText(
-                "Support for more PowerPoint functionality\r" +
-                "Rendering slides into java.awt.Graphics2D");
-        box2.setAnchor(new Rectangle(36, 126, 648, 100));
-        slide.addShape(box2);
-
-        TextBox box3 = new TextBox();
-        TextRun tr3 = box3.getTextRun();
-        tr3.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr3.getRichTextRuns()[0].setIndentLevel(1);
-        tr3.setText(
-                "A way to export slides into images or other formats");
-        box3.setAnchor(new Rectangle(36, 220, 648, 70));
-        slide.addShape(box3);
-
-        TextBox box4 = new TextBox();
-        TextRun tr4 = box4.getTextRun();
-        tr4.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr4.getRichTextRuns()[0].setFontSize(32);
-        tr4.setText(
-                "Integration with Apache FOP - Formatting Objects Processor");
-        box4.setAnchor(new Rectangle(36, 290, 648, 90));
-        slide.addShape(box4);
-
-        TextBox box5 = new TextBox();
-        TextRun tr5 = box5.getTextRun();
-        tr5.setRunType(TextHeaderAtom.BODY_TYPE);
-        tr5.getRichTextRuns()[0].setIndentLevel(1);
-        tr5.setText(
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.setRunType(TextHeaderAtom.BODY_TYPE);
+        box2.setText(
+            "Support for more PowerPoint functionality\r" +
+            "Rendering slides into java.awt.Graphics2D\r" +
+                "A way to export slides into images or other formats\r" +
+            "Integration with Apache FOP - Formatting Objects Processor\r" +
                 "Transformation of XSL-FO into PPT\r" +
-                "PPT2PDF transcoder");
-        box5.setAnchor(new Rectangle(36, 380, 648, 100));
-        slide.addShape(box5);
+                "PPT2PDF transcoder"
+        );
+
+        List<HSLFTextParagraph> tp = box2.getTextParagraphs();
+        for (int i : new byte[]{0,1,3}) {
+            tp.get(i).getTextRuns().get(0).setFontSize(28d);
+        }
+        for (int i : new byte[]{2,4,5}) {
+            tp.get(i).getTextRuns().get(0).setFontSize(24d);
+            tp.get(i).setIndentLevel(1);
+        }
+        
+        box2.setAnchor(new Rectangle(36, 126, 648, 400));
+        slide.addShape(box2);
     }
 
-    public static void slide12(SlideShow ppt) throws IOException {
-        Slide slide = ppt.createSlide();
+    public static void slide12(HSLFSlideShow ppt) throws IOException {
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox box1 = new TextBox();
-        TextRun tr1 = box1.getTextRun();
-        tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE);
-        tr1.setText("Questions?");
+        HSLFTextBox box1 = new HSLFTextBox();
+        box1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE);
+        box1.setText("Questions?");
         box1.setAnchor(new Rectangle(54, 167, 612, 115));
         slide.addShape(box1);
 
-        TextBox box2 = new TextBox();
-        TextRun tr2 = box2.getTextRun();
-        tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE);
-        tr2.setText(
+        HSLFTextBox box2 = new HSLFTextBox();
+        box2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE);
+        box2.setText(
                 "http://poi.apache.org/hslf/\r" +
                 "http://people.apache.org/~yegor");
         box2.setAnchor(new Rectangle(108, 306, 504, 138));
diff --git a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java
index 3a97b61..a047d8b 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java
@@ -17,10 +17,7 @@
 
 package org.apache.poi.hslf.examples;
 
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.TextBox;
+import org.apache.poi.hslf.usermodel.*;
 
 import java.io.FileOutputStream;
 
@@ -34,22 +31,22 @@
 
     public static void main(String[] args) throws Exception {
 
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
-        TextBox shape = new TextBox();
-        RichTextRun rt = shape.getTextRun().getRichTextRuns()[0];
+        HSLFTextBox shape = new HSLFTextBox();
+        HSLFTextParagraph rt = shape.getTextParagraphs().get(0);
+        rt.getTextRuns().get(0).setFontSize(42d);
+        rt.setBullet(true);
+        rt.setIndent(0d);  //bullet offset
+        rt.setLeftMargin(50d);   //text offset (should be greater than bullet offset)
+        rt.setBulletChar('\u263A'); //bullet character
         shape.setText(
                 "January\r" +
                 "February\r" +
                 "March\r" +
                 "April");
-        rt.setFontSize(42);
-        rt.setBullet(true);
-        rt.setBulletOffset(0);  //bullet offset
-        rt.setTextOffset(50);   //text offset (should be greater than bullet offset)
-        rt.setBulletChar('\u263A'); //bullet character
         slide.addShape(shape);
 
         shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300));  //position of the text box in the slide
diff --git a/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java b/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java
index 0aa8db3..8732152 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/CreateHyperlink.java
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hslf.examples;
 
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.*;
 import org.apache.poi.hslf.model.*;
 
 import java.io.FileOutputStream;
@@ -31,19 +31,19 @@
 public final class CreateHyperlink {
 
     public static void main(String[] args) throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slideA = ppt.createSlide();
-        Slide slideB = ppt.createSlide();
-        Slide slideC = ppt.createSlide();
+        HSLFSlide slideA = ppt.createSlide();
+        HSLFSlide slideB = ppt.createSlide();
+        HSLFSlide slideC = ppt.createSlide();
 
         // link to a URL
-        TextBox textBox1 = new TextBox();
+        HSLFTextBox textBox1 = new HSLFTextBox();
         textBox1.setText("Apache POI");
         textBox1.setAnchor(new Rectangle(100, 100, 200, 50));
 
         String text = textBox1.getText();
-        Hyperlink link = new Hyperlink();
+        HSLFHyperlink link = new HSLFHyperlink();
         link.setAddress("http://www.apache.org");
         link.setTitle(textBox1.getText());
         int linkId = ppt.addHyperlink(link);
@@ -54,11 +54,11 @@
         slideA.addShape(textBox1);
 
         // link to another slide
-        TextBox textBox2 = new TextBox();
+        HSLFTextBox textBox2 = new HSLFTextBox();
         textBox2.setText("Go to slide #3");
         textBox2.setAnchor(new Rectangle(100, 300, 200, 50));
 
-        Hyperlink link2 = new Hyperlink();
+        HSLFHyperlink link2 = new HSLFHyperlink();
         link2.setAddress(slideC);
         ppt.addHyperlink(link2);
 
diff --git a/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java b/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java
index a278e89..d1e9a21 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/DataExtraction.java
@@ -41,11 +41,11 @@
         }
 
         FileInputStream is = new FileInputStream(args[0]);
-        SlideShow ppt = new SlideShow(is);
+        HSLFSlideShow ppt = new HSLFSlideShow(is);
         is.close();
 
         //extract all sound files embedded in this presentation
-        SoundData[] sound = ppt.getSoundData();
+        HSLFSoundData[] sound = ppt.getSoundData();
         for (int i = 0; i < sound.length; i++) {
             String type = sound[i].getSoundType();  //*.wav
             String name = sound[i].getSoundName();  //typically file name
@@ -57,14 +57,14 @@
             out.close();
         }
 
-        //extract embedded OLE documents
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            Shape[] shape = slide[i].getShapes();
-            for (int j = 0; j < shape.length; j++) {
-                if (shape[j] instanceof OLEShape) {
-                    OLEShape ole = (OLEShape) shape[j];
-                    ObjectData data = ole.getObjectData();
+        int oleIdx=-1, picIdx=-1;
+        for (HSLFSlide slide : ppt.getSlides()) {
+            //extract embedded OLE documents
+            for (HSLFShape shape : slide.getShapes()) {
+                if (shape instanceof OLEShape) {
+                    oleIdx++;
+                    OLEShape ole = (OLEShape) shape;
+                    HSLFObjectData data = ole.getObjectData();
                     String name = ole.getInstanceName();
                     if ("Worksheet".equals(name)) {
 
@@ -81,11 +81,11 @@
                          }
 
                         //save on disk
-                        FileOutputStream out = new FileOutputStream(name + "-("+(j)+").doc");
+                        FileOutputStream out = new FileOutputStream(name + "-("+(oleIdx)+").doc");
                         doc.write(out);
                         out.close();
                      }  else {
-                        FileOutputStream out = new FileOutputStream(ole.getProgID() + "-"+(j+1)+".dat");
+                        FileOutputStream out = new FileOutputStream(ole.getProgID() + "-"+(oleIdx+1)+".dat");
                         InputStream dis = data.getData();
                         byte[] chunk = new byte[2048];
                         int count;
@@ -96,50 +96,44 @@
                         out.close();
                     }
                 }
-
-            }
-        }
-
-        //Pictures
-        for (int i = 0; i < slide.length; i++) {
-            Shape[] shape = slide[i].getShapes();
-            for (int j = 0; j < shape.length; j++) {
-                if (shape[j] instanceof Picture) {
-                    Picture p = (Picture) shape[j];
-                    PictureData data = p.getPictureData();
+                
+                //Pictures
+                else if (shape instanceof HSLFPictureShape) {
+                    picIdx++;
+                    HSLFPictureShape p = (HSLFPictureShape) shape;
+                    HSLFPictureData data = p.getPictureData();
                     String name = p.getPictureName();
                     int type = data.getType();
                     String ext;
                     switch (type) {
-                        case Picture.JPEG:
+                        case HSLFPictureShape.JPEG:
                             ext = ".jpg";
                             break;
-                        case Picture.PNG:
+                        case HSLFPictureShape.PNG:
                             ext = ".png";
                             break;
-                        case Picture.WMF:
+                        case HSLFPictureShape.WMF:
                             ext = ".wmf";
                             break;
-                        case Picture.EMF:
+                        case HSLFPictureShape.EMF:
                             ext = ".emf";
                             break;
-                        case Picture.PICT:
+                        case HSLFPictureShape.PICT:
                             ext = ".pict";
                             break;
-                        case Picture.DIB:
+                        case HSLFPictureShape.DIB:
                             ext = ".dib";
                             break;
                         default:
                             continue;
                     }
-                    FileOutputStream out = new FileOutputStream("pict-" + j + ext);
+                    FileOutputStream out = new FileOutputStream("pict-" + picIdx + ext);
                     out.write(data.getData());
                     out.close();
                 }
-
             }
-        }
 
+        }
     }
 
     private static void usage(){
diff --git a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java
index 8d79211..cd90090 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/Graphics2DDemo.java
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hslf.examples;
 
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.*;
 import org.apache.poi.hslf.model.*;
 
 import java.awt.*;
@@ -34,7 +34,7 @@
      * A simple bar chart demo
      */
     public static void main(String[] args) throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
         //bar chart data. The first value is the bar color, the second is the width
         Object[] def = new Object[]{
@@ -44,13 +44,13 @@
             Color.red, new Integer(80),
         };
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
-        ShapeGroup group = new ShapeGroup();
+        HSLFGroupShape group = new HSLFGroupShape();
         //define position of the drawing in the slide
         Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);
         group.setAnchor(bounds);
-        group.setCoordinates(new java.awt.Rectangle(0, 0, 100, 100));
+        group.setInteriorAnchor(new java.awt.Rectangle(0, 0, 100, 100));
         slide.addShape(group);
         Graphics2D graphics = new PPGraphics2D(group);
 
@@ -68,7 +68,7 @@
         }
         graphics.setColor(Color.black);
         graphics.setFont(new Font("Arial", Font.BOLD, 14));
-        graphics.draw(group.getCoordinates());
+        graphics.draw(group.getInteriorAnchor());
         graphics.drawString("Performance", x + 30, y + 10);
 
         FileOutputStream out = new FileOutputStream("hslf-graphics.ppt");
diff --git a/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java b/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java
index 3ebcecc..b335e1f 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/HeadersFootersDemo.java
@@ -16,9 +16,9 @@
 ==================================================================== */
 package org.apache.poi.hslf.examples;
 
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlide;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
 import org.apache.poi.hslf.model.HeadersFooters;
-import org.apache.poi.hslf.model.Slide;
 
 import java.io.FileOutputStream;
 
@@ -29,7 +29,7 @@
  */
 public class HeadersFootersDemo {
     public static void main(String[] args) throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
         
         HeadersFooters slideHeaders = ppt.getSlideHeadersFooters();
         slideHeaders.setFootersText("Created by POI-HSLF");
@@ -40,7 +40,7 @@
         notesHeaders.setFootersText("My notes footers");
         notesHeaders.setHeaderText("My notes header");
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
         FileOutputStream out = new FileOutputStream("headers_footers.ppt");
         ppt.write(out);
diff --git a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java
index 968426c..9e88082 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/Hyperlinks.java
@@ -17,13 +17,10 @@
 
 package org.apache.poi.hslf.examples;
 
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.TextRun;
-import org.apache.poi.hslf.model.Hyperlink;
-import org.apache.poi.hslf.model.Shape;
-
 import java.io.FileInputStream;
+import java.util.List;
+
+import org.apache.poi.hslf.usermodel.*;
 
 /**
  * Demonstrates how to read hyperlinks from  a presentation
@@ -35,47 +32,40 @@
     public static void main(String[] args) throws Exception {
         for (int i = 0; i < args.length; i++) {
             FileInputStream is = new FileInputStream(args[i]);
-            SlideShow ppt = new SlideShow(is);
+            HSLFSlideShow ppt = new HSLFSlideShow(is);
             is.close();
 
-            Slide[] slide = ppt.getSlides();
-            for (int j = 0; j < slide.length; j++) {
-                System.out.println("slide " + slide[j].getSlideNumber());
+            for (HSLFSlide slide : ppt.getSlides()) {
+                System.out.println("\nslide " + slide.getSlideNumber());
 
-                //read hyperlinks from the slide's text runs
-                System.out.println("reading hyperlinks from the text runs");
-                TextRun[] txt = slide[j].getTextRuns();
-                for (int k = 0; k < txt.length; k++) {
-                    String text = txt[k].getText();
-                    Hyperlink[] links = txt[k].getHyperlinks();
-                    if(links != null) for (int l = 0; l < links.length; l++) {
-                        Hyperlink link = links[l];
-                        String title = link.getTitle();
-                        String address = link.getAddress();
-                        System.out.println("  " + title);
-                        System.out.println("  " + address);
-                        String substring = text.substring(link.getStartIndex(), link.getEndIndex()-1);//in ppt end index is inclusive
-                        System.out.println("  " + substring);
+                // read hyperlinks from the slide's text runs
+                System.out.println("- reading hyperlinks from the text runs");
+                for (List<HSLFTextParagraph> txtParas : slide.getTextParagraphs()) {
+                    List<HSLFHyperlink> links = HSLFHyperlink.find(txtParas);
+                    String text = HSLFTextParagraph.getRawText(txtParas);
+
+                    for (HSLFHyperlink link : links) {
+                        System.out.println(toStr(link, text));
                     }
                 }
 
-                //in PowerPoint you can assign a hyperlink to a shape without text,
-                //for example to a Line object. The code below demonstrates how to
-                //read such hyperlinks
-                System.out.println("  reading hyperlinks from the slide's shapes");
-                Shape[] sh = slide[j].getShapes();
-                for (int k = 0; k < sh.length; k++) {
-                    Hyperlink link = sh[k].getHyperlink();
-                    if(link != null)  {
-                        String title = link.getTitle();
-                        String address = link.getAddress();
-                        System.out.println("  " + title);
-                        System.out.println("  " + address);
-                    }
+                // in PowerPoint you can assign a hyperlink to a shape without text,
+                // for example to a Line object. The code below demonstrates how to
+                // read such hyperlinks
+                System.out.println("- reading hyperlinks from the slide's shapes");
+                for (HSLFShape sh : slide.getShapes()) {
+                    HSLFHyperlink link = HSLFHyperlink.find(sh);
+                    if (link == null) continue;
+                    System.out.println(toStr(link, null));
                 }
             }
-
         }
-
    }
+
+    static String toStr(HSLFHyperlink link, String rawText) {
+        //in ppt end index is inclusive
+        String formatStr = "title: %1$s, address: %2$s" + (rawText == null ? "" : ", start: %3$s, end: %4$s, substring: %5$s");
+        String substring = (rawText == null) ? "" : rawText.substring(link.getStartIndex(), link.getEndIndex()-1);
+        return String.format(formatStr, link.getTitle(), link.getAddress(), link.getStartIndex(), link.getEndIndex(), substring);
+    }
 }
diff --git a/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java b/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java
index 99037d3..8981c64 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/PPT2PNG.java
@@ -17,15 +17,16 @@
 
 package org.apache.poi.hslf.examples;
 
-import org.apache.poi.hslf.usermodel.*;
-import org.apache.poi.hslf.model.*;
+import java.awt.*;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 
 import javax.imageio.ImageIO;
-import java.io.FileOutputStream;
-import java.io.FileInputStream;
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.awt.geom.Rectangle2D;
+
+import org.apache.poi.hslf.usermodel.HSLFSlide;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
 
 /**
  * Demonstrates how you can use HSLF to convert each slide into a PNG image
@@ -62,19 +63,18 @@
         }
 
         FileInputStream is = new FileInputStream(file);
-        SlideShow ppt = new SlideShow(is);
+        HSLFSlideShow ppt = new HSLFSlideShow(is);
         is.close();
 
         Dimension pgsize = ppt.getPageSize();
         int width = (int)(pgsize.width*scale);
         int height = (int)(pgsize.height*scale);
 
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            if (slidenum != -1 && slidenum != (i+1)) continue;
+        for (HSLFSlide slide : ppt.getSlides()) {
+            if (slidenum != -1 && slidenum != slide.getSlideNumber()) continue;
 
-            String title = slide[i].getTitle();
-            System.out.println("Rendering slide "+slide[i].getSlideNumber() + (title == null ? "" : ": " + title));
+            String title = slide.getTitle();
+            System.out.println("Rendering slide "+slide.getSlideNumber() + (title == null ? "" : ": " + title));
 
             BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
             Graphics2D graphics = img.createGraphics();
@@ -88,9 +88,9 @@
 
             graphics.scale((double)width/pgsize.width, (double)height/pgsize.height);
 
-            slide[i].draw(graphics);
+            slide.draw(graphics);
 
-            String fname = file.replaceAll("\\.ppt", "-" + (i+1) + ".png");
+            String fname = file.replaceAll("\\.ppt", "-" + slide.getSlideNumber() + ".png");
             FileOutputStream out = new FileOutputStream(fname);
             ImageIO.write(img, "png", out);
             out.close();
diff --git a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java
index b31019d..3cdb101 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/SoundFinder.java
@@ -15,16 +15,14 @@
    limitations under the License.
 ==================================================================== */
 package org.apache.poi.hslf.examples;
-import org.apache.poi.ddf.*;
-import org.apache.poi.hslf.model.*;
-import org.apache.poi.hslf.record.InteractiveInfo;
-import org.apache.poi.hslf.record.InteractiveInfoAtom;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.usermodel.*;
 import java.io.FileInputStream;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.*;
+
 /**
  * For each slide iterate over shapes and found associated sound data.
  *
@@ -32,19 +30,18 @@
  */
 public class SoundFinder {
     public static void main(String[] args) throws Exception {
-        SlideShow ppt = new SlideShow(new FileInputStream(args[0]));
-        SoundData[] sounds = ppt.getSoundData();
+        HSLFSlideShow ppt = new HSLFSlideShow(new FileInputStream(args[0]));
+        HSLFSoundData[] sounds = ppt.getSoundData();
 
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            Shape[] shape = slide[i].getShapes();
-            for (int j = 0; j < shape.length; j++) {
-                int soundRef = getSoundReference(shape[j]);
-                if(soundRef != -1) {
-                    System.out.println("Slide["+i+"], shape["+j+"], soundRef: "+soundRef);
-                    System.out.println("  " + sounds[soundRef].getSoundName());
-                    System.out.println("  " + sounds[soundRef].getSoundType());
-                }
+        for (HSLFSlide slide : ppt.getSlides()) {
+            for (HSLFShape shape : slide.getShapes()) {
+                int soundRef = getSoundReference(shape);
+                if(soundRef == -1) continue;
+
+                
+                System.out.println("Slide["+slide.getSlideNumber()+"], shape["+shape.getShapeId()+"], soundRef: "+soundRef);
+                System.out.println("  " + sounds[soundRef].getSoundName());
+                System.out.println("  " + sounds[soundRef].getSoundType());
             }
         }
     }
@@ -54,7 +51,7 @@
      * @return 0-based reference to a sound in the sound collection
      * or -1 if the shape is not associated with a sound
      */
-    protected static int getSoundReference(Shape shape){
+    protected static int getSoundReference(HSLFShape shape){
         int soundRef = -1;
         //dive into the shape container and search for InteractiveInfoAtom
         EscherContainerRecord spContainer = shape.getSpContainer();
diff --git a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java
index 44935c0..93463aa 100644
--- a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java
+++ b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java
@@ -17,9 +17,10 @@
 
 package org.apache.poi.hslf.examples;
 
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.RichTextRun;
+import org.apache.poi.hslf.usermodel.*;
 import org.apache.poi.hslf.model.*;
+import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
+import org.apache.poi.sl.usermodel.VerticalAlignment;
 
 import java.awt.*;
 import java.io.FileOutputStream;
@@ -43,26 +44,26 @@
             {"Total PO History Spend", "$10,172,038"}
         };
 
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
         //six rows, two columns
-        Table table1 = new Table(6, 2);
+        HSLFTable table1 = new HSLFTable(6, 2);
         for (int i = 0; i < txt1.length; i++) {
             for (int j = 0; j < txt1[i].length; j++) {
-                TableCell cell = table1.getCell(i, j);
-                cell.setText(txt1[i][j]);
-                RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];
-                rt.setFontName("Arial");
-                rt.setFontSize(10);
+                HSLFTableCell cell = table1.getCell(i, j);
+                HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
+                rt.setFontFamily("Arial");
+                rt.setFontSize(10d);
                 if(i == 0){
                     cell.getFill().setForegroundColor(new Color(227, 227, 227));
                 } else {
                     rt.setBold(true);
                 }
-                cell.setVerticalAlignment(TextBox.AnchorMiddle);
-                cell.setHorizontalAlignment(TextBox.AlignCenter);
+                cell.setVerticalAlignment(VerticalAlignment.MIDDLE);
+                cell.setHorizontalCentered(true);
+                cell.setText(txt1[i][j]);
             }
         }
 
@@ -87,26 +88,27 @@
         };
 
         //two rows, one column
-        Table table2 = new Table(2, 1);
+        HSLFTable table2 = new HSLFTable(2, 1);
         for (int i = 0; i < txt2.length; i++) {
             for (int j = 0; j < txt2[i].length; j++) {
-                TableCell cell = table2.getCell(i, j);
-                cell.setText(txt2[i][j]);
-                RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];
-                rt.setFontSize(10);
-                rt.setFontName("Arial");
+                HSLFTableCell cell = table2.getCell(i, j);
+                HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
+                rt.setFontSize(10d);
+                rt.setFontFamily("Arial");
                 if(i == 0){
                     cell.getFill().setForegroundColor(new Color(0, 51, 102));
                     rt.setFontColor(Color.white);
                     rt.setBold(true);
-                    rt.setFontSize(14);
-                    cell.setHorizontalAlignment(TextBox.AlignCenter);
+                    rt.setFontSize(14d);
+                    cell.setHorizontalCentered(true);
                 } else {
-                    rt.setBullet(true);
-                    rt.setFontSize(12);
-                    cell.setHorizontalAlignment(TextBox.AlignLeft);
+                    rt.getTextParagraph().setBullet(true);
+                    rt.setFontSize(12d);
+                    rt.getTextParagraph().setAlignment(TextAlign.LEFT);
+                    cell.setHorizontalCentered(false);
                 }
-                cell.setVerticalAlignment(TextBox.AnchorMiddle);
+                cell.setVerticalAlignment(VerticalAlignment.MIDDLE);
+                cell.setText(txt2[i][j]);
             }
         }
         table2.setColumnWidth(0, 300);
diff --git a/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java b/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java
index bb6f19d..c656e7c 100644
--- a/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java
+++ b/src/examples/src/org/apache/poi/hssf/usermodel/examples/EmeddedObjects.java
@@ -21,8 +21,8 @@
 import org.apache.poi.poifs.filesystem.Entry;

 import org.apache.poi.poifs.filesystem.POIFSFileSystem;

 import org.apache.poi.hwpf.HWPFDocument;

-import org.apache.poi.hslf.HSLFSlideShow;

-import org.apache.poi.hslf.usermodel.SlideShow;

+import org.apache.poi.hslf.usermodel.HSLFSlideShow;

+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;

 

 import java.io.FileInputStream;

 import java.util.Iterator;

@@ -47,7 +47,7 @@
                 //System.out.println(entry.getName() + ": " + embeddedWordDocument.getRange().text());

             }  else if (oleName.equals("Presentation")) {

                 DirectoryNode dn = (DirectoryNode) obj.getDirectory();

-                SlideShow embeddedPowerPointDocument = new SlideShow(new HSLFSlideShow(dn));

+                HSLFSlideShow embeddedPowerPointDocument = new HSLFSlideShow(new HSLFSlideShowImpl(dn));

                 //System.out.println(entry.getName() + ": " + embeddedPowerPointDocument.getSlides().length);

             } else {

                 if(obj.hasDirectoryEntry()){

diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/DataExtraction.java b/src/examples/src/org/apache/poi/xslf/usermodel/DataExtraction.java
index b7e08fc..5437b5d 100644
--- a/src/examples/src/org/apache/poi/xslf/usermodel/DataExtraction.java
+++ b/src/examples/src/org/apache/poi/xslf/usermodel/DataExtraction.java
@@ -76,7 +76,6 @@
         Dimension pageSize = ppt.getPageSize();  // size of the canvas in points

         for(XSLFSlide slide : ppt.getSlides()) {

             for(XSLFShape shape : slide){

-                Rectangle2D anchor = shape.getAnchor();  // position on the canvas

                 if(shape instanceof XSLFTextShape) {

                     XSLFTextShape txShape = (XSLFTextShape)shape;

                     System.out.println(txShape.getText());

diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java b/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java
index de90c52..e399d3d 100644
--- a/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java
+++ b/src/examples/src/org/apache/poi/xslf/usermodel/PieChartDemo.java
@@ -67,7 +67,7 @@
             String chartTitle = modelReader.readLine();  // first line is chart title

     

             XMLSlideShow pptx = new XMLSlideShow(new FileInputStream(args[0]));

-            XSLFSlide slide = pptx.getSlides()[0];

+            XSLFSlide slide = pptx.getSlides().get(0);

     

             // find chart in the slide

             XSLFChart chart = null;

diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java
index 93d437b..f552ea8 100644
--- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java
+++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial1.java
@@ -37,7 +37,7 @@
         /*XSLFSlide blankSlide =*/ ppt.createSlide();

 

         

-        XSLFSlideMaster master = ppt.getSlideMasters()[0];

+        XSLFSlideMaster master = ppt.getSlideMasters().get(0);

 

         XSLFSlideLayout layout1 = master.getLayout(SlideLayout.TITLE);

         XSLFSlide slide1 = ppt.createSlide(layout1) ;

@@ -56,13 +56,13 @@
         // we are going to add text by paragraphs. Clear the default placehoder text before that

         bodyPlaceholder.clearText();

         XSLFTextParagraph p1 = bodyPlaceholder.addNewTextParagraph();

-        p1.setLevel(0);

+        p1.setIndentLevel(0);

         p1.addNewTextRun().setText("Level1 text");

         XSLFTextParagraph p2 = bodyPlaceholder.addNewTextParagraph();

-        p2.setLevel(1);

+        p2.setIndentLevel(1);

         p2.addNewTextRun().setText("Level2 text");

         XSLFTextParagraph p3 = bodyPlaceholder.addNewTextParagraph();

-        p3.setLevel(3);

+        p3.setIndentLevel(3);

         p3.addNewTextRun().setText("Level3 text");

 

         FileOutputStream out = new FileOutputStream("slides.pptx");

diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java
index 373f01f..dcd0dea 100644
--- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java
+++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java
@@ -42,30 +42,30 @@
         XSLFTextParagraph p1 = shape1.addNewTextParagraph();

         XSLFTextRun r1 = p1.addNewTextRun();

         r1.setText("Paragraph Formatting");

-        r1.setFontSize(24);

+        r1.setFontSize(24d);

         r1.setFontColor(new Color(85, 142, 213));

 

         XSLFTextParagraph p2 = shape1.addNewTextParagraph();

         // If spaceBefore >= 0, then space is a percentage of normal line height.

         // If spaceBefore < 0, the absolute value of linespacing is the spacing in points

-        p2.setSpaceBefore(-20); // 20 pt from the previous paragraph

-        p2.setSpaceAfter(300); // 3 lines after the paragraph

+        p2.setSpaceBefore(-20d); // 20 pt from the previous paragraph

+        p2.setSpaceAfter(300d); // 3 lines after the paragraph

         XSLFTextRun r2 = p2.addNewTextRun();

         r2.setText("Paragraph  properties apply to all text residing within the corresponding paragraph.");

-        r2.setFontSize(16);

+        r2.setFontSize(16d);

 

         XSLFTextParagraph p3 = shape1.addNewTextParagraph();

 

         XSLFTextRun r3 = p3.addNewTextRun();

         r3.setText("Run Formatting");

-        r3.setFontSize(24);

+        r3.setFontSize(24d);

         r3.setFontColor(new Color(85, 142, 213));

 

         XSLFTextParagraph p4 = shape1.addNewTextParagraph();

-        p4.setSpaceBefore(-20); // 20 pt from the previous paragraph

-        p4.setSpaceAfter(300); // 3 lines after the paragraph

+        p4.setSpaceBefore(-20d); // 20 pt from the previous paragraph

+        p4.setSpaceAfter(300d); // 3 lines after the paragraph

         XSLFTextRun r4 = p4.addNewTextRun();

-        r4.setFontSize(16);

+        r4.setFontSize(16d);

         r4.setText(

                 "Run level formatting is the most granular property level and allows " +

                 "for the specifying of all low level text properties. The text run is " +

diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial4.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial4.java
index ea4fba3..926bc0d 100644
--- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial4.java
+++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial4.java
@@ -19,11 +19,13 @@
 

 package org.apache.poi.xslf.usermodel;

 

-import java.awt.*;

+import java.awt.Color;

 import java.awt.geom.Rectangle2D;

 import java.io.FileOutputStream;

 import java.io.IOException;

 

+import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;

+

 /**

  * PPTX Tables

  *

diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java
index a80f23c..443d568 100644
--- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java
+++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java
@@ -23,6 +23,8 @@
 import java.io.FileOutputStream;

 import java.io.IOException;

 

+import org.apache.poi.sl.usermodel.AutoNumberingScheme;

+

 /**

  * Bullets and numbering

  *

@@ -38,41 +40,41 @@
         shape.setAnchor(new Rectangle(50, 50, 400, 200));

 

         XSLFTextParagraph p1 = shape.addNewTextParagraph();

-        p1.setLevel(0);

+        p1.setIndentLevel(0);

         p1.setBullet(true);

         XSLFTextRun r1 = p1.addNewTextRun();

         r1.setText("Bullet1");

 

         XSLFTextParagraph p2 = shape.addNewTextParagraph();

         // indentation before text

-        p2.setLeftMargin(60);

+        p2.setLeftMargin(60d);

         // the bullet is set 40 pt before the text

-        p2.setIndent(-40);

+        p2.setIndent(-40d);

         p2.setBullet(true);

         // customize bullets

         p2.setBulletFontColor(Color.red);

         p2.setBulletFont("Wingdings");

         p2.setBulletCharacter("\u0075");

-        p2.setLevel(1);

+        p2.setIndentLevel(1);

         XSLFTextRun r2 = p2.addNewTextRun();

         r2.setText("Bullet2");

 

         // the next three paragraphs form an auto-numbered list

         XSLFTextParagraph p3 = shape.addNewTextParagraph();

-        p3.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_R, 1);

-        p3.setLevel(2);

+        p3.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1);

+        p3.setIndentLevel(2);

         XSLFTextRun r3 = p3.addNewTextRun();

         r3.setText("Numbered List Item - 1");

 

         XSLFTextParagraph p4 = shape.addNewTextParagraph();

-        p4.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_R, 2);

-        p4.setLevel(2);

+        p4.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 2);

+        p4.setIndentLevel(2);

         XSLFTextRun r4 = p4.addNewTextRun();

         r4.setText("Numbered List Item - 2");

 

         XSLFTextParagraph p5 = shape.addNewTextParagraph();

-        p5.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_R, 3);

-        p5.setLevel(2);

+        p5.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 3);

+        p5.setIndentLevel(2);

         XSLFTextRun r5 = p5.addNewTextRun();

         r5.setText("Numbered List Item - 3");

 

diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java
index a83a17e..41c6cc2 100644
--- a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java
+++ b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step1.java
@@ -50,12 +50,12 @@
                 if(shape instanceof XSLFTextShape) {
                     XSLFTextShape tsh = (XSLFTextShape)shape;
                     for(XSLFTextParagraph p : tsh){
-                        System.out.println("Paragraph level: " + p.getLevel());
+                        System.out.println("Paragraph level: " + p.getIndentLevel());
                         for(XSLFTextRun r : p){
-                            System.out.println(r.getText());
+                            System.out.println(r.getRawText());
                             System.out.println("  bold: " + r.isBold());
                             System.out.println("  italic: " + r.isItalic());
-                            System.out.println("  underline: " + r.isUnderline());
+                            System.out.println("  underline: " + r.isUnderlined());
                             System.out.println("  font.family: " + r.getFontFamily());
                             System.out.println("  font.size: " + r.getFontSize());
                             System.out.println("  font.color: " + r.getFontColor());
diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step2.java b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step2.java
index b006eb8..cd01d60c8 100644
--- a/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step2.java
+++ b/src/examples/src/org/apache/poi/xslf/usermodel/tutorial/Step2.java
@@ -49,7 +49,7 @@
         // blank slide
         /*XSLFSlide blankSlide =*/ ppt.createSlide();
 
-        XSLFSlideMaster defaultMaster = ppt.getSlideMasters()[0];
+        XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0);
 
         // title slide
         XSLFSlideLayout titleLayout = defaultMaster.getLayout(SlideLayout.TITLE);
diff --git a/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java b/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java
index b50e959..69b570f 100644
--- a/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java
+++ b/src/examples/src/org/apache/poi/xssf/usermodel/examples/EmbeddedObjects.java
@@ -20,7 +20,7 @@
 import org.apache.poi.openxml4j.opc.OPCPackage;

 import org.apache.poi.openxml4j.opc.PackagePart;

 import org.apache.poi.xwpf.usermodel.XWPFDocument;

-import org.apache.poi.hslf.HSLFSlideShow;

+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;

 import org.apache.poi.hwpf.HWPFDocument;

 import org.apache.poi.xslf.XSLFSlideShow;

 import org.apache.poi.hssf.usermodel.HSSFWorkbook;

@@ -54,7 +54,7 @@
             }

             // PowerPoint Document - binary file format

             else if (contentType.equals("application/vnd.ms-powerpoint")) {

-                HSLFSlideShow slideShow = new HSLFSlideShow(pPart.getInputStream());

+                HSLFSlideShowImpl slideShow = new HSLFSlideShowImpl(pPart.getInputStream());

             }

             // PowerPoint Document - OpenXML file format

             else if (contentType.equals("application/vnd.openxmlformats-officedocument.presentationml.presentation")) {

diff --git a/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java b/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java
index 51e54f6..a946b18 100644
--- a/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/HSLFFileHandler.java
@@ -22,14 +22,14 @@
 import java.io.FileInputStream;
 import java.io.InputStream;
 
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.junit.Test;
 
 public class HSLFFileHandler extends POIFSFileHandler {
 	@Override
 	public void handleFile(InputStream stream) throws Exception {
-		HSLFSlideShow slide = new HSLFSlideShow(stream);
+		HSLFSlideShowImpl slide = new HSLFSlideShowImpl(stream);
 		assertNotNull(slide.getCurrentUserAtom());
 		assertNotNull(slide.getEmbeddedObjects());
 		assertNotNull(slide.getUnderlyingBytes());
diff --git a/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java b/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
index b6f5f7c..2669238 100644
--- a/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
+++ b/src/integrationtest/org/apache/poi/stress/XSLFFileHandler.java
@@ -29,6 +29,8 @@
 import java.io.InputStream;
 
 import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.sl.draw.DrawFactory;
+import org.apache.poi.sl.draw.Drawable;
 import org.apache.poi.xslf.XSLFSlideShow;
 import org.apache.poi.xslf.usermodel.XMLSlideShow;
 import org.apache.poi.xslf.usermodel.XSLFNotes;
@@ -61,9 +63,7 @@
     private void createBitmaps(ByteArrayOutputStream out) throws IOException {
         XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(out.toByteArray()));
         Dimension pgsize = ppt.getPageSize();
-        XSLFSlide[] xmlSlide = ppt.getSlides();
-        int slideSize = xmlSlide.length;
-        for (int i = 0; i < slideSize; i++) {
+        for (XSLFSlide xmlSlide : ppt.getSlides()) {
 //            System.out.println("slide-" + (i + 1));
 //            System.out.println("" + xmlSlide[i].getTitle());
 
@@ -71,13 +71,15 @@
             Graphics2D graphics = img.createGraphics();
 
             // draw stuff
-            xmlSlide[i].draw(graphics);
+            xmlSlide.draw(graphics);
 
             // Also try to read notes
-            XSLFNotes notes = xmlSlide[i].getNotes();
+            XSLFNotes notes = xmlSlide.getNotes();
             if(notes != null) {
                 for (XSLFShape note : notes) {
-                    note.draw(graphics);
+                    DrawFactory df = DrawFactory.getInstance(graphics);
+                    Drawable d = df.getDrawable(note);
+                    d.draw(graphics);
                     
                     if (note instanceof XSLFTextShape) {
                         XSLFTextShape txShape = (XSLFTextShape) note;
diff --git a/src/java/org/apache/poi/common/usermodel/Fill.java b/src/java/org/apache/poi/common/usermodel/Fill.java
deleted file mode 100644
index 9e1ab45..0000000
--- a/src/java/org/apache/poi/common/usermodel/Fill.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.common.usermodel;
-
-import java.awt.Color;
-
-public interface Fill {
-	public Color getColor();
-	public void setColor(Color color);
-}
diff --git a/src/java/org/apache/poi/ddf/DefaultEscherRecordFactory.java b/src/java/org/apache/poi/ddf/DefaultEscherRecordFactory.java
index cf48a38..05a3246 100644
--- a/src/java/org/apache/poi/ddf/DefaultEscherRecordFactory.java
+++ b/src/java/org/apache/poi/ddf/DefaultEscherRecordFactory.java
@@ -117,7 +117,7 @@
      * @param recClasses The records to convert
      * @return The map containing the id/constructor pairs.
      */
-    private static Map<Short, Constructor<? extends EscherRecord>> recordsToMap(Class<?>[] recClasses) {
+    protected static Map<Short, Constructor<? extends EscherRecord>> recordsToMap(Class<?>[] recClasses) {
         Map<Short, Constructor<? extends EscherRecord>> result = new HashMap<Short, Constructor<? extends EscherRecord>>();
         final Class<?>[] EMPTY_CLASS_ARRAY = new Class[0];
 
diff --git a/src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java b/src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java
index b6193ce..bbb84ba 100644
--- a/src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java
+++ b/src/java/org/apache/poi/ddf/EscherChildAnchorRecord.java
@@ -40,13 +40,26 @@
     private int field_4_dy2;
 
     public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {
-        /*int bytesRemaining =*/ readHeader( data, offset );
+        int bytesRemaining = readHeader( data, offset );
         int pos            = offset + 8;
         int size           = 0;
-        field_1_dx1    =  LittleEndian.getInt( data, pos + size );size+=4;
-        field_2_dy1    =  LittleEndian.getInt( data, pos + size );size+=4;
-        field_3_dx2  =  LittleEndian.getInt( data, pos + size );size+=4;
-        field_4_dy2 =  LittleEndian.getInt( data, pos + size );size+=4;
+        switch (bytesRemaining) {
+        case 16: // RectStruct
+            field_1_dx1 =  LittleEndian.getInt( data, pos + size );size+=4;
+            field_2_dy1 =  LittleEndian.getInt( data, pos + size );size+=4;
+            field_3_dx2 =  LittleEndian.getInt( data, pos + size );size+=4;
+            field_4_dy2 =  LittleEndian.getInt( data, pos + size );size+=4;
+            break;
+        case 8: // SmallRectStruct
+            field_1_dx1 =  LittleEndian.getShort( data, pos + size );size+=2;
+            field_2_dy1 =  LittleEndian.getShort( data, pos + size );size+=2;
+            field_3_dx2 =  LittleEndian.getShort( data, pos + size );size+=2;
+            field_4_dy2 =  LittleEndian.getShort( data, pos + size );size+=2;
+            break;
+        default:
+            throw new RuntimeException("Invalid EscherChildAnchorRecord - neither 8 nor 16 bytes.");
+        }
+            
         return 8 + size;
     }
 
@@ -58,8 +71,8 @@
         LittleEndian.putInt( data, pos, getRecordSize()-8 );       pos += 4;
         LittleEndian.putInt( data, pos, field_1_dx1 );             pos += 4;
         LittleEndian.putInt( data, pos, field_2_dy1 );             pos += 4;
-        LittleEndian.putInt( data, pos, field_3_dx2 );           pos += 4;
-        LittleEndian.putInt( data, pos, field_4_dy2 );          pos += 4;
+        LittleEndian.putInt( data, pos, field_3_dx2 );             pos += 4;
+        LittleEndian.putInt( data, pos, field_4_dy2 );             pos += 4;
 
         listener.afterRecordSerialize( pos, getRecordId(), pos - offset, this );
         return pos - offset;
diff --git a/src/java/org/apache/poi/ddf/EscherContainerRecord.java b/src/java/org/apache/poi/ddf/EscherContainerRecord.java
index 8454231..d613943 100644
--- a/src/java/org/apache/poi/ddf/EscherContainerRecord.java
+++ b/src/java/org/apache/poi/ddf/EscherContainerRecord.java
@@ -18,10 +18,7 @@
 package org.apache.poi.ddf;
 
 import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
+import java.util.*;
 
 import org.apache.poi.util.HexDump;
 import org.apache.poi.util.LittleEndian;
@@ -154,30 +151,9 @@
     }
 
     public Iterator<EscherRecord> getChildIterator() {
-        return new ReadOnlyIterator(_childRecords);
+        return Collections.unmodifiableList(_childRecords).iterator();
     }
-    private static final class ReadOnlyIterator implements Iterator<EscherRecord> {
-        private final List<EscherRecord> _list;
-        private int _index;
 
-        public ReadOnlyIterator(List<EscherRecord> list) {
-            _list = list;
-            _index = 0;
-        }
-
-        public boolean hasNext() {
-            return _index < _list.size();
-        }
-        public EscherRecord next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
-            }
-            return _list.get(_index++);
-        }
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
     /**
      * replaces the internal child list with the contents of the supplied <tt>childRecords</tt>
      */
diff --git a/src/java/org/apache/poi/ddf/EscherProperties.java b/src/java/org/apache/poi/ddf/EscherProperties.java
index 7ec2190..2bee6b9 100644
--- a/src/java/org/apache/poi/ddf/EscherProperties.java
+++ b/src/java/org/apache/poi/ddf/EscherProperties.java
@@ -507,7 +507,7 @@
 		addProp(m, SHADOWSTYLE__ORIGINX, "shadowstyle.originx");
 		addProp(m, SHADOWSTYLE__ORIGINY, "shadowstyle.originy");
 		addProp(m, SHADOWSTYLE__SHADOW, "shadowstyle.shadow");
-		addProp(m, SHADOWSTYLE__SHADOWOBSURED, "shadowstyle.shadowobsured");
+		addProp(m, SHADOWSTYLE__SHADOWOBSURED, "shadowstyle.shadowobscured");
 		addProp(m, PERSPECTIVE__TYPE, "perspective.type");
 		addProp(m, PERSPECTIVE__OFFSETX, "perspective.offsetx");
 		addProp(m, PERSPECTIVE__OFFSETY, "perspective.offsety");
diff --git a/src/java/org/apache/poi/ddf/EscherTextboxRecord.java b/src/java/org/apache/poi/ddf/EscherTextboxRecord.java
index c21c227..1a0147f 100644
--- a/src/java/org/apache/poi/ddf/EscherTextboxRecord.java
+++ b/src/java/org/apache/poi/ddf/EscherTextboxRecord.java
@@ -17,9 +17,7 @@
 
 package org.apache.poi.ddf;
 
-import org.apache.poi.util.HexDump;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.RecordFormatException;
+import org.apache.poi.util.*;
 
 /**
  * Holds data from the parent application. Most commonly used to store
@@ -32,7 +30,7 @@
  */
 public class EscherTextboxRecord extends EscherRecord
 {
-    public static final short RECORD_ID = (short)0xF00D;
+    public static final short RECORD_ID = (short)0xf00d;
     public static final String RECORD_DESCRIPTION = "msofbtClientTextbox";
 
     private static final byte[] NO_BYTES = new byte[0];
diff --git a/src/java/org/apache/poi/hssf/usermodel/DummyGraphics2d.java b/src/java/org/apache/poi/hssf/usermodel/DummyGraphics2d.java
index beadac4..8ada601 100644
--- a/src/java/org/apache/poi/hssf/usermodel/DummyGraphics2d.java
+++ b/src/java/org/apache/poi/hssf/usermodel/DummyGraphics2d.java
@@ -28,6 +28,7 @@
 import java.awt.image.RenderedImage;

 import java.awt.image.renderable.RenderableImage;

 import java.text.AttributedCharacterIterator;

+import java.util.Arrays;

 import java.util.Map;

 

 public class DummyGraphics2d

@@ -262,7 +263,7 @@
 

     public void setPaint( Paint paint )

     {

-        System.out.println( "setPain(Paint):" );

+        System.out.println( "setPaint(Paint):" );

         System.out.println( "paint = " + paint );

         g2D.setPaint( paint );

     }

@@ -285,7 +286,19 @@
     public void setStroke(Stroke s)

     {

         System.out.println( "setStroke(Stoke):" );

-        System.out.println( "s = " + s );

+        if (s instanceof BasicStroke) {

+            BasicStroke bs = (BasicStroke)s;

+            StringBuilder str = new StringBuilder("s = BasicStroke(");

+            str.append("dash[]: "+Arrays.toString(bs.getDashArray())+", ");

+            str.append("dashPhase: "+bs.getDashPhase()+", ");

+            str.append("endCap: "+bs.getEndCap()+", ");

+            str.append("lineJoin: "+bs.getLineJoin()+", ");

+            str.append("width: "+bs.getLineWidth()+", ");

+            str.append("miterLimit: "+bs.getMiterLimit()+")");

+            System.out.println(str.toString());

+        } else {

+            System.out.println( "s = " + s );

+        }

         g2D.setStroke( s );

     }

 

diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java b/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
index 04f57b4..667c83c 100644
--- a/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
+++ b/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
@@ -518,7 +518,7 @@
     }
 
     public Chart createChart(ClientAnchor anchor) {
-        throw new RuntimeException("NotImplemented");
+        throw new UnsupportedOperationException("NotImplemented");
     }
 
 
diff --git a/src/java/org/apache/poi/common/usermodel/LineStyle.java b/src/java/org/apache/poi/sl/draw/DrawAutoShape.java
similarity index 78%
copy from src/java/org/apache/poi/common/usermodel/LineStyle.java
copy to src/java/org/apache/poi/sl/draw/DrawAutoShape.java
index db676f5..6af2b4b 100644
--- a/src/java/org/apache/poi/common/usermodel/LineStyle.java
+++ b/src/java/org/apache/poi/sl/draw/DrawAutoShape.java
@@ -1,21 +1,27 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.common.usermodel;
-
-public interface LineStyle {
-
-}
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import org.apache.poi.sl.usermodel.*;

+

+

+public class DrawAutoShape<T extends AutoShape<? extends TextParagraph<? extends TextRun>>> extends DrawTextShape<T> {

+    public DrawAutoShape(T shape) {

+        super(shape);

+    }

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawBackground.java b/src/java/org/apache/poi/sl/draw/DrawBackground.java
new file mode 100644
index 0000000..35c844d
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawBackground.java
@@ -0,0 +1,60 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.*;

+import java.awt.geom.Rectangle2D;

+

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.Shape;

+

+

+public class DrawBackground<T extends Background> extends DrawShape<T> {

+    public DrawBackground(T shape) {

+        super(shape);

+    }

+

+    public void draw(Graphics2D graphics) {

+        Dimension pg = shape.getSheet().getSlideShow().getPageSize();

+        final Rectangle2D anchor = new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight());

+

+        PlaceableShape ps = new PlaceableShape(){

+            public ShapeContainer<? extends Shape> getParent() { return null; }

+            public Rectangle2D getAnchor() { return anchor; }

+            public void setAnchor(Rectangle2D anchor) {}

+            public double getRotation() { return 0; }

+            public void setRotation(double theta) {}

+            public void setFlipHorizontal(boolean flip) {}

+            public void setFlipVertical(boolean flip) {}

+            public boolean getFlipHorizontal() { return false; }

+            public boolean getFlipVertical() { return false; }

+        };

+        

+        DrawFactory drawFact = DrawFactory.getInstance(graphics);

+        DrawPaint dp = drawFact.getPaint(ps);

+        Paint fill = dp.getPaint(graphics, shape.getFillStyle().getPaint());

+        Rectangle2D anchor2 = getAnchor(graphics, anchor);

+        

+        if(fill != null) {

+            graphics.setPaint(fill);

+            graphics.fill(anchor2);

+        }

+    }

+    

+    

+}

diff --git a/src/java/org/apache/poi/common/usermodel/LineStyle.java b/src/java/org/apache/poi/sl/draw/DrawConnectorShape.java
similarity index 80%
rename from src/java/org/apache/poi/common/usermodel/LineStyle.java
rename to src/java/org/apache/poi/sl/draw/DrawConnectorShape.java
index db676f5..0fee07c 100644
--- a/src/java/org/apache/poi/common/usermodel/LineStyle.java
+++ b/src/java/org/apache/poi/sl/draw/DrawConnectorShape.java
@@ -1,21 +1,26 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.common.usermodel;
-
-public interface LineStyle {
-
-}
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import org.apache.poi.sl.usermodel.*;

+

+public class DrawConnectorShape<T extends ConnectorShape> extends DrawSimpleShape<T> {

+    public DrawConnectorShape(T shape) {

+        super(shape);

+    }

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawFactory.java b/src/java/org/apache/poi/sl/draw/DrawFactory.java
new file mode 100644
index 0000000..97b3f52
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawFactory.java
@@ -0,0 +1,148 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import static org.apache.poi.sl.draw.Drawable.DRAW_FACTORY;

+

+import java.awt.Graphics2D;

+import java.awt.font.TextLayout;

+import java.text.AttributedString;

+

+import org.apache.poi.sl.usermodel.*;

+

+public class DrawFactory {

+    protected static ThreadLocal<DrawFactory> defaultFactory = new ThreadLocal<DrawFactory>();

+

+    /**

+     * Set a custom draw factory for the current thread.

+     * This is a fallback, for operations where usercode can't set a graphics context.

+     * Preferably use the rendering hint {@link Drawable#DRAW_FACTORY} to set the factory.

+     *

+     * @param factory

+     */

+    public static void setDefaultFactory(DrawFactory factory) {

+        defaultFactory.set(factory);

+    }

+

+    public static DrawFactory getInstance(Graphics2D graphics) {

+        // first try to find the factory over the rendering hint

+        DrawFactory factory = null;

+        boolean isHint = false;

+        if (graphics != null) {

+            factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY);

+            isHint = (factory != null);

+        }

+        // secondly try the thread local default

+        if (factory == null) {

+            factory = defaultFactory.get();

+        }

+        // and at last, use the default factory

+        if (factory == null) {

+            factory = new DrawFactory();

+        }

+        if (graphics != null && !isHint) {

+            graphics.setRenderingHint(DRAW_FACTORY, factory);

+        }

+        return factory;

+    }

+

+    @SuppressWarnings("unchecked")

+    public Drawable getDrawable(Shape shape) {

+        if (shape instanceof TextBox) {

+            return getDrawable((TextBox<? extends TextParagraph<? extends TextRun>>)shape);

+        } else if (shape instanceof FreeformShape) {

+            return getDrawable((FreeformShape<? extends TextParagraph<? extends TextRun>>)shape);

+        } else if (shape instanceof TextShape) {

+            return getDrawable((TextShape<? extends TextParagraph<? extends TextRun>>)shape);

+        } else if (shape instanceof GroupShape) {

+            return getDrawable((GroupShape<? extends Shape>)shape);

+        } else if (shape instanceof PictureShape) {

+            return getDrawable((PictureShape)shape);

+        } else if (shape instanceof Background) {

+            return getDrawable((Background)shape);

+        } else if (shape instanceof ConnectorShape) {

+            return getDrawable((ConnectorShape)shape);

+        } else if (shape instanceof TableShape) {

+            return getDrawable((TableShape)shape);

+        } else if (shape instanceof Slide) {

+            return getDrawable((Slide<? extends Shape, ? extends SlideShow, ? extends Notes<?,?>>)shape);

+        } else if (shape instanceof MasterSheet) {

+            return getDrawable((MasterSheet<? extends Shape, ? extends SlideShow>)shape);

+        } else if (shape instanceof Sheet) {

+            return getDrawable((Sheet<? extends Shape, ? extends SlideShow>)shape);

+        }

+

+        throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass());

+    }

+

+    public <T extends Slide<? extends Shape, ? extends SlideShow, ? extends Notes<?,?>>> DrawSlide<T> getDrawable(T sheet) {

+        return new DrawSlide<T>(sheet);

+    }

+

+    public <T extends Sheet<? extends Shape, ? extends SlideShow>> DrawSheet<T> getDrawable(T sheet) {

+        return new DrawSheet<T>(sheet);

+    }

+

+    public <T extends MasterSheet<? extends Shape, ? extends SlideShow>> DrawMasterSheet<T> getDrawable(T sheet) {

+        return new DrawMasterSheet<T>(sheet);

+    }

+

+    public <T extends TextBox<? extends TextParagraph<?>>> DrawTextBox<T> getDrawable(T shape) {

+        return new DrawTextBox<T>(shape);

+    }

+

+    public <T extends FreeformShape<? extends TextParagraph<? extends TextRun>>> DrawFreeformShape<T> getDrawable(T shape) {

+        return new DrawFreeformShape<T>(shape);

+    }

+

+    public <T extends ConnectorShape> DrawConnectorShape<T> getDrawable(T shape) {

+        return new DrawConnectorShape<T>(shape);

+    }

+    

+    public <T extends TableShape> DrawTableShape<T> getDrawable(T shape) {

+        return new DrawTableShape<T>(shape);

+    }

+    

+    public <T extends TextShape<? extends TextParagraph<? extends TextRun>>> DrawTextShape<T> getDrawable(T shape) {

+        return new DrawTextShape<T>(shape);

+    }

+

+    public <T extends GroupShape<? extends Shape>> DrawGroupShape<T> getDrawable(T shape) {

+        return new DrawGroupShape<T>(shape);

+    }

+    

+    public <T extends PictureShape> DrawPictureShape<T> getDrawable(T shape) {

+        return new DrawPictureShape<T>(shape);

+    }

+    

+    public <T extends TextRun> DrawTextParagraph<T> getDrawable(TextParagraph<T> paragraph) {

+        return new DrawTextParagraph<T>(paragraph);

+    }

+

+    public <T extends Background> DrawBackground<T> getDrawable(T shape) {

+        return new DrawBackground<T>(shape);

+    }

+    

+    public DrawTextFragment getTextFragment(TextLayout layout, AttributedString str) {

+        return new DrawTextFragment(layout, str);

+    }

+    

+    public DrawPaint getPaint(PlaceableShape shape) {

+        return new DrawPaint(shape);

+    }

+}

diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java b/src/java/org/apache/poi/sl/draw/DrawFontManager.java
similarity index 67%
copy from src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java
copy to src/java/org/apache/poi/sl/draw/DrawFontManager.java
index 44f5a56..9c49489 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java
+++ b/src/java/org/apache/poi/sl/draw/DrawFontManager.java
@@ -1,37 +1,38 @@
-/*
- *  ====================================================================
- *    Licensed to the Apache Software Foundation (ASF) under one or more
- *    contributor license agreements.  See the NOTICE file distributed with
- *    this work for additional information regarding copyright ownership.
- *    The ASF licenses this file to You under the Apache License, Version 2.0
- *    (the "License"); you may not use this file except in compliance with
- *    the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- * ====================================================================
- */
-
-package org.apache.poi.xslf.model.geom;
-
-
-/**
- * A bridge to the consumer application.
- *
- * To get a shape geometry one needs to pass shape bounds and adjust values.
- *
- * @author Yegor Kozlov
- */
-public interface IAdjustableShape {
-    /**
-     *
-     * @param  name name of a adjust value, e.g. adj1
-     * @return adjust guide defined in the shape or null
-     */
-    Guide getAdjustValue(String name);
-}
+/*

+ *  ====================================================================

+ *    Licensed to the Apache Software Foundation (ASF) under one or more

+ *    contributor license agreements.  See the NOTICE file distributed with

+ *    this work for additional information regarding copyright ownership.

+ *    The ASF licenses this file to You under the Apache License, Version 2.0

+ *    (the "License"); you may not use this file except in compliance with

+ *    the License.  You may obtain a copy of the License at

+ *

+ *        http://www.apache.org/licenses/LICENSE-2.0

+ *

+ *    Unless required by applicable law or agreed to in writing, software

+ *    distributed under the License is distributed on an "AS IS" BASIS,

+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ *    See the License for the specific language governing permissions and

+ *    limitations under the License.

+ * ====================================================================

+ */

+

+package org.apache.poi.sl.draw;

+

+/**

+ * Manages fonts when rendering slides.

+ *

+ * Use this class to handle unknown / missing fonts or to substitute fonts

+ */

+public interface DrawFontManager {

+

+    /**

+     * select a font to be used to paint text

+     *

+     * @param typeface the font family as defined in the .pptx file.

+     * This can be unknown or missing in the graphic environment.

+     *

+     * @return the font to be used to paint text

+     */

+    String getRendererableFont(String typeface, int pitchFamily);

+}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java b/src/java/org/apache/poi/sl/draw/DrawFreeformShape.java
similarity index 77%
rename from src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java
rename to src/java/org/apache/poi/sl/draw/DrawFreeformShape.java
index 71891f8..b8dd7c3 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java
+++ b/src/java/org/apache/poi/sl/draw/DrawFreeformShape.java
@@ -14,21 +14,13 @@
    See the License for the specific language governing permissions and

    limitations under the License.

 ==================================================================== */

-package org.apache.poi.xslf.usermodel;

 

-/**

- * @author Yegor Kozlov

- */

-public enum LineDash {

-    SOLID,

-    DOT,

-    DASH,

-    LG_DASH,

-    DASH_DOT,

-    LG_DASH_DOT,

-    LG_DASH_DOT_DOT,

-    SYS_DASH,

-    SYS_DOT,

-    SYS_DASH_DOT,

-    SYS_DASH_DOT_DOT;

+package org.apache.poi.sl.draw;

+

+import org.apache.poi.sl.usermodel.*;

+

+public class DrawFreeformShape<T extends FreeformShape<? extends TextParagraph<? extends TextRun>>> extends DrawAutoShape<T> {

+    public DrawFreeformShape(T shape) {

+        super(shape);

+    }

 }

diff --git a/src/java/org/apache/poi/sl/draw/DrawGroupShape.java b/src/java/org/apache/poi/sl/draw/DrawGroupShape.java
new file mode 100644
index 0000000..60af5f7
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawGroupShape.java
@@ -0,0 +1,70 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.Graphics2D;

+import java.awt.geom.AffineTransform;

+import java.awt.geom.Rectangle2D;

+

+import org.apache.poi.sl.usermodel.*;

+

+

+public class DrawGroupShape<T extends GroupShape<? extends Shape>> extends DrawShape<T> implements Drawable {

+

+    public DrawGroupShape(T shape) {

+        super(shape);

+    }

+    

+    public void draw(Graphics2D graphics) {

+

+        // the coordinate system of this group of shape

+        Rectangle2D interior = shape.getInteriorAnchor();

+        // anchor of this group relative to the parent shape

+        Rectangle2D exterior = shape.getAnchor();

+

+        AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);

+        AffineTransform tx0 = new AffineTransform(tx);

+

+        double scaleX = interior.getWidth() == 0. ? 1.0 : exterior.getWidth() / interior.getWidth();

+        double scaleY = interior.getHeight() == 0. ? 1.0 : exterior.getHeight() / interior.getHeight();

+

+        tx.translate(exterior.getX(), exterior.getY());

+        tx.scale(scaleX, scaleY);

+        tx.translate(-interior.getX(), -interior.getY());

+

+        DrawFactory drawFact = DrawFactory.getInstance(graphics);

+        AffineTransform at2 = graphics.getTransform();

+        

+        for (Shape child : shape) {

+            // remember the initial transform and restore it after we are done with the drawing

+            AffineTransform at = graphics.getTransform();

+            graphics.setRenderingHint(Drawable.GSAVE, true);

+

+            Drawable draw = drawFact.getDrawable(child);

+            draw.applyTransform(graphics);

+            draw.draw(graphics);

+

+            // restore the coordinate system

+            graphics.setTransform(at);

+            graphics.setRenderingHint(Drawable.GRESTORE, true);

+        }

+

+        graphics.setTransform(at2);

+        graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, tx0);

+    }

+}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineCap.java b/src/java/org/apache/poi/sl/draw/DrawMasterSheet.java
similarity index 60%
rename from src/ooxml/java/org/apache/poi/xslf/usermodel/LineCap.java
rename to src/java/org/apache/poi/sl/draw/DrawMasterSheet.java
index 55b4c84..6b5d078 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineCap.java
+++ b/src/java/org/apache/poi/sl/draw/DrawMasterSheet.java
@@ -14,25 +14,25 @@
    See the License for the specific language governing permissions and

    limitations under the License.

 ==================================================================== */

-package org.apache.poi.xslf.usermodel;

 

-/**

- * 

- *

- * @author Yegor Kozlov

- */

-public enum LineCap {

-    /**

-     *  Rounded ends

-     */

-    ROUND,

-    /**

-     * Square protrudes by half line width

-     */

-    SQUARE,

+package org.apache.poi.sl.draw;

+

+import org.apache.poi.sl.usermodel.*;

+

+

+public class DrawMasterSheet<T extends MasterSheet<? extends Shape, ? extends SlideShow>> extends DrawSheet<T> {

+

+    public DrawMasterSheet(T sheet) {

+        super(sheet);

+    }

 

     /**

-     *  Line ends at end point

+     * Checks if this <code>sheet</code> displays the specified shape.

+     *

+     * Subclasses can override it and skip certain shapes from drawings,

+     * for instance, slide masters and layouts don't display placeholders

      */

-    FLAT;

-}
\ No newline at end of file
+    protected boolean canDraw(Shape shape){

+        return !(shape instanceof SimpleShape) || !((SimpleShape)shape).isPlaceholder();

+    }

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawPaint.java b/src/java/org/apache/poi/sl/draw/DrawPaint.java
new file mode 100644
index 0000000..16562b8
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawPaint.java
@@ -0,0 +1,444 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import static org.apache.poi.sl.usermodel.PaintStyle.TRANSPARENT_PAINT;

+

+import java.awt.*;

+import java.awt.MultipleGradientPaint.ColorSpaceType;

+import java.awt.MultipleGradientPaint.CycleMethod;

+import java.awt.geom.*;

+import java.io.IOException;

+import java.io.InputStream;

+

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint;

+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;

+import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint;

+import org.apache.poi.util.POILogFactory;

+import org.apache.poi.util.POILogger;

+

+

+/**

+ * This class handles color transformations

+ * 

+ * @see HSL code taken from <a href="https://tips4java.wordpress.com/2009/07/05/hsl-color/">Java Tips Weblog</a>

+ */

+public class DrawPaint {

+    // HSL code is public domain - see https://tips4java.wordpress.com/contact-us/

+    

+    private final static POILogger LOG = POILogFactory.getLogger(DrawPaint.class);

+

+    protected PlaceableShape shape;

+    

+    public DrawPaint(PlaceableShape shape) {

+        this.shape = shape;

+    }

+

+    public static SolidPaint createSolidPaint(final Color color) {

+        return new SolidPaint() {

+            public ColorStyle getSolidColor() {

+                return new ColorStyle(){

+                    public Color getColor() { return color; }

+                    public int getAlpha() { return -1; }

+                    public int getLumOff() { return -1; }

+                    public int getLumMod() { return -1; }

+                    public int getShade() { return -1; }

+                    public int getTint() { return -1; }

+                };

+            }

+        };

+    }

+    

+    public Paint getPaint(Graphics2D graphics, PaintStyle paint) {

+        if (paint instanceof SolidPaint) {

+            return getSolidPaint((SolidPaint)paint, graphics);

+        } else if (paint instanceof GradientPaint) {

+            return getGradientPaint((GradientPaint)paint, graphics);

+        } else if (paint instanceof TexturePaint) {

+            return getTexturePaint((TexturePaint)paint, graphics);

+        }

+        return null;

+    }

+    

+    protected Paint getSolidPaint(SolidPaint fill, Graphics2D graphics) {

+        return applyColorTransform(fill.getSolidColor());

+    }

+

+    protected Paint getGradientPaint(GradientPaint fill, Graphics2D graphics) {

+        switch (fill.getGradientType()) {

+        case linear:

+            return createLinearGradientPaint(fill, graphics);

+        case circular:

+            return createRadialGradientPaint(fill, graphics);

+        case shape:

+            return createPathGradientPaint(fill, graphics);

+        default:

+            throw new UnsupportedOperationException("gradient fill of type "+fill+" not supported.");

+        }

+    }

+

+    protected Paint getTexturePaint(TexturePaint fill, Graphics2D graphics) {

+        InputStream is = fill.getImageData();

+        if (is == null) return TRANSPARENT_PAINT.getSolidColor().getColor();

+        assert(graphics != null);

+        

+        ImageRenderer renderer = (ImageRenderer)graphics.getRenderingHint(Drawable.IMAGE_RENDERER);

+        if (renderer == null) renderer = new ImageRenderer();

+

+        try {

+            renderer.loadImage(fill.getImageData(), fill.getContentType());

+        } catch (IOException e) {

+            LOG.log(POILogger.ERROR, "Can't load image data - using transparent color", e);

+            return TRANSPARENT_PAINT.getSolidColor().getColor();

+        }

+

+        int alpha = fill.getAlpha();

+        if (alpha != -1) {

+            renderer.setAlpha(alpha/100000.f);

+        }

+        

+        Dimension dim = renderer.getDimension();

+        Rectangle2D textAnchor = new Rectangle2D.Double(0, 0, dim.getWidth(), dim.getHeight());

+        Paint paint = new java.awt.TexturePaint(renderer.getImage(), textAnchor);

+

+        return paint;

+    }

+    

+    /**

+     * Convert color transformations in {@link ColorStyle} to a {@link Color} instance

+     */

+    public static Color applyColorTransform(ColorStyle color){

+        Color result = color.getColor();

+

+        if (result == null || color.getAlpha() == 100) {

+            return TRANSPARENT_PAINT.getSolidColor().getColor();

+        }

+        

+        result = applyAlpha(result, color);

+        result = applyLuminance(result, color);

+        result = applyShade(result, color);

+        result = applyTint(result, color);

+

+        return result;

+    }

+

+    protected static Color applyAlpha(Color c, ColorStyle fc) {

+        int alpha = c.getAlpha();

+        return (alpha == 255) ? c : new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha); 

+    }

+    

+    /**

+     * Apply lumMod / lumOff adjustments

+     *

+     * @param c the color to modify

+     * @param lumMod luminance modulation in the range [0..100000]

+     * @param lumOff luminance offset in the range [0..100000]

+     * @return  modified color

+     * 

+     * @see <a href="https://msdn.microsoft.com/en-us/library/dd560821%28v=office.12%29.aspx">Using Office Open XML to Customize Document Formatting in the 2007 Office System</a>

+     */

+    protected static Color applyLuminance(Color c, ColorStyle fc) {

+        int lumMod = fc.getLumMod();

+        if (lumMod == -1) lumMod = 100000;

+

+        int lumOff = fc.getLumOff();

+        if (lumOff == -1) lumOff = 0;

+        

+        if (lumMod == 100000 && lumOff == 0) return c;

+

+        // The lumMod value is the percent luminance. A lumMod value of "60000",

+        // is 60% of the luminance of the original color.

+        // When the color is a shade of the original theme color, the lumMod

+        // attribute is the only one of the tags shown here that appears.

+        // The <a:lumOff> tag appears after the <a:lumMod> tag when the color is a

+        // tint of the original. The lumOff value always equals 1-lumMod, which is used in the tint calculation

+        //

+        // Despite having different ways to display the tint and shade percentages,

+        // all of the programs use the same method to calculate the resulting color.

+        // Convert the original RGB value to HSL ... and then adjust the luminance (L)

+        // with one of the following equations before converting the HSL value back to RGB.

+        // (The % tint in the following equations refers to the tint, themetint, themeshade,

+        // or lumMod values, as applicable.)

+        //

+        // For a shade, the equation is luminance * %tint.

+        //

+        // For a tint, the equation is luminance * %tint + (1-%tint).

+        // (Note that 1-%tint is equal to the lumOff value in DrawingML.)

+        

+        double fLumOff = lumOff / 100000d;

+        double fLumMod = lumMod / 100000d;

+        

+        double hsl[] = RGB2HSL(c);

+        hsl[2] = hsl[2]*fLumMod+fLumOff;

+

+        Color c2 = HSL2RGB(hsl[0], hsl[1], hsl[2], c.getAlpha()/255d);

+        return c2;

+    }

+    

+    /**

+     * This algorithm returns result different from PowerPoint.

+     * TODO: revisit and improve

+     */

+    protected static Color applyShade(Color c, ColorStyle fc) {

+        int shade = fc.getShade();

+        if (shade == -1) return c;

+        

+        float fshade = shade / 100000.f;

+

+        float red = c.getRed() * fshade;

+        float green = c.getGreen() * fshade;

+        float blue = c.getGreen() * fshade;

+        

+        return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha());

+    }

+

+    /**

+     * This algorithm returns result different from PowerPoint.

+     * TODO: revisit and improve

+     */

+    protected static Color applyTint(Color c, ColorStyle fc) {

+        int tint = fc.getTint();

+        if (tint == -1) return c;

+        

+        float ftint = tint / 100000.f;

+

+        float red = ftint * c.getRed() + (1.f - ftint) * 255.f;

+        float green = ftint * c.getGreen() + (1.f - ftint) * 255.f;

+        float blue = ftint * c.getBlue() + (1.f - ftint) * 255.f;

+

+        return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha());

+    }

+    

+

+    protected Paint createLinearGradientPaint(GradientPaint fill, Graphics2D graphics) {

+        double angle = fill.getGradientAngle();

+        Rectangle2D anchor = DrawShape.getAnchor(graphics, shape);

+

+        AffineTransform at = AffineTransform.getRotateInstance(

+            Math.toRadians(angle),

+            anchor.getX() + anchor.getWidth() / 2,

+            anchor.getY() + anchor.getHeight() / 2);

+

+        double diagonal = Math.sqrt(anchor.getHeight() * anchor.getHeight() + anchor.getWidth() * anchor.getWidth());

+        Point2D p1 = new Point2D.Double(anchor.getX() + anchor.getWidth() / 2 - diagonal / 2,

+                anchor.getY() + anchor.getHeight() / 2);

+        p1 = at.transform(p1, null);

+

+        Point2D p2 = new Point2D.Double(anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight() / 2);

+        p2 = at.transform(p2, null);

+

+        snapToAnchor(p1, anchor);

+        snapToAnchor(p2, anchor);

+

+        float[] fractions = fill.getGradientFractions();

+        Color[] colors = new Color[fractions.length];

+        

+        int i = 0;

+        for (ColorStyle fc : fill.getGradientColors()) {

+            colors[i++] = applyColorTransform(fc);

+        }

+

+        AffineTransform grAt  = new AffineTransform();

+        if(fill.isRotatedWithShape()) {

+            double rotation = shape.getRotation();

+            if (rotation != 0.) {

+                double centerX = anchor.getX() + anchor.getWidth() / 2;

+                double centerY = anchor.getY() + anchor.getHeight() / 2;

+

+                grAt.translate(centerX, centerY);

+                grAt.rotate(Math.toRadians(-rotation));

+                grAt.translate(-centerX, -centerY);

+            }

+        }

+

+        return new LinearGradientPaint

+            (p1, p2, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, grAt);

+    }

+

+    protected Paint createRadialGradientPaint(GradientPaint fill, Graphics2D graphics) {

+        Rectangle2D anchor = DrawShape.getAnchor(graphics, shape);

+

+        Point2D pCenter = new Point2D.Double(anchor.getX() + anchor.getWidth()/2,

+                anchor.getY() + anchor.getHeight()/2);

+

+        float radius = (float)Math.max(anchor.getWidth(), anchor.getHeight());

+

+        float[] fractions = fill.getGradientFractions();

+        Color[] colors = new Color[fractions.length];

+

+        int i=0;

+        for (ColorStyle fc : fill.getGradientColors()) {

+            colors[i++] = applyColorTransform(fc);

+        }

+

+        return new RadialGradientPaint(pCenter, radius, fractions, colors);

+    }

+

+    protected Paint createPathGradientPaint(GradientPaint fill, Graphics2D graphics) {

+        // currently we ignore an eventually center setting

+        

+        float[] fractions = fill.getGradientFractions();

+        Color[] colors = new Color[fractions.length];

+

+        int i=0;

+        for (ColorStyle fc : fill.getGradientColors()) {

+            colors[i++] = applyColorTransform(fc);

+        }

+

+        return new PathGradientPaint(colors, fractions);

+    }

+    

+    protected void snapToAnchor(Point2D p, Rectangle2D anchor) {

+        if (p.getX() < anchor.getX()) {

+            p.setLocation(anchor.getX(), p.getY());

+        } else if (p.getX() > (anchor.getX() + anchor.getWidth())) {

+            p.setLocation(anchor.getX() + anchor.getWidth(), p.getY());

+        }

+

+        if (p.getY() < anchor.getY()) {

+            p.setLocation(p.getX(), anchor.getY());

+        } else if (p.getY() > (anchor.getY() + anchor.getHeight())) {

+            p.setLocation(p.getX(), anchor.getY() + anchor.getHeight());

+        }

+    }

+

+    /**

+     *  Convert HSL values to a RGB Color.

+     *

+     *  @param h Hue is specified as degrees in the range 0 - 360.

+     *  @param s Saturation is specified as a percentage in the range 1 - 100.

+     *  @param l Luminance is specified as a percentage in the range 1 - 100.

+     *  @param alpha  the alpha value between 0 - 1

+     *

+     *  @returns the RGB Color object

+     */

+    private static Color HSL2RGB(double h, double s, double l, double alpha) {

+        if (s <0.0f || s > 100.0f) {

+            String message = "Color parameter outside of expected range - Saturation";

+            throw new IllegalArgumentException( message );

+        }

+

+        if (l <0.0f || l > 100.0f) {

+            String message = "Color parameter outside of expected range - Luminance";

+            throw new IllegalArgumentException( message );

+        }

+

+        if (alpha <0.0f || alpha > 1.0f) {

+            String message = "Color parameter outside of expected range - Alpha";

+            throw new IllegalArgumentException( message );

+        }

+

+        //  Formula needs all values between 0 - 1.

+

+        h = h % 360.0f;

+        h /= 360f;

+        s /= 100f;

+        l /= 100f;

+

+        double q = (l < 0.5d)

+            ? l * (1d + s)

+            : (l + s) - (s * l);

+

+        double p = 2d * l - q;

+

+        double r = Math.max(0, HUE2RGB(p, q, h + (1.0d / 3.0d)));

+        double g = Math.max(0, HUE2RGB(p, q, h));

+        double b = Math.max(0, HUE2RGB(p, q, h - (1.0d / 3.0d)));

+

+        r = Math.min(r, 1.0d);

+        g = Math.min(g, 1.0d);

+        b = Math.min(b, 1.0d);

+

+        return new Color((float)r, (float)g, (float)b, (float)alpha);

+    }

+

+    private static double HUE2RGB(double p, double q, double h) {

+        if (h < 0d) h += 1d;

+

+        if (h > 1d) h -= 1d;

+

+        if (6d * h < 1d) {

+            return p + ((q - p) * 6d * h);

+        }

+

+        if (2d * h < 1d) {

+            return q;

+        }

+

+        if (3d * h < 2d) {

+            return p + ( (q - p) * 6d * ((2.0d / 3.0d) - h) );

+        }

+

+        return p;

+    }

+

+

+    /**

+     *  Convert a RGB Color to it corresponding HSL values.

+     *

+     *  @return an array containing the 3 HSL values.

+     */

+    private static double[] RGB2HSL(Color color)

+    {

+        //  Get RGB values in the range 0 - 1

+

+        float[] rgb = color.getRGBColorComponents( null );

+        double r = rgb[0];

+        double g = rgb[1];

+        double b = rgb[2];

+

+        //  Minimum and Maximum RGB values are used in the HSL calculations

+

+        double min = Math.min(r, Math.min(g, b));

+        double max = Math.max(r, Math.max(g, b));

+

+        //  Calculate the Hue

+

+        double h = 0;

+

+        if (max == min) {

+            h = 0;

+        } else if (max == r) {

+            h = ((60d * (g - b) / (max - min)) + 360d) % 360d;

+        } else if (max == g) {

+            h = (60d * (b - r) / (max - min)) + 120d;

+        } else if (max == b) {

+            h = (60d * (r - g) / (max - min)) + 240d;

+        }

+

+        //  Calculate the Luminance

+

+        double l = (max + min) / 2d;

+

+        //  Calculate the Saturation

+

+        double s = 0;

+

+        if (max == min) {

+            s = 0;

+        } else if (l <= .5d) {

+            s = (max - min) / (max + min);

+        } else {

+            s = (max - min) / (2d - max - min);

+        }

+

+        return new double[] {h, s * 100, l * 100};

+    }

+

+}
\ No newline at end of file
diff --git a/src/java/org/apache/poi/sl/draw/DrawPictureShape.java b/src/java/org/apache/poi/sl/draw/DrawPictureShape.java
new file mode 100644
index 0000000..3d00b4e
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawPictureShape.java
@@ -0,0 +1,54 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.Graphics2D;

+import java.awt.Insets;

+import java.awt.geom.Rectangle2D;

+import java.io.IOException;

+

+import org.apache.poi.sl.usermodel.PictureData;

+import org.apache.poi.sl.usermodel.PictureShape;

+

+

+public class DrawPictureShape<T extends PictureShape> extends DrawSimpleShape<T> {

+    public DrawPictureShape(T shape) {

+        super(shape);

+    }

+    

+    @Override

+    public void drawContent(Graphics2D graphics) {

+        PictureData data = shape.getPictureData();

+        if(data == null) return;

+

+        ImageRenderer renderer = (ImageRenderer)graphics.getRenderingHint(Drawable.IMAGE_RENDERER);

+        if (renderer == null) renderer = new ImageRenderer();

+        

+        Rectangle2D anchor = getAnchor(graphics, shape);

+

+        Insets insets = shape.getClipping();

+

+        try {

+            renderer.loadImage(data.getData(), data.getContentType());

+            renderer.drawImage(graphics, anchor, insets);

+        } catch (IOException e) {

+            // TODO: draw specific runtime exception?

+            throw new RuntimeException(e);

+        }

+    }    

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawShape.java b/src/java/org/apache/poi/sl/draw/DrawShape.java
new file mode 100644
index 0000000..13ef429
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawShape.java
@@ -0,0 +1,143 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.Graphics2D;

+import java.awt.geom.AffineTransform;

+import java.awt.geom.Rectangle2D;

+

+import org.apache.poi.sl.usermodel.PlaceableShape;

+import org.apache.poi.sl.usermodel.Shape;

+

+

+public class DrawShape<T extends Shape> implements Drawable {

+

+    protected final T shape;

+    

+    public DrawShape(T shape) {

+        this.shape = shape;

+    }

+    

+    /**

+     * Apply 2-D transforms before drawing this shape. This includes rotation and flipping.

+     *

+     * @param graphics the graphics whos transform matrix will be modified

+     */

+    public void applyTransform(Graphics2D graphics) {

+        if (!(shape instanceof PlaceableShape)) return;

+        

+        PlaceableShape ps = (PlaceableShape)shape;

+        AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);

+        if (tx == null) tx = new AffineTransform();

+        final Rectangle2D anchor = tx.createTransformedShape(ps.getAnchor()).getBounds2D();

+

+        // rotation

+        double rotation = ps.getRotation();

+        if (rotation != 0.) {

+            // PowerPoint rotates shapes relative to the geometric center

+            double centerX = anchor.getCenterX();

+            double centerY = anchor.getCenterY();

+

+            // normalize rotation

+            rotation %= 360.;

+            if (rotation < 0) rotation += 360.;

+

+            int quadrant = (((int)rotation+45)/90)%4;

+            double scaleX = 1.0, scaleY = 1.0;

+            

+            // scale to bounding box (bug #53176)

+            if (quadrant == 1 || quadrant == 3) {

+                // In quadrant 1 and 3, which is basically a shape in a more or less portrait orientation 

+                // (45-135 degrees and 225-315 degrees), we need to first rotate the shape by a multiple 

+                // of 90 degrees and then resize the bounding box to its original bbox. After that we can 

+                // rotate the shape to the exact rotation amount.

+                // It's strange that you'll need to rotate the shape back and forth again, but you can

+                // think of it, as if you paint the shape on a canvas. First you rotate the canvas, which might

+                // be already (differently) scaled, so you can paint the shape in its default orientation

+                // and later on, turn it around again to compare it with its original size ...

+

+                AffineTransform txs;

+                if (ps.getClass().getCanonicalName().toLowerCase().contains("hslf")) {

+                    txs = new AffineTransform(tx);

+                } else {

+                    // this handling is only based on try and error ... not sure why xslf is handled differently.

+                    txs = new AffineTransform();

+                    txs.translate(centerX, centerY);

+                    txs.rotate(Math.PI/2.); // actually doesn't matter if +/- 90 degrees

+                    txs.translate(-centerX, -centerY);

+                    txs.concatenate(tx);

+                }

+                

+                txs.translate(centerX, centerY);

+                txs.rotate(Math.PI/2.);

+                txs.translate(-centerX, -centerY);

+                

+                Rectangle2D anchor2 = txs.createTransformedShape(ps.getAnchor()).getBounds2D();

+                

+                scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth();

+                scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight();

+            } else {

+                quadrant = 0;

+            }

+            

+            // transformation is applied reversed ...

+            graphics.translate(centerX, centerY);

+            graphics.rotate(Math.toRadians(rotation-quadrant*90.));

+            graphics.scale(scaleX, scaleY);

+            graphics.rotate(Math.toRadians(quadrant*90));

+            graphics.translate(-centerX, -centerY);

+        }

+

+        //flip horizontal

+        if (ps.getFlipHorizontal()) {

+            graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());

+            graphics.scale(-1, 1);

+            graphics.translate(-anchor.getX(), -anchor.getY());

+        }

+

+        //flip vertical

+        if (ps.getFlipVertical()) {

+            graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());

+            graphics.scale(1, -1);

+            graphics.translate(-anchor.getX(), -anchor.getY());

+        }

+    }

+

+

+    public void draw(Graphics2D graphics) {

+    }

+

+    public void drawContent(Graphics2D context) {

+    }

+

+    public static Rectangle2D getAnchor(Graphics2D graphics, PlaceableShape shape) {

+        return getAnchor(graphics, shape.getAnchor());

+    }

+    

+    public static Rectangle2D getAnchor(Graphics2D graphics, Rectangle2D anchor) {

+        if(graphics == null)  {

+            return anchor;

+        }

+

+        AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);

+        if(tx != null) {

+            anchor = tx.createTransformedShape(anchor).getBounds2D();

+        }

+        return anchor;

+    }    

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawSheet.java b/src/java/org/apache/poi/sl/draw/DrawSheet.java
new file mode 100644
index 0000000..e4c7e18
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawSheet.java
@@ -0,0 +1,91 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.Dimension;

+import java.awt.Color;

+import java.awt.Graphics2D;

+

+import java.awt.geom.AffineTransform;

+

+import org.apache.poi.sl.usermodel.*;

+

+

+public class DrawSheet<T extends Sheet<? extends Shape, ? extends SlideShow>> implements Drawable {

+

+    protected final T sheet;

+    

+    public DrawSheet(T sheet) {

+        this.sheet = sheet;

+    }

+    

+    public void draw(Graphics2D graphics) {

+        Dimension dim = sheet.getSlideShow().getPageSize();

+        Color whiteTrans = new Color(1f,1f,1f,0f);

+        graphics.setColor(whiteTrans);

+        graphics.fillRect(0, 0, (int)dim.getWidth(), (int)dim.getHeight());

+        

+        DrawFactory drawFact = DrawFactory.getInstance(graphics);

+        MasterSheet<? extends Shape, ? extends SlideShow> master = sheet.getMasterSheet();

+        

+        if(sheet.getFollowMasterGraphics() && master != null) {

+            Drawable drawer = drawFact.getDrawable(master);

+            drawer.draw(graphics);

+        }

+        

+        graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, new AffineTransform());

+

+        for (Shape shape : sheet.getShapes()) {

+            if(!canDraw(shape)) continue;

+            

+            // remember the initial transform and restore it after we are done with drawing

+            AffineTransform at = graphics.getTransform();

+

+            // concrete implementations can make sense of this hint,

+            // for example PSGraphics2D or PDFGraphics2D would call gsave() / grestore

+            graphics.setRenderingHint(Drawable.GSAVE, true);

+

+            // apply rotation and flipping

+            Drawable drawer = drawFact.getDrawable(shape);

+            drawer.applyTransform(graphics);

+            // draw stuff

+            drawer.draw(graphics);

+

+            // restore the coordinate system

+            graphics.setTransform(at);

+

+            graphics.setRenderingHint(Drawable.GRESTORE, true);

+        }

+    }

+

+    public void applyTransform(Graphics2D context) {

+    }

+

+    public void drawContent(Graphics2D context) {

+    }

+

+    /**

+     * Checks if this <code>sheet</code> displays the specified shape.

+     *

+     * Subclasses can override it and skip certain shapes from drawings,

+     * for instance, slide masters and layouts don't display placeholders

+     */

+    protected boolean canDraw(Shape shape){

+        return true;

+    }

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java b/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java
new file mode 100644
index 0000000..e674166
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawSimpleShape.java
@@ -0,0 +1,420 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.*;

+import java.awt.geom.*;

+import java.io.*;

+import java.nio.charset.Charset;

+import java.util.*;

+import java.util.List;

+

+import javax.xml.bind.*;

+import javax.xml.stream.*;

+import javax.xml.stream.EventFilter;

+import javax.xml.stream.events.StartElement;

+import javax.xml.stream.events.XMLEvent;

+

+import org.apache.poi.sl.draw.binding.CTCustomGeometry2D;

+import org.apache.poi.sl.draw.geom.*;

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;

+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;

+import org.apache.poi.sl.usermodel.StrokeStyle.*;

+import org.apache.poi.util.Units;

+

+

+public class DrawSimpleShape<T extends SimpleShape> extends DrawShape<T> {

+

+    public DrawSimpleShape(T shape) {

+        super(shape);

+    }

+

+    @Override

+    public void draw(Graphics2D graphics) {

+//        RenderableShape rShape = new RenderableShape(this);

+//        rShape.render(graphics);

+

+        DrawPaint drawPaint = DrawFactory.getInstance(graphics).getPaint(shape);

+        Paint fill = drawPaint.getPaint(graphics, shape.getFillStyle().getPaint());

+        Paint line = drawPaint.getPaint(graphics, shape.getStrokeStyle().getPaint());

+        BasicStroke stroke = getStroke(); // the stroke applies both to the shadow and the shape

+        graphics.setStroke(stroke);

+

+        Collection<Outline> elems = computeOutlines(graphics);

+        

+        // first paint the shadow

+        drawShadow(graphics, elems, fill, line);

+        

+        // then fill the shape interior

+        if (fill != null) {

+            graphics.setPaint(fill);

+            for (Outline o : elems) {

+                if (o.getPath().isFilled()){

+                    java.awt.Shape s = o.getOutline();

+                    graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);

+                    graphics.fill(s);

+                }                

+            }

+        }

+        

+        // then draw any content within this shape (text, image, etc.)

+        drawContent(graphics);

+

+        // then stroke the shape outline

+        if(line != null) {

+            graphics.setPaint(line);

+            for(Outline o : elems){

+                if(o.getPath().isStroked()){

+                    java.awt.Shape s = o.getOutline();

+                    graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);

+                    graphics.draw(s);

+                }

+            }

+        }

+        

+        // draw line decorations

+        drawDecoration(graphics, line, stroke);

+    }

+

+    protected void drawDecoration(Graphics2D graphics, Paint line, BasicStroke stroke) {

+        if(line == null) return;

+        graphics.setPaint(line);

+        

+        List<Outline> lst = new ArrayList<Outline>();

+        LineDecoration deco = shape.getLineDecoration();

+        Outline head = getHeadDecoration(graphics, deco, stroke);

+        if (head != null) lst.add(head);

+        Outline tail = getTailDecoration(graphics, deco, stroke);

+        if (tail != null) lst.add(tail);

+        

+        

+        for(Outline o : lst){

+            java.awt.Shape s = o.getOutline();

+            Path p = o.getPath();

+            graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);

+            

+            if(p.isFilled()) graphics.fill(s);

+            if(p.isStroked()) graphics.draw(s);

+        }

+    }

+

+    protected Outline getTailDecoration(Graphics2D graphics, LineDecoration deco, BasicStroke stroke) {

+        DecorationSize tailLength = deco.getTailLength();

+        DecorationSize tailWidth = deco.getTailWidth();

+    

+        double lineWidth = Math.max(2.5, stroke.getLineWidth());

+    

+        Rectangle2D anchor = getAnchor(graphics, shape);

+        double x2 = anchor.getX() + anchor.getWidth(),

+                y2 = anchor.getY() + anchor.getHeight();

+    

+        double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());

+    

+        AffineTransform at = new AffineTransform();

+        java.awt.Shape shape = null;

+        Path p = null;

+        Rectangle2D bounds;

+        double scaleY = Math.pow(2, tailWidth.ordinal());

+        double scaleX = Math.pow(2, tailLength.ordinal());

+        switch (deco.getTailShape()) {

+            case OVAL:

+                p = new Path();

+                shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY);

+                bounds = shape.getBounds2D();

+                at.translate(x2 - bounds.getWidth() / 2, y2 - bounds.getHeight() / 2);

+                at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2);

+                break;

+            case ARROW:

+                p = new Path();

+                GeneralPath arrow = new GeneralPath();

+                arrow.moveTo((float) (-lineWidth * 3), (float) (-lineWidth * 2));

+                arrow.lineTo(0, 0);

+                arrow.lineTo((float) (-lineWidth * 3), (float) (lineWidth * 2));

+                shape = arrow;

+                at.translate(x2, y2);

+                at.rotate(alpha);

+                break;

+            case TRIANGLE:

+                p = new Path();

+                scaleY = tailWidth.ordinal() + 1;

+                scaleX = tailLength.ordinal() + 1;

+                GeneralPath triangle = new GeneralPath();

+                triangle.moveTo((float) (-lineWidth * scaleX), (float) (-lineWidth * scaleY / 2));

+                triangle.lineTo(0, 0);

+                triangle.lineTo((float) (-lineWidth * scaleX), (float) (lineWidth * scaleY / 2));

+                triangle.closePath();

+                shape = triangle;

+                at.translate(x2, y2);

+                at.rotate(alpha);

+                break;

+            default:

+                break;

+        }

+    

+        if (shape != null) {

+            shape = at.createTransformedShape(shape);

+        }

+        return shape == null ? null : new Outline(shape, p);

+    }

+    

+    Outline getHeadDecoration(Graphics2D graphics, LineDecoration deco, BasicStroke stroke) {

+        DecorationSize headLength = deco.getHeadLength();

+        DecorationSize headWidth = deco.getHeadWidth();

+    

+        double lineWidth = Math.max(2.5, stroke.getLineWidth());

+    

+        Rectangle2D anchor = getAnchor(graphics, shape);

+        double x1 = anchor.getX(),

+                y1 = anchor.getY();

+    

+        double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());

+    

+        AffineTransform at = new AffineTransform();

+        java.awt.Shape shape = null;

+        Path p = null;

+        Rectangle2D bounds;

+        double scaleY = 1;

+        double scaleX = 1;

+        switch (deco.getHeadShape()) {

+            case OVAL:

+                p = new Path();

+                shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY);

+                bounds = shape.getBounds2D();

+                at.translate(x1 - bounds.getWidth() / 2, y1 - bounds.getHeight() / 2);

+                at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2);

+                break;

+            case STEALTH:

+            case ARROW:

+                p = new Path(false, true);

+                GeneralPath arrow = new GeneralPath();

+                arrow.moveTo((float) (lineWidth * 3 * scaleX), (float) (-lineWidth * scaleY * 2));

+                arrow.lineTo(0, 0);

+                arrow.lineTo((float) (lineWidth * 3 * scaleX), (float) (lineWidth * scaleY * 2));

+                shape = arrow;

+                at.translate(x1, y1);

+                at.rotate(alpha);

+                break;

+            case TRIANGLE:

+                p = new Path();

+                scaleY = headWidth.ordinal() + 1;

+                scaleX = headLength.ordinal() + 1;

+                GeneralPath triangle = new GeneralPath();

+                triangle.moveTo((float) (lineWidth * scaleX), (float) (-lineWidth * scaleY / 2));

+                triangle.lineTo(0, 0);

+                triangle.lineTo((float) (lineWidth * scaleX), (float) (lineWidth * scaleY / 2));

+                triangle.closePath();

+                shape = triangle;

+                at.translate(x1, y1);

+                at.rotate(alpha);

+                break;

+            default:

+                break;

+        }

+    

+        if (shape != null) {

+            shape = at.createTransformedShape(shape);

+        }

+        return shape == null ? null : new Outline(shape, p);

+    }

+    

+    public BasicStroke getStroke() {

+        StrokeStyle strokeStyle = shape.getStrokeStyle();

+        

+        float lineWidth = (float) strokeStyle.getLineWidth();

+        if (lineWidth == 0.0f) lineWidth = 0.25f; // Both PowerPoint and OOo draw zero-length lines as 0.25pt

+

+        LineDash lineDash = strokeStyle.getLineDash();

+        if (lineDash == null) {

+        	lineDash = LineDash.SOLID;

+        }

+

+        int dashPatI[] = lineDash.pattern;

+        final float dash_phase = 0;

+        float[] dashPatF = null;

+        if (dashPatI != null) {

+            dashPatF = new float[dashPatI.length];

+            for (int i=0; i<dashPatI.length; i++) {

+                dashPatF[i] = dashPatI[i]*Math.max(1, lineWidth);

+            }

+        }

+

+        LineCap lineCapE = strokeStyle.getLineCap();

+        if (lineCapE == null) lineCapE = LineCap.FLAT;

+        int lineCap;

+        switch (lineCapE) {

+            case ROUND:

+                lineCap = BasicStroke.CAP_ROUND;

+                break;

+            case SQUARE:

+                lineCap = BasicStroke.CAP_SQUARE;

+                break;

+            default:

+            case FLAT:

+                lineCap = BasicStroke.CAP_BUTT;

+                break;

+        }

+

+        int lineJoin = BasicStroke.JOIN_ROUND;

+

+        return new BasicStroke(lineWidth, lineCap, lineJoin, lineWidth, dashPatF, dash_phase);

+    }

+

+    protected void drawShadow(

+            Graphics2D graphics

+          , Collection<Outline> outlines

+          , Paint fill

+          , Paint line

+    ) {

+          Shadow shadow = shape.getShadow();

+          if (shadow == null || (fill == null && line == null)) return;

+

+          SolidPaint shadowPaint = shadow.getFillStyle();

+          Color shadowColor = DrawPaint.applyColorTransform(shadowPaint.getSolidColor());

+          

+          double shapeRotation = shape.getRotation();

+          if(shape.getFlipVertical()) {

+              shapeRotation += 180;

+          }

+          double angle = shadow.getAngle() - shapeRotation;

+          double dist = shadow.getDistance();

+          double dx = dist * Math.cos(Math.toRadians(angle));

+          double dy = dist * Math.sin(Math.toRadians(angle));

+          

+          graphics.translate(dx, dy);

+          

+          for(Outline o : outlines){

+              java.awt.Shape s = o.getOutline();

+              Path p = o.getPath();

+              graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);

+              graphics.setPaint(shadowColor);

+              

+              if(fill != null && p.isFilled()){

+                  graphics.fill(s);

+              } else if (line != null && p.isStroked()) {

+                  graphics.draw(s);

+              }

+          }

+

+          graphics.translate(-dx, -dy);

+      }

+      

+    protected static CustomGeometry getCustomGeometry(String name) {

+        return getCustomGeometry(name, null);

+    }

+    

+    protected static CustomGeometry getCustomGeometry(String name, Graphics2D graphics) {

+        @SuppressWarnings("unchecked")

+        Map<String, CustomGeometry> presets = (graphics == null)

+            ? null

+            : (Map<String, CustomGeometry>)graphics.getRenderingHint(Drawable.PRESET_GEOMETRY_CACHE);

+        

+        if (presets == null) {

+            presets = new HashMap<String,CustomGeometry>();

+            if (graphics != null) {

+                graphics.setRenderingHint(Drawable.PRESET_GEOMETRY_CACHE, presets);

+            }

+            

+            String packageName = "org.apache.poi.sl.draw.binding";

+            InputStream presetIS = Drawable.class.getResourceAsStream("presetShapeDefinitions.xml");

+            Reader xml = new InputStreamReader( presetIS, Charset.forName("UTF-8") );

+    

+            // StAX:

+            EventFilter startElementFilter = new EventFilter() {

+                @Override

+                public boolean accept(XMLEvent event) {

+                    return event.isStartElement();

+                }

+            };

+            

+            try {

+                XMLInputFactory staxFactory = XMLInputFactory.newInstance();

+                XMLEventReader staxReader = staxFactory.createXMLEventReader(xml);

+                XMLEventReader staxFiltRd = staxFactory.createFilteredReader(staxReader, startElementFilter);

+                // Ignore StartElement:

+                staxFiltRd.nextEvent();

+                // JAXB:

+                JAXBContext jaxbContext = JAXBContext.newInstance(packageName);

+                Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

+        

+                while (staxFiltRd.peek() != null) {

+                    StartElement evRoot = (StartElement)staxFiltRd.peek();

+                    String cusName = evRoot.getName().getLocalPart();

+                    // XMLEvent ev = staxReader.nextEvent();

+                    JAXBElement<org.apache.poi.sl.draw.binding.CTCustomGeometry2D> el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class);

+                    CTCustomGeometry2D cusGeom = el.getValue();

+                    

+                    presets.put(cusName, new CustomGeometry(cusGeom));

+                }

+            } catch (Exception e) {

+                throw new RuntimeException("Unable to load preset geometries.", e);

+            }

+        }

+        

+        return presets.get(name);

+    }

+    

+    protected Collection<Outline> computeOutlines(Graphics2D graphics) {

+

+        List<Outline> lst = new ArrayList<Outline>();

+        CustomGeometry geom = shape.getGeometry();

+        if(geom == null) {

+            return lst;

+        }

+

+        Rectangle2D anchor = getAnchor(graphics, shape);

+        for (Path p : geom) {

+

+            double w = p.getW() == -1 ? anchor.getWidth() * Units.EMU_PER_POINT : p.getW();

+            double h = p.getH() == -1 ? anchor.getHeight() * Units.EMU_PER_POINT : p.getH();

+

+            // the guides in the shape definitions are all defined relative to each other,

+            // so we build the path starting from (0,0).

+            final Rectangle2D pathAnchor = new Rectangle2D.Double(0,0,w,h);

+

+            Context ctx = new Context(geom, pathAnchor, shape);

+

+            java.awt.Shape gp = p.getPath(ctx);

+

+            // translate the result to the canvas coordinates in points

+            AffineTransform at = new AffineTransform();

+            at.translate(anchor.getX(), anchor.getY());

+

+            double scaleX, scaleY;

+            if (p.getW() != -1) {

+                scaleX = anchor.getWidth() / p.getW();

+            } else {

+                scaleX = 1.0 / Units.EMU_PER_POINT;

+            }

+            if (p.getH() != -1) {

+                scaleY = anchor.getHeight() / p.getH();

+            } else {

+                scaleY = 1.0 / Units.EMU_PER_POINT;

+            }

+

+            at.scale(scaleX, scaleY);

+

+            java.awt.Shape canvasShape = at.createTransformedShape(gp);

+

+            lst.add(new Outline(canvasShape, p));

+        }

+

+        return lst;

+    }

+

+}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java b/src/java/org/apache/poi/sl/draw/DrawSlide.java
similarity index 60%
copy from src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java
copy to src/java/org/apache/poi/sl/draw/DrawSlide.java
index 71891f8..cfa3167 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java
+++ b/src/java/org/apache/poi/sl/draw/DrawSlide.java
@@ -14,21 +14,28 @@
    See the License for the specific language governing permissions and

    limitations under the License.

 ==================================================================== */

-package org.apache.poi.xslf.usermodel;

 

-/**

- * @author Yegor Kozlov

- */

-public enum LineDash {

-    SOLID,

-    DOT,

-    DASH,

-    LG_DASH,

-    DASH_DOT,

-    LG_DASH_DOT,

-    LG_DASH_DOT_DOT,

-    SYS_DASH,

-    SYS_DOT,

-    SYS_DASH_DOT,

-    SYS_DASH_DOT_DOT;

+package org.apache.poi.sl.draw;

+

+import java.awt.Graphics2D;

+

+import org.apache.poi.sl.usermodel.*;

+

+

+public class DrawSlide<T extends Slide<? extends Shape, ? extends SlideShow, ? extends Notes<?,?>>> extends DrawSheet<T> {

+

+    public DrawSlide(T slide) {

+        super(slide);

+    }

+    

+    public void draw(Graphics2D graphics) {

+        Background bg = sheet.getBackground();

+        if(bg != null) {

+            DrawFactory drawFact = DrawFactory.getInstance(graphics);

+            Drawable db = drawFact.getDrawable(bg);

+            db.draw(graphics);

+        }

+

+        super.draw(graphics);

+    }

 }

diff --git a/src/java/org/apache/poi/common/usermodel/LineStyle.java b/src/java/org/apache/poi/sl/draw/DrawTableShape.java
similarity index 79%
copy from src/java/org/apache/poi/common/usermodel/LineStyle.java
copy to src/java/org/apache/poi/sl/draw/DrawTableShape.java
index db676f5..ceb6450 100644
--- a/src/java/org/apache/poi/common/usermodel/LineStyle.java
+++ b/src/java/org/apache/poi/sl/draw/DrawTableShape.java
@@ -1,21 +1,27 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.common.usermodel;
-
-public interface LineStyle {
-
-}
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import org.apache.poi.sl.usermodel.*;

+

+public class DrawTableShape<T extends TableShape> extends DrawShape<T> {

+    // to be implemented ...

+    public DrawTableShape(T shape) {

+        super(shape);

+    }

+}

diff --git a/src/java/org/apache/poi/common/usermodel/LineStyle.java b/src/java/org/apache/poi/sl/draw/DrawTextBox.java
similarity index 78%
copy from src/java/org/apache/poi/common/usermodel/LineStyle.java
copy to src/java/org/apache/poi/sl/draw/DrawTextBox.java
index db676f5..89d6922 100644
--- a/src/java/org/apache/poi/common/usermodel/LineStyle.java
+++ b/src/java/org/apache/poi/sl/draw/DrawTextBox.java
@@ -1,21 +1,26 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.common.usermodel;
-
-public interface LineStyle {
-
-}
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import org.apache.poi.sl.usermodel.*;

+

+public class DrawTextBox<T extends TextBox<? extends TextParagraph<? extends TextRun>>> extends DrawAutoShape<T> {

+    public DrawTextBox(T shape) {

+        super(shape);

+    }

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawTextFragment.java b/src/java/org/apache/poi/sl/draw/DrawTextFragment.java
new file mode 100644
index 0000000..acb6b4c
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawTextFragment.java
@@ -0,0 +1,105 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.Graphics2D;

+import java.awt.font.TextLayout;

+import java.text.*;

+

+public class DrawTextFragment implements Drawable  {

+    final TextLayout layout;

+    final AttributedString str;

+    double x, y;

+    

+    public DrawTextFragment(TextLayout layout, AttributedString str) {

+        this.layout = layout;

+        this.str = str;

+    }

+

+    public void setPosition(double x, double y) {

+        // TODO: replace it, by applyTransform????

+        this.x = x;

+        this.y = y;

+    }

+

+    public void draw(Graphics2D graphics){

+        if(str == null) {

+            return;

+        }

+

+        double yBaseline = y + layout.getAscent();

+

+        Integer textMode = (Integer)graphics.getRenderingHint(Drawable.TEXT_RENDERING_MODE);

+        if(textMode != null && textMode == Drawable.TEXT_AS_SHAPES){

+            layout.draw(graphics, (float)x, (float)yBaseline);

+        } else {

+            graphics.drawString(str.getIterator(), (float)x, (float)yBaseline );

+        }

+    }

+

+    public void applyTransform(Graphics2D graphics) {

+    }

+

+    public void drawContent(Graphics2D graphics) {

+    }

+    

+    public TextLayout getLayout() {

+        return layout;

+    }

+

+    public AttributedString getAttributedString() {

+        return str;

+    }

+    

+    /**

+     * @return full height of this text run which is sum of ascent, descent and leading

+     */

+    public float getHeight(){

+        double h = Math.ceil(layout.getAscent()) + Math.ceil(layout.getDescent()) + layout.getLeading();

+        return (float)h;

+    }

+

+    /**

+     *

+     * @return width if this text run

+     */

+    public float getWidth(){

+        return layout.getAdvance();

+    }

+

+    /**

+     *

+     * @return the string to be painted

+     */

+    public String getString(){

+        if (str == null) return "";

+

+        AttributedCharacterIterator it = str.getIterator();

+         StringBuilder buf = new StringBuilder();

+         for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {

+             buf.append(c);

+         }

+        return buf.toString();

+    }

+

+    @Override

+    public String toString(){

+        return "[" + getClass().getSimpleName() + "] " + getString();

+    }

+    

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java
new file mode 100644
index 0000000..e2db501
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java
@@ -0,0 +1,462 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.Color;

+import java.awt.Graphics2D;

+import java.awt.font.*;

+import java.awt.geom.Rectangle2D;

+import java.text.*;

+import java.text.AttributedCharacterIterator.Attribute;

+import java.util.*;

+

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle;

+import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;

+import org.apache.poi.sl.usermodel.TextRun.TextCap;

+import org.apache.poi.util.Units;

+

+public class DrawTextParagraph<T extends TextRun> implements Drawable {

+    protected TextParagraph<T> paragraph;

+    double x, y;

+    protected List<DrawTextFragment> lines = new ArrayList<DrawTextFragment>();

+    protected String rawText;

+    protected DrawTextFragment bullet;

+    protected int autoNbrIdx = 0;

+

+    /**

+     * the highest line in this paragraph. Used for line spacing.

+     */

+    protected double maxLineHeight;

+

+    public DrawTextParagraph(TextParagraph<T> paragraph) {

+        this.paragraph = paragraph;

+    }

+

+    public void setPosition(double x, double y) {

+        // TODO: replace it, by applyTransform????

+        this.x = x;

+        this.y = y;

+    }

+

+    public double getY() {

+        return y;

+    }

+

+    /**

+     * Sets the auto numbering index of the handled paragraph

+     * @param index the auto numbering index

+     */

+    public void setAutoNumberingIdx(int index) {

+        autoNbrIdx = index;

+    }

+    

+    public void draw(Graphics2D graphics){

+        if (lines.isEmpty()) return;

+        

+        Insets2D insets = paragraph.getParentShape().getInsets();

+        double leftInset = insets.left;

+        double rightInset = insets.right;

+        double penY = y;

+

+        boolean firstLine = true;

+        int indentLevel = paragraph.getIndentLevel();

+        Double leftMargin = paragraph.getLeftMargin();

+        if (leftMargin == null) {

+            // if the marL attribute is omitted, then a value of 347663 is implied

+            leftMargin = Units.toPoints(347663*(indentLevel+1));

+        }

+        Double indent = paragraph.getIndent();

+        if (indent == null) {

+            indent = Units.toPoints(347663*indentLevel);

+        }

+        Double rightMargin = paragraph.getRightMargin();

+        if (rightMargin == null) {

+            rightMargin = 0d;

+        }

+

+        //The vertical line spacing

+        Double spacing = paragraph.getLineSpacing();

+        if (spacing == null) spacing = 100d;

+        

+        for(DrawTextFragment line : lines){

+            double penX;

+

+            if(firstLine) {

+                if (!isEmptyParagraph()) {

+                    // TODO: find out character style for empty, but bulleted/numbered lines

+                    bullet = getBullet(graphics, line.getAttributedString().getIterator());

+                }

+                

+                if (bullet != null){

+                    bullet.setPosition(x + indent, penY);

+                    bullet.draw(graphics);

+                    // don't let text overlay the bullet and advance by the bullet width

+                    double bulletWidth = bullet.getLayout().getAdvance() + 1;

+                    penX = x + Math.max(leftMargin, indent+bulletWidth);

+                } else {

+                    penX = x + indent;

+                }

+            } else {

+                penX = x + leftMargin;

+            }

+

+            Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape());

+

+            TextAlign ta = paragraph.getTextAlign();

+            if (ta == null) ta = TextAlign.LEFT;

+            switch (ta) {

+                case CENTER:

+                    penX += (anchor.getWidth() - leftMargin - line.getWidth() - leftInset - rightInset) / 2;

+                    break;

+                case RIGHT:

+                    penX += (anchor.getWidth() - line.getWidth() - leftInset - rightInset);

+                    break;

+                default:

+                    break;

+            }

+

+            line.setPosition(penX, penY);

+            line.draw(graphics);

+

+            if(spacing > 0) {

+                // If linespacing >= 0, then linespacing is a percentage of normal line height.

+                penY += spacing*0.01* line.getHeight();

+            } else {

+                // negative value means absolute spacing in points

+                penY += -spacing;

+            }

+

+            firstLine = false;

+        }

+

+        y = penY - y;

+    }

+    

+    public float getFirstLineHeight() {

+        return (lines.isEmpty()) ? 0 : lines.get(0).getHeight();

+    }

+

+    public float getLastLineHeight() {

+        return (lines.isEmpty()) ? 0 : lines.get(lines.size()-1).getHeight();

+    }

+

+    public boolean isEmptyParagraph() {

+        return (lines.isEmpty() || rawText.trim().isEmpty());

+    }

+    

+    public void applyTransform(Graphics2D graphics) {

+    }

+

+    public void drawContent(Graphics2D graphics) {

+    }

+

+    /**

+     * break text into lines, each representing a line of text that fits in the wrapping width

+     *

+     * @param graphics

+     */

+    protected void breakText(Graphics2D graphics){

+        lines.clear();

+

+        DrawFactory fact = DrawFactory.getInstance(graphics);

+        StringBuilder text = new StringBuilder();

+        AttributedString at = getAttributedString(graphics, text);

+        boolean emptyParagraph = ("".equals(text.toString().trim()));

+

+        AttributedCharacterIterator it = at.getIterator();

+        LineBreakMeasurer measurer = new LineBreakMeasurer(it, graphics.getFontRenderContext());

+        for (;;) {

+            int startIndex = measurer.getPosition();

+

+            double wrappingWidth = getWrappingWidth(lines.size() == 0, graphics) + 1; // add a pixel to compensate rounding errors

+            // shape width can be smaller that the sum of insets (this was proved by a test file)

+            if(wrappingWidth < 0) wrappingWidth = 1;

+

+            int nextBreak = text.indexOf("\n", startIndex + 1);

+            if(nextBreak == -1) nextBreak = it.getEndIndex();

+

+            TextLayout layout = measurer.nextLayout((float)wrappingWidth, nextBreak, true);

+            if (layout == null) {

+                 // layout can be null if the entire word at the current position

+                 // does not fit within the wrapping width. Try with requireNextWord=false.

+                 layout = measurer.nextLayout((float)wrappingWidth, nextBreak, false);

+            }

+

+            if(layout == null) {

+                // exit if can't break any more

+                break;

+            }

+

+            int endIndex = measurer.getPosition();

+            // skip over new line breaks (we paint 'clear' text runs not starting or ending with \n)

+            if(endIndex < it.getEndIndex() && text.charAt(endIndex) == '\n'){

+                measurer.setPosition(endIndex + 1);

+            }

+

+            TextAlign hAlign = paragraph.getTextAlign();

+            if(hAlign == TextAlign.JUSTIFY || hAlign == TextAlign.JUSTIFY_LOW) {

+                layout = layout.getJustifiedLayout((float)wrappingWidth);

+            }

+

+            AttributedString str = (emptyParagraph)

+                ? null // we will not paint empty paragraphs

+                : new AttributedString(it, startIndex, endIndex);

+            DrawTextFragment line = fact.getTextFragment(layout, str);

+            lines.add(line);

+

+            maxLineHeight = Math.max(maxLineHeight, line.getHeight());

+

+            if(endIndex == it.getEndIndex()) break;

+        }

+

+        rawText = text.toString();

+    }

+

+    protected DrawTextFragment getBullet(Graphics2D graphics, AttributedCharacterIterator firstLineAttr) {

+        BulletStyle bulletStyle = paragraph.getBulletStyle();

+        if (bulletStyle == null) return null;

+

+        String buCharacter;

+        AutoNumberingScheme ans = bulletStyle.getAutoNumberingScheme();

+        if (ans != null) {

+            buCharacter = ans.format(autoNbrIdx);

+        } else {

+            buCharacter = bulletStyle.getBulletCharacter();

+        }

+        if (buCharacter == null) return null;

+

+        String buFont = bulletStyle.getBulletFont();

+        if (buFont == null) buFont = paragraph.getDefaultFontFamily();

+        assert(buFont != null);

+

+        Color buColor = bulletStyle.getBulletFontColor();

+        if (buColor == null) buColor = (Color)firstLineAttr.getAttribute(TextAttribute.FOREGROUND);

+

+        float fontSize = (Float)firstLineAttr.getAttribute(TextAttribute.SIZE);

+        Double buSz = bulletStyle.getBulletFontSize();

+        if (buSz == null) buSz = 100d; 

+        if (buSz > 0) fontSize *= buSz* 0.01;

+        else fontSize = (float)-buSz;

+

+        

+        AttributedString str = new AttributedString(buCharacter);

+        str.addAttribute(TextAttribute.FOREGROUND, buColor);

+        str.addAttribute(TextAttribute.FAMILY, buFont);

+        str.addAttribute(TextAttribute.SIZE, fontSize);

+

+        TextLayout layout = new TextLayout(str.getIterator(), graphics.getFontRenderContext());

+        DrawFactory fact = DrawFactory.getInstance(graphics);

+        return fact.getTextFragment(layout, str);

+    }

+

+    protected String getRenderableText(TextRun tr) {

+        StringBuilder buf = new StringBuilder();

+        TextCap cap = tr.getTextCap();

+        String tabs = null;

+        for (char c : tr.getRawText().toCharArray()) {

+            if(c == '\t') {

+                if (tabs == null) {

+                    tabs = tab2space(tr);

+                }

+                buf.append(tabs);

+                continue;

+            }

+

+            switch (cap) {

+                case ALL: c = Character.toUpperCase(c); break;

+                case SMALL: c = Character.toLowerCase(c); break;

+                case NONE: break;

+            }

+

+            buf.append(c);

+        }

+

+        return buf.toString();

+    }

+    

+    /**

+     * Replace a tab with the effective number of white spaces.

+     */

+    private String tab2space(TextRun tr) {

+        AttributedString string = new AttributedString(" ");

+        String typeFace = tr.getFontFamily();

+        if (typeFace == null) typeFace = "Lucida Sans";

+        string.addAttribute(TextAttribute.FAMILY, typeFace);

+

+        Double fs = tr.getFontSize();

+        if (fs == null) fs = 12d;

+        string.addAttribute(TextAttribute.SIZE, fs.floatValue());

+        

+        TextLayout l = new TextLayout(string.getIterator(), new FontRenderContext(null, true, true));

+        double wspace = l.getAdvance();

+

+        Double tabSz = paragraph.getDefaultTabSize();

+        if (tabSz == null) tabSz = wspace*4;

+

+        int numSpaces = (int)Math.ceil(tabSz / wspace);

+        StringBuilder buf = new StringBuilder();

+        for(int i = 0; i < numSpaces; i++) {

+            buf.append(' ');

+        }

+        return buf.toString();

+    }

+    

+

+    /**

+     * Returns wrapping width to break lines in this paragraph

+     *

+     * @param firstLine whether the first line is breaking

+     *

+     * @return  wrapping width in points

+     */

+    protected double getWrappingWidth(boolean firstLine, Graphics2D graphics){

+        // internal margins for the text box

+

+        Insets2D insets = paragraph.getParentShape().getInsets();

+        double leftInset = insets.left;

+        double rightInset = insets.right;

+

+        Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape());

+

+        int indentLevel = paragraph.getIndentLevel();

+        Double leftMargin = paragraph.getLeftMargin();

+        if (leftMargin == null) {

+            // if the marL attribute is omitted, then a value of 347663 is implied

+            leftMargin = Units.toPoints(347663*(indentLevel+1));

+        }

+        Double indent = paragraph.getIndent();

+        if (indent == null) {

+            indent = Units.toPoints(347663*indentLevel);

+        }

+        Double rightMargin = paragraph.getRightMargin();

+        if (rightMargin == null) {

+            rightMargin = 0d;

+        }

+

+        double width;

+        TextShape<? extends TextParagraph<T>> ts = paragraph.getParentShape();

+        if (!ts.getWordWrap()) {

+            // if wordWrap == false then we return the advance to the right border of the sheet

+            width = ts.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX();

+        } else {

+            width = anchor.getWidth() - leftInset - rightInset - leftMargin - rightMargin;

+            if (firstLine) {

+                if (bullet != null){

+                    if (indent > 0) width -= indent;

+                } else {

+                    if (indent > 0) width -= indent; // first line indentation

+                    else if (indent < 0) { // hanging indentation: the first line start at the left margin

+                        width += leftMargin;

+                    }

+                }

+            }

+        }

+

+        return width;

+    }

+

+    private static class AttributedStringData {

+        Attribute attribute;

+        Object value;

+        int beginIndex, endIndex;

+        AttributedStringData(Attribute attribute, Object value, int beginIndex, int endIndex) {

+            this.attribute = attribute;

+            this.value = value;

+            this.beginIndex = beginIndex;

+            this.endIndex = endIndex;

+        }

+    }

+

+    protected AttributedString getAttributedString(Graphics2D graphics, StringBuilder text){

+        List<AttributedStringData> attList = new ArrayList<AttributedStringData>();

+        if (text == null) text = new StringBuilder();

+

+        DrawFontManager fontHandler = (DrawFontManager)graphics.getRenderingHint(Drawable.FONT_HANDLER);

+

+        for (TextRun run : paragraph){

+            String runText = getRenderableText(run);

+            // skip empty runs

+            if (runText.isEmpty()) continue;

+

+            int beginIndex = text.length();

+            text.append(runText);

+            int endIndex = text.length();

+

+            Color fgColor = run.getFontColor();

+            if (fgColor == null) fgColor = Color.BLACK;

+            attList.add(new AttributedStringData(TextAttribute.FOREGROUND, fgColor, beginIndex, endIndex));

+

+            // user can pass an custom object to convert fonts

+            String fontFamily = run.getFontFamily();

+            @SuppressWarnings("unchecked")

+            Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(Drawable.FONT_MAP);

+            if (fontMap != null && fontMap.containsKey(fontFamily)) {

+                fontFamily = fontMap.get(fontFamily);

+            }

+            if(fontHandler != null) {

+                fontFamily = fontHandler.getRendererableFont(fontFamily, run.getPitchAndFamily());

+            }

+            if (fontFamily == null) {

+                fontFamily = paragraph.getDefaultFontFamily();

+            }

+            attList.add(new AttributedStringData(TextAttribute.FAMILY, fontFamily, beginIndex, endIndex));

+

+            Double fontSz = run.getFontSize();

+            if (fontSz == null) fontSz = paragraph.getDefaultFontSize();

+            attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz.floatValue(), beginIndex, endIndex));

+

+            if(run.isBold()) {

+                attList.add(new AttributedStringData(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, beginIndex, endIndex));

+            }

+            if(run.isItalic()) {

+                attList.add(new AttributedStringData(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, beginIndex, endIndex));

+            }

+            if(run.isUnderlined()) {

+                attList.add(new AttributedStringData(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, beginIndex, endIndex));

+                attList.add(new AttributedStringData(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, beginIndex, endIndex));

+            }

+            if(run.isStrikethrough()) {

+                attList.add(new AttributedStringData(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, beginIndex, endIndex));

+            }

+            if(run.isSubscript()) {

+                attList.add(new AttributedStringData(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUB, beginIndex, endIndex));

+            }

+            if(run.isSuperscript()) {

+                attList.add(new AttributedStringData(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, beginIndex, endIndex));

+            }

+        }

+

+        // ensure that the paragraph contains at least one character

+        // We need this trick to correctly measure text

+        if (text.length() == 0) {

+            Double fontSz = paragraph.getDefaultFontSize();

+            text.append(" ");

+            attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz.floatValue(), 0, 1));

+        }

+

+        AttributedString string = new AttributedString(text.toString());

+        for (AttributedStringData asd : attList) {

+            string.addAttribute(asd.attribute, asd.value, asd.beginIndex, asd.endIndex);

+        }

+

+        return string;

+    }

+

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/DrawTextShape.java b/src/java/org/apache/poi/sl/draw/DrawTextShape.java
new file mode 100644
index 0000000..5862ac5
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/DrawTextShape.java
@@ -0,0 +1,179 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.Graphics2D;

+import java.awt.geom.AffineTransform;

+import java.awt.geom.Rectangle2D;

+import java.awt.image.BufferedImage;

+import java.util.*;

+

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle;

+import org.apache.poi.util.JvmBugs;

+

+public class DrawTextShape<T extends TextShape<? extends TextParagraph<? extends TextRun>>> extends DrawSimpleShape<T> {

+

+    public DrawTextShape(T shape) {

+        super(shape);

+    }

+

+    @Override

+    public void drawContent(Graphics2D graphics) {

+        Rectangle2D anchor = DrawShape.getAnchor(graphics, shape);

+        Insets2D insets = shape.getInsets();

+        double x = anchor.getX() + insets.left;

+        double y = anchor.getY();

+

+        // remember the initial transform

+        AffineTransform tx = graphics.getTransform();

+

+        // Transform of text in flipped shapes is special.

+        // At this point the flip and rotation transform is already applied

+        // (see DrawShape#applyTransform ), but we need to restore it to avoid painting "upside down".

+        // See Bugzilla 54210.

+

+        if(shape.getFlipVertical()){

+            graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());

+            graphics.scale(1, -1);

+            graphics.translate(-anchor.getX(), -anchor.getY());

+

+            // text in vertically flipped shapes is rotated by 180 degrees

+            double centerX = anchor.getX() + anchor.getWidth()/2;

+            double centerY = anchor.getY() + anchor.getHeight()/2;

+            graphics.translate(centerX, centerY);

+            graphics.rotate(Math.toRadians(180));

+            graphics.translate(-centerX, -centerY);

+        }

+

+        // Horizontal flipping applies only to shape outline and not to the text in the shape.

+        // Applying flip second time restores the original not-flipped transform

+        if(shape.getFlipHorizontal()){

+            graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());

+            graphics.scale(-1, 1);

+            graphics.translate(-anchor.getX() , -anchor.getY());

+        }

+

+

+        // first dry-run to calculate the total height of the text

+        double textHeight = shape.getTextHeight();

+

+        switch (shape.getVerticalAlignment()){

+            case TOP:

+                y += insets.top;

+                break;

+            case BOTTOM:

+                y += anchor.getHeight() - textHeight - insets.bottom;

+                break;

+            default:

+            case MIDDLE:

+                double delta = anchor.getHeight() - textHeight - insets.top - insets.bottom;

+                y += insets.top + delta/2;

+                break;

+        }

+

+        drawParagraphs(graphics, x, y);

+

+        // restore the transform

+        graphics.setTransform(tx);

+    }

+

+    /**

+     * paint the paragraphs starting from top left (x,y)

+     *

+     * @return  the vertical advance, i.e. the cumulative space occupied by the text

+     */

+    public double drawParagraphs(Graphics2D graphics, double x, double y) {

+        DrawFactory fact = DrawFactory.getInstance(graphics);

+        Insets2D shapePadding = shape.getInsets();

+

+        double y0 = y;

+        Iterator<? extends TextParagraph<? extends TextRun>> paragraphs = shape.iterator();

+        

+        boolean isFirstLine = true;

+        for (int autoNbrIdx=0; paragraphs.hasNext(); autoNbrIdx++){

+            TextParagraph<? extends TextRun> p = paragraphs.next();

+            DrawTextParagraph<? extends TextRun> dp = fact.getDrawable(p);

+            BulletStyle bs = p.getBulletStyle();

+            if (bs == null || bs.getAutoNumberingScheme() == null) {

+                autoNbrIdx = -1;

+            } else {

+                Integer startAt = bs.getAutoNumberingStartAt();

+                if (startAt == null) startAt = 1;

+                // TODO: handle reset auto number indexes

+                if (startAt > autoNbrIdx) autoNbrIdx = startAt;

+            }

+            dp.setAutoNumberingIdx(autoNbrIdx);

+            dp.breakText(graphics);

+

+            if (!isFirstLine) {

+                // the amount of vertical white space before the paragraph

+                Double spaceBefore = p.getSpaceBefore();

+                if (spaceBefore == null) spaceBefore = 0d;

+                if(spaceBefore > 0) {

+                    // positive value means percentage spacing of the height of the first line, e.g.

+                    // the higher the first line, the bigger the space before the paragraph

+                    y += spaceBefore*0.01*dp.getFirstLineHeight();

+                } else {

+                    // negative value means the absolute spacing in points

+                    y += -spaceBefore;

+                }

+            }

+            isFirstLine = false;

+            

+            dp.setPosition(x, y);

+            dp.draw(graphics);

+            y += dp.getY();

+

+            if (paragraphs.hasNext()) {

+                Double spaceAfter = p.getSpaceAfter();

+                if (spaceAfter == null) spaceAfter = 0d;

+                if(spaceAfter > 0) {

+                    // positive value means percentage spacing of the height of the last line, e.g.

+                    // the higher the last line, the bigger the space after the paragraph

+                    y += spaceAfter*0.01*dp.getLastLineHeight();

+                } else {

+                    // negative value means the absolute spacing in points

+                    y += -spaceAfter;

+                }

+            }

+        }

+        return y - y0;

+    }

+

+    /**

+     * Compute the cumulative height occupied by the text

+     */

+    public double getTextHeight(){

+        // dry-run in a 1x1 image and return the vertical advance

+        BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);

+        Graphics2D graphics = img.createGraphics();

+        fixFonts(graphics);

+        return drawParagraphs(graphics, 0, 0);

+    }

+    

+    @SuppressWarnings("unchecked")

+    private static void fixFonts(Graphics2D graphics) {

+        if (!JvmBugs.hasLineBreakMeasurerBug()) return;

+        Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(Drawable.FONT_MAP);

+        if (fontMap == null) fontMap = new HashMap<String,String>();

+        fontMap.put("Calibri", "Lucida Sans");

+        fontMap.put("Cambria", "Lucida Bright");

+        graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);        

+    }

+}

diff --git a/src/java/org/apache/poi/sl/draw/Drawable.java b/src/java/org/apache/poi/sl/draw/Drawable.java
new file mode 100644
index 0000000..54128b8
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/Drawable.java
@@ -0,0 +1,140 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.Graphics2D;

+import java.awt.RenderingHints;

+

+import org.apache.poi.util.Internal;

+

+

+public interface Drawable {

+    class DrawableHint extends RenderingHints.Key {

+        protected DrawableHint(int id) {

+            super(id);

+        }

+        

+        public boolean isCompatibleValue(Object val) {

+            return true;

+        }

+        

+        public String toString() {

+            switch (intKey()) {

+            case 1: return "DRAW_FACTORY";

+            case 2: return "GROUP_TRANSFORM";

+            case 3: return "IMAGE_RENDERER";

+            case 4: return "TEXT_RENDERING_MODE";

+            case 5: return "GRADIENT_SHAPE";

+            case 6: return "PRESET_GEOMETRY_CACHE";

+            case 7: return "FONT_HANDLER";

+            case 8: return "FONT_FALLBACK";

+            case 9: return "FONT_MAP";

+            case 10: return "GSAVE";

+            case 11: return "GRESTORE";

+            default: return "UNKNOWN_ID "+intKey();

+            }

+        }

+    }

+    

+    /**

+     * {@link DrawFactory} which will be used to draw objects into this graphics context

+     */

+    DrawableHint DRAW_FACTORY = new DrawableHint(1);

+

+    /**

+     * Key will be internally used to store affine transformation temporarily within group shapes

+     */

+    @Internal

+    DrawableHint GROUP_TRANSFORM = new DrawableHint(2);

+

+    /**

+     * Use a custom image renderer of an instance of {@link ImageRenderer}

+     */

+    DrawableHint IMAGE_RENDERER = new DrawableHint(3);

+

+    /**

+     *  how to render text:

+     *

+     *  {@link #TEXT_AS_CHARACTERS} (default) means to draw via

+     *   {@link java.awt.Graphics2D#drawString(java.text.AttributedCharacterIterator, float, float)}.

+     *   This mode draws text as characters. Use it if the target graphics writes the actual

+     *   character codes instead of glyph outlines (PDFGraphics2D, SVGGraphics2D, etc.)

+     *

+     *   {@link #TEXT_AS_SHAPES} means to render via

+     *   {@link java.awt.font.TextLayout#draw(java.awt.Graphics2D, float, float)}.

+     *   This mode draws glyphs as shapes and provides some advanced capabilities such as

+     *   justification and font substitution. Use it if the target graphics is an image.

+     *

+     */

+    DrawableHint TEXT_RENDERING_MODE = new DrawableHint(4);

+

+    /**

+     * PathGradientPaint needs the shape to be set.

+     * It will be achieved through setting it in the rendering hints

+     */

+    DrawableHint GRADIENT_SHAPE = new DrawableHint(5);

+

+

+    /**

+     * Internal key for caching the preset geometries

+     */

+    DrawableHint PRESET_GEOMETRY_CACHE = new DrawableHint(6);

+    

+    /**

+     * draw text via {@link java.awt.Graphics2D#drawString(java.text.AttributedCharacterIterator, float, float)}

+     */

+    int TEXT_AS_CHARACTERS = 1;

+

+    /**

+     * draw text via {@link java.awt.font.TextLayout#draw(java.awt.Graphics2D, float, float)}

+     */

+    int TEXT_AS_SHAPES = 2;

+

+    /**

+     * Use this object to resolve unknown / missing fonts when rendering slides

+     */

+    DrawableHint FONT_HANDLER = new DrawableHint(7);

+    DrawableHint FONT_FALLBACK = new DrawableHint(8);

+    DrawableHint FONT_MAP = new DrawableHint(9);

+    

+    DrawableHint GSAVE = new DrawableHint(10);

+    DrawableHint GRESTORE = new DrawableHint(11);

+    

+    

+    

+    /**

+     * Apply 2-D transforms before drawing this shape. This includes rotation and flipping.

+     *

+     * @param graphics the graphics whos transform matrix will be modified

+     */

+    void applyTransform(Graphics2D graphics);

+    

+    /**

+     * Draw this shape into the supplied canvas

+     *

+     * @param graphics the graphics to draw into

+     */

+    void draw(Graphics2D graphics);

+    

+    /**

+     * draw any content within this shape (image, text, etc.).

+     *

+     * @param graphics the graphics to draw into

+     */

+    void drawContent(Graphics2D graphics);    

+}

diff --git a/src/java/org/apache/poi/sl/draw/ImageRenderer.java b/src/java/org/apache/poi/sl/draw/ImageRenderer.java
new file mode 100644
index 0000000..87561ae
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/ImageRenderer.java
@@ -0,0 +1,192 @@
+/*

+ *  ====================================================================

+ *    Licensed to the Apache Software Foundation (ASF) under one or more

+ *    contributor license agreements.  See the NOTICE file distributed with

+ *    this work for additional information regarding copyright ownership.

+ *    The ASF licenses this file to You under the Apache License, Version 2.0

+ *    (the "License"); you may not use this file except in compliance with

+ *    the License.  You may obtain a copy of the License at

+ *

+ *        http://www.apache.org/licenses/LICENSE-2.0

+ *

+ *    Unless required by applicable law or agreed to in writing, software

+ *    distributed under the License is distributed on an "AS IS" BASIS,

+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ *    See the License for the specific language governing permissions and

+ *    limitations under the License.

+ * ====================================================================

+ */

+package org.apache.poi.sl.draw;

+

+import java.awt.*;

+import java.awt.geom.AffineTransform;

+import java.awt.geom.Rectangle2D;

+import java.awt.image.BufferedImage;

+import java.awt.image.RescaleOp;

+import java.io.*;

+

+import javax.imageio.ImageIO;

+

+/**

+ * For now this class renders only images supported by the javax.imageio.ImageIO

+ * framework. Subclasses can override this class to support other formats, for

+ * example, use Apache Batik to render WMF, PICT can be rendered using Apple QuickTime API for Java:

+ *

+ * <pre>

+ * <code>

+ * public class MyImageRendener extends ImageRendener {

+ *     InputStream data;

+ *

+ *     public boolean drawImage(Graphics2D graphics,Rectangle2D anchor,Insets clip) {

+ *         // draw image

+ *       DataInputStream is = new DataInputStream(data);

+ *       org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore wmfStore =

+ *               new org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore();

+ *       try {

+ *           wmfStore.read(is);

+ *       } catch (IOException e){

+ *           return;

+ *       }

+ *

+ *       float scale = (float)anchor.width/wmfStore.getWidthPixels();

+ *

+ *       org.apache.batik.transcoder.wmf.tosvg.WMFPainter painter =

+ *               new org.apache.batik.transcoder.wmf.tosvg.WMFPainter(wmfStore, 0, 0, scale);

+ *       graphics.translate(anchor.x, anchor.y);

+ *       painter.paint(graphics);

+ *     }

+ *

+ *     public void loadImage(InputStream data, String contentType) throws IOException {

+ *         if ("image/wmf".equals(contentType)) {

+ *             this.data = data;

+ *             // use Apache Batik to handle WMF

+ *         } else {

+ *             super.loadImage(data,contentType);

+ *         }

+ *     }

+ * }

+ * </code>

+ * </pre>

+ *

+ * and then pass this class to your instance of java.awt.Graphics2D:

+ *

+ * <pre>

+ * <code>

+ * graphics.setRenderingHint(Drawable.IMAGE_RENDERER, new MyImageRendener());

+ * </code>

+ * </pre>

+ */

+public class ImageRenderer {

+    protected BufferedImage img;

+

+    /**

+     * Load and buffer the image

+     *

+     * @param data the raw image stream

+     * @param contentType the content type

+     */

+    public void loadImage(InputStream data, String contentType) throws IOException {

+        img = convertBufferedImage(ImageIO.read(data));

+    }

+

+    /**

+     * Load and buffer the image

+     *

+     * @param data the raw image stream

+     * @param contentType the content type

+     */

+    public void loadImage(byte data[], String contentType) throws IOException {

+        img = convertBufferedImage(ImageIO.read(new ByteArrayInputStream(data)));

+    }

+

+    protected static BufferedImage convertBufferedImage(BufferedImage img) {

+        BufferedImage bi = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);

+        Graphics g = bi.getGraphics();

+        g.drawImage(img, 0, 0, null);

+        g.dispose();

+        return bi;

+    }

+    

+    

+    /**

+     * @return the buffered image

+     */

+    public BufferedImage getImage() {

+        return img;

+    }

+

+    /**

+     * @return the dimension of the buffered image

+     */

+    public Dimension getDimension() {

+        return (img == null)

+            ? new Dimension(0,0)

+            : new Dimension(img.getWidth(),img.getHeight());

+    }

+

+    /**

+     * @param alpha the alpha [0..1] to be added to the image (possibly already containing an alpha channel)

+     */

+    public void setAlpha(double alpha) {

+        if (img == null) return;

+

+        Dimension dim = getDimension();

+        BufferedImage newImg = new BufferedImage((int)dim.getWidth(), (int)dim.getHeight(), BufferedImage.TYPE_INT_ARGB);

+        Graphics2D g = newImg.createGraphics();

+        RescaleOp op = new RescaleOp(new float[]{1.0f, 1.0f, 1.0f, (float)alpha}, new float[]{0,0,0,0}, null);

+        g.drawImage(img, op, 0, 0);

+        g.dispose();

+        

+        img = newImg;

+    }

+

+

+    /**

+     * Render picture data into the supplied graphics

+     *

+     * @return true if the picture data was successfully rendered

+     */

+    public boolean drawImage(

+        Graphics2D graphics,

+        Rectangle2D anchor) {

+        return drawImage(graphics, anchor, null);

+    }

+

+    /**

+     * Render picture data into the supplied graphics

+     *

+     * @return true if the picture data was successfully rendered

+     */

+    public boolean drawImage(

+        Graphics2D graphics,

+        Rectangle2D anchor,

+        Insets clip) {

+        if (img == null) return false;

+

+        boolean isClipped = true;

+        if (clip == null) {

+            isClipped = false;

+            clip = new Insets(0,0,0,0);

+        }

+

+        int iw = img.getWidth();

+        int ih = img.getHeight();

+

+        

+        double cw = (100000-clip.left-clip.right) / 100000.0;

+        double ch = (100000-clip.top-clip.bottom) / 100000.0;

+        double sx = anchor.getWidth()/(iw*cw);

+        double sy = anchor.getHeight()/(ih*ch);

+        double tx = anchor.getX()-(iw*sx*clip.left/100000.0);

+        double ty = anchor.getY()-(ih*sy*clip.top/100000.0);

+

+        AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ;

+

+        Shape clipOld = graphics.getClip();

+        if (isClipped) graphics.clip(anchor.getBounds2D());

+        graphics.drawRenderedImage(img, at);

+        graphics.setClip(clipOld);

+

+        return true;

+    }

+}

diff --git a/src/java/org/apache/poi/sl/draw/PathGradientPaint.java b/src/java/org/apache/poi/sl/draw/PathGradientPaint.java
new file mode 100644
index 0000000..c5ad799
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/PathGradientPaint.java
@@ -0,0 +1,186 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw;

+

+import java.awt.*;

+import java.awt.MultipleGradientPaint.ColorSpaceType;

+import java.awt.MultipleGradientPaint.CycleMethod;

+import java.awt.geom.*;

+import java.awt.image.*;

+

+class PathGradientPaint implements Paint {

+

+    // http://asserttrue.blogspot.de/2010/01/how-to-iimplement-custom-paint-in-50.html

+    protected final Color colors[];

+    protected final float fractions[];

+    protected final int capStyle;

+    protected final int joinStyle;

+    protected final int transparency;

+

+    

+    public PathGradientPaint(Color colors[], float fractions[]) {

+        this(colors,fractions,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);

+    }

+    

+    public PathGradientPaint(Color colors[], float fractions[], int capStyle, int joinStyle) {

+        this.colors = colors;

+        this.fractions = fractions;

+        this.capStyle = capStyle;

+        this.joinStyle = joinStyle;

+

+        // determine transparency

+        boolean opaque = true;

+        for (int i = 0; i < colors.length; i++){

+            opaque = opaque && (colors[i].getAlpha() == 0xff);

+        }

+        this.transparency = opaque ? OPAQUE : TRANSLUCENT;

+    }

+    

+    public PaintContext createContext(ColorModel cm,

+        Rectangle deviceBounds,

+        Rectangle2D userBounds,

+        AffineTransform transform,

+        RenderingHints hints) {

+        return new PathGradientContext(cm, deviceBounds, userBounds, transform, hints);

+    }

+    

+    public int getTransparency() {

+        return transparency;

+    }

+

+    class PathGradientContext implements PaintContext {

+        protected final Rectangle deviceBounds;

+        protected final Rectangle2D userBounds;

+        protected final AffineTransform xform;

+        protected final RenderingHints hints;

+

+        /**

+         * for POI: the shape will be only known when the subclasses determines the concrete implementation 

+         * in the draw/-content method, so we need to postpone the setting/creation as long as possible

+         **/

+        protected final Shape shape;

+        protected final PaintContext pCtx;

+        protected final int gradientSteps;

+        WritableRaster raster;

+

+        public PathGradientContext(

+              ColorModel cm

+            , Rectangle deviceBounds

+            , Rectangle2D userBounds

+            , AffineTransform xform

+            , RenderingHints hints

+        ) {

+            shape = (Shape)hints.get(Drawable.GRADIENT_SHAPE);

+            if (shape == null) {

+                throw new IllegalPathStateException("PathGradientPaint needs a shape to be set via the rendering hint PathGradientPaint.GRADIANT_SHAPE.");

+            }

+

+            this.deviceBounds = deviceBounds;

+            this.userBounds = userBounds;

+            this.xform = xform;

+            this.hints = hints;

+

+            gradientSteps = getGradientSteps(shape);

+

+            Point2D start = new Point2D.Double(0, 0);

+            Point2D end = new Point2D.Double(gradientSteps, 0);

+            LinearGradientPaint gradientPaint = new LinearGradientPaint(start, end, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, new AffineTransform());

+            

+            Rectangle bounds = new Rectangle(0, 0, gradientSteps, 1);

+            pCtx = gradientPaint.createContext(cm, bounds, bounds, new AffineTransform(), hints);

+        }

+

+        public void dispose() {}

+

+        public ColorModel getColorModel() {

+            return pCtx.getColorModel();

+        }

+

+        public Raster getRaster(int xOffset, int yOffset, int w, int h) {

+            ColorModel cm = getColorModel();

+            if (raster == null) createRaster();

+

+            // TODO: eventually use caching here

+            WritableRaster childRaster = cm.createCompatibleWritableRaster(w, h);

+            Rectangle2D childRect = new Rectangle2D.Double(xOffset, yOffset, w, h);

+            if (!childRect.intersects(deviceBounds)) {

+                // usually doesn't happen ...

+                return childRaster;

+            }

+            

+            Rectangle2D destRect = new Rectangle2D.Double();

+            Rectangle2D.intersect(childRect, deviceBounds, destRect);

+            int dx = (int)(destRect.getX()-deviceBounds.getX());

+            int dy = (int)(destRect.getY()-deviceBounds.getY());

+            int dw = (int)destRect.getWidth();

+            int dh = (int)destRect.getHeight();

+            Object data = raster.getDataElements(dx, dy, dw, dh, null);

+            dx = (int)(destRect.getX()-childRect.getX());

+            dy = (int)(destRect.getY()-childRect.getY());

+            childRaster.setDataElements(dx, dy, dw, dh, data);

+            

+            return childRaster;

+        }

+

+        protected int getGradientSteps(Shape shape) {

+            Rectangle rect = shape.getBounds();

+            int lower = 1;

+            int upper = (int)(Math.max(rect.getWidth(),rect.getHeight())/2.0);

+            while (lower < upper-1) {

+                int mid = lower + (upper - lower) / 2;

+                BasicStroke bs = new BasicStroke(mid, capStyle, joinStyle);

+                Area area = new Area(bs.createStrokedShape(shape));

+                if (area.isSingular()) {

+                    upper = mid;

+                } else {

+                    lower = mid;

+                }

+            }

+            return upper;

+        }

+        

+        

+        

+        protected void createRaster() {

+            ColorModel cm = getColorModel();

+            raster = cm.createCompatibleWritableRaster((int)deviceBounds.getWidth(), (int)deviceBounds.getHeight());

+            BufferedImage img = new BufferedImage(cm, raster, false, null);

+            Graphics2D graphics = img.createGraphics();

+            graphics.setRenderingHints(hints);

+            graphics.translate(-deviceBounds.getX(), -deviceBounds.getY());

+            graphics.transform(xform);

+

+            Raster img2 = pCtx.getRaster(0, 0, gradientSteps, 1);

+            int rgb[] = new int[cm.getNumComponents()];

+

+            for (int i = gradientSteps-1; i>=0; i--) {

+                img2.getPixel(i, 0, rgb);

+                Color c = new Color(rgb[0],rgb[1],rgb[2]);

+                if (rgb.length == 4) {

+                    // it doesn't work to use just a color with transparency ...

+                    graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, rgb[3]/255.0f));                           

+                }

+                graphics.setStroke(new BasicStroke(i+1, capStyle, joinStyle));

+                graphics.setColor(c);

+                graphics.draw(shape);

+            }

+            

+            graphics.dispose();

+        }

+    }

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java b/src/java/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java
new file mode 100644
index 0000000..d7fc0ae
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTAdjPoint2D.java
@@ -0,0 +1,109 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_AdjPoint2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_AdjPoint2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="x" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="y" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_AdjPoint2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTAdjPoint2D {

+

+    @XmlAttribute(name = "x", required = true)

+    protected String x;

+    @XmlAttribute(name = "y", required = true)

+    protected String y;

+

+    /**

+     * Gets the value of the x property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getX() {

+        return x;

+    }

+

+    /**

+     * Sets the value of the x property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setX(String value) {

+        this.x = value;

+    }

+

+    public boolean isSetX() {

+        return (this.x!= null);

+    }

+

+    /**

+     * Gets the value of the y property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getY() {

+        return y;

+    }

+

+    /**

+     * Sets the value of the y property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setY(String value) {

+        this.y = value;

+    }

+

+    public boolean isSetY() {

+        return (this.y!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java b/src/java/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java
new file mode 100644
index 0000000..d684ccc
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTAdjustHandleList.java
@@ -0,0 +1,99 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlElements;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_AdjustHandleList complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_AdjustHandleList">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;choice maxOccurs="unbounded" minOccurs="0">

+ *         &lt;element name="ahXY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_XYAdjustHandle"/>

+ *         &lt;element name="ahPolar" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PolarAdjustHandle"/>

+ *       &lt;/choice>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_AdjustHandleList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "ahXYOrAhPolar"

+})

+public class CTAdjustHandleList {

+

+    @XmlElements({

+        @XmlElement(name = "ahXY", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTXYAdjustHandle.class),

+        @XmlElement(name = "ahPolar", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPolarAdjustHandle.class)

+    })

+    protected List<Object> ahXYOrAhPolar;

+

+    /**

+     * Gets the value of the ahXYOrAhPolar property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the ahXYOrAhPolar property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getAhXYOrAhPolar().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTXYAdjustHandle }

+     * {@link CTPolarAdjustHandle }

+     * 

+     * 

+     */

+    public List<Object> getAhXYOrAhPolar() {

+        if (ahXYOrAhPolar == null) {

+            ahXYOrAhPolar = new ArrayList<Object>();

+        }

+        return this.ahXYOrAhPolar;

+    }

+

+    public boolean isSetAhXYOrAhPolar() {

+        return ((this.ahXYOrAhPolar!= null)&&(!this.ahXYOrAhPolar.isEmpty()));

+    }

+

+    public void unsetAhXYOrAhPolar() {

+        this.ahXYOrAhPolar = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTAngle.java b/src/java/org/apache/poi/sl/draw/binding/CTAngle.java
new file mode 100644
index 0000000..2da2373
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTAngle.java
@@ -0,0 +1,70 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Angle complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Angle">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Angle" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Angle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTAngle {

+

+    @XmlAttribute(name = "val", required = true)

+    protected int val;

+

+    /**

+     * Gets the value of the val property.

+     * 

+     */

+    public int getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     */

+    public void setVal(int value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTColor.java b/src/java/org/apache/poi/sl/draw/binding/CTColor.java
new file mode 100644
index 0000000..dd3cca3
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTColor.java
@@ -0,0 +1,237 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Color complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Color">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorChoice"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Color", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "scrgbClr",

+    "srgbClr",

+    "hslClr",

+    "sysClr",

+    "schemeClr",

+    "prstClr"

+})

+public class CTColor {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTScRgbColor scrgbClr;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTSRgbColor srgbClr;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTHslColor hslClr;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTSystemColor sysClr;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTSchemeColor schemeClr;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTPresetColor prstClr;

+

+    /**

+     * Gets the value of the scrgbClr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTScRgbColor }

+     *     

+     */

+    public CTScRgbColor getScrgbClr() {

+        return scrgbClr;

+    }

+

+    /**

+     * Sets the value of the scrgbClr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTScRgbColor }

+     *     

+     */

+    public void setScrgbClr(CTScRgbColor value) {

+        this.scrgbClr = value;

+    }

+

+    public boolean isSetScrgbClr() {

+        return (this.scrgbClr!= null);

+    }

+

+    /**

+     * Gets the value of the srgbClr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTSRgbColor }

+     *     

+     */

+    public CTSRgbColor getSrgbClr() {

+        return srgbClr;

+    }

+

+    /**

+     * Sets the value of the srgbClr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTSRgbColor }

+     *     

+     */

+    public void setSrgbClr(CTSRgbColor value) {

+        this.srgbClr = value;

+    }

+

+    public boolean isSetSrgbClr() {

+        return (this.srgbClr!= null);

+    }

+

+    /**

+     * Gets the value of the hslClr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTHslColor }

+     *     

+     */

+    public CTHslColor getHslClr() {

+        return hslClr;

+    }

+

+    /**

+     * Sets the value of the hslClr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTHslColor }

+     *     

+     */

+    public void setHslClr(CTHslColor value) {

+        this.hslClr = value;

+    }

+

+    public boolean isSetHslClr() {

+        return (this.hslClr!= null);

+    }

+

+    /**

+     * Gets the value of the sysClr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTSystemColor }

+     *     

+     */

+    public CTSystemColor getSysClr() {

+        return sysClr;

+    }

+

+    /**

+     * Sets the value of the sysClr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTSystemColor }

+     *     

+     */

+    public void setSysClr(CTSystemColor value) {

+        this.sysClr = value;

+    }

+

+    public boolean isSetSysClr() {

+        return (this.sysClr!= null);

+    }

+

+    /**

+     * Gets the value of the schemeClr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTSchemeColor }

+     *     

+     */

+    public CTSchemeColor getSchemeClr() {

+        return schemeClr;

+    }

+

+    /**

+     * Sets the value of the schemeClr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTSchemeColor }

+     *     

+     */

+    public void setSchemeClr(CTSchemeColor value) {

+        this.schemeClr = value;

+    }

+

+    public boolean isSetSchemeClr() {

+        return (this.schemeClr!= null);

+    }

+

+    /**

+     * Gets the value of the prstClr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTPresetColor }

+     *     

+     */

+    public CTPresetColor getPrstClr() {

+        return prstClr;

+    }

+

+    /**

+     * Sets the value of the prstClr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTPresetColor }

+     *     

+     */

+    public void setPrstClr(CTPresetColor value) {

+        this.prstClr = value;

+    }

+

+    public boolean isSetPrstClr() {

+        return (this.prstClr!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTColorMRU.java b/src/java/org/apache/poi/sl/draw/binding/CTColorMRU.java
new file mode 100644
index 0000000..8ec68ba
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTColorMRU.java
@@ -0,0 +1,106 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlElements;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_ColorMRU complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_ColorMRU">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorChoice" maxOccurs="10" minOccurs="0"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_ColorMRU", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "egColorChoice"

+})

+public class CTColorMRU {

+

+    @XmlElements({

+        @XmlElement(name = "scrgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTScRgbColor.class),

+        @XmlElement(name = "srgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSRgbColor.class),

+        @XmlElement(name = "hslClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTHslColor.class),

+        @XmlElement(name = "sysClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSystemColor.class),

+        @XmlElement(name = "schemeClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSchemeColor.class),

+        @XmlElement(name = "prstClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPresetColor.class)

+    })

+    protected List<Object> egColorChoice;

+

+    /**

+     * Gets the value of the egColorChoice property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the egColorChoice property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getEGColorChoice().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTScRgbColor }

+     * {@link CTSRgbColor }

+     * {@link CTHslColor }

+     * {@link CTSystemColor }

+     * {@link CTSchemeColor }

+     * {@link CTPresetColor }

+     * 

+     * 

+     */

+    public List<Object> getEGColorChoice() {

+        if (egColorChoice == null) {

+            egColorChoice = new ArrayList<Object>();

+        }

+        return this.egColorChoice;

+    }

+

+    public boolean isSetEGColorChoice() {

+        return ((this.egColorChoice!= null)&&(!this.egColorChoice.isEmpty()));

+    }

+

+    public void unsetEGColorChoice() {

+        this.egColorChoice = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTComplementTransform.java b/src/java/org/apache/poi/sl/draw/binding/CTComplementTransform.java
new file mode 100644
index 0000000..dd1a56c
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTComplementTransform.java
@@ -0,0 +1,46 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_ComplementTransform complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_ComplementTransform">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_ComplementTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTComplementTransform {

+

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTConnection.java b/src/java/org/apache/poi/sl/draw/binding/CTConnection.java
new file mode 100644
index 0000000..f5d5e17
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTConnection.java
@@ -0,0 +1,95 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlSchemaType;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Connection complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Connection">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="id" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_DrawingElementId" />

+ *       &lt;attribute name="idx" use="required" type="{http://www.w3.org/2001/XMLSchema}unsignedInt" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Connection", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTConnection {

+

+    @XmlAttribute(name = "id", required = true)

+    protected long id;

+    @XmlAttribute(name = "idx", required = true)

+    @XmlSchemaType(name = "unsignedInt")

+    protected long idx;

+

+    /**

+     * Gets the value of the id property.

+     * 

+     */

+    public long getId() {

+        return id;

+    }

+

+    /**

+     * Sets the value of the id property.

+     * 

+     */

+    public void setId(long value) {

+        this.id = value;

+    }

+

+    public boolean isSetId() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the idx property.

+     * 

+     */

+    public long getIdx() {

+        return idx;

+    }

+

+    /**

+     * Sets the value of the idx property.

+     * 

+     */

+    public void setIdx(long value) {

+        this.idx = value;

+    }

+

+    public boolean isSetIdx() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTConnectionSite.java b/src/java/org/apache/poi/sl/draw/binding/CTConnectionSite.java
new file mode 100644
index 0000000..eae59a0
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTConnectionSite.java
@@ -0,0 +1,114 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_ConnectionSite complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_ConnectionSite">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="pos" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="ang" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_ConnectionSite", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "pos"

+})

+public class CTConnectionSite {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected CTAdjPoint2D pos;

+    @XmlAttribute(name = "ang", required = true)

+    protected String ang;

+

+    /**

+     * Gets the value of the pos property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public CTAdjPoint2D getPos() {

+        return pos;

+    }

+

+    /**

+     * Sets the value of the pos property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public void setPos(CTAdjPoint2D value) {

+        this.pos = value;

+    }

+

+    public boolean isSetPos() {

+        return (this.pos!= null);

+    }

+

+    /**

+     * Gets the value of the ang property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getAng() {

+        return ang;

+    }

+

+    /**

+     * Sets the value of the ang property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setAng(String value) {

+        this.ang = value;

+    }

+

+    public boolean isSetAng() {

+        return (this.ang!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java b/src/java/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java
new file mode 100644
index 0000000..a3c9889
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTConnectionSiteList.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_ConnectionSiteList complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_ConnectionSiteList">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="cxn" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_ConnectionSite" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_ConnectionSiteList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "cxn"

+})

+public class CTConnectionSiteList {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected List<CTConnectionSite> cxn;

+

+    /**

+     * Gets the value of the cxn property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the cxn property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getCxn().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTConnectionSite }

+     * 

+     * 

+     */

+    public List<CTConnectionSite> getCxn() {

+        if (cxn == null) {

+            cxn = new ArrayList<CTConnectionSite>();

+        }

+        return this.cxn;

+    }

+

+    public boolean isSetCxn() {

+        return ((this.cxn!= null)&&(!this.cxn.isEmpty()));

+    }

+

+    public void unsetCxn() {

+        this.cxn = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java b/src/java/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java
new file mode 100644
index 0000000..d6856ee
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTCustomGeometry2D.java
@@ -0,0 +1,242 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_CustomGeometry2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_CustomGeometry2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="avLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>

+ *         &lt;element name="gdLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>

+ *         &lt;element name="ahLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjustHandleList" minOccurs="0"/>

+ *         &lt;element name="cxnLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_ConnectionSiteList" minOccurs="0"/>

+ *         &lt;element name="rect" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomRect" minOccurs="0"/>

+ *         &lt;element name="pathLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DList"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_CustomGeometry2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "avLst",

+    "gdLst",

+    "ahLst",

+    "cxnLst",

+    "rect",

+    "pathLst"

+})

+public class CTCustomGeometry2D {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTGeomGuideList avLst;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTGeomGuideList gdLst;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTAdjustHandleList ahLst;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTConnectionSiteList cxnLst;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTGeomRect rect;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected CTPath2DList pathLst;

+

+    /**

+     * Gets the value of the avLst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTGeomGuideList }

+     *     

+     */

+    public CTGeomGuideList getAvLst() {

+        return avLst;

+    }

+

+    /**

+     * Sets the value of the avLst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTGeomGuideList }

+     *     

+     */

+    public void setAvLst(CTGeomGuideList value) {

+        this.avLst = value;

+    }

+

+    public boolean isSetAvLst() {

+        return (this.avLst!= null);

+    }

+

+    /**

+     * Gets the value of the gdLst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTGeomGuideList }

+     *     

+     */

+    public CTGeomGuideList getGdLst() {

+        return gdLst;

+    }

+

+    /**

+     * Sets the value of the gdLst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTGeomGuideList }

+     *     

+     */

+    public void setGdLst(CTGeomGuideList value) {

+        this.gdLst = value;

+    }

+

+    public boolean isSetGdLst() {

+        return (this.gdLst!= null);

+    }

+

+    /**

+     * Gets the value of the ahLst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTAdjustHandleList }

+     *     

+     */

+    public CTAdjustHandleList getAhLst() {

+        return ahLst;

+    }

+

+    /**

+     * Sets the value of the ahLst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTAdjustHandleList }

+     *     

+     */

+    public void setAhLst(CTAdjustHandleList value) {

+        this.ahLst = value;

+    }

+

+    public boolean isSetAhLst() {

+        return (this.ahLst!= null);

+    }

+

+    /**

+     * Gets the value of the cxnLst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTConnectionSiteList }

+     *     

+     */

+    public CTConnectionSiteList getCxnLst() {

+        return cxnLst;

+    }

+

+    /**

+     * Sets the value of the cxnLst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTConnectionSiteList }

+     *     

+     */

+    public void setCxnLst(CTConnectionSiteList value) {

+        this.cxnLst = value;

+    }

+

+    public boolean isSetCxnLst() {

+        return (this.cxnLst!= null);

+    }

+

+    /**

+     * Gets the value of the rect property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTGeomRect }

+     *     

+     */

+    public CTGeomRect getRect() {

+        return rect;

+    }

+

+    /**

+     * Sets the value of the rect property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTGeomRect }

+     *     

+     */

+    public void setRect(CTGeomRect value) {

+        this.rect = value;

+    }

+

+    public boolean isSetRect() {

+        return (this.rect!= null);

+    }

+

+    /**

+     * Gets the value of the pathLst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTPath2DList }

+     *     

+     */

+    public CTPath2DList getPathLst() {

+        return pathLst;

+    }

+

+    /**

+     * Sets the value of the pathLst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTPath2DList }

+     *     

+     */

+    public void setPathLst(CTPath2DList value) {

+        this.pathLst = value;

+    }

+

+    public boolean isSetPathLst() {

+        return (this.pathLst!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java b/src/java/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java
new file mode 100644
index 0000000..8787125
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTEmbeddedWAVAudioFile.java
@@ -0,0 +1,152 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_EmbeddedWAVAudioFile complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_EmbeddedWAVAudioFile">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute ref="{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed use="required""/>

+ *       &lt;attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" default="" />

+ *       &lt;attribute name="builtIn" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_EmbeddedWAVAudioFile", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTEmbeddedWAVAudioFile {

+

+    @XmlAttribute(name = "embed", namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", required = true)

+    protected String embed;

+    @XmlAttribute(name = "name")

+    protected String name;

+    @XmlAttribute(name = "builtIn")

+    protected Boolean builtIn;

+

+    /**

+     * Embedded Audio File Relationship ID

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getEmbed() {

+        return embed;

+    }

+

+    /**

+     * Sets the value of the embed property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setEmbed(String value) {

+        this.embed = value;

+    }

+

+    public boolean isSetEmbed() {

+        return (this.embed!= null);

+    }

+

+    /**

+     * Gets the value of the name property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getName() {

+        if (name == null) {

+            return "";

+        } else {

+            return name;

+        }

+    }

+

+    /**

+     * Sets the value of the name property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setName(String value) {

+        this.name = value;

+    }

+

+    public boolean isSetName() {

+        return (this.name!= null);

+    }

+

+    /**

+     * Gets the value of the builtIn property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isBuiltIn() {

+        if (builtIn == null) {

+            return false;

+        } else {

+            return builtIn;

+        }

+    }

+

+    /**

+     * Sets the value of the builtIn property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setBuiltIn(boolean value) {

+        this.builtIn = value;

+    }

+

+    public boolean isSetBuiltIn() {

+        return (this.builtIn!= null);

+    }

+

+    public void unsetBuiltIn() {

+        this.builtIn = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTFixedPercentage.java b/src/java/org/apache/poi/sl/draw/binding/CTFixedPercentage.java
new file mode 100644
index 0000000..d1ed283
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTFixedPercentage.java
@@ -0,0 +1,70 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_FixedPercentage complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_FixedPercentage">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_FixedPercentage" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_FixedPercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTFixedPercentage {

+

+    @XmlAttribute(name = "val", required = true)

+    protected int val;

+

+    /**

+     * Gets the value of the val property.

+     * 

+     */

+    public int getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     */

+    public void setVal(int value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTGammaTransform.java b/src/java/org/apache/poi/sl/draw/binding/CTGammaTransform.java
new file mode 100644
index 0000000..7cf6cb1
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTGammaTransform.java
@@ -0,0 +1,46 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_GammaTransform complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_GammaTransform">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_GammaTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTGammaTransform {

+

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTGeomGuide.java b/src/java/org/apache/poi/sl/draw/binding/CTGeomGuide.java
new file mode 100644
index 0000000..5622e4c
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTGeomGuide.java
@@ -0,0 +1,112 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;

+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

+

+

+/**

+ * <p>Java class for CT_GeomGuide complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_GeomGuide">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="name" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />

+ *       &lt;attribute name="fmla" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideFormula" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_GeomGuide", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTGeomGuide {

+

+    @XmlAttribute(name = "name", required = true)

+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)

+    protected String name;

+    @XmlAttribute(name = "fmla", required = true)

+    protected String fmla;

+

+    /**

+     * Gets the value of the name property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getName() {

+        return name;

+    }

+

+    /**

+     * Sets the value of the name property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setName(String value) {

+        this.name = value;

+    }

+

+    public boolean isSetName() {

+        return (this.name!= null);

+    }

+

+    /**

+     * Gets the value of the fmla property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getFmla() {

+        return fmla;

+    }

+

+    /**

+     * Sets the value of the fmla property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setFmla(String value) {

+        this.fmla = value;

+    }

+

+    public boolean isSetFmla() {

+        return (this.fmla!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTGeomGuideList.java b/src/java/org/apache/poi/sl/draw/binding/CTGeomGuideList.java
new file mode 100644
index 0000000..4490933
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTGeomGuideList.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_GeomGuideList complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_GeomGuideList">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="gd" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuide" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_GeomGuideList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "gd"

+})

+public class CTGeomGuideList {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected List<CTGeomGuide> gd;

+

+    /**

+     * Gets the value of the gd property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the gd property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getGd().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTGeomGuide }

+     * 

+     * 

+     */

+    public List<CTGeomGuide> getGd() {

+        if (gd == null) {

+            gd = new ArrayList<CTGeomGuide>();

+        }

+        return this.gd;

+    }

+

+    public boolean isSetGd() {

+        return ((this.gd!= null)&&(!this.gd.isEmpty()));

+    }

+

+    public void unsetGd() {

+        this.gd = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTGeomRect.java b/src/java/org/apache/poi/sl/draw/binding/CTGeomRect.java
new file mode 100644
index 0000000..3198f04
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTGeomRect.java
@@ -0,0 +1,171 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_GeomRect complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_GeomRect">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="l" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="t" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="r" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="b" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_GeomRect", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTGeomRect {

+

+    @XmlAttribute(name = "l", required = true)

+    protected String l;

+    @XmlAttribute(name = "t", required = true)

+    protected String t;

+    @XmlAttribute(name = "r", required = true)

+    protected String r;

+    @XmlAttribute(name = "b", required = true)

+    protected String b;

+

+    /**

+     * Gets the value of the l property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getL() {

+        return l;

+    }

+

+    /**

+     * Sets the value of the l property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setL(String value) {

+        this.l = value;

+    }

+

+    public boolean isSetL() {

+        return (this.l!= null);

+    }

+

+    /**

+     * Gets the value of the t property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getT() {

+        return t;

+    }

+

+    /**

+     * Sets the value of the t property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setT(String value) {

+        this.t = value;

+    }

+

+    public boolean isSetT() {

+        return (this.t!= null);

+    }

+

+    /**

+     * Gets the value of the r property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getR() {

+        return r;

+    }

+

+    /**

+     * Sets the value of the r property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setR(String value) {

+        this.r = value;

+    }

+

+    public boolean isSetR() {

+        return (this.r!= null);

+    }

+

+    /**

+     * Gets the value of the b property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getB() {

+        return b;

+    }

+

+    /**

+     * Sets the value of the b property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setB(String value) {

+        this.b = value;

+    }

+

+    public boolean isSetB() {

+        return (this.b!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java b/src/java/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java
new file mode 100644
index 0000000..643db02
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTGrayscaleTransform.java
@@ -0,0 +1,46 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_GrayscaleTransform complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_GrayscaleTransform">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_GrayscaleTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTGrayscaleTransform {

+

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java b/src/java/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java
new file mode 100644
index 0000000..f06e1d8
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTGroupTransform2D.java
@@ -0,0 +1,296 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_GroupTransform2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_GroupTransform2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="off" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Point2D" minOccurs="0"/>

+ *         &lt;element name="ext" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PositiveSize2D" minOccurs="0"/>

+ *         &lt;element name="chOff" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Point2D" minOccurs="0"/>

+ *         &lt;element name="chExt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PositiveSize2D" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="rot" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Angle" default="0" />

+ *       &lt;attribute name="flipH" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />

+ *       &lt;attribute name="flipV" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_GroupTransform2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "off",

+    "ext",

+    "chOff",

+    "chExt"

+})

+public class CTGroupTransform2D {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTPoint2D off;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTPositiveSize2D ext;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTPoint2D chOff;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTPositiveSize2D chExt;

+    @XmlAttribute(name = "rot")

+    protected Integer rot;

+    @XmlAttribute(name = "flipH")

+    protected Boolean flipH;

+    @XmlAttribute(name = "flipV")

+    protected Boolean flipV;

+

+    /**

+     * Gets the value of the off property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTPoint2D }

+     *     

+     */

+    public CTPoint2D getOff() {

+        return off;

+    }

+

+    /**

+     * Sets the value of the off property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTPoint2D }

+     *     

+     */

+    public void setOff(CTPoint2D value) {

+        this.off = value;

+    }

+

+    public boolean isSetOff() {

+        return (this.off!= null);

+    }

+

+    /**

+     * Gets the value of the ext property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTPositiveSize2D }

+     *     

+     */

+    public CTPositiveSize2D getExt() {

+        return ext;

+    }

+

+    /**

+     * Sets the value of the ext property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTPositiveSize2D }

+     *     

+     */

+    public void setExt(CTPositiveSize2D value) {

+        this.ext = value;

+    }

+

+    public boolean isSetExt() {

+        return (this.ext!= null);

+    }

+

+    /**

+     * Gets the value of the chOff property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTPoint2D }

+     *     

+     */

+    public CTPoint2D getChOff() {

+        return chOff;

+    }

+

+    /**

+     * Sets the value of the chOff property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTPoint2D }

+     *     

+     */

+    public void setChOff(CTPoint2D value) {

+        this.chOff = value;

+    }

+

+    public boolean isSetChOff() {

+        return (this.chOff!= null);

+    }

+

+    /**

+     * Gets the value of the chExt property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTPositiveSize2D }

+     *     

+     */

+    public CTPositiveSize2D getChExt() {

+        return chExt;

+    }

+

+    /**

+     * Sets the value of the chExt property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTPositiveSize2D }

+     *     

+     */

+    public void setChExt(CTPositiveSize2D value) {

+        this.chExt = value;

+    }

+

+    public boolean isSetChExt() {

+        return (this.chExt!= null);

+    }

+

+    /**

+     * Gets the value of the rot property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Integer }

+     *     

+     */

+    public int getRot() {

+        if (rot == null) {

+            return  0;

+        } else {

+            return rot;

+        }

+    }

+

+    /**

+     * Sets the value of the rot property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Integer }

+     *     

+     */

+    public void setRot(int value) {

+        this.rot = value;

+    }

+

+    public boolean isSetRot() {

+        return (this.rot!= null);

+    }

+

+    public void unsetRot() {

+        this.rot = null;

+    }

+

+    /**

+     * Gets the value of the flipH property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isFlipH() {

+        if (flipH == null) {

+            return false;

+        } else {

+            return flipH;

+        }

+    }

+

+    /**

+     * Sets the value of the flipH property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setFlipH(boolean value) {

+        this.flipH = value;

+    }

+

+    public boolean isSetFlipH() {

+        return (this.flipH!= null);

+    }

+

+    public void unsetFlipH() {

+        this.flipH = null;

+    }

+

+    /**

+     * Gets the value of the flipV property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isFlipV() {

+        if (flipV == null) {

+            return false;

+        } else {

+            return flipV;

+        }

+    }

+

+    /**

+     * Sets the value of the flipV property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setFlipV(boolean value) {

+        this.flipV = value;

+    }

+

+    public boolean isSetFlipV() {

+        return (this.flipV!= null);

+    }

+

+    public void unsetFlipV() {

+        this.flipV = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTHslColor.java b/src/java/org/apache/poi/sl/draw/binding/CTHslColor.java
new file mode 100644
index 0000000..376d423
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTHslColor.java
@@ -0,0 +1,221 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.JAXBElement;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElementRef;

+import javax.xml.bind.annotation.XmlElementRefs;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_HslColor complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_HslColor">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="hue" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />

+ *       &lt;attribute name="sat" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />

+ *       &lt;attribute name="lum" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_HslColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "egColorTransform"

+})

+public class CTHslColor {

+

+    @XmlElementRefs({

+        @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false)

+    })

+    protected List<JAXBElement<?>> egColorTransform;

+    @XmlAttribute(name = "hue", required = true)

+    protected int hue;

+    @XmlAttribute(name = "sat", required = true)

+    protected int sat;

+    @XmlAttribute(name = "lum", required = true)

+    protected int lum;

+

+    /**

+     * Gets the value of the egColorTransform property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the egColorTransform property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getEGColorTransform().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * 

+     * 

+     */

+    public List<JAXBElement<?>> getEGColorTransform() {

+        if (egColorTransform == null) {

+            egColorTransform = new ArrayList<JAXBElement<?>>();

+        }

+        return this.egColorTransform;

+    }

+

+    public boolean isSetEGColorTransform() {

+        return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty()));

+    }

+

+    public void unsetEGColorTransform() {

+        this.egColorTransform = null;

+    }

+

+    /**

+     * Gets the value of the hue property.

+     * 

+     */

+    public int getHue() {

+        return hue;

+    }

+

+    /**

+     * Sets the value of the hue property.

+     * 

+     */

+    public void setHue(int value) {

+        this.hue = value;

+    }

+

+    public boolean isSetHue() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the sat property.

+     * 

+     */

+    public int getSat() {

+        return sat;

+    }

+

+    /**

+     * Sets the value of the sat property.

+     * 

+     */

+    public void setSat(int value) {

+        this.sat = value;

+    }

+

+    public boolean isSetSat() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the lum property.

+     * 

+     */

+    public int getLum() {

+        return lum;

+    }

+

+    /**

+     * Sets the value of the lum property.

+     * 

+     */

+    public void setLum(int value) {

+        this.lum = value;

+    }

+

+    public boolean isSetLum() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTHyperlink.java b/src/java/org/apache/poi/sl/draw/binding/CTHyperlink.java
new file mode 100644
index 0000000..0c89f39
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTHyperlink.java
@@ -0,0 +1,403 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Hyperlink complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Hyperlink">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="snd" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_EmbeddedWAVAudioFile" minOccurs="0"/>

+ *         &lt;element name="extLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_OfficeArtExtensionList" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute ref="{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id"/>

+ *       &lt;attribute name="invalidUrl" type="{http://www.w3.org/2001/XMLSchema}string" default="" />

+ *       &lt;attribute name="action" type="{http://www.w3.org/2001/XMLSchema}string" default="" />

+ *       &lt;attribute name="tgtFrame" type="{http://www.w3.org/2001/XMLSchema}string" default="" />

+ *       &lt;attribute name="tooltip" type="{http://www.w3.org/2001/XMLSchema}string" default="" />

+ *       &lt;attribute name="history" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />

+ *       &lt;attribute name="highlightClick" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />

+ *       &lt;attribute name="endSnd" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Hyperlink", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "snd",

+    "extLst"

+})

+public class CTHyperlink {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTEmbeddedWAVAudioFile snd;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTOfficeArtExtensionList extLst;

+    @XmlAttribute(name = "id", namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships")

+    protected String id;

+    @XmlAttribute(name = "invalidUrl")

+    protected String invalidUrl;

+    @XmlAttribute(name = "action")

+    protected String action;

+    @XmlAttribute(name = "tgtFrame")

+    protected String tgtFrame;

+    @XmlAttribute(name = "tooltip")

+    protected String tooltip;

+    @XmlAttribute(name = "history")

+    protected Boolean history;

+    @XmlAttribute(name = "highlightClick")

+    protected Boolean highlightClick;

+    @XmlAttribute(name = "endSnd")

+    protected Boolean endSnd;

+

+    /**

+     * Gets the value of the snd property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTEmbeddedWAVAudioFile }

+     *     

+     */

+    public CTEmbeddedWAVAudioFile getSnd() {

+        return snd;

+    }

+

+    /**

+     * Sets the value of the snd property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTEmbeddedWAVAudioFile }

+     *     

+     */

+    public void setSnd(CTEmbeddedWAVAudioFile value) {

+        this.snd = value;

+    }

+

+    public boolean isSetSnd() {

+        return (this.snd!= null);

+    }

+

+    /**

+     * Gets the value of the extLst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTOfficeArtExtensionList }

+     *     

+     */

+    public CTOfficeArtExtensionList getExtLst() {

+        return extLst;

+    }

+

+    /**

+     * Sets the value of the extLst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTOfficeArtExtensionList }

+     *     

+     */

+    public void setExtLst(CTOfficeArtExtensionList value) {

+        this.extLst = value;

+    }

+

+    public boolean isSetExtLst() {

+        return (this.extLst!= null);

+    }

+

+    /**

+     * Drawing Object Hyperlink Target

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getId() {

+        return id;

+    }

+

+    /**

+     * Sets the value of the id property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setId(String value) {

+        this.id = value;

+    }

+

+    public boolean isSetId() {

+        return (this.id!= null);

+    }

+

+    /**

+     * Gets the value of the invalidUrl property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getInvalidUrl() {

+        if (invalidUrl == null) {

+            return "";

+        } else {

+            return invalidUrl;

+        }

+    }

+

+    /**

+     * Sets the value of the invalidUrl property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setInvalidUrl(String value) {

+        this.invalidUrl = value;

+    }

+

+    public boolean isSetInvalidUrl() {

+        return (this.invalidUrl!= null);

+    }

+

+    /**

+     * Gets the value of the action property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getAction() {

+        if (action == null) {

+            return "";

+        } else {

+            return action;

+        }

+    }

+

+    /**

+     * Sets the value of the action property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setAction(String value) {

+        this.action = value;

+    }

+

+    public boolean isSetAction() {

+        return (this.action!= null);

+    }

+

+    /**

+     * Gets the value of the tgtFrame property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getTgtFrame() {

+        if (tgtFrame == null) {

+            return "";

+        } else {

+            return tgtFrame;

+        }

+    }

+

+    /**

+     * Sets the value of the tgtFrame property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setTgtFrame(String value) {

+        this.tgtFrame = value;

+    }

+

+    public boolean isSetTgtFrame() {

+        return (this.tgtFrame!= null);

+    }

+

+    /**

+     * Gets the value of the tooltip property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getTooltip() {

+        if (tooltip == null) {

+            return "";

+        } else {

+            return tooltip;

+        }

+    }

+

+    /**

+     * Sets the value of the tooltip property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setTooltip(String value) {

+        this.tooltip = value;

+    }

+

+    public boolean isSetTooltip() {

+        return (this.tooltip!= null);

+    }

+

+    /**

+     * Gets the value of the history property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isHistory() {

+        if (history == null) {

+            return true;

+        } else {

+            return history;

+        }

+    }

+

+    /**

+     * Sets the value of the history property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setHistory(boolean value) {

+        this.history = value;

+    }

+

+    public boolean isSetHistory() {

+        return (this.history!= null);

+    }

+

+    public void unsetHistory() {

+        this.history = null;

+    }

+

+    /**

+     * Gets the value of the highlightClick property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isHighlightClick() {

+        if (highlightClick == null) {

+            return false;

+        } else {

+            return highlightClick;

+        }

+    }

+

+    /**

+     * Sets the value of the highlightClick property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setHighlightClick(boolean value) {

+        this.highlightClick = value;

+    }

+

+    public boolean isSetHighlightClick() {

+        return (this.highlightClick!= null);

+    }

+

+    public void unsetHighlightClick() {

+        this.highlightClick = null;

+    }

+

+    /**

+     * Gets the value of the endSnd property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isEndSnd() {

+        if (endSnd == null) {

+            return false;

+        } else {

+            return endSnd;

+        }

+    }

+

+    /**

+     * Sets the value of the endSnd property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setEndSnd(boolean value) {

+        this.endSnd = value;

+    }

+

+    public boolean isSetEndSnd() {

+        return (this.endSnd!= null);

+    }

+

+    public void unsetEndSnd() {

+        this.endSnd = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java b/src/java/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java
new file mode 100644
index 0000000..eaff064
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTInverseGammaTransform.java
@@ -0,0 +1,46 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_InverseGammaTransform complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_InverseGammaTransform">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_InverseGammaTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTInverseGammaTransform {

+

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTInverseTransform.java b/src/java/org/apache/poi/sl/draw/binding/CTInverseTransform.java
new file mode 100644
index 0000000..84af625
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTInverseTransform.java
@@ -0,0 +1,46 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_InverseTransform complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_InverseTransform">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_InverseTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTInverseTransform {

+

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java b/src/java/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java
new file mode 100644
index 0000000..ec864d3
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTOfficeArtExtension.java
@@ -0,0 +1,122 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAnyElement;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlSchemaType;

+import javax.xml.bind.annotation.XmlType;

+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;

+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

+import org.w3c.dom.Element;

+

+

+/**

+ * <p>Java class for CT_OfficeArtExtension complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_OfficeArtExtension">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;any processContents='lax'/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="uri" type="{http://www.w3.org/2001/XMLSchema}token" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_OfficeArtExtension", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "any"

+})

+public class CTOfficeArtExtension {

+

+    @XmlAnyElement(lax = true)

+    protected Object any;

+    @XmlAttribute(name = "uri")

+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)

+    @XmlSchemaType(name = "token")

+    protected String uri;

+

+    /**

+     * Gets the value of the any property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Object }

+     *     {@link Element }

+     *     

+     */

+    public Object getAny() {

+        return any;

+    }

+

+    /**

+     * Sets the value of the any property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Object }

+     *     {@link Element }

+     *     

+     */

+    public void setAny(Object value) {

+        this.any = value;

+    }

+

+    public boolean isSetAny() {

+        return (this.any!= null);

+    }

+

+    /**

+     * Gets the value of the uri property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getUri() {

+        return uri;

+    }

+

+    /**

+     * Sets the value of the uri property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setUri(String value) {

+        this.uri = value;

+    }

+

+    public boolean isSetUri() {

+        return (this.uri!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java b/src/java/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java
new file mode 100644
index 0000000..f0b54cb
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTOfficeArtExtensionList.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_OfficeArtExtensionList complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_OfficeArtExtensionList">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_OfficeArtExtensionList"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_OfficeArtExtensionList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "ext"

+})

+public class CTOfficeArtExtensionList {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected List<CTOfficeArtExtension> ext;

+

+    /**

+     * Gets the value of the ext property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the ext property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getExt().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTOfficeArtExtension }

+     * 

+     * 

+     */

+    public List<CTOfficeArtExtension> getExt() {

+        if (ext == null) {

+            ext = new ArrayList<CTOfficeArtExtension>();

+        }

+        return this.ext;

+    }

+

+    public boolean isSetExt() {

+        return ((this.ext!= null)&&(!this.ext.isEmpty()));

+    }

+

+    public void unsetExt() {

+        this.ext = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPath2D.java b/src/java/org/apache/poi/sl/draw/binding/CTPath2D.java
new file mode 100644
index 0000000..5294812
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPath2D.java
@@ -0,0 +1,303 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlElements;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Path2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Path2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;choice maxOccurs="unbounded" minOccurs="0">

+ *         &lt;element name="close" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DClose"/>

+ *         &lt;element name="moveTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DMoveTo"/>

+ *         &lt;element name="lnTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DLineTo"/>

+ *         &lt;element name="arcTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DArcTo"/>

+ *         &lt;element name="quadBezTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DQuadBezierTo"/>

+ *         &lt;element name="cubicBezTo" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DCubicBezierTo"/>

+ *       &lt;/choice>

+ *       &lt;attribute name="w" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveCoordinate" default="0" />

+ *       &lt;attribute name="h" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveCoordinate" default="0" />

+ *       &lt;attribute name="fill" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PathFillMode" default="norm" />

+ *       &lt;attribute name="stroke" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />

+ *       &lt;attribute name="extrusionOk" type="{http://www.w3.org/2001/XMLSchema}boolean" default="true" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Path2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "closeOrMoveToOrLnTo"

+})

+public class CTPath2D {

+

+    @XmlElements({

+        @XmlElement(name = "close", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DClose.class),

+        @XmlElement(name = "moveTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DMoveTo.class),

+        @XmlElement(name = "lnTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DLineTo.class),

+        @XmlElement(name = "arcTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DArcTo.class),

+        @XmlElement(name = "quadBezTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DQuadBezierTo.class),

+        @XmlElement(name = "cubicBezTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPath2DCubicBezierTo.class)

+    })

+    protected List<Object> closeOrMoveToOrLnTo;

+    @XmlAttribute(name = "w")

+    protected Long w;

+    @XmlAttribute(name = "h")

+    protected Long h;

+    @XmlAttribute(name = "fill")

+    protected STPathFillMode fill;

+    @XmlAttribute(name = "stroke")

+    protected Boolean stroke;

+    @XmlAttribute(name = "extrusionOk")

+    protected Boolean extrusionOk;

+

+    /**

+     * Gets the value of the closeOrMoveToOrLnTo property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the closeOrMoveToOrLnTo property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getCloseOrMoveToOrLnTo().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTPath2DClose }

+     * {@link CTPath2DMoveTo }

+     * {@link CTPath2DLineTo }

+     * {@link CTPath2DArcTo }

+     * {@link CTPath2DQuadBezierTo }

+     * {@link CTPath2DCubicBezierTo }

+     * 

+     * 

+     */

+    public List<Object> getCloseOrMoveToOrLnTo() {

+        if (closeOrMoveToOrLnTo == null) {

+            closeOrMoveToOrLnTo = new ArrayList<Object>();

+        }

+        return this.closeOrMoveToOrLnTo;

+    }

+

+    public boolean isSetCloseOrMoveToOrLnTo() {

+        return ((this.closeOrMoveToOrLnTo!= null)&&(!this.closeOrMoveToOrLnTo.isEmpty()));

+    }

+

+    public void unsetCloseOrMoveToOrLnTo() {

+        this.closeOrMoveToOrLnTo = null;

+    }

+

+    /**

+     * Gets the value of the w property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Long }

+     *     

+     */

+    public long getW() {

+        if (w == null) {

+            return  0L;

+        } else {

+            return w;

+        }

+    }

+

+    /**

+     * Sets the value of the w property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Long }

+     *     

+     */

+    public void setW(long value) {

+        this.w = value;

+    }

+

+    public boolean isSetW() {

+        return (this.w!= null);

+    }

+

+    public void unsetW() {

+        this.w = null;

+    }

+

+    /**

+     * Gets the value of the h property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Long }

+     *     

+     */

+    public long getH() {

+        if (h == null) {

+            return  0L;

+        } else {

+            return h;

+        }

+    }

+

+    /**

+     * Sets the value of the h property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Long }

+     *     

+     */

+    public void setH(long value) {

+        this.h = value;

+    }

+

+    public boolean isSetH() {

+        return (this.h!= null);

+    }

+

+    public void unsetH() {

+        this.h = null;

+    }

+

+    /**

+     * Gets the value of the fill property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link STPathFillMode }

+     *     

+     */

+    public STPathFillMode getFill() {

+        if (fill == null) {

+            return STPathFillMode.NORM;

+        } else {

+            return fill;

+        }

+    }

+

+    /**

+     * Sets the value of the fill property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link STPathFillMode }

+     *     

+     */

+    public void setFill(STPathFillMode value) {

+        this.fill = value;

+    }

+

+    public boolean isSetFill() {

+        return (this.fill!= null);

+    }

+

+    /**

+     * Gets the value of the stroke property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isStroke() {

+        if (stroke == null) {

+            return true;

+        } else {

+            return stroke;

+        }

+    }

+

+    /**

+     * Sets the value of the stroke property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setStroke(boolean value) {

+        this.stroke = value;

+    }

+

+    public boolean isSetStroke() {

+        return (this.stroke!= null);

+    }

+

+    public void unsetStroke() {

+        this.stroke = null;

+    }

+

+    /**

+     * Gets the value of the extrusionOk property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isExtrusionOk() {

+        if (extrusionOk == null) {

+            return true;

+        } else {

+            return extrusionOk;

+        }

+    }

+

+    /**

+     * Sets the value of the extrusionOk property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setExtrusionOk(boolean value) {

+        this.extrusionOk = value;

+    }

+

+    public boolean isSetExtrusionOk() {

+        return (this.extrusionOk!= null);

+    }

+

+    public void unsetExtrusionOk() {

+        this.extrusionOk = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java b/src/java/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java
new file mode 100644
index 0000000..5464ee4
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPath2DArcTo.java
@@ -0,0 +1,171 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Path2DArcTo complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Path2DArcTo">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="wR" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="hR" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="stAng" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />

+ *       &lt;attribute name="swAng" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Path2DArcTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPath2DArcTo {

+

+    @XmlAttribute(name = "wR", required = true)

+    protected String wr;

+    @XmlAttribute(name = "hR", required = true)

+    protected String hr;

+    @XmlAttribute(name = "stAng", required = true)

+    protected String stAng;

+    @XmlAttribute(name = "swAng", required = true)

+    protected String swAng;

+

+    /**

+     * Gets the value of the wr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getWR() {

+        return wr;

+    }

+

+    /**

+     * Sets the value of the wr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setWR(String value) {

+        this.wr = value;

+    }

+

+    public boolean isSetWR() {

+        return (this.wr!= null);

+    }

+

+    /**

+     * Gets the value of the hr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getHR() {

+        return hr;

+    }

+

+    /**

+     * Sets the value of the hr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setHR(String value) {

+        this.hr = value;

+    }

+

+    public boolean isSetHR() {

+        return (this.hr!= null);

+    }

+

+    /**

+     * Gets the value of the stAng property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getStAng() {

+        return stAng;

+    }

+

+    /**

+     * Sets the value of the stAng property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setStAng(String value) {

+        this.stAng = value;

+    }

+

+    public boolean isSetStAng() {

+        return (this.stAng!= null);

+    }

+

+    /**

+     * Gets the value of the swAng property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getSwAng() {

+        return swAng;

+    }

+

+    /**

+     * Sets the value of the swAng property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setSwAng(String value) {

+        this.swAng = value;

+    }

+

+    public boolean isSetSwAng() {

+        return (this.swAng!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPath2DClose.java b/src/java/org/apache/poi/sl/draw/binding/CTPath2DClose.java
new file mode 100644
index 0000000..a60f98b
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPath2DClose.java
@@ -0,0 +1,46 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Path2DClose complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Path2DClose">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Path2DClose", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPath2DClose {

+

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java b/src/java/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java
new file mode 100644
index 0000000..e1818fa
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPath2DCubicBezierTo.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Path2DCubicBezierTo complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Path2DCubicBezierTo">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="pt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D" maxOccurs="3" minOccurs="3"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Path2DCubicBezierTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "pt"

+})

+public class CTPath2DCubicBezierTo {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected List<CTAdjPoint2D> pt;

+

+    /**

+     * Gets the value of the pt property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the pt property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getPt().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTAdjPoint2D }

+     * 

+     * 

+     */

+    public List<CTAdjPoint2D> getPt() {

+        if (pt == null) {

+            pt = new ArrayList<CTAdjPoint2D>();

+        }

+        return this.pt;

+    }

+

+    public boolean isSetPt() {

+        return ((this.pt!= null)&&(!this.pt.isEmpty()));

+    }

+

+    public void unsetPt() {

+        this.pt = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java b/src/java/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java
new file mode 100644
index 0000000..9c6d1b3
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPath2DLineTo.java
@@ -0,0 +1,82 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Path2DLineTo complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Path2DLineTo">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="pt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Path2DLineTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "pt"

+})

+public class CTPath2DLineTo {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected CTAdjPoint2D pt;

+

+    /**

+     * Gets the value of the pt property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public CTAdjPoint2D getPt() {

+        return pt;

+    }

+

+    /**

+     * Sets the value of the pt property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public void setPt(CTAdjPoint2D value) {

+        this.pt = value;

+    }

+

+    public boolean isSetPt() {

+        return (this.pt!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPath2DList.java b/src/java/org/apache/poi/sl/draw/binding/CTPath2DList.java
new file mode 100644
index 0000000..cd31a0b
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPath2DList.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Path2DList complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Path2DList">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="path" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2D" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Path2DList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "path"

+})

+public class CTPath2DList {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected List<CTPath2D> path;

+

+    /**

+     * Gets the value of the path property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the path property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getPath().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTPath2D }

+     * 

+     * 

+     */

+    public List<CTPath2D> getPath() {

+        if (path == null) {

+            path = new ArrayList<CTPath2D>();

+        }

+        return this.path;

+    }

+

+    public boolean isSetPath() {

+        return ((this.path!= null)&&(!this.path.isEmpty()));

+    }

+

+    public void unsetPath() {

+        this.path = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java b/src/java/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java
new file mode 100644
index 0000000..f5e210f
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPath2DMoveTo.java
@@ -0,0 +1,82 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Path2DMoveTo complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Path2DMoveTo">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="pt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Path2DMoveTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "pt"

+})

+public class CTPath2DMoveTo {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected CTAdjPoint2D pt;

+

+    /**

+     * Gets the value of the pt property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public CTAdjPoint2D getPt() {

+        return pt;

+    }

+

+    /**

+     * Sets the value of the pt property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public void setPt(CTAdjPoint2D value) {

+        this.pt = value;

+    }

+

+    public boolean isSetPt() {

+        return (this.pt!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java b/src/java/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java
new file mode 100644
index 0000000..b588775
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPath2DQuadBezierTo.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Path2DQuadBezierTo complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Path2DQuadBezierTo">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="pt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D" maxOccurs="2" minOccurs="2"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Path2DQuadBezierTo", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "pt"

+})

+public class CTPath2DQuadBezierTo {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected List<CTAdjPoint2D> pt;

+

+    /**

+     * Gets the value of the pt property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the pt property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getPt().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link CTAdjPoint2D }

+     * 

+     * 

+     */

+    public List<CTAdjPoint2D> getPt() {

+        if (pt == null) {

+            pt = new ArrayList<CTAdjPoint2D>();

+        }

+        return this.pt;

+    }

+

+    public boolean isSetPt() {

+        return ((this.pt!= null)&&(!this.pt.isEmpty()));

+    }

+

+    public void unsetPt() {

+        this.pt = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPercentage.java b/src/java/org/apache/poi/sl/draw/binding/CTPercentage.java
new file mode 100644
index 0000000..e1a74b5
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPercentage.java
@@ -0,0 +1,70 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Percentage complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Percentage">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Percentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPercentage {

+

+    @XmlAttribute(name = "val", required = true)

+    protected int val;

+

+    /**

+     * Gets the value of the val property.

+     * 

+     */

+    public int getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     */

+    public void setVal(int value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPoint2D.java b/src/java/org/apache/poi/sl/draw/binding/CTPoint2D.java
new file mode 100644
index 0000000..06cbfbc
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPoint2D.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Point2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Point2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="x" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />

+ *       &lt;attribute name="y" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Point2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPoint2D {

+

+    @XmlAttribute(name = "x", required = true)

+    protected long x;

+    @XmlAttribute(name = "y", required = true)

+    protected long y;

+

+    /**

+     * Gets the value of the x property.

+     * 

+     */

+    public long getX() {

+        return x;

+    }

+

+    /**

+     * Sets the value of the x property.

+     * 

+     */

+    public void setX(long value) {

+        this.x = value;

+    }

+

+    public boolean isSetX() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the y property.

+     * 

+     */

+    public long getY() {

+        return y;

+    }

+

+    /**

+     * Sets the value of the y property.

+     * 

+     */

+    public void setY(long value) {

+        this.y = value;

+    }

+

+    public boolean isSetY() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPoint3D.java b/src/java/org/apache/poi/sl/draw/binding/CTPoint3D.java
new file mode 100644
index 0000000..3cbeb67
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPoint3D.java
@@ -0,0 +1,116 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Point3D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Point3D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="x" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />

+ *       &lt;attribute name="y" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />

+ *       &lt;attribute name="z" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Point3D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPoint3D {

+

+    @XmlAttribute(name = "x", required = true)

+    protected long x;

+    @XmlAttribute(name = "y", required = true)

+    protected long y;

+    @XmlAttribute(name = "z", required = true)

+    protected long z;

+

+    /**

+     * Gets the value of the x property.

+     * 

+     */

+    public long getX() {

+        return x;

+    }

+

+    /**

+     * Sets the value of the x property.

+     * 

+     */

+    public void setX(long value) {

+        this.x = value;

+    }

+

+    public boolean isSetX() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the y property.

+     * 

+     */

+    public long getY() {

+        return y;

+    }

+

+    /**

+     * Sets the value of the y property.

+     * 

+     */

+    public void setY(long value) {

+        this.y = value;

+    }

+

+    public boolean isSetY() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the z property.

+     * 

+     */

+    public long getZ() {

+        return z;

+    }

+

+    /**

+     * Sets the value of the z property.

+     * 

+     */

+    public void setZ(long value) {

+        this.z = value;

+    }

+

+    public boolean isSetZ() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java b/src/java/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java
new file mode 100644
index 0000000..646dad5
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPolarAdjustHandle.java
@@ -0,0 +1,273 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;

+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

+

+

+/**

+ * <p>Java class for CT_PolarAdjustHandle complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_PolarAdjustHandle">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="pos" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="gdRefR" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />

+ *       &lt;attribute name="minR" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="maxR" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="gdRefAng" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />

+ *       &lt;attribute name="minAng" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />

+ *       &lt;attribute name="maxAng" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_PolarAdjustHandle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "pos"

+})

+public class CTPolarAdjustHandle {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected CTAdjPoint2D pos;

+    @XmlAttribute(name = "gdRefR")

+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)

+    protected String gdRefR;

+    @XmlAttribute(name = "minR")

+    protected String minR;

+    @XmlAttribute(name = "maxR")

+    protected String maxR;

+    @XmlAttribute(name = "gdRefAng")

+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)

+    protected String gdRefAng;

+    @XmlAttribute(name = "minAng")

+    protected String minAng;

+    @XmlAttribute(name = "maxAng")

+    protected String maxAng;

+

+    /**

+     * Gets the value of the pos property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public CTAdjPoint2D getPos() {

+        return pos;

+    }

+

+    /**

+     * Sets the value of the pos property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public void setPos(CTAdjPoint2D value) {

+        this.pos = value;

+    }

+

+    public boolean isSetPos() {

+        return (this.pos!= null);

+    }

+

+    /**

+     * Gets the value of the gdRefR property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getGdRefR() {

+        return gdRefR;

+    }

+

+    /**

+     * Sets the value of the gdRefR property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setGdRefR(String value) {

+        this.gdRefR = value;

+    }

+

+    public boolean isSetGdRefR() {

+        return (this.gdRefR!= null);

+    }

+

+    /**

+     * Gets the value of the minR property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getMinR() {

+        return minR;

+    }

+

+    /**

+     * Sets the value of the minR property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setMinR(String value) {

+        this.minR = value;

+    }

+

+    public boolean isSetMinR() {

+        return (this.minR!= null);

+    }

+

+    /**

+     * Gets the value of the maxR property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getMaxR() {

+        return maxR;

+    }

+

+    /**

+     * Sets the value of the maxR property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setMaxR(String value) {

+        this.maxR = value;

+    }

+

+    public boolean isSetMaxR() {

+        return (this.maxR!= null);

+    }

+

+    /**

+     * Gets the value of the gdRefAng property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getGdRefAng() {

+        return gdRefAng;

+    }

+

+    /**

+     * Sets the value of the gdRefAng property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setGdRefAng(String value) {

+        this.gdRefAng = value;

+    }

+

+    public boolean isSetGdRefAng() {

+        return (this.gdRefAng!= null);

+    }

+

+    /**

+     * Gets the value of the minAng property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getMinAng() {

+        return minAng;

+    }

+

+    /**

+     * Sets the value of the minAng property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setMinAng(String value) {

+        this.minAng = value;

+    }

+

+    public boolean isSetMinAng() {

+        return (this.minAng!= null);

+    }

+

+    /**

+     * Gets the value of the maxAng property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getMaxAng() {

+        return maxAng;

+    }

+

+    /**

+     * Sets the value of the maxAng property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setMaxAng(String value) {

+        this.maxAng = value;

+    }

+

+    public boolean isSetMaxAng() {

+        return (this.maxAng!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java b/src/java/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java
new file mode 100644
index 0000000..962db95
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPositiveFixedAngle.java
@@ -0,0 +1,70 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_PositiveFixedAngle complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_PositiveFixedAngle">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_PositiveFixedAngle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPositiveFixedAngle {

+

+    @XmlAttribute(name = "val", required = true)

+    protected int val;

+

+    /**

+     * Gets the value of the val property.

+     * 

+     */

+    public int getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     */

+    public void setVal(int value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java b/src/java/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java
new file mode 100644
index 0000000..001f01a
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPositiveFixedPercentage.java
@@ -0,0 +1,70 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_PositiveFixedPercentage complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_PositiveFixedPercentage">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedPercentage" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_PositiveFixedPercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPositiveFixedPercentage {

+

+    @XmlAttribute(name = "val", required = true)

+    protected int val;

+

+    /**

+     * Gets the value of the val property.

+     * 

+     */

+    public int getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     */

+    public void setVal(int value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPositivePercentage.java b/src/java/org/apache/poi/sl/draw/binding/CTPositivePercentage.java
new file mode 100644
index 0000000..8fc61f3
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPositivePercentage.java
@@ -0,0 +1,70 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_PositivePercentage complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_PositivePercentage">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositivePercentage" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_PositivePercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPositivePercentage {

+

+    @XmlAttribute(name = "val", required = true)

+    protected int val;

+

+    /**

+     * Gets the value of the val property.

+     * 

+     */

+    public int getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     */

+    public void setVal(int value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java b/src/java/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java
new file mode 100644
index 0000000..c8d76e6
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPositiveSize2D.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_PositiveSize2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_PositiveSize2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="cx" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveCoordinate" />

+ *       &lt;attribute name="cy" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveCoordinate" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_PositiveSize2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTPositiveSize2D {

+

+    @XmlAttribute(name = "cx", required = true)

+    protected long cx;

+    @XmlAttribute(name = "cy", required = true)

+    protected long cy;

+

+    /**

+     * Gets the value of the cx property.

+     * 

+     */

+    public long getCx() {

+        return cx;

+    }

+

+    /**

+     * Sets the value of the cx property.

+     * 

+     */

+    public void setCx(long value) {

+        this.cx = value;

+    }

+

+    public boolean isSetCx() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the cy property.

+     * 

+     */

+    public long getCy() {

+        return cy;

+    }

+

+    /**

+     * Sets the value of the cy property.

+     * 

+     */

+    public void setCy(long value) {

+        this.cy = value;

+    }

+

+    public boolean isSetCy() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPresetColor.java b/src/java/org/apache/poi/sl/draw/binding/CTPresetColor.java
new file mode 100644
index 0000000..e240a71
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPresetColor.java
@@ -0,0 +1,183 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.JAXBElement;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElementRef;

+import javax.xml.bind.annotation.XmlElementRefs;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_PresetColor complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_PresetColor">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="val" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PresetColorVal" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_PresetColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "egColorTransform"

+})

+public class CTPresetColor {

+

+    @XmlElementRefs({

+        @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false)

+    })

+    protected List<JAXBElement<?>> egColorTransform;

+    @XmlAttribute(name = "val")

+    protected STPresetColorVal val;

+

+    /**

+     * Gets the value of the egColorTransform property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the egColorTransform property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getEGColorTransform().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * 

+     * 

+     */

+    public List<JAXBElement<?>> getEGColorTransform() {

+        if (egColorTransform == null) {

+            egColorTransform = new ArrayList<JAXBElement<?>>();

+        }

+        return this.egColorTransform;

+    }

+

+    public boolean isSetEGColorTransform() {

+        return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty()));

+    }

+

+    public void unsetEGColorTransform() {

+        this.egColorTransform = null;

+    }

+

+    /**

+     * Gets the value of the val property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link STPresetColorVal }

+     *     

+     */

+    public STPresetColorVal getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link STPresetColorVal }

+     *     

+     */

+    public void setVal(STPresetColorVal value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return (this.val!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java b/src/java/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java
new file mode 100644
index 0000000..b55b02e
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPresetGeometry2D.java
@@ -0,0 +1,114 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_PresetGeometry2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_PresetGeometry2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="avLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="prst" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_ShapeType" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_PresetGeometry2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "avLst"

+})

+public class CTPresetGeometry2D {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTGeomGuideList avLst;

+    @XmlAttribute(name = "prst", required = true)

+    protected STShapeType prst;

+

+    /**

+     * Gets the value of the avLst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTGeomGuideList }

+     *     

+     */

+    public CTGeomGuideList getAvLst() {

+        return avLst;

+    }

+

+    /**

+     * Sets the value of the avLst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTGeomGuideList }

+     *     

+     */

+    public void setAvLst(CTGeomGuideList value) {

+        this.avLst = value;

+    }

+

+    public boolean isSetAvLst() {

+        return (this.avLst!= null);

+    }

+

+    /**

+     * Gets the value of the prst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link STShapeType }

+     *     

+     */

+    public STShapeType getPrst() {

+        return prst;

+    }

+

+    /**

+     * Sets the value of the prst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link STShapeType }

+     *     

+     */

+    public void setPrst(STShapeType value) {

+        this.prst = value;

+    }

+

+    public boolean isSetPrst() {

+        return (this.prst!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTPresetTextShape.java b/src/java/org/apache/poi/sl/draw/binding/CTPresetTextShape.java
new file mode 100644
index 0000000..f7082b3
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTPresetTextShape.java
@@ -0,0 +1,114 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_PresetTextShape complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_PresetTextShape">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="avLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="prst" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_TextShapeType" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_PresetTextShape", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "avLst"

+})

+public class CTPresetTextShape {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTGeomGuideList avLst;

+    @XmlAttribute(name = "prst", required = true)

+    protected STTextShapeType prst;

+

+    /**

+     * Gets the value of the avLst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTGeomGuideList }

+     *     

+     */

+    public CTGeomGuideList getAvLst() {

+        return avLst;

+    }

+

+    /**

+     * Sets the value of the avLst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTGeomGuideList }

+     *     

+     */

+    public void setAvLst(CTGeomGuideList value) {

+        this.avLst = value;

+    }

+

+    public boolean isSetAvLst() {

+        return (this.avLst!= null);

+    }

+

+    /**

+     * Gets the value of the prst property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link STTextShapeType }

+     *     

+     */

+    public STTextShapeType getPrst() {

+        return prst;

+    }

+

+    /**

+     * Sets the value of the prst property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link STTextShapeType }

+     *     

+     */

+    public void setPrst(STTextShapeType value) {

+        this.prst = value;

+    }

+

+    public boolean isSetPrst() {

+        return (this.prst!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTRatio.java b/src/java/org/apache/poi/sl/draw/binding/CTRatio.java
new file mode 100644
index 0000000..3a951c1
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTRatio.java
@@ -0,0 +1,93 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Ratio complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Ratio">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="n" use="required" type="{http://www.w3.org/2001/XMLSchema}long" />

+ *       &lt;attribute name="d" use="required" type="{http://www.w3.org/2001/XMLSchema}long" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Ratio", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTRatio {

+

+    @XmlAttribute(name = "n", required = true)

+    protected long n;

+    @XmlAttribute(name = "d", required = true)

+    protected long d;

+

+    /**

+     * Gets the value of the n property.

+     * 

+     */

+    public long getN() {

+        return n;

+    }

+

+    /**

+     * Sets the value of the n property.

+     * 

+     */

+    public void setN(long value) {

+        this.n = value;

+    }

+

+    public boolean isSetN() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the d property.

+     * 

+     */

+    public long getD() {

+        return d;

+    }

+

+    /**

+     * Sets the value of the d property.

+     * 

+     */

+    public void setD(long value) {

+        this.d = value;

+    }

+

+    public boolean isSetD() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTRelativeRect.java b/src/java/org/apache/poi/sl/draw/binding/CTRelativeRect.java
new file mode 100644
index 0000000..e332bd8
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTRelativeRect.java
@@ -0,0 +1,203 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_RelativeRect complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_RelativeRect">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="l" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" default="0" />

+ *       &lt;attribute name="t" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" default="0" />

+ *       &lt;attribute name="r" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" default="0" />

+ *       &lt;attribute name="b" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" default="0" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_RelativeRect", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTRelativeRect {

+

+    @XmlAttribute(name = "l")

+    protected Integer l;

+    @XmlAttribute(name = "t")

+    protected Integer t;

+    @XmlAttribute(name = "r")

+    protected Integer r;

+    @XmlAttribute(name = "b")

+    protected Integer b;

+

+    /**

+     * Gets the value of the l property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Integer }

+     *     

+     */

+    public int getL() {

+        if (l == null) {

+            return  0;

+        } else {

+            return l;

+        }

+    }

+

+    /**

+     * Sets the value of the l property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Integer }

+     *     

+     */

+    public void setL(int value) {

+        this.l = value;

+    }

+

+    public boolean isSetL() {

+        return (this.l!= null);

+    }

+

+    public void unsetL() {

+        this.l = null;

+    }

+

+    /**

+     * Gets the value of the t property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Integer }

+     *     

+     */

+    public int getT() {

+        if (t == null) {

+            return  0;

+        } else {

+            return t;

+        }

+    }

+

+    /**

+     * Sets the value of the t property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Integer }

+     *     

+     */

+    public void setT(int value) {

+        this.t = value;

+    }

+

+    public boolean isSetT() {

+        return (this.t!= null);

+    }

+

+    public void unsetT() {

+        this.t = null;

+    }

+

+    /**

+     * Gets the value of the r property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Integer }

+     *     

+     */

+    public int getR() {

+        if (r == null) {

+            return  0;

+        } else {

+            return r;

+        }

+    }

+

+    /**

+     * Sets the value of the r property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Integer }

+     *     

+     */

+    public void setR(int value) {

+        this.r = value;

+    }

+

+    public boolean isSetR() {

+        return (this.r!= null);

+    }

+

+    public void unsetR() {

+        this.r = null;

+    }

+

+    /**

+     * Gets the value of the b property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Integer }

+     *     

+     */

+    public int getB() {

+        if (b == null) {

+            return  0;

+        } else {

+            return b;

+        }

+    }

+

+    /**

+     * Sets the value of the b property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Integer }

+     *     

+     */

+    public void setB(int value) {

+        this.b = value;

+    }

+

+    public boolean isSetB() {

+        return (this.b!= null);

+    }

+

+    public void unsetB() {

+        this.b = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTSRgbColor.java b/src/java/org/apache/poi/sl/draw/binding/CTSRgbColor.java
new file mode 100644
index 0000000..ef920d6
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTSRgbColor.java
@@ -0,0 +1,186 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.JAXBElement;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElementRef;

+import javax.xml.bind.annotation.XmlElementRefs;

+import javax.xml.bind.annotation.XmlType;

+import javax.xml.bind.annotation.adapters.HexBinaryAdapter;

+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

+

+

+/**

+ * <p>Java class for CT_SRgbColor complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_SRgbColor">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_HexBinary3" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_SRgbColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "egColorTransform"

+})

+public class CTSRgbColor {

+

+    @XmlElementRefs({

+        @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false)

+    })

+    protected List<JAXBElement<?>> egColorTransform;

+    @XmlAttribute(name = "val", required = true)

+    @XmlJavaTypeAdapter(HexBinaryAdapter.class)

+    protected byte[] val;

+

+    /**

+     * Gets the value of the egColorTransform property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the egColorTransform property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getEGColorTransform().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTAngle }{@code >}

+     * 

+     * 

+     */

+    public List<JAXBElement<?>> getEGColorTransform() {

+        if (egColorTransform == null) {

+            egColorTransform = new ArrayList<JAXBElement<?>>();

+        }

+        return this.egColorTransform;

+    }

+

+    public boolean isSetEGColorTransform() {

+        return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty()));

+    }

+

+    public void unsetEGColorTransform() {

+        this.egColorTransform = null;

+    }

+

+    /**

+     * Gets the value of the val property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public byte[] getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setVal(byte[] value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return (this.val!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTScRgbColor.java b/src/java/org/apache/poi/sl/draw/binding/CTScRgbColor.java
new file mode 100644
index 0000000..335e4b2
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTScRgbColor.java
@@ -0,0 +1,221 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.JAXBElement;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElementRef;

+import javax.xml.bind.annotation.XmlElementRefs;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_ScRgbColor complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_ScRgbColor">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="r" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />

+ *       &lt;attribute name="g" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />

+ *       &lt;attribute name="b" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_ScRgbColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "egColorTransform"

+})

+public class CTScRgbColor {

+

+    @XmlElementRefs({

+        @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false)

+    })

+    protected List<JAXBElement<?>> egColorTransform;

+    @XmlAttribute(name = "r", required = true)

+    protected int r;

+    @XmlAttribute(name = "g", required = true)

+    protected int g;

+    @XmlAttribute(name = "b", required = true)

+    protected int b;

+

+    /**

+     * Gets the value of the egColorTransform property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the egColorTransform property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getEGColorTransform().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}

+     * 

+     * 

+     */

+    public List<JAXBElement<?>> getEGColorTransform() {

+        if (egColorTransform == null) {

+            egColorTransform = new ArrayList<JAXBElement<?>>();

+        }

+        return this.egColorTransform;

+    }

+

+    public boolean isSetEGColorTransform() {

+        return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty()));

+    }

+

+    public void unsetEGColorTransform() {

+        this.egColorTransform = null;

+    }

+

+    /**

+     * Gets the value of the r property.

+     * 

+     */

+    public int getR() {

+        return r;

+    }

+

+    /**

+     * Sets the value of the r property.

+     * 

+     */

+    public void setR(int value) {

+        this.r = value;

+    }

+

+    public boolean isSetR() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the g property.

+     * 

+     */

+    public int getG() {

+        return g;

+    }

+

+    /**

+     * Sets the value of the g property.

+     * 

+     */

+    public void setG(int value) {

+        this.g = value;

+    }

+

+    public boolean isSetG() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the b property.

+     * 

+     */

+    public int getB() {

+        return b;

+    }

+

+    /**

+     * Sets the value of the b property.

+     * 

+     */

+    public void setB(int value) {

+        this.b = value;

+    }

+

+    public boolean isSetB() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTScale2D.java b/src/java/org/apache/poi/sl/draw/binding/CTScale2D.java
new file mode 100644
index 0000000..2e8eba1
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTScale2D.java
@@ -0,0 +1,114 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Scale2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Scale2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="sx" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Ratio"/>

+ *         &lt;element name="sy" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Ratio"/>

+ *       &lt;/sequence>

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Scale2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "sx",

+    "sy"

+})

+public class CTScale2D {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected CTRatio sx;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected CTRatio sy;

+

+    /**

+     * Gets the value of the sx property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTRatio }

+     *     

+     */

+    public CTRatio getSx() {

+        return sx;

+    }

+

+    /**

+     * Sets the value of the sx property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTRatio }

+     *     

+     */

+    public void setSx(CTRatio value) {

+        this.sx = value;

+    }

+

+    public boolean isSetSx() {

+        return (this.sx!= null);

+    }

+

+    /**

+     * Gets the value of the sy property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTRatio }

+     *     

+     */

+    public CTRatio getSy() {

+        return sy;

+    }

+

+    /**

+     * Sets the value of the sy property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTRatio }

+     *     

+     */

+    public void setSy(CTRatio value) {

+        this.sy = value;

+    }

+

+    public boolean isSetSy() {

+        return (this.sy!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTSchemeColor.java b/src/java/org/apache/poi/sl/draw/binding/CTSchemeColor.java
new file mode 100644
index 0000000..7febaad
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTSchemeColor.java
@@ -0,0 +1,183 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.JAXBElement;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElementRef;

+import javax.xml.bind.annotation.XmlElementRefs;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_SchemeColor complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_SchemeColor">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_SchemeColorVal" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_SchemeColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "egColorTransform"

+})

+public class CTSchemeColor {

+

+    @XmlElementRefs({

+        @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false)

+    })

+    protected List<JAXBElement<?>> egColorTransform;

+    @XmlAttribute(name = "val", required = true)

+    protected STSchemeColorVal val;

+

+    /**

+     * Gets the value of the egColorTransform property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the egColorTransform property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getEGColorTransform().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}

+     * 

+     * 

+     */

+    public List<JAXBElement<?>> getEGColorTransform() {

+        if (egColorTransform == null) {

+            egColorTransform = new ArrayList<JAXBElement<?>>();

+        }

+        return this.egColorTransform;

+    }

+

+    public boolean isSetEGColorTransform() {

+        return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty()));

+    }

+

+    public void unsetEGColorTransform() {

+        this.egColorTransform = null;

+    }

+

+    /**

+     * Gets the value of the val property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link STSchemeColorVal }

+     *     

+     */

+    public STSchemeColorVal getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link STSchemeColorVal }

+     *     

+     */

+    public void setVal(STSchemeColorVal value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return (this.val!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTSphereCoords.java b/src/java/org/apache/poi/sl/draw/binding/CTSphereCoords.java
new file mode 100644
index 0000000..a29d744
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTSphereCoords.java
@@ -0,0 +1,116 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_SphereCoords complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_SphereCoords">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="lat" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />

+ *       &lt;attribute name="lon" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />

+ *       &lt;attribute name="rev" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_SphereCoords", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTSphereCoords {

+

+    @XmlAttribute(name = "lat", required = true)

+    protected int lat;

+    @XmlAttribute(name = "lon", required = true)

+    protected int lon;

+    @XmlAttribute(name = "rev", required = true)

+    protected int rev;

+

+    /**

+     * Gets the value of the lat property.

+     * 

+     */

+    public int getLat() {

+        return lat;

+    }

+

+    /**

+     * Sets the value of the lat property.

+     * 

+     */

+    public void setLat(int value) {

+        this.lat = value;

+    }

+

+    public boolean isSetLat() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the lon property.

+     * 

+     */

+    public int getLon() {

+        return lon;

+    }

+

+    /**

+     * Sets the value of the lon property.

+     * 

+     */

+    public void setLon(int value) {

+        this.lon = value;

+    }

+

+    public boolean isSetLon() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the rev property.

+     * 

+     */

+    public int getRev() {

+        return rev;

+    }

+

+    /**

+     * Sets the value of the rev property.

+     * 

+     */

+    public void setRev(int value) {

+        this.rev = value;

+    }

+

+    public boolean isSetRev() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTSystemColor.java b/src/java/org/apache/poi/sl/draw/binding/CTSystemColor.java
new file mode 100644
index 0000000..adf0d16
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTSystemColor.java
@@ -0,0 +1,219 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import java.util.ArrayList;

+import java.util.List;

+import javax.xml.bind.JAXBElement;

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElementRef;

+import javax.xml.bind.annotation.XmlElementRefs;

+import javax.xml.bind.annotation.XmlType;

+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;

+import javax.xml.bind.annotation.adapters.HexBinaryAdapter;

+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

+

+

+/**

+ * <p>Java class for CT_SystemColor complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_SystemColor">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_SystemColorVal" />

+ *       &lt;attribute name="lastClr" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_HexBinary3" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_SystemColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "egColorTransform"

+})

+public class CTSystemColor {

+

+    @XmlElementRefs({

+        @XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),

+        @XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false)

+    })

+    protected List<JAXBElement<?>> egColorTransform;

+    @XmlAttribute(name = "val", required = true)

+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)

+    protected String val;

+    @XmlAttribute(name = "lastClr")

+    @XmlJavaTypeAdapter(HexBinaryAdapter.class)

+    protected byte[] lastClr;

+

+    /**

+     * Gets the value of the egColorTransform property.

+     * 

+     * <p>

+     * This accessor method returns a reference to the live list,

+     * not a snapshot. Therefore any modification you make to the

+     * returned list will be present inside the JAXB object.

+     * This is why there is not a <CODE>set</CODE> method for the egColorTransform property.

+     * 

+     * <p>

+     * For example, to add a new item, do as follows:

+     * <pre>

+     *    getEGColorTransform().add(newItem);

+     * </pre>

+     * 

+     * 

+     * <p>

+     * Objects of the following type(s) are allowed in the list

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTAngle }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}

+     * {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}

+     * 

+     * 

+     */

+    public List<JAXBElement<?>> getEGColorTransform() {

+        if (egColorTransform == null) {

+            egColorTransform = new ArrayList<JAXBElement<?>>();

+        }

+        return this.egColorTransform;

+    }

+

+    public boolean isSetEGColorTransform() {

+        return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty()));

+    }

+

+    public void unsetEGColorTransform() {

+        this.egColorTransform = null;

+    }

+

+    /**

+     * Gets the value of the val property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getVal() {

+        return val;

+    }

+

+    /**

+     * Sets the value of the val property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setVal(String value) {

+        this.val = value;

+    }

+

+    public boolean isSetVal() {

+        return (this.val!= null);

+    }

+

+    /**

+     * Gets the value of the lastClr property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public byte[] getLastClr() {

+        return lastClr;

+    }

+

+    /**

+     * Sets the value of the lastClr property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setLastClr(byte[] value) {

+        this.lastClr = value;

+    }

+

+    public boolean isSetLastClr() {

+        return (this.lastClr!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTTransform2D.java b/src/java/org/apache/poi/sl/draw/binding/CTTransform2D.java
new file mode 100644
index 0000000..38ec50e
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTTransform2D.java
@@ -0,0 +1,232 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Transform2D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Transform2D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="off" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Point2D" minOccurs="0"/>

+ *         &lt;element name="ext" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PositiveSize2D" minOccurs="0"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="rot" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Angle" default="0" />

+ *       &lt;attribute name="flipH" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />

+ *       &lt;attribute name="flipV" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Transform2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "off",

+    "ext"

+})

+public class CTTransform2D {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTPoint2D off;

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+    protected CTPositiveSize2D ext;

+    @XmlAttribute(name = "rot")

+    protected Integer rot;

+    @XmlAttribute(name = "flipH")

+    protected Boolean flipH;

+    @XmlAttribute(name = "flipV")

+    protected Boolean flipV;

+

+    /**

+     * Gets the value of the off property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTPoint2D }

+     *     

+     */

+    public CTPoint2D getOff() {

+        return off;

+    }

+

+    /**

+     * Sets the value of the off property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTPoint2D }

+     *     

+     */

+    public void setOff(CTPoint2D value) {

+        this.off = value;

+    }

+

+    public boolean isSetOff() {

+        return (this.off!= null);

+    }

+

+    /**

+     * Gets the value of the ext property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTPositiveSize2D }

+     *     

+     */

+    public CTPositiveSize2D getExt() {

+        return ext;

+    }

+

+    /**

+     * Sets the value of the ext property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTPositiveSize2D }

+     *     

+     */

+    public void setExt(CTPositiveSize2D value) {

+        this.ext = value;

+    }

+

+    public boolean isSetExt() {

+        return (this.ext!= null);

+    }

+

+    /**

+     * Gets the value of the rot property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Integer }

+     *     

+     */

+    public int getRot() {

+        if (rot == null) {

+            return  0;

+        } else {

+            return rot;

+        }

+    }

+

+    /**

+     * Sets the value of the rot property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Integer }

+     *     

+     */

+    public void setRot(int value) {

+        this.rot = value;

+    }

+

+    public boolean isSetRot() {

+        return (this.rot!= null);

+    }

+

+    public void unsetRot() {

+        this.rot = null;

+    }

+

+    /**

+     * Gets the value of the flipH property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isFlipH() {

+        if (flipH == null) {

+            return false;

+        } else {

+            return flipH;

+        }

+    }

+

+    /**

+     * Sets the value of the flipH property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setFlipH(boolean value) {

+        this.flipH = value;

+    }

+

+    public boolean isSetFlipH() {

+        return (this.flipH!= null);

+    }

+

+    public void unsetFlipH() {

+        this.flipH = null;

+    }

+

+    /**

+     * Gets the value of the flipV property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link Boolean }

+     *     

+     */

+    public boolean isFlipV() {

+        if (flipV == null) {

+            return false;

+        } else {

+            return flipV;

+        }

+    }

+

+    /**

+     * Sets the value of the flipV property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link Boolean }

+     *     

+     */

+    public void setFlipV(boolean value) {

+        this.flipV = value;

+    }

+

+    public boolean isSetFlipV() {

+        return (this.flipV!= null);

+    }

+

+    public void unsetFlipV() {

+        this.flipV = null;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTVector3D.java b/src/java/org/apache/poi/sl/draw/binding/CTVector3D.java
new file mode 100644
index 0000000..03c5fb8
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTVector3D.java
@@ -0,0 +1,116 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for CT_Vector3D complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_Vector3D">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;attribute name="dx" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />

+ *       &lt;attribute name="dy" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />

+ *       &lt;attribute name="dz" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Coordinate" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_Vector3D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+public class CTVector3D {

+

+    @XmlAttribute(name = "dx", required = true)

+    protected long dx;

+    @XmlAttribute(name = "dy", required = true)

+    protected long dy;

+    @XmlAttribute(name = "dz", required = true)

+    protected long dz;

+

+    /**

+     * Gets the value of the dx property.

+     * 

+     */

+    public long getDx() {

+        return dx;

+    }

+

+    /**

+     * Sets the value of the dx property.

+     * 

+     */

+    public void setDx(long value) {

+        this.dx = value;

+    }

+

+    public boolean isSetDx() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the dy property.

+     * 

+     */

+    public long getDy() {

+        return dy;

+    }

+

+    /**

+     * Sets the value of the dy property.

+     * 

+     */

+    public void setDy(long value) {

+        this.dy = value;

+    }

+

+    public boolean isSetDy() {

+        return true;

+    }

+

+    /**

+     * Gets the value of the dz property.

+     * 

+     */

+    public long getDz() {

+        return dz;

+    }

+

+    /**

+     * Sets the value of the dz property.

+     * 

+     */

+    public void setDz(long value) {

+        this.dz = value;

+    }

+

+    public boolean isSetDz() {

+        return true;

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java b/src/java/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java
new file mode 100644
index 0000000..85c30ba
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/CTXYAdjustHandle.java
@@ -0,0 +1,273 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlAccessType;

+import javax.xml.bind.annotation.XmlAccessorType;

+import javax.xml.bind.annotation.XmlAttribute;

+import javax.xml.bind.annotation.XmlElement;

+import javax.xml.bind.annotation.XmlType;

+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;

+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

+

+

+/**

+ * <p>Java class for CT_XYAdjustHandle complex type.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * 

+ * <pre>

+ * &lt;complexType name="CT_XYAdjustHandle">

+ *   &lt;complexContent>

+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">

+ *       &lt;sequence>

+ *         &lt;element name="pos" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>

+ *       &lt;/sequence>

+ *       &lt;attribute name="gdRefX" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />

+ *       &lt;attribute name="minX" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="maxX" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="gdRefY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />

+ *       &lt;attribute name="minY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *       &lt;attribute name="maxY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />

+ *     &lt;/restriction>

+ *   &lt;/complexContent>

+ * &lt;/complexType>

+ * </pre>

+ * 

+ * 

+ */

+@XmlAccessorType(XmlAccessType.FIELD)

+@XmlType(name = "CT_XYAdjustHandle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {

+    "pos"

+})

+public class CTXYAdjustHandle {

+

+    @XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)

+    protected CTAdjPoint2D pos;

+    @XmlAttribute(name = "gdRefX")

+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)

+    protected String gdRefX;

+    @XmlAttribute(name = "minX")

+    protected String minX;

+    @XmlAttribute(name = "maxX")

+    protected String maxX;

+    @XmlAttribute(name = "gdRefY")

+    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)

+    protected String gdRefY;

+    @XmlAttribute(name = "minY")

+    protected String minY;

+    @XmlAttribute(name = "maxY")

+    protected String maxY;

+

+    /**

+     * Gets the value of the pos property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public CTAdjPoint2D getPos() {

+        return pos;

+    }

+

+    /**

+     * Sets the value of the pos property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link CTAdjPoint2D }

+     *     

+     */

+    public void setPos(CTAdjPoint2D value) {

+        this.pos = value;

+    }

+

+    public boolean isSetPos() {

+        return (this.pos!= null);

+    }

+

+    /**

+     * Gets the value of the gdRefX property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getGdRefX() {

+        return gdRefX;

+    }

+

+    /**

+     * Sets the value of the gdRefX property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setGdRefX(String value) {

+        this.gdRefX = value;

+    }

+

+    public boolean isSetGdRefX() {

+        return (this.gdRefX!= null);

+    }

+

+    /**

+     * Gets the value of the minX property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getMinX() {

+        return minX;

+    }

+

+    /**

+     * Sets the value of the minX property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setMinX(String value) {

+        this.minX = value;

+    }

+

+    public boolean isSetMinX() {

+        return (this.minX!= null);

+    }

+

+    /**

+     * Gets the value of the maxX property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getMaxX() {

+        return maxX;

+    }

+

+    /**

+     * Sets the value of the maxX property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setMaxX(String value) {

+        this.maxX = value;

+    }

+

+    public boolean isSetMaxX() {

+        return (this.maxX!= null);

+    }

+

+    /**

+     * Gets the value of the gdRefY property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getGdRefY() {

+        return gdRefY;

+    }

+

+    /**

+     * Sets the value of the gdRefY property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setGdRefY(String value) {

+        this.gdRefY = value;

+    }

+

+    public boolean isSetGdRefY() {

+        return (this.gdRefY!= null);

+    }

+

+    /**

+     * Gets the value of the minY property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getMinY() {

+        return minY;

+    }

+

+    /**

+     * Sets the value of the minY property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setMinY(String value) {

+        this.minY = value;

+    }

+

+    public boolean isSetMinY() {

+        return (this.minY!= null);

+    }

+

+    /**

+     * Gets the value of the maxY property.

+     * 

+     * @return

+     *     possible object is

+     *     {@link String }

+     *     

+     */

+    public String getMaxY() {

+        return maxY;

+    }

+

+    /**

+     * Sets the value of the maxY property.

+     * 

+     * @param value

+     *     allowed object is

+     *     {@link String }

+     *     

+     */

+    public void setMaxY(String value) {

+        this.maxY = value;

+    }

+

+    public boolean isSetMaxY() {

+        return (this.maxY!= null);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/ObjectFactory.java b/src/java/org/apache/poi/sl/draw/binding/ObjectFactory.java
new file mode 100644
index 0000000..8c6f9c2
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/ObjectFactory.java
@@ -0,0 +1,2023 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.JAXBElement;

+import javax.xml.bind.annotation.XmlElementDecl;

+import javax.xml.bind.annotation.XmlRegistry;

+import javax.xml.namespace.QName;

+

+

+/**

+ * This object contains factory methods for each 

+ * Java content interface and Java element interface 

+ * generated in the org.apache.poi.sl.draw.binding package. 

+ * <p>An ObjectFactory allows you to programatically 

+ * construct new instances of the Java representation 

+ * for XML content. The Java representation of XML 

+ * content can consist of schema derived interfaces 

+ * and classes representing the binding of schema 

+ * type definitions, element declarations and model 

+ * groups.  Factory methods for each of these are 

+ * provided in this class.

+ * 

+ */

+@XmlRegistry

+public class ObjectFactory {

+

+    private final static QName _CTSRgbColorAlpha_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alpha");

+    private final static QName _CTSRgbColorLum_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lum");

+    private final static QName _CTSRgbColorGamma_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "gamma");

+    private final static QName _CTSRgbColorInvGamma_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "invGamma");

+    private final static QName _CTSRgbColorAlphaMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alphaMod");

+    private final static QName _CTSRgbColorRedOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "redOff");

+    private final static QName _CTSRgbColorAlphaOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "alphaOff");

+    private final static QName _CTSRgbColorGreenOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "greenOff");

+    private final static QName _CTSRgbColorHue_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hue");

+    private final static QName _CTSRgbColorRedMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "redMod");

+    private final static QName _CTSRgbColorSatOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "satOff");

+    private final static QName _CTSRgbColorGreenMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "greenMod");

+    private final static QName _CTSRgbColorSat_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "sat");

+    private final static QName _CTSRgbColorBlue_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blue");

+    private final static QName _CTSRgbColorRed_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "red");

+    private final static QName _CTSRgbColorSatMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "satMod");

+    private final static QName _CTSRgbColorBlueMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blueMod");

+    private final static QName _CTSRgbColorHueOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hueOff");

+    private final static QName _CTSRgbColorShade_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "shade");

+    private final static QName _CTSRgbColorLumMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lumMod");

+    private final static QName _CTSRgbColorInv_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "inv");

+    private final static QName _CTSRgbColorLumOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "lumOff");

+    private final static QName _CTSRgbColorTint_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tint");

+    private final static QName _CTSRgbColorGreen_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "green");

+    private final static QName _CTSRgbColorComp_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "comp");

+    private final static QName _CTSRgbColorBlueOff_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "blueOff");

+    private final static QName _CTSRgbColorHueMod_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "hueMod");

+    private final static QName _CTSRgbColorGray_QNAME = new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "gray");

+

+    /**

+     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.apache.poi.sl.draw.binding

+     * 

+     */

+    public ObjectFactory() {

+    }

+

+    /**

+     * Create an instance of {@link CTPath2DQuadBezierTo }

+     * 

+     */

+    public CTPath2DQuadBezierTo createCTPath2DQuadBezierTo() {

+        return new CTPath2DQuadBezierTo();

+    }

+

+    /**

+     * Create an instance of {@link CTCustomGeometry2D }

+     * 

+     */

+    public CTCustomGeometry2D createCTCustomGeometry2D() {

+        return new CTCustomGeometry2D();

+    }

+

+    /**

+     * Create an instance of {@link CTPolarAdjustHandle }

+     * 

+     */

+    public CTPolarAdjustHandle createCTPolarAdjustHandle() {

+        return new CTPolarAdjustHandle();

+    }

+

+    /**

+     * Create an instance of {@link CTPath2DClose }

+     * 

+     */

+    public CTPath2DClose createCTPath2DClose() {

+        return new CTPath2DClose();

+    }

+

+    /**

+     * Create an instance of {@link CTPoint2D }

+     * 

+     */

+    public CTPoint2D createCTPoint2D() {

+        return new CTPoint2D();

+    }

+

+    /**

+     * Create an instance of {@link CTInverseTransform }

+     * 

+     */

+    public CTInverseTransform createCTInverseTransform() {

+        return new CTInverseTransform();

+    }

+

+    /**

+     * Create an instance of {@link CTPercentage }

+     * 

+     */

+    public CTPercentage createCTPercentage() {

+        return new CTPercentage();

+    }

+

+    /**

+     * Create an instance of {@link CTSystemColor }

+     * 

+     */

+    public CTSystemColor createCTSystemColor() {

+        return new CTSystemColor();

+    }

+

+    /**

+     * Create an instance of {@link CTConnectionSite }

+     * 

+     */

+    public CTConnectionSite createCTConnectionSite() {

+        return new CTConnectionSite();

+    }

+

+    /**

+     * Create an instance of {@link CTColor }

+     * 

+     */

+    public CTColor createCTColor() {

+        return new CTColor();

+    }

+

+    /**

+     * Create an instance of {@link CTPositiveFixedAngle }

+     * 

+     */

+    public CTPositiveFixedAngle createCTPositiveFixedAngle() {

+        return new CTPositiveFixedAngle();

+    }

+

+    /**

+     * Create an instance of {@link CTFixedPercentage }

+     * 

+     */

+    public CTFixedPercentage createCTFixedPercentage() {

+        return new CTFixedPercentage();

+    }

+

+    /**

+     * Create an instance of {@link CTHslColor }

+     * 

+     */

+    public CTHslColor createCTHslColor() {

+        return new CTHslColor();

+    }

+

+    /**

+     * Create an instance of {@link CTConnection }

+     * 

+     */

+    public CTConnection createCTConnection() {

+        return new CTConnection();

+    }

+

+    /**

+     * Create an instance of {@link CTPath2DLineTo }

+     * 

+     */

+    public CTPath2DLineTo createCTPath2DLineTo() {

+        return new CTPath2DLineTo();

+    }

+

+    /**

+     * Create an instance of {@link CTTransform2D }

+     * 

+     */

+    public CTTransform2D createCTTransform2D() {

+        return new CTTransform2D();

+    }

+

+    /**

+     * Create an instance of {@link CTPositivePercentage }

+     * 

+     */

+    public CTPositivePercentage createCTPositivePercentage() {

+        return new CTPositivePercentage();

+    }

+

+    /**

+     * Create an instance of {@link CTVector3D }

+     * 

+     */

+    public CTVector3D createCTVector3D() {

+        return new CTVector3D();

+    }

+

+    /**

+     * Create an instance of {@link CTSphereCoords }

+     * 

+     */

+    public CTSphereCoords createCTSphereCoords() {

+        return new CTSphereCoords();

+    }

+

+    /**

+     * Create an instance of {@link CTPath2D }

+     * 

+     */

+    public CTPath2D createCTPath2D() {

+        return new CTPath2D();

+    }

+

+    /**

+     * Create an instance of {@link CTGroupTransform2D }

+     * 

+     */

+    public CTGroupTransform2D createCTGroupTransform2D() {

+        return new CTGroupTransform2D();

+    }

+

+    /**

+     * Create an instance of {@link CTGrayscaleTransform }

+     * 

+     */

+    public CTGrayscaleTransform createCTGrayscaleTransform() {

+        return new CTGrayscaleTransform();

+    }

+

+    /**

+     * Create an instance of {@link CTRatio }

+     * 

+     */

+    public CTRatio createCTRatio() {

+        return new CTRatio();

+    }

+

+    /**

+     * Create an instance of {@link CTSRgbColor }

+     * 

+     */

+    public CTSRgbColor createCTSRgbColor() {

+        return new CTSRgbColor();

+    }

+

+    /**

+     * Create an instance of {@link CTGeomGuideList }

+     * 

+     */

+    public CTGeomGuideList createCTGeomGuideList() {

+        return new CTGeomGuideList();

+    }

+

+    /**

+     * Create an instance of {@link CTComplementTransform }

+     * 

+     */

+    public CTComplementTransform createCTComplementTransform() {

+        return new CTComplementTransform();

+    }

+

+    /**

+     * Create an instance of {@link CTPath2DCubicBezierTo }

+     * 

+     */

+    public CTPath2DCubicBezierTo createCTPath2DCubicBezierTo() {

+        return new CTPath2DCubicBezierTo();

+    }

+

+    /**

+     * Create an instance of {@link CTXYAdjustHandle }

+     * 

+     */

+    public CTXYAdjustHandle createCTXYAdjustHandle() {

+        return new CTXYAdjustHandle();

+    }

+

+    /**

+     * Create an instance of {@link CTPresetColor }

+     * 

+     */

+    public CTPresetColor createCTPresetColor() {

+        return new CTPresetColor();

+    }

+

+    /**

+     * Create an instance of {@link CTOfficeArtExtension }

+     * 

+     */

+    public CTOfficeArtExtension createCTOfficeArtExtension() {

+        return new CTOfficeArtExtension();

+    }

+

+    /**

+     * Create an instance of {@link CTSchemeColor }

+     * 

+     */

+    public CTSchemeColor createCTSchemeColor() {

+        return new CTSchemeColor();

+    }

+

+    /**

+     * Create an instance of {@link CTConnectionSiteList }

+     * 

+     */

+    public CTConnectionSiteList createCTConnectionSiteList() {

+        return new CTConnectionSiteList();

+    }

+

+    /**

+     * Create an instance of {@link CTPath2DArcTo }

+     * 

+     */

+    public CTPath2DArcTo createCTPath2DArcTo() {

+        return new CTPath2DArcTo();

+    }

+

+    /**

+     * Create an instance of {@link CTPath2DList }

+     * 

+     */

+    public CTPath2DList createCTPath2DList() {

+        return new CTPath2DList();

+    }

+

+    /**

+     * Create an instance of {@link CTAngle }

+     * 

+     */

+    public CTAngle createCTAngle() {

+        return new CTAngle();

+    }

+

+    /**

+     * Create an instance of {@link CTScale2D }

+     * 

+     */

+    public CTScale2D createCTScale2D() {

+        return new CTScale2D();

+    }

+

+    /**

+     * Create an instance of {@link CTPositiveSize2D }

+     * 

+     */

+    public CTPositiveSize2D createCTPositiveSize2D() {

+        return new CTPositiveSize2D();

+    }

+

+    /**

+     * Create an instance of {@link CTOfficeArtExtensionList }

+     * 

+     */

+    public CTOfficeArtExtensionList createCTOfficeArtExtensionList() {

+        return new CTOfficeArtExtensionList();

+    }

+

+    /**

+     * Create an instance of {@link CTHyperlink }

+     * 

+     */

+    public CTHyperlink createCTHyperlink() {

+        return new CTHyperlink();

+    }

+

+    /**

+     * Create an instance of {@link CTPoint3D }

+     * 

+     */

+    public CTPoint3D createCTPoint3D() {

+        return new CTPoint3D();

+    }

+

+    /**

+     * Create an instance of {@link CTInverseGammaTransform }

+     * 

+     */

+    public CTInverseGammaTransform createCTInverseGammaTransform() {

+        return new CTInverseGammaTransform();

+    }

+

+    /**

+     * Create an instance of {@link CTPositiveFixedPercentage }

+     * 

+     */

+    public CTPositiveFixedPercentage createCTPositiveFixedPercentage() {

+        return new CTPositiveFixedPercentage();

+    }

+

+    /**

+     * Create an instance of {@link CTGeomRect }

+     * 

+     */

+    public CTGeomRect createCTGeomRect() {

+        return new CTGeomRect();

+    }

+

+    /**

+     * Create an instance of {@link CTPresetTextShape }

+     * 

+     */

+    public CTPresetTextShape createCTPresetTextShape() {

+        return new CTPresetTextShape();

+    }

+

+    /**

+     * Create an instance of {@link CTColorMRU }

+     * 

+     */

+    public CTColorMRU createCTColorMRU() {

+        return new CTColorMRU();

+    }

+

+    /**

+     * Create an instance of {@link CTPath2DMoveTo }

+     * 

+     */

+    public CTPath2DMoveTo createCTPath2DMoveTo() {

+        return new CTPath2DMoveTo();

+    }

+

+    /**

+     * Create an instance of {@link CTEmbeddedWAVAudioFile }

+     * 

+     */

+    public CTEmbeddedWAVAudioFile createCTEmbeddedWAVAudioFile() {

+        return new CTEmbeddedWAVAudioFile();

+    }

+

+    /**

+     * Create an instance of {@link CTScRgbColor }

+     * 

+     */

+    public CTScRgbColor createCTScRgbColor() {

+        return new CTScRgbColor();

+    }

+

+    /**

+     * Create an instance of {@link CTPresetGeometry2D }

+     * 

+     */

+    public CTPresetGeometry2D createCTPresetGeometry2D() {

+        return new CTPresetGeometry2D();

+    }

+

+    /**

+     * Create an instance of {@link CTGeomGuide }

+     * 

+     */

+    public CTGeomGuide createCTGeomGuide() {

+        return new CTGeomGuide();

+    }

+

+    /**

+     * Create an instance of {@link CTRelativeRect }

+     * 

+     */

+    public CTRelativeRect createCTRelativeRect() {

+        return new CTRelativeRect();

+    }

+

+    /**

+     * Create an instance of {@link CTAdjustHandleList }

+     * 

+     */

+    public CTAdjustHandleList createCTAdjustHandleList() {

+        return new CTAdjustHandleList();

+    }

+

+    /**

+     * Create an instance of {@link CTAdjPoint2D }

+     * 

+     */

+    public CTAdjPoint2D createCTAdjPoint2D() {

+        return new CTAdjPoint2D();

+    }

+

+    /**

+     * Create an instance of {@link CTGammaTransform }

+     * 

+     */

+    public CTGammaTransform createCTGammaTransform() {

+        return new CTGammaTransform();

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSRgbColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSRgbColorAlpha(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorLum(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLum_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSRgbColor.class)

+    public JAXBElement<CTGammaTransform> createCTSRgbColorGamma(CTGammaTransform value) {

+        return new JAXBElement<CTGammaTransform>(_CTSRgbColorGamma_QNAME, CTGammaTransform.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSRgbColor.class)

+    public JAXBElement<CTInverseGammaTransform> createCTSRgbColorInvGamma(CTInverseGammaTransform value) {

+        return new JAXBElement<CTInverseGammaTransform>(_CTSRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSRgbColor.class)

+    public JAXBElement<CTPositivePercentage> createCTSRgbColorAlphaMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorRedOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedOff_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSRgbColor.class)

+    public JAXBElement<CTFixedPercentage> createCTSRgbColorAlphaOff(CTFixedPercentage value) {

+        return new JAXBElement<CTFixedPercentage>(_CTSRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorGreenOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenOff_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSRgbColor.class)

+    public JAXBElement<CTPositiveFixedAngle> createCTSRgbColorHue(CTPositiveFixedAngle value) {

+        return new JAXBElement<CTPositiveFixedAngle>(_CTSRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorRedMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedMod_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorSatOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatOff_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorGreenMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenMod_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorSat(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSat_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorBlue(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlue_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorRed(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRed_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorSatMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatMod_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorBlueMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueMod_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSRgbColor.class)

+    public JAXBElement<CTAngle> createCTSRgbColorHueOff(CTAngle value) {

+        return new JAXBElement<CTAngle>(_CTSRgbColorHueOff_QNAME, CTAngle.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSRgbColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSRgbColorShade(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorLumMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumMod_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSRgbColor.class)

+    public JAXBElement<CTInverseTransform> createCTSRgbColorInv(CTInverseTransform value) {

+        return new JAXBElement<CTInverseTransform>(_CTSRgbColorInv_QNAME, CTInverseTransform.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorLumOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumOff_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSRgbColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSRgbColorTint(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorGreen(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreen_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSRgbColor.class)

+    public JAXBElement<CTComplementTransform> createCTSRgbColorComp(CTComplementTransform value) {

+        return new JAXBElement<CTComplementTransform>(_CTSRgbColorComp_QNAME, CTComplementTransform.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSRgbColor.class)

+    public JAXBElement<CTPercentage> createCTSRgbColorBlueOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueOff_QNAME, CTPercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSRgbColor.class)

+    public JAXBElement<CTPositivePercentage> createCTSRgbColorHueMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorHueMod_QNAME, CTPositivePercentage.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSRgbColor.class)

+    public JAXBElement<CTGrayscaleTransform> createCTSRgbColorGray(CTGrayscaleTransform value) {

+        return new JAXBElement<CTGrayscaleTransform>(_CTSRgbColorGray_QNAME, CTGrayscaleTransform.class, CTSRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSchemeColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSchemeColorAlpha(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorLum(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLum_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSchemeColor.class)

+    public JAXBElement<CTGammaTransform> createCTSchemeColorGamma(CTGammaTransform value) {

+        return new JAXBElement<CTGammaTransform>(_CTSRgbColorGamma_QNAME, CTGammaTransform.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSchemeColor.class)

+    public JAXBElement<CTInverseGammaTransform> createCTSchemeColorInvGamma(CTInverseGammaTransform value) {

+        return new JAXBElement<CTInverseGammaTransform>(_CTSRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSchemeColor.class)

+    public JAXBElement<CTPositivePercentage> createCTSchemeColorAlphaMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorRedOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedOff_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSchemeColor.class)

+    public JAXBElement<CTFixedPercentage> createCTSchemeColorAlphaOff(CTFixedPercentage value) {

+        return new JAXBElement<CTFixedPercentage>(_CTSRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorGreenOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenOff_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSchemeColor.class)

+    public JAXBElement<CTPositiveFixedAngle> createCTSchemeColorHue(CTPositiveFixedAngle value) {

+        return new JAXBElement<CTPositiveFixedAngle>(_CTSRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorRedMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedMod_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorSatOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatOff_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorGreenMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenMod_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorSat(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSat_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorBlue(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlue_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorRed(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRed_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorSatMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatMod_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorBlueMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueMod_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSchemeColor.class)

+    public JAXBElement<CTAngle> createCTSchemeColorHueOff(CTAngle value) {

+        return new JAXBElement<CTAngle>(_CTSRgbColorHueOff_QNAME, CTAngle.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSchemeColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSchemeColorShade(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorLumMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumMod_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSchemeColor.class)

+    public JAXBElement<CTInverseTransform> createCTSchemeColorInv(CTInverseTransform value) {

+        return new JAXBElement<CTInverseTransform>(_CTSRgbColorInv_QNAME, CTInverseTransform.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorLumOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumOff_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSchemeColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSchemeColorTint(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorGreen(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreen_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSchemeColor.class)

+    public JAXBElement<CTComplementTransform> createCTSchemeColorComp(CTComplementTransform value) {

+        return new JAXBElement<CTComplementTransform>(_CTSRgbColorComp_QNAME, CTComplementTransform.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSchemeColor.class)

+    public JAXBElement<CTPercentage> createCTSchemeColorBlueOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueOff_QNAME, CTPercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSchemeColor.class)

+    public JAXBElement<CTPositivePercentage> createCTSchemeColorHueMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorHueMod_QNAME, CTPositivePercentage.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSchemeColor.class)

+    public JAXBElement<CTGrayscaleTransform> createCTSchemeColorGray(CTGrayscaleTransform value) {

+        return new JAXBElement<CTGrayscaleTransform>(_CTSRgbColorGray_QNAME, CTGrayscaleTransform.class, CTSchemeColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTScRgbColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTScRgbColorAlpha(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorLum(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLum_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTScRgbColor.class)

+    public JAXBElement<CTGammaTransform> createCTScRgbColorGamma(CTGammaTransform value) {

+        return new JAXBElement<CTGammaTransform>(_CTSRgbColorGamma_QNAME, CTGammaTransform.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTScRgbColor.class)

+    public JAXBElement<CTInverseGammaTransform> createCTScRgbColorInvGamma(CTInverseGammaTransform value) {

+        return new JAXBElement<CTInverseGammaTransform>(_CTSRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTScRgbColor.class)

+    public JAXBElement<CTPositivePercentage> createCTScRgbColorAlphaMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorRedOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedOff_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTScRgbColor.class)

+    public JAXBElement<CTFixedPercentage> createCTScRgbColorAlphaOff(CTFixedPercentage value) {

+        return new JAXBElement<CTFixedPercentage>(_CTSRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorGreenOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenOff_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTScRgbColor.class)

+    public JAXBElement<CTPositiveFixedAngle> createCTScRgbColorHue(CTPositiveFixedAngle value) {

+        return new JAXBElement<CTPositiveFixedAngle>(_CTSRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorRedMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedMod_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorSatOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatOff_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorGreenMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenMod_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorSat(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSat_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorBlue(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlue_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorRed(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRed_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorSatMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatMod_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorBlueMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueMod_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTScRgbColor.class)

+    public JAXBElement<CTAngle> createCTScRgbColorHueOff(CTAngle value) {

+        return new JAXBElement<CTAngle>(_CTSRgbColorHueOff_QNAME, CTAngle.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTScRgbColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTScRgbColorShade(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorLumMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumMod_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTScRgbColor.class)

+    public JAXBElement<CTInverseTransform> createCTScRgbColorInv(CTInverseTransform value) {

+        return new JAXBElement<CTInverseTransform>(_CTSRgbColorInv_QNAME, CTInverseTransform.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorLumOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumOff_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTScRgbColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTScRgbColorTint(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorGreen(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreen_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTScRgbColor.class)

+    public JAXBElement<CTComplementTransform> createCTScRgbColorComp(CTComplementTransform value) {

+        return new JAXBElement<CTComplementTransform>(_CTSRgbColorComp_QNAME, CTComplementTransform.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTScRgbColor.class)

+    public JAXBElement<CTPercentage> createCTScRgbColorBlueOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueOff_QNAME, CTPercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTScRgbColor.class)

+    public JAXBElement<CTPositivePercentage> createCTScRgbColorHueMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorHueMod_QNAME, CTPositivePercentage.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTScRgbColor.class)

+    public JAXBElement<CTGrayscaleTransform> createCTScRgbColorGray(CTGrayscaleTransform value) {

+        return new JAXBElement<CTGrayscaleTransform>(_CTSRgbColorGray_QNAME, CTGrayscaleTransform.class, CTScRgbColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTSystemColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSystemColorAlpha(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorLum(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLum_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTSystemColor.class)

+    public JAXBElement<CTGammaTransform> createCTSystemColorGamma(CTGammaTransform value) {

+        return new JAXBElement<CTGammaTransform>(_CTSRgbColorGamma_QNAME, CTGammaTransform.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTSystemColor.class)

+    public JAXBElement<CTInverseGammaTransform> createCTSystemColorInvGamma(CTInverseGammaTransform value) {

+        return new JAXBElement<CTInverseGammaTransform>(_CTSRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTSystemColor.class)

+    public JAXBElement<CTPositivePercentage> createCTSystemColorAlphaMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorRedOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedOff_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTSystemColor.class)

+    public JAXBElement<CTFixedPercentage> createCTSystemColorAlphaOff(CTFixedPercentage value) {

+        return new JAXBElement<CTFixedPercentage>(_CTSRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorGreenOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenOff_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTSystemColor.class)

+    public JAXBElement<CTPositiveFixedAngle> createCTSystemColorHue(CTPositiveFixedAngle value) {

+        return new JAXBElement<CTPositiveFixedAngle>(_CTSRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorRedMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedMod_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorSatOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatOff_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorGreenMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenMod_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorSat(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSat_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorBlue(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlue_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorRed(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRed_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorSatMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatMod_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorBlueMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueMod_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTSystemColor.class)

+    public JAXBElement<CTAngle> createCTSystemColorHueOff(CTAngle value) {

+        return new JAXBElement<CTAngle>(_CTSRgbColorHueOff_QNAME, CTAngle.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTSystemColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSystemColorShade(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorLumMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumMod_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTSystemColor.class)

+    public JAXBElement<CTInverseTransform> createCTSystemColorInv(CTInverseTransform value) {

+        return new JAXBElement<CTInverseTransform>(_CTSRgbColorInv_QNAME, CTInverseTransform.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorLumOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumOff_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTSystemColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTSystemColorTint(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorGreen(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreen_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTSystemColor.class)

+    public JAXBElement<CTComplementTransform> createCTSystemColorComp(CTComplementTransform value) {

+        return new JAXBElement<CTComplementTransform>(_CTSRgbColorComp_QNAME, CTComplementTransform.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTSystemColor.class)

+    public JAXBElement<CTPercentage> createCTSystemColorBlueOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueOff_QNAME, CTPercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTSystemColor.class)

+    public JAXBElement<CTPositivePercentage> createCTSystemColorHueMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorHueMod_QNAME, CTPositivePercentage.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTSystemColor.class)

+    public JAXBElement<CTGrayscaleTransform> createCTSystemColorGray(CTGrayscaleTransform value) {

+        return new JAXBElement<CTGrayscaleTransform>(_CTSRgbColorGray_QNAME, CTGrayscaleTransform.class, CTSystemColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTHslColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTHslColorAlpha(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorLum(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLum_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTHslColor.class)

+    public JAXBElement<CTGammaTransform> createCTHslColorGamma(CTGammaTransform value) {

+        return new JAXBElement<CTGammaTransform>(_CTSRgbColorGamma_QNAME, CTGammaTransform.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTHslColor.class)

+    public JAXBElement<CTInverseGammaTransform> createCTHslColorInvGamma(CTInverseGammaTransform value) {

+        return new JAXBElement<CTInverseGammaTransform>(_CTSRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTHslColor.class)

+    public JAXBElement<CTPositivePercentage> createCTHslColorAlphaMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorRedOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedOff_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTHslColor.class)

+    public JAXBElement<CTFixedPercentage> createCTHslColorAlphaOff(CTFixedPercentage value) {

+        return new JAXBElement<CTFixedPercentage>(_CTSRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorGreenOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenOff_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTHslColor.class)

+    public JAXBElement<CTPositiveFixedAngle> createCTHslColorHue(CTPositiveFixedAngle value) {

+        return new JAXBElement<CTPositiveFixedAngle>(_CTSRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorRedMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedMod_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorSatOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatOff_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorGreenMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenMod_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorSat(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSat_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorBlue(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlue_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorRed(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRed_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorSatMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatMod_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorBlueMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueMod_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTHslColor.class)

+    public JAXBElement<CTAngle> createCTHslColorHueOff(CTAngle value) {

+        return new JAXBElement<CTAngle>(_CTSRgbColorHueOff_QNAME, CTAngle.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTHslColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTHslColorShade(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorLumMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumMod_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTHslColor.class)

+    public JAXBElement<CTInverseTransform> createCTHslColorInv(CTInverseTransform value) {

+        return new JAXBElement<CTInverseTransform>(_CTSRgbColorInv_QNAME, CTInverseTransform.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorLumOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumOff_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTHslColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTHslColorTint(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorGreen(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreen_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTHslColor.class)

+    public JAXBElement<CTComplementTransform> createCTHslColorComp(CTComplementTransform value) {

+        return new JAXBElement<CTComplementTransform>(_CTSRgbColorComp_QNAME, CTComplementTransform.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTHslColor.class)

+    public JAXBElement<CTPercentage> createCTHslColorBlueOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueOff_QNAME, CTPercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTHslColor.class)

+    public JAXBElement<CTPositivePercentage> createCTHslColorHueMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorHueMod_QNAME, CTPositivePercentage.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTHslColor.class)

+    public JAXBElement<CTGrayscaleTransform> createCTHslColorGray(CTGrayscaleTransform value) {

+        return new JAXBElement<CTGrayscaleTransform>(_CTSRgbColorGray_QNAME, CTGrayscaleTransform.class, CTHslColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alpha", scope = CTPresetColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTPresetColorAlpha(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorAlpha_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lum", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorLum(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLum_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gamma", scope = CTPresetColor.class)

+    public JAXBElement<CTGammaTransform> createCTPresetColorGamma(CTGammaTransform value) {

+        return new JAXBElement<CTGammaTransform>(_CTSRgbColorGamma_QNAME, CTGammaTransform.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "invGamma", scope = CTPresetColor.class)

+    public JAXBElement<CTInverseGammaTransform> createCTPresetColorInvGamma(CTInverseGammaTransform value) {

+        return new JAXBElement<CTInverseGammaTransform>(_CTSRgbColorInvGamma_QNAME, CTInverseGammaTransform.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaMod", scope = CTPresetColor.class)

+    public JAXBElement<CTPositivePercentage> createCTPresetColorAlphaMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorAlphaMod_QNAME, CTPositivePercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redOff", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorRedOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedOff_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "alphaOff", scope = CTPresetColor.class)

+    public JAXBElement<CTFixedPercentage> createCTPresetColorAlphaOff(CTFixedPercentage value) {

+        return new JAXBElement<CTFixedPercentage>(_CTSRgbColorAlphaOff_QNAME, CTFixedPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenOff", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorGreenOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenOff_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hue", scope = CTPresetColor.class)

+    public JAXBElement<CTPositiveFixedAngle> createCTPresetColorHue(CTPositiveFixedAngle value) {

+        return new JAXBElement<CTPositiveFixedAngle>(_CTSRgbColorHue_QNAME, CTPositiveFixedAngle.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "redMod", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorRedMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRedMod_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satOff", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorSatOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatOff_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "greenMod", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorGreenMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreenMod_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "sat", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorSat(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSat_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blue", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorBlue(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlue_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "red", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorRed(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorRed_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "satMod", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorSatMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorSatMod_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueMod", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorBlueMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueMod_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTAngle }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueOff", scope = CTPresetColor.class)

+    public JAXBElement<CTAngle> createCTPresetColorHueOff(CTAngle value) {

+        return new JAXBElement<CTAngle>(_CTSRgbColorHueOff_QNAME, CTAngle.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "shade", scope = CTPresetColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTPresetColorShade(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorShade_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumMod", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorLumMod(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumMod_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "inv", scope = CTPresetColor.class)

+    public JAXBElement<CTInverseTransform> createCTPresetColorInv(CTInverseTransform value) {

+        return new JAXBElement<CTInverseTransform>(_CTSRgbColorInv_QNAME, CTInverseTransform.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "lumOff", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorLumOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorLumOff_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "tint", scope = CTPresetColor.class)

+    public JAXBElement<CTPositiveFixedPercentage> createCTPresetColorTint(CTPositiveFixedPercentage value) {

+        return new JAXBElement<CTPositiveFixedPercentage>(_CTSRgbColorTint_QNAME, CTPositiveFixedPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "green", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorGreen(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorGreen_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "comp", scope = CTPresetColor.class)

+    public JAXBElement<CTComplementTransform> createCTPresetColorComp(CTComplementTransform value) {

+        return new JAXBElement<CTComplementTransform>(_CTSRgbColorComp_QNAME, CTComplementTransform.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "blueOff", scope = CTPresetColor.class)

+    public JAXBElement<CTPercentage> createCTPresetColorBlueOff(CTPercentage value) {

+        return new JAXBElement<CTPercentage>(_CTSRgbColorBlueOff_QNAME, CTPercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "hueMod", scope = CTPresetColor.class)

+    public JAXBElement<CTPositivePercentage> createCTPresetColorHueMod(CTPositivePercentage value) {

+        return new JAXBElement<CTPositivePercentage>(_CTSRgbColorHueMod_QNAME, CTPositivePercentage.class, CTPresetColor.class, value);

+    }

+

+    /**

+     * Create an instance of {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}}

+     * 

+     */

+    @XmlElementDecl(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", name = "gray", scope = CTPresetColor.class)

+    public JAXBElement<CTGrayscaleTransform> createCTPresetColorGray(CTGrayscaleTransform value) {

+        return new JAXBElement<CTGrayscaleTransform>(_CTSRgbColorGray_QNAME, CTGrayscaleTransform.class, CTPresetColor.class, value);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/STBlackWhiteMode.java b/src/java/org/apache/poi/sl/draw/binding/STBlackWhiteMode.java
new file mode 100644
index 0000000..27262d6
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/STBlackWhiteMode.java
@@ -0,0 +1,149 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlEnum;

+import javax.xml.bind.annotation.XmlEnumValue;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for ST_BlackWhiteMode.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * <p>

+ * <pre>

+ * &lt;simpleType name="ST_BlackWhiteMode">

+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}token">

+ *     &lt;enumeration value="clr"/>

+ *     &lt;enumeration value="auto"/>

+ *     &lt;enumeration value="gray"/>

+ *     &lt;enumeration value="ltGray"/>

+ *     &lt;enumeration value="invGray"/>

+ *     &lt;enumeration value="grayWhite"/>

+ *     &lt;enumeration value="blackGray"/>

+ *     &lt;enumeration value="blackWhite"/>

+ *     &lt;enumeration value="black"/>

+ *     &lt;enumeration value="white"/>

+ *     &lt;enumeration value="hidden"/>

+ *   &lt;/restriction>

+ * &lt;/simpleType>

+ * </pre>

+ * 

+ */

+@XmlType(name = "ST_BlackWhiteMode", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+@XmlEnum

+public enum STBlackWhiteMode {

+

+

+    /**

+     * Color

+     * 

+     */

+    @XmlEnumValue("clr")

+    CLR("clr"),

+

+    /**

+     * Automatic

+     * 

+     */

+    @XmlEnumValue("auto")

+    AUTO("auto"),

+

+    /**

+     * Gray

+     * 

+     */

+    @XmlEnumValue("gray")

+    GRAY("gray"),

+

+    /**

+     * Light Gray

+     * 

+     */

+    @XmlEnumValue("ltGray")

+    LT_GRAY("ltGray"),

+

+    /**

+     * Inverse Gray

+     * 

+     */

+    @XmlEnumValue("invGray")

+    INV_GRAY("invGray"),

+

+    /**

+     * Gray and White

+     * 

+     */

+    @XmlEnumValue("grayWhite")

+    GRAY_WHITE("grayWhite"),

+

+    /**

+     * Black and Gray

+     * 

+     */

+    @XmlEnumValue("blackGray")

+    BLACK_GRAY("blackGray"),

+

+    /**

+     * Black and White

+     * 

+     */

+    @XmlEnumValue("blackWhite")

+    BLACK_WHITE("blackWhite"),

+

+    /**

+     * Black

+     * 

+     */

+    @XmlEnumValue("black")

+    BLACK("black"),

+

+    /**

+     * White

+     * 

+     */

+    @XmlEnumValue("white")

+    WHITE("white"),

+

+    /**

+     * Hidden

+     * 

+     */

+    @XmlEnumValue("hidden")

+    HIDDEN("hidden");

+    private final String value;

+

+    STBlackWhiteMode(String v) {

+        value = v;

+    }

+

+    public String value() {

+        return value;

+    }

+

+    public static STBlackWhiteMode fromValue(String v) {

+        for (STBlackWhiteMode c: STBlackWhiteMode.values()) {

+            if (c.value.equals(v)) {

+                return c;

+            }

+        }

+        throw new IllegalArgumentException(v);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/STPathFillMode.java b/src/java/org/apache/poi/sl/draw/binding/STPathFillMode.java
new file mode 100644
index 0000000..8a26458
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/STPathFillMode.java
@@ -0,0 +1,109 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlEnum;

+import javax.xml.bind.annotation.XmlEnumValue;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for ST_PathFillMode.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * <p>

+ * <pre>

+ * &lt;simpleType name="ST_PathFillMode">

+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}token">

+ *     &lt;enumeration value="none"/>

+ *     &lt;enumeration value="norm"/>

+ *     &lt;enumeration value="lighten"/>

+ *     &lt;enumeration value="lightenLess"/>

+ *     &lt;enumeration value="darken"/>

+ *     &lt;enumeration value="darkenLess"/>

+ *   &lt;/restriction>

+ * &lt;/simpleType>

+ * </pre>

+ * 

+ */

+@XmlType(name = "ST_PathFillMode", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+@XmlEnum

+public enum STPathFillMode {

+

+

+    /**

+     * No Path Fill

+     * 

+     */

+    @XmlEnumValue("none")

+    NONE("none"),

+

+    /**

+     * Normal Path Fill

+     * 

+     */

+    @XmlEnumValue("norm")

+    NORM("norm"),

+

+    /**

+     * Lighten Path Fill

+     * 

+     */

+    @XmlEnumValue("lighten")

+    LIGHTEN("lighten"),

+

+    /**

+     * Lighten Path Fill Less

+     * 

+     */

+    @XmlEnumValue("lightenLess")

+    LIGHTEN_LESS("lightenLess"),

+

+    /**

+     * Darken Path Fill

+     * 

+     */

+    @XmlEnumValue("darken")

+    DARKEN("darken"),

+

+    /**

+     * Darken Path Fill Less

+     * 

+     */

+    @XmlEnumValue("darkenLess")

+    DARKEN_LESS("darkenLess");

+    private final String value;

+

+    STPathFillMode(String v) {

+        value = v;

+    }

+

+    public String value() {

+        return value;

+    }

+

+    public static STPathFillMode fromValue(String v) {

+        for (STPathFillMode c: STPathFillMode.values()) {

+            if (c.value.equals(v)) {

+                return c;

+            }

+        }

+        throw new IllegalArgumentException(v);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/STPresetColorVal.java b/src/java/org/apache/poi/sl/draw/binding/STPresetColorVal.java
new file mode 100644
index 0000000..7450ac6
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/STPresetColorVal.java
@@ -0,0 +1,1181 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlEnum;

+import javax.xml.bind.annotation.XmlEnumValue;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for ST_PresetColorVal.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * <p>

+ * <pre>

+ * &lt;simpleType name="ST_PresetColorVal">

+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}token">

+ *     &lt;enumeration value="aliceBlue"/>

+ *     &lt;enumeration value="antiqueWhite"/>

+ *     &lt;enumeration value="aqua"/>

+ *     &lt;enumeration value="aquamarine"/>

+ *     &lt;enumeration value="azure"/>

+ *     &lt;enumeration value="beige"/>

+ *     &lt;enumeration value="bisque"/>

+ *     &lt;enumeration value="black"/>

+ *     &lt;enumeration value="blanchedAlmond"/>

+ *     &lt;enumeration value="blue"/>

+ *     &lt;enumeration value="blueViolet"/>

+ *     &lt;enumeration value="brown"/>

+ *     &lt;enumeration value="burlyWood"/>

+ *     &lt;enumeration value="cadetBlue"/>

+ *     &lt;enumeration value="chartreuse"/>

+ *     &lt;enumeration value="chocolate"/>

+ *     &lt;enumeration value="coral"/>

+ *     &lt;enumeration value="cornflowerBlue"/>

+ *     &lt;enumeration value="cornsilk"/>

+ *     &lt;enumeration value="crimson"/>

+ *     &lt;enumeration value="cyan"/>

+ *     &lt;enumeration value="dkBlue"/>

+ *     &lt;enumeration value="dkCyan"/>

+ *     &lt;enumeration value="dkGoldenrod"/>

+ *     &lt;enumeration value="dkGray"/>

+ *     &lt;enumeration value="dkGreen"/>

+ *     &lt;enumeration value="dkKhaki"/>

+ *     &lt;enumeration value="dkMagenta"/>

+ *     &lt;enumeration value="dkOliveGreen"/>

+ *     &lt;enumeration value="dkOrange"/>

+ *     &lt;enumeration value="dkOrchid"/>

+ *     &lt;enumeration value="dkRed"/>

+ *     &lt;enumeration value="dkSalmon"/>

+ *     &lt;enumeration value="dkSeaGreen"/>

+ *     &lt;enumeration value="dkSlateBlue"/>

+ *     &lt;enumeration value="dkSlateGray"/>

+ *     &lt;enumeration value="dkTurquoise"/>

+ *     &lt;enumeration value="dkViolet"/>

+ *     &lt;enumeration value="deepPink"/>

+ *     &lt;enumeration value="deepSkyBlue"/>

+ *     &lt;enumeration value="dimGray"/>

+ *     &lt;enumeration value="dodgerBlue"/>

+ *     &lt;enumeration value="firebrick"/>

+ *     &lt;enumeration value="floralWhite"/>

+ *     &lt;enumeration value="forestGreen"/>

+ *     &lt;enumeration value="fuchsia"/>

+ *     &lt;enumeration value="gainsboro"/>

+ *     &lt;enumeration value="ghostWhite"/>

+ *     &lt;enumeration value="gold"/>

+ *     &lt;enumeration value="goldenrod"/>

+ *     &lt;enumeration value="gray"/>

+ *     &lt;enumeration value="green"/>

+ *     &lt;enumeration value="greenYellow"/>

+ *     &lt;enumeration value="honeydew"/>

+ *     &lt;enumeration value="hotPink"/>

+ *     &lt;enumeration value="indianRed"/>

+ *     &lt;enumeration value="indigo"/>

+ *     &lt;enumeration value="ivory"/>

+ *     &lt;enumeration value="khaki"/>

+ *     &lt;enumeration value="lavender"/>

+ *     &lt;enumeration value="lavenderBlush"/>

+ *     &lt;enumeration value="lawnGreen"/>

+ *     &lt;enumeration value="lemonChiffon"/>

+ *     &lt;enumeration value="ltBlue"/>

+ *     &lt;enumeration value="ltCoral"/>

+ *     &lt;enumeration value="ltCyan"/>

+ *     &lt;enumeration value="ltGoldenrodYellow"/>

+ *     &lt;enumeration value="ltGray"/>

+ *     &lt;enumeration value="ltGreen"/>

+ *     &lt;enumeration value="ltPink"/>

+ *     &lt;enumeration value="ltSalmon"/>

+ *     &lt;enumeration value="ltSeaGreen"/>

+ *     &lt;enumeration value="ltSkyBlue"/>

+ *     &lt;enumeration value="ltSlateGray"/>

+ *     &lt;enumeration value="ltSteelBlue"/>

+ *     &lt;enumeration value="ltYellow"/>

+ *     &lt;enumeration value="lime"/>

+ *     &lt;enumeration value="limeGreen"/>

+ *     &lt;enumeration value="linen"/>

+ *     &lt;enumeration value="magenta"/>

+ *     &lt;enumeration value="maroon"/>

+ *     &lt;enumeration value="medAquamarine"/>

+ *     &lt;enumeration value="medBlue"/>

+ *     &lt;enumeration value="medOrchid"/>

+ *     &lt;enumeration value="medPurple"/>

+ *     &lt;enumeration value="medSeaGreen"/>

+ *     &lt;enumeration value="medSlateBlue"/>

+ *     &lt;enumeration value="medSpringGreen"/>

+ *     &lt;enumeration value="medTurquoise"/>

+ *     &lt;enumeration value="medVioletRed"/>

+ *     &lt;enumeration value="midnightBlue"/>

+ *     &lt;enumeration value="mintCream"/>

+ *     &lt;enumeration value="mistyRose"/>

+ *     &lt;enumeration value="moccasin"/>

+ *     &lt;enumeration value="navajoWhite"/>

+ *     &lt;enumeration value="navy"/>

+ *     &lt;enumeration value="oldLace"/>

+ *     &lt;enumeration value="olive"/>

+ *     &lt;enumeration value="oliveDrab"/>

+ *     &lt;enumeration value="orange"/>

+ *     &lt;enumeration value="orangeRed"/>

+ *     &lt;enumeration value="orchid"/>

+ *     &lt;enumeration value="paleGoldenrod"/>

+ *     &lt;enumeration value="paleGreen"/>

+ *     &lt;enumeration value="paleTurquoise"/>

+ *     &lt;enumeration value="paleVioletRed"/>

+ *     &lt;enumeration value="papayaWhip"/>

+ *     &lt;enumeration value="peachPuff"/>

+ *     &lt;enumeration value="peru"/>

+ *     &lt;enumeration value="pink"/>

+ *     &lt;enumeration value="plum"/>

+ *     &lt;enumeration value="powderBlue"/>

+ *     &lt;enumeration value="purple"/>

+ *     &lt;enumeration value="red"/>

+ *     &lt;enumeration value="rosyBrown"/>

+ *     &lt;enumeration value="royalBlue"/>

+ *     &lt;enumeration value="saddleBrown"/>

+ *     &lt;enumeration value="salmon"/>

+ *     &lt;enumeration value="sandyBrown"/>

+ *     &lt;enumeration value="seaGreen"/>

+ *     &lt;enumeration value="seaShell"/>

+ *     &lt;enumeration value="sienna"/>

+ *     &lt;enumeration value="silver"/>

+ *     &lt;enumeration value="skyBlue"/>

+ *     &lt;enumeration value="slateBlue"/>

+ *     &lt;enumeration value="slateGray"/>

+ *     &lt;enumeration value="snow"/>

+ *     &lt;enumeration value="springGreen"/>

+ *     &lt;enumeration value="steelBlue"/>

+ *     &lt;enumeration value="tan"/>

+ *     &lt;enumeration value="teal"/>

+ *     &lt;enumeration value="thistle"/>

+ *     &lt;enumeration value="tomato"/>

+ *     &lt;enumeration value="turquoise"/>

+ *     &lt;enumeration value="violet"/>

+ *     &lt;enumeration value="wheat"/>

+ *     &lt;enumeration value="white"/>

+ *     &lt;enumeration value="whiteSmoke"/>

+ *     &lt;enumeration value="yellow"/>

+ *     &lt;enumeration value="yellowGreen"/>

+ *   &lt;/restriction>

+ * &lt;/simpleType>

+ * </pre>

+ * 

+ */

+@XmlType(name = "ST_PresetColorVal", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+@XmlEnum

+public enum STPresetColorVal {

+

+

+    /**

+     * Alice Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("aliceBlue")

+    ALICE_BLUE("aliceBlue"),

+

+    /**

+     * Antique White Preset Color

+     * 

+     */

+    @XmlEnumValue("antiqueWhite")

+    ANTIQUE_WHITE("antiqueWhite"),

+

+    /**

+     * Aqua Preset Color

+     * 

+     */

+    @XmlEnumValue("aqua")

+    AQUA("aqua"),

+

+    /**

+     * Aquamarine Preset Color

+     * 

+     */

+    @XmlEnumValue("aquamarine")

+    AQUAMARINE("aquamarine"),

+

+    /**

+     * Azure Preset Color

+     * 

+     */

+    @XmlEnumValue("azure")

+    AZURE("azure"),

+

+    /**

+     * Beige Preset Color

+     * 

+     */

+    @XmlEnumValue("beige")

+    BEIGE("beige"),

+

+    /**

+     * Bisque Preset Color

+     * 

+     */

+    @XmlEnumValue("bisque")

+    BISQUE("bisque"),

+

+    /**

+     * Black Preset Color

+     * 

+     */

+    @XmlEnumValue("black")

+    BLACK("black"),

+

+    /**

+     * Blanched Almond Preset Color

+     * 

+     */

+    @XmlEnumValue("blanchedAlmond")

+    BLANCHED_ALMOND("blanchedAlmond"),

+

+    /**

+     * Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("blue")

+    BLUE("blue"),

+

+    /**

+     * Blue Violet Preset Color

+     * 

+     */

+    @XmlEnumValue("blueViolet")

+    BLUE_VIOLET("blueViolet"),

+

+    /**

+     * Brown Preset Color

+     * 

+     */

+    @XmlEnumValue("brown")

+    BROWN("brown"),

+

+    /**

+     * Burly Wood Preset Color

+     * 

+     */

+    @XmlEnumValue("burlyWood")

+    BURLY_WOOD("burlyWood"),

+

+    /**

+     * Cadet Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("cadetBlue")

+    CADET_BLUE("cadetBlue"),

+

+    /**

+     * Chartreuse Preset Color

+     * 

+     */

+    @XmlEnumValue("chartreuse")

+    CHARTREUSE("chartreuse"),

+

+    /**

+     * Chocolate Preset Color

+     * 

+     */

+    @XmlEnumValue("chocolate")

+    CHOCOLATE("chocolate"),

+

+    /**

+     * Coral Preset Color

+     * 

+     */

+    @XmlEnumValue("coral")

+    CORAL("coral"),

+

+    /**

+     * Cornflower Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("cornflowerBlue")

+    CORNFLOWER_BLUE("cornflowerBlue"),

+

+    /**

+     * Cornsilk Preset Color

+     * 

+     */

+    @XmlEnumValue("cornsilk")

+    CORNSILK("cornsilk"),

+

+    /**

+     * Crimson Preset Color

+     * 

+     */

+    @XmlEnumValue("crimson")

+    CRIMSON("crimson"),

+

+    /**

+     * Cyan Preset Color

+     * 

+     */

+    @XmlEnumValue("cyan")

+    CYAN("cyan"),

+

+    /**

+     * Dark Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("dkBlue")

+    DK_BLUE("dkBlue"),

+

+    /**

+     * Dark Cyan Preset Color

+     * 

+     */

+    @XmlEnumValue("dkCyan")

+    DK_CYAN("dkCyan"),

+

+    /**

+     * Dark Goldenrod Preset Color

+     * 

+     */

+    @XmlEnumValue("dkGoldenrod")

+    DK_GOLDENROD("dkGoldenrod"),

+

+    /**

+     * Dark Gray Preset Color

+     * 

+     */

+    @XmlEnumValue("dkGray")

+    DK_GRAY("dkGray"),

+

+    /**

+     * Dark Green Preset Color

+     * 

+     */

+    @XmlEnumValue("dkGreen")

+    DK_GREEN("dkGreen"),

+

+    /**

+     * Dark Khaki Preset Color

+     * 

+     */

+    @XmlEnumValue("dkKhaki")

+    DK_KHAKI("dkKhaki"),

+

+    /**

+     * Dark Magenta Preset Color

+     * 

+     */

+    @XmlEnumValue("dkMagenta")

+    DK_MAGENTA("dkMagenta"),

+

+    /**

+     * Dark Olive Green Preset Color

+     * 

+     */

+    @XmlEnumValue("dkOliveGreen")

+    DK_OLIVE_GREEN("dkOliveGreen"),

+

+    /**

+     * Dark Orange Preset Color

+     * 

+     */

+    @XmlEnumValue("dkOrange")

+    DK_ORANGE("dkOrange"),

+

+    /**

+     * Dark Orchid Preset Color

+     * 

+     */

+    @XmlEnumValue("dkOrchid")

+    DK_ORCHID("dkOrchid"),

+

+    /**

+     * Dark Red Preset Color

+     * 

+     */

+    @XmlEnumValue("dkRed")

+    DK_RED("dkRed"),

+

+    /**

+     * Dark Salmon Preset Color

+     * 

+     */

+    @XmlEnumValue("dkSalmon")

+    DK_SALMON("dkSalmon"),

+

+    /**

+     * Dark Sea Green Preset Color

+     * 

+     */

+    @XmlEnumValue("dkSeaGreen")

+    DK_SEA_GREEN("dkSeaGreen"),

+

+    /**

+     * Dark Slate Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("dkSlateBlue")

+    DK_SLATE_BLUE("dkSlateBlue"),

+

+    /**

+     * Dark Slate Gray Preset Color

+     * 

+     */

+    @XmlEnumValue("dkSlateGray")

+    DK_SLATE_GRAY("dkSlateGray"),

+

+    /**

+     * Dark Turquoise Preset Color

+     * 

+     */

+    @XmlEnumValue("dkTurquoise")

+    DK_TURQUOISE("dkTurquoise"),

+

+    /**

+     * Dark Violet Preset Color

+     * 

+     */

+    @XmlEnumValue("dkViolet")

+    DK_VIOLET("dkViolet"),

+

+    /**

+     * Deep Pink Preset Color

+     * 

+     */

+    @XmlEnumValue("deepPink")

+    DEEP_PINK("deepPink"),

+

+    /**

+     * Deep Sky Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("deepSkyBlue")

+    DEEP_SKY_BLUE("deepSkyBlue"),

+

+    /**

+     * Dim Gray Preset Color

+     * 

+     */

+    @XmlEnumValue("dimGray")

+    DIM_GRAY("dimGray"),

+

+    /**

+     * Dodger Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("dodgerBlue")

+    DODGER_BLUE("dodgerBlue"),

+

+    /**

+     * Firebrick Preset Color

+     * 

+     */

+    @XmlEnumValue("firebrick")

+    FIREBRICK("firebrick"),

+

+    /**

+     * Floral White Preset Color

+     * 

+     */

+    @XmlEnumValue("floralWhite")

+    FLORAL_WHITE("floralWhite"),

+

+    /**

+     * Forest Green Preset Color

+     * 

+     */

+    @XmlEnumValue("forestGreen")

+    FOREST_GREEN("forestGreen"),

+

+    /**

+     * Fuchsia Preset Color

+     * 

+     */

+    @XmlEnumValue("fuchsia")

+    FUCHSIA("fuchsia"),

+

+    /**

+     * Gainsboro Preset Color

+     * 

+     */

+    @XmlEnumValue("gainsboro")

+    GAINSBORO("gainsboro"),

+

+    /**

+     * Ghost White Preset Color

+     * 

+     */

+    @XmlEnumValue("ghostWhite")

+    GHOST_WHITE("ghostWhite"),

+

+    /**

+     * Gold Preset Color

+     * 

+     */

+    @XmlEnumValue("gold")

+    GOLD("gold"),

+

+    /**

+     * Goldenrod Preset Color

+     * 

+     */

+    @XmlEnumValue("goldenrod")

+    GOLDENROD("goldenrod"),

+

+    /**

+     * Gray Preset Color

+     * 

+     */

+    @XmlEnumValue("gray")

+    GRAY("gray"),

+

+    /**

+     * Green Preset Color

+     * 

+     */

+    @XmlEnumValue("green")

+    GREEN("green"),

+

+    /**

+     * Green Yellow Preset Color

+     * 

+     */

+    @XmlEnumValue("greenYellow")

+    GREEN_YELLOW("greenYellow"),

+

+    /**

+     * Honeydew Preset Color

+     * 

+     */

+    @XmlEnumValue("honeydew")

+    HONEYDEW("honeydew"),

+

+    /**

+     * Hot Pink Preset Color

+     * 

+     */

+    @XmlEnumValue("hotPink")

+    HOT_PINK("hotPink"),

+

+    /**

+     * Indian Red Preset Color

+     * 

+     */

+    @XmlEnumValue("indianRed")

+    INDIAN_RED("indianRed"),

+

+    /**

+     * Indigo Preset Color

+     * 

+     */

+    @XmlEnumValue("indigo")

+    INDIGO("indigo"),

+

+    /**

+     * Ivory Preset Color

+     * 

+     */

+    @XmlEnumValue("ivory")

+    IVORY("ivory"),

+

+    /**

+     * Khaki Preset Color

+     * 

+     */

+    @XmlEnumValue("khaki")

+    KHAKI("khaki"),

+

+    /**

+     * Lavender Preset Color

+     * 

+     */

+    @XmlEnumValue("lavender")

+    LAVENDER("lavender"),

+

+    /**

+     * Lavender Blush Preset Color

+     * 

+     */

+    @XmlEnumValue("lavenderBlush")

+    LAVENDER_BLUSH("lavenderBlush"),

+

+    /**

+     * Lawn Green Preset Color

+     * 

+     */

+    @XmlEnumValue("lawnGreen")

+    LAWN_GREEN("lawnGreen"),

+

+    /**

+     * Lemon Chiffon Preset Color

+     * 

+     */

+    @XmlEnumValue("lemonChiffon")

+    LEMON_CHIFFON("lemonChiffon"),

+

+    /**

+     * Light Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("ltBlue")

+    LT_BLUE("ltBlue"),

+

+    /**

+     * Light Coral Preset Color

+     * 

+     */

+    @XmlEnumValue("ltCoral")

+    LT_CORAL("ltCoral"),

+

+    /**

+     * Light Cyan Preset Color

+     * 

+     */

+    @XmlEnumValue("ltCyan")

+    LT_CYAN("ltCyan"),

+

+    /**

+     * Light Goldenrod Yellow Preset Color

+     * 

+     */

+    @XmlEnumValue("ltGoldenrodYellow")

+    LT_GOLDENROD_YELLOW("ltGoldenrodYellow"),

+

+    /**

+     * Light Gray Preset Color

+     * 

+     */

+    @XmlEnumValue("ltGray")

+    LT_GRAY("ltGray"),

+

+    /**

+     * Light Green Preset Color

+     * 

+     */

+    @XmlEnumValue("ltGreen")

+    LT_GREEN("ltGreen"),

+

+    /**

+     * Light Pink Preset Color

+     * 

+     */

+    @XmlEnumValue("ltPink")

+    LT_PINK("ltPink"),

+

+    /**

+     * Light Salmon Preset Color

+     * 

+     */

+    @XmlEnumValue("ltSalmon")

+    LT_SALMON("ltSalmon"),

+

+    /**

+     * Light Sea Green Preset Color

+     * 

+     */

+    @XmlEnumValue("ltSeaGreen")

+    LT_SEA_GREEN("ltSeaGreen"),

+

+    /**

+     * Light Sky Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("ltSkyBlue")

+    LT_SKY_BLUE("ltSkyBlue"),

+

+    /**

+     * Light Slate Gray Preset Color

+     * 

+     */

+    @XmlEnumValue("ltSlateGray")

+    LT_SLATE_GRAY("ltSlateGray"),

+

+    /**

+     * Light Steel Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("ltSteelBlue")

+    LT_STEEL_BLUE("ltSteelBlue"),

+

+    /**

+     * Light Yellow Preset Color

+     * 

+     */

+    @XmlEnumValue("ltYellow")

+    LT_YELLOW("ltYellow"),

+

+    /**

+     * Lime Preset Color

+     * 

+     */

+    @XmlEnumValue("lime")

+    LIME("lime"),

+

+    /**

+     * Lime Green Preset Color

+     * 

+     */

+    @XmlEnumValue("limeGreen")

+    LIME_GREEN("limeGreen"),

+

+    /**

+     * Linen Preset Color

+     * 

+     */

+    @XmlEnumValue("linen")

+    LINEN("linen"),

+

+    /**

+     * Magenta Preset Color

+     * 

+     */

+    @XmlEnumValue("magenta")

+    MAGENTA("magenta"),

+

+    /**

+     * Maroon Preset Color

+     * 

+     */

+    @XmlEnumValue("maroon")

+    MAROON("maroon"),

+

+    /**

+     * Medium Aquamarine Preset Color

+     * 

+     */

+    @XmlEnumValue("medAquamarine")

+    MED_AQUAMARINE("medAquamarine"),

+

+    /**

+     * Medium Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("medBlue")

+    MED_BLUE("medBlue"),

+

+    /**

+     * Medium Orchid Preset Color

+     * 

+     */

+    @XmlEnumValue("medOrchid")

+    MED_ORCHID("medOrchid"),

+

+    /**

+     * Medium Purple Preset Color

+     * 

+     */

+    @XmlEnumValue("medPurple")

+    MED_PURPLE("medPurple"),

+

+    /**

+     * Medium Sea Green Preset Color

+     * 

+     */

+    @XmlEnumValue("medSeaGreen")

+    MED_SEA_GREEN("medSeaGreen"),

+

+    /**

+     * Medium Slate Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("medSlateBlue")

+    MED_SLATE_BLUE("medSlateBlue"),

+

+    /**

+     * Medium Spring Green Preset Color

+     * 

+     */

+    @XmlEnumValue("medSpringGreen")

+    MED_SPRING_GREEN("medSpringGreen"),

+

+    /**

+     * Medium Turquoise Preset Color

+     * 

+     */

+    @XmlEnumValue("medTurquoise")

+    MED_TURQUOISE("medTurquoise"),

+

+    /**

+     * Medium Violet Red Preset Color

+     * 

+     */

+    @XmlEnumValue("medVioletRed")

+    MED_VIOLET_RED("medVioletRed"),

+

+    /**

+     * Midnight Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("midnightBlue")

+    MIDNIGHT_BLUE("midnightBlue"),

+

+    /**

+     * Mint Cream Preset Color

+     * 

+     */

+    @XmlEnumValue("mintCream")

+    MINT_CREAM("mintCream"),

+

+    /**

+     * Misty Rose Preset Color

+     * 

+     */

+    @XmlEnumValue("mistyRose")

+    MISTY_ROSE("mistyRose"),

+

+    /**

+     * Moccasin Preset Color

+     * 

+     */

+    @XmlEnumValue("moccasin")

+    MOCCASIN("moccasin"),

+

+    /**

+     * Navajo White Preset Color

+     * 

+     */

+    @XmlEnumValue("navajoWhite")

+    NAVAJO_WHITE("navajoWhite"),

+

+    /**

+     * Navy Preset Color

+     * 

+     */

+    @XmlEnumValue("navy")

+    NAVY("navy"),

+

+    /**

+     * Old Lace Preset Color

+     * 

+     */

+    @XmlEnumValue("oldLace")

+    OLD_LACE("oldLace"),

+

+    /**

+     * Olive Preset Color

+     * 

+     */

+    @XmlEnumValue("olive")

+    OLIVE("olive"),

+

+    /**

+     * Olive Drab Preset Color

+     * 

+     */

+    @XmlEnumValue("oliveDrab")

+    OLIVE_DRAB("oliveDrab"),

+

+    /**

+     * Orange Preset Color

+     * 

+     */

+    @XmlEnumValue("orange")

+    ORANGE("orange"),

+

+    /**

+     * Orange Red Preset Color

+     * 

+     */

+    @XmlEnumValue("orangeRed")

+    ORANGE_RED("orangeRed"),

+

+    /**

+     * Orchid Preset Color

+     * 

+     */

+    @XmlEnumValue("orchid")

+    ORCHID("orchid"),

+

+    /**

+     * Pale Goldenrod Preset Color

+     * 

+     */

+    @XmlEnumValue("paleGoldenrod")

+    PALE_GOLDENROD("paleGoldenrod"),

+

+    /**

+     * Pale Green Preset Color

+     * 

+     */

+    @XmlEnumValue("paleGreen")

+    PALE_GREEN("paleGreen"),

+

+    /**

+     * Pale Turquoise Preset Color

+     * 

+     */

+    @XmlEnumValue("paleTurquoise")

+    PALE_TURQUOISE("paleTurquoise"),

+

+    /**

+     * Pale Violet Red Preset Color

+     * 

+     */

+    @XmlEnumValue("paleVioletRed")

+    PALE_VIOLET_RED("paleVioletRed"),

+

+    /**

+     * Papaya Whip Preset Color

+     * 

+     */

+    @XmlEnumValue("papayaWhip")

+    PAPAYA_WHIP("papayaWhip"),

+

+    /**

+     * Peach Puff Preset Color

+     * 

+     */

+    @XmlEnumValue("peachPuff")

+    PEACH_PUFF("peachPuff"),

+

+    /**

+     * Peru Preset Color

+     * 

+     */

+    @XmlEnumValue("peru")

+    PERU("peru"),

+

+    /**

+     * Pink Preset Color

+     * 

+     */

+    @XmlEnumValue("pink")

+    PINK("pink"),

+

+    /**

+     * Plum Preset Color

+     * 

+     */

+    @XmlEnumValue("plum")

+    PLUM("plum"),

+

+    /**

+     * Powder Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("powderBlue")

+    POWDER_BLUE("powderBlue"),

+

+    /**

+     * Purple Preset Color

+     * 

+     */

+    @XmlEnumValue("purple")

+    PURPLE("purple"),

+

+    /**

+     * Red Preset Color

+     * 

+     */

+    @XmlEnumValue("red")

+    RED("red"),

+

+    /**

+     * Rosy Brown Preset Color

+     * 

+     */

+    @XmlEnumValue("rosyBrown")

+    ROSY_BROWN("rosyBrown"),

+

+    /**

+     * Royal Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("royalBlue")

+    ROYAL_BLUE("royalBlue"),

+

+    /**

+     * Saddle Brown Preset Color

+     * 

+     */

+    @XmlEnumValue("saddleBrown")

+    SADDLE_BROWN("saddleBrown"),

+

+    /**

+     * Salmon Preset Color

+     * 

+     */

+    @XmlEnumValue("salmon")

+    SALMON("salmon"),

+

+    /**

+     * Sandy Brown Preset Color

+     * 

+     */

+    @XmlEnumValue("sandyBrown")

+    SANDY_BROWN("sandyBrown"),

+

+    /**

+     * Sea Green Preset Color

+     * 

+     */

+    @XmlEnumValue("seaGreen")

+    SEA_GREEN("seaGreen"),

+

+    /**

+     * Sea Shell Preset Color

+     * 

+     */

+    @XmlEnumValue("seaShell")

+    SEA_SHELL("seaShell"),

+

+    /**

+     * Sienna Preset Color

+     * 

+     */

+    @XmlEnumValue("sienna")

+    SIENNA("sienna"),

+

+    /**

+     * Silver Preset Color

+     * 

+     */

+    @XmlEnumValue("silver")

+    SILVER("silver"),

+

+    /**

+     * Sky Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("skyBlue")

+    SKY_BLUE("skyBlue"),

+

+    /**

+     * Slate Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("slateBlue")

+    SLATE_BLUE("slateBlue"),

+

+    /**

+     * Slate Gray Preset Color

+     * 

+     */

+    @XmlEnumValue("slateGray")

+    SLATE_GRAY("slateGray"),

+

+    /**

+     * Snow Preset Color

+     * 

+     */

+    @XmlEnumValue("snow")

+    SNOW("snow"),

+

+    /**

+     * Spring Green Preset Color

+     * 

+     */

+    @XmlEnumValue("springGreen")

+    SPRING_GREEN("springGreen"),

+

+    /**

+     * Steel Blue Preset Color

+     * 

+     */

+    @XmlEnumValue("steelBlue")

+    STEEL_BLUE("steelBlue"),

+

+    /**

+     * Tan Preset Color

+     * 

+     */

+    @XmlEnumValue("tan")

+    TAN("tan"),

+

+    /**

+     * Teal Preset Color

+     * 

+     */

+    @XmlEnumValue("teal")

+    TEAL("teal"),

+

+    /**

+     * Thistle Preset Color

+     * 

+     */

+    @XmlEnumValue("thistle")

+    THISTLE("thistle"),

+

+    /**

+     * Tomato Preset Color

+     * 

+     */

+    @XmlEnumValue("tomato")

+    TOMATO("tomato"),

+

+    /**

+     * Turquoise Preset Color

+     * 

+     */

+    @XmlEnumValue("turquoise")

+    TURQUOISE("turquoise"),

+

+    /**

+     * Violet Preset Color

+     * 

+     */

+    @XmlEnumValue("violet")

+    VIOLET("violet"),

+

+    /**

+     * Wheat Preset Color

+     * 

+     */

+    @XmlEnumValue("wheat")

+    WHEAT("wheat"),

+

+    /**

+     * White Preset Color

+     * 

+     */

+    @XmlEnumValue("white")

+    WHITE("white"),

+

+    /**

+     * White Smoke Preset Color

+     * 

+     */

+    @XmlEnumValue("whiteSmoke")

+    WHITE_SMOKE("whiteSmoke"),

+

+    /**

+     * Yellow Preset Color

+     * 

+     */

+    @XmlEnumValue("yellow")

+    YELLOW("yellow"),

+

+    /**

+     * Yellow Green Preset Color

+     * 

+     */

+    @XmlEnumValue("yellowGreen")

+    YELLOW_GREEN("yellowGreen");

+    private final String value;

+

+    STPresetColorVal(String v) {

+        value = v;

+    }

+

+    public String value() {

+        return value;

+    }

+

+    public static STPresetColorVal fromValue(String v) {

+        for (STPresetColorVal c: STPresetColorVal.values()) {

+            if (c.value.equals(v)) {

+                return c;

+            }

+        }

+        throw new IllegalArgumentException(v);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/STRectAlignment.java b/src/java/org/apache/poi/sl/draw/binding/STRectAlignment.java
new file mode 100644
index 0000000..688a166
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/STRectAlignment.java
@@ -0,0 +1,133 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlEnum;

+import javax.xml.bind.annotation.XmlEnumValue;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for ST_RectAlignment.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * <p>

+ * <pre>

+ * &lt;simpleType name="ST_RectAlignment">

+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}token">

+ *     &lt;enumeration value="tl"/>

+ *     &lt;enumeration value="t"/>

+ *     &lt;enumeration value="tr"/>

+ *     &lt;enumeration value="l"/>

+ *     &lt;enumeration value="ctr"/>

+ *     &lt;enumeration value="r"/>

+ *     &lt;enumeration value="bl"/>

+ *     &lt;enumeration value="b"/>

+ *     &lt;enumeration value="br"/>

+ *   &lt;/restriction>

+ * &lt;/simpleType>

+ * </pre>

+ * 

+ */

+@XmlType(name = "ST_RectAlignment", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+@XmlEnum

+public enum STRectAlignment {

+

+

+    /**

+     * Rectangle Alignment Enum ( Top Left )

+     * 

+     */

+    @XmlEnumValue("tl")

+    TL("tl"),

+

+    /**

+     * Rectangle Alignment Enum ( Top )

+     * 

+     */

+    @XmlEnumValue("t")

+    T("t"),

+

+    /**

+     * Rectangle Alignment Enum ( Top Right )

+     * 

+     */

+    @XmlEnumValue("tr")

+    TR("tr"),

+

+    /**

+     * Rectangle Alignment Enum ( Left )

+     * 

+     */

+    @XmlEnumValue("l")

+    L("l"),

+

+    /**

+     * Rectangle Alignment Enum ( Center )

+     * 

+     */

+    @XmlEnumValue("ctr")

+    CTR("ctr"),

+

+    /**

+     * Rectangle Alignment Enum ( Right )

+     * 

+     */

+    @XmlEnumValue("r")

+    R("r"),

+

+    /**

+     * Rectangle Alignment Enum ( Bottom Left )

+     * 

+     */

+    @XmlEnumValue("bl")

+    BL("bl"),

+

+    /**

+     * Rectangle Alignment Enum ( Bottom )

+     * 

+     */

+    @XmlEnumValue("b")

+    B("b"),

+

+    /**

+     * Rectangle Alignment Enum ( Bottom Right )

+     * 

+     */

+    @XmlEnumValue("br")

+    BR("br");

+    private final String value;

+

+    STRectAlignment(String v) {

+        value = v;

+    }

+

+    public String value() {

+        return value;

+    }

+

+    public static STRectAlignment fromValue(String v) {

+        for (STRectAlignment c: STRectAlignment.values()) {

+            if (c.value.equals(v)) {

+                return c;

+            }

+        }

+        throw new IllegalArgumentException(v);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/STSchemeColorVal.java b/src/java/org/apache/poi/sl/draw/binding/STSchemeColorVal.java
new file mode 100644
index 0000000..84b8807
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/STSchemeColorVal.java
@@ -0,0 +1,197 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlEnum;

+import javax.xml.bind.annotation.XmlEnumValue;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for ST_SchemeColorVal.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * <p>

+ * <pre>

+ * &lt;simpleType name="ST_SchemeColorVal">

+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}token">

+ *     &lt;enumeration value="bg1"/>

+ *     &lt;enumeration value="tx1"/>

+ *     &lt;enumeration value="bg2"/>

+ *     &lt;enumeration value="tx2"/>

+ *     &lt;enumeration value="accent1"/>

+ *     &lt;enumeration value="accent2"/>

+ *     &lt;enumeration value="accent3"/>

+ *     &lt;enumeration value="accent4"/>

+ *     &lt;enumeration value="accent5"/>

+ *     &lt;enumeration value="accent6"/>

+ *     &lt;enumeration value="hlink"/>

+ *     &lt;enumeration value="folHlink"/>

+ *     &lt;enumeration value="phClr"/>

+ *     &lt;enumeration value="dk1"/>

+ *     &lt;enumeration value="lt1"/>

+ *     &lt;enumeration value="dk2"/>

+ *     &lt;enumeration value="lt2"/>

+ *   &lt;/restriction>

+ * &lt;/simpleType>

+ * </pre>

+ * 

+ */

+@XmlType(name = "ST_SchemeColorVal", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+@XmlEnum

+public enum STSchemeColorVal {

+

+

+    /**

+     * Background Color 1

+     * 

+     */

+    @XmlEnumValue("bg1")

+    BG_1("bg1"),

+

+    /**

+     * Text Color 1

+     * 

+     */

+    @XmlEnumValue("tx1")

+    TX_1("tx1"),

+

+    /**

+     * Background Color 2

+     * 

+     */

+    @XmlEnumValue("bg2")

+    BG_2("bg2"),

+

+    /**

+     * Text Color 2

+     * 

+     */

+    @XmlEnumValue("tx2")

+    TX_2("tx2"),

+

+    /**

+     * Accent Color 1

+     * 

+     */

+    @XmlEnumValue("accent1")

+    ACCENT_1("accent1"),

+

+    /**

+     * Accent Color 2

+     * 

+     */

+    @XmlEnumValue("accent2")

+    ACCENT_2("accent2"),

+

+    /**

+     * Accent Color 3

+     * 

+     */

+    @XmlEnumValue("accent3")

+    ACCENT_3("accent3"),

+

+    /**

+     * Accent Color 4

+     * 

+     */

+    @XmlEnumValue("accent4")

+    ACCENT_4("accent4"),

+

+    /**

+     * Accent Color 5

+     * 

+     */

+    @XmlEnumValue("accent5")

+    ACCENT_5("accent5"),

+

+    /**

+     * Accent Color 6

+     * 

+     */

+    @XmlEnumValue("accent6")

+    ACCENT_6("accent6"),

+

+    /**

+     * Hyperlink Color

+     * 

+     */

+    @XmlEnumValue("hlink")

+    HLINK("hlink"),

+

+    /**

+     * Followed Hyperlink Color

+     * 

+     */

+    @XmlEnumValue("folHlink")

+    FOL_HLINK("folHlink"),

+

+    /**

+     * Style Color

+     * 

+     */

+    @XmlEnumValue("phClr")

+    PH_CLR("phClr"),

+

+    /**

+     * Dark Color 1

+     * 

+     */

+    @XmlEnumValue("dk1")

+    DK_1("dk1"),

+

+    /**

+     * Light Color 1

+     * 

+     */

+    @XmlEnumValue("lt1")

+    LT_1("lt1"),

+

+    /**

+     * Dark Color 2

+     * 

+     */

+    @XmlEnumValue("dk2")

+    DK_2("dk2"),

+

+    /**

+     * Light Color 2

+     * 

+     */

+    @XmlEnumValue("lt2")

+    LT_2("lt2");

+    private final String value;

+

+    STSchemeColorVal(String v) {

+        value = v;

+    }

+

+    public String value() {

+        return value;

+    }

+

+    public static STSchemeColorVal fromValue(String v) {

+        for (STSchemeColorVal c: STSchemeColorVal.values()) {

+            if (c.value.equals(v)) {

+                return c;

+            }

+        }

+        throw new IllegalArgumentException(v);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/STShapeType.java b/src/java/org/apache/poi/sl/draw/binding/STShapeType.java
new file mode 100644
index 0000000..559b0a1
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/STShapeType.java
@@ -0,0 +1,1557 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlEnum;

+import javax.xml.bind.annotation.XmlEnumValue;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for ST_ShapeType.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * <p>

+ * <pre>

+ * &lt;simpleType name="ST_ShapeType">

+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}token">

+ *     &lt;enumeration value="line"/>

+ *     &lt;enumeration value="lineInv"/>

+ *     &lt;enumeration value="triangle"/>

+ *     &lt;enumeration value="rtTriangle"/>

+ *     &lt;enumeration value="rect"/>

+ *     &lt;enumeration value="diamond"/>

+ *     &lt;enumeration value="parallelogram"/>

+ *     &lt;enumeration value="trapezoid"/>

+ *     &lt;enumeration value="nonIsoscelesTrapezoid"/>

+ *     &lt;enumeration value="pentagon"/>

+ *     &lt;enumeration value="hexagon"/>

+ *     &lt;enumeration value="heptagon"/>

+ *     &lt;enumeration value="octagon"/>

+ *     &lt;enumeration value="decagon"/>

+ *     &lt;enumeration value="dodecagon"/>

+ *     &lt;enumeration value="star4"/>

+ *     &lt;enumeration value="star5"/>

+ *     &lt;enumeration value="star6"/>

+ *     &lt;enumeration value="star7"/>

+ *     &lt;enumeration value="star8"/>

+ *     &lt;enumeration value="star10"/>

+ *     &lt;enumeration value="star12"/>

+ *     &lt;enumeration value="star16"/>

+ *     &lt;enumeration value="star24"/>

+ *     &lt;enumeration value="star32"/>

+ *     &lt;enumeration value="roundRect"/>

+ *     &lt;enumeration value="round1Rect"/>

+ *     &lt;enumeration value="round2SameRect"/>

+ *     &lt;enumeration value="round2DiagRect"/>

+ *     &lt;enumeration value="snipRoundRect"/>

+ *     &lt;enumeration value="snip1Rect"/>

+ *     &lt;enumeration value="snip2SameRect"/>

+ *     &lt;enumeration value="snip2DiagRect"/>

+ *     &lt;enumeration value="plaque"/>

+ *     &lt;enumeration value="ellipse"/>

+ *     &lt;enumeration value="teardrop"/>

+ *     &lt;enumeration value="homePlate"/>

+ *     &lt;enumeration value="chevron"/>

+ *     &lt;enumeration value="pieWedge"/>

+ *     &lt;enumeration value="pie"/>

+ *     &lt;enumeration value="blockArc"/>

+ *     &lt;enumeration value="donut"/>

+ *     &lt;enumeration value="noSmoking"/>

+ *     &lt;enumeration value="rightArrow"/>

+ *     &lt;enumeration value="leftArrow"/>

+ *     &lt;enumeration value="upArrow"/>

+ *     &lt;enumeration value="downArrow"/>

+ *     &lt;enumeration value="stripedRightArrow"/>

+ *     &lt;enumeration value="notchedRightArrow"/>

+ *     &lt;enumeration value="bentUpArrow"/>

+ *     &lt;enumeration value="leftRightArrow"/>

+ *     &lt;enumeration value="upDownArrow"/>

+ *     &lt;enumeration value="leftUpArrow"/>

+ *     &lt;enumeration value="leftRightUpArrow"/>

+ *     &lt;enumeration value="quadArrow"/>

+ *     &lt;enumeration value="leftArrowCallout"/>

+ *     &lt;enumeration value="rightArrowCallout"/>

+ *     &lt;enumeration value="upArrowCallout"/>

+ *     &lt;enumeration value="downArrowCallout"/>

+ *     &lt;enumeration value="leftRightArrowCallout"/>

+ *     &lt;enumeration value="upDownArrowCallout"/>

+ *     &lt;enumeration value="quadArrowCallout"/>

+ *     &lt;enumeration value="bentArrow"/>

+ *     &lt;enumeration value="uturnArrow"/>

+ *     &lt;enumeration value="circularArrow"/>

+ *     &lt;enumeration value="leftCircularArrow"/>

+ *     &lt;enumeration value="leftRightCircularArrow"/>

+ *     &lt;enumeration value="curvedRightArrow"/>

+ *     &lt;enumeration value="curvedLeftArrow"/>

+ *     &lt;enumeration value="curvedUpArrow"/>

+ *     &lt;enumeration value="curvedDownArrow"/>

+ *     &lt;enumeration value="swooshArrow"/>

+ *     &lt;enumeration value="cube"/>

+ *     &lt;enumeration value="can"/>

+ *     &lt;enumeration value="lightningBolt"/>

+ *     &lt;enumeration value="heart"/>

+ *     &lt;enumeration value="sun"/>

+ *     &lt;enumeration value="moon"/>

+ *     &lt;enumeration value="smileyFace"/>

+ *     &lt;enumeration value="irregularSeal1"/>

+ *     &lt;enumeration value="irregularSeal2"/>

+ *     &lt;enumeration value="foldedCorner"/>

+ *     &lt;enumeration value="bevel"/>

+ *     &lt;enumeration value="frame"/>

+ *     &lt;enumeration value="halfFrame"/>

+ *     &lt;enumeration value="corner"/>

+ *     &lt;enumeration value="diagStripe"/>

+ *     &lt;enumeration value="chord"/>

+ *     &lt;enumeration value="arc"/>

+ *     &lt;enumeration value="leftBracket"/>

+ *     &lt;enumeration value="rightBracket"/>

+ *     &lt;enumeration value="leftBrace"/>

+ *     &lt;enumeration value="rightBrace"/>

+ *     &lt;enumeration value="bracketPair"/>

+ *     &lt;enumeration value="bracePair"/>

+ *     &lt;enumeration value="straightConnector1"/>

+ *     &lt;enumeration value="bentConnector2"/>

+ *     &lt;enumeration value="bentConnector3"/>

+ *     &lt;enumeration value="bentConnector4"/>

+ *     &lt;enumeration value="bentConnector5"/>

+ *     &lt;enumeration value="curvedConnector2"/>

+ *     &lt;enumeration value="curvedConnector3"/>

+ *     &lt;enumeration value="curvedConnector4"/>

+ *     &lt;enumeration value="curvedConnector5"/>

+ *     &lt;enumeration value="callout1"/>

+ *     &lt;enumeration value="callout2"/>

+ *     &lt;enumeration value="callout3"/>

+ *     &lt;enumeration value="accentCallout1"/>

+ *     &lt;enumeration value="accentCallout2"/>

+ *     &lt;enumeration value="accentCallout3"/>

+ *     &lt;enumeration value="borderCallout1"/>

+ *     &lt;enumeration value="borderCallout2"/>

+ *     &lt;enumeration value="borderCallout3"/>

+ *     &lt;enumeration value="accentBorderCallout1"/>

+ *     &lt;enumeration value="accentBorderCallout2"/>

+ *     &lt;enumeration value="accentBorderCallout3"/>

+ *     &lt;enumeration value="wedgeRectCallout"/>

+ *     &lt;enumeration value="wedgeRoundRectCallout"/>

+ *     &lt;enumeration value="wedgeEllipseCallout"/>

+ *     &lt;enumeration value="cloudCallout"/>

+ *     &lt;enumeration value="cloud"/>

+ *     &lt;enumeration value="ribbon"/>

+ *     &lt;enumeration value="ribbon2"/>

+ *     &lt;enumeration value="ellipseRibbon"/>

+ *     &lt;enumeration value="ellipseRibbon2"/>

+ *     &lt;enumeration value="leftRightRibbon"/>

+ *     &lt;enumeration value="verticalScroll"/>

+ *     &lt;enumeration value="horizontalScroll"/>

+ *     &lt;enumeration value="wave"/>

+ *     &lt;enumeration value="doubleWave"/>

+ *     &lt;enumeration value="plus"/>

+ *     &lt;enumeration value="flowChartProcess"/>

+ *     &lt;enumeration value="flowChartDecision"/>

+ *     &lt;enumeration value="flowChartInputOutput"/>

+ *     &lt;enumeration value="flowChartPredefinedProcess"/>

+ *     &lt;enumeration value="flowChartInternalStorage"/>

+ *     &lt;enumeration value="flowChartDocument"/>

+ *     &lt;enumeration value="flowChartMultidocument"/>

+ *     &lt;enumeration value="flowChartTerminator"/>

+ *     &lt;enumeration value="flowChartPreparation"/>

+ *     &lt;enumeration value="flowChartManualInput"/>

+ *     &lt;enumeration value="flowChartManualOperation"/>

+ *     &lt;enumeration value="flowChartConnector"/>

+ *     &lt;enumeration value="flowChartPunchedCard"/>

+ *     &lt;enumeration value="flowChartPunchedTape"/>

+ *     &lt;enumeration value="flowChartSummingJunction"/>

+ *     &lt;enumeration value="flowChartOr"/>

+ *     &lt;enumeration value="flowChartCollate"/>

+ *     &lt;enumeration value="flowChartSort"/>

+ *     &lt;enumeration value="flowChartExtract"/>

+ *     &lt;enumeration value="flowChartMerge"/>

+ *     &lt;enumeration value="flowChartOfflineStorage"/>

+ *     &lt;enumeration value="flowChartOnlineStorage"/>

+ *     &lt;enumeration value="flowChartMagneticTape"/>

+ *     &lt;enumeration value="flowChartMagneticDisk"/>

+ *     &lt;enumeration value="flowChartMagneticDrum"/>

+ *     &lt;enumeration value="flowChartDisplay"/>

+ *     &lt;enumeration value="flowChartDelay"/>

+ *     &lt;enumeration value="flowChartAlternateProcess"/>

+ *     &lt;enumeration value="flowChartOffpageConnector"/>

+ *     &lt;enumeration value="actionButtonBlank"/>

+ *     &lt;enumeration value="actionButtonHome"/>

+ *     &lt;enumeration value="actionButtonHelp"/>

+ *     &lt;enumeration value="actionButtonInformation"/>

+ *     &lt;enumeration value="actionButtonForwardNext"/>

+ *     &lt;enumeration value="actionButtonBackPrevious"/>

+ *     &lt;enumeration value="actionButtonEnd"/>

+ *     &lt;enumeration value="actionButtonBeginning"/>

+ *     &lt;enumeration value="actionButtonReturn"/>

+ *     &lt;enumeration value="actionButtonDocument"/>

+ *     &lt;enumeration value="actionButtonSound"/>

+ *     &lt;enumeration value="actionButtonMovie"/>

+ *     &lt;enumeration value="gear6"/>

+ *     &lt;enumeration value="gear9"/>

+ *     &lt;enumeration value="funnel"/>

+ *     &lt;enumeration value="mathPlus"/>

+ *     &lt;enumeration value="mathMinus"/>

+ *     &lt;enumeration value="mathMultiply"/>

+ *     &lt;enumeration value="mathDivide"/>

+ *     &lt;enumeration value="mathEqual"/>

+ *     &lt;enumeration value="mathNotEqual"/>

+ *     &lt;enumeration value="cornerTabs"/>

+ *     &lt;enumeration value="squareTabs"/>

+ *     &lt;enumeration value="plaqueTabs"/>

+ *     &lt;enumeration value="chartX"/>

+ *     &lt;enumeration value="chartStar"/>

+ *     &lt;enumeration value="chartPlus"/>

+ *   &lt;/restriction>

+ * &lt;/simpleType>

+ * </pre>

+ * 

+ */

+@XmlType(name = "ST_ShapeType", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+@XmlEnum

+public enum STShapeType {

+

+

+    /**

+     * Line Shape

+     * 

+     */

+    @XmlEnumValue("line")

+    LINE("line"),

+

+    /**

+     * Line Inverse Shape

+     * 

+     */

+    @XmlEnumValue("lineInv")

+    LINE_INV("lineInv"),

+

+    /**

+     * Triangle Shape

+     * 

+     */

+    @XmlEnumValue("triangle")

+    TRIANGLE("triangle"),

+

+    /**

+     * Right Triangle Shape

+     * 

+     */

+    @XmlEnumValue("rtTriangle")

+    RT_TRIANGLE("rtTriangle"),

+

+    /**

+     * Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("rect")

+    RECT("rect"),

+

+    /**

+     * Diamond Shape

+     * 

+     */

+    @XmlEnumValue("diamond")

+    DIAMOND("diamond"),

+

+    /**

+     * Parallelogram Shape

+     * 

+     */

+    @XmlEnumValue("parallelogram")

+    PARALLELOGRAM("parallelogram"),

+

+    /**

+     * Trapezoid Shape

+     * 

+     */

+    @XmlEnumValue("trapezoid")

+    TRAPEZOID("trapezoid"),

+

+    /**

+     * Non-Isosceles Trapezoid Shape

+     * 

+     */

+    @XmlEnumValue("nonIsoscelesTrapezoid")

+    NON_ISOSCELES_TRAPEZOID("nonIsoscelesTrapezoid"),

+

+    /**

+     * Pentagon Shape

+     * 

+     */

+    @XmlEnumValue("pentagon")

+    PENTAGON("pentagon"),

+

+    /**

+     * Hexagon Shape

+     * 

+     */

+    @XmlEnumValue("hexagon")

+    HEXAGON("hexagon"),

+

+    /**

+     * Heptagon Shape

+     * 

+     */

+    @XmlEnumValue("heptagon")

+    HEPTAGON("heptagon"),

+

+    /**

+     * Octagon Shape

+     * 

+     */

+    @XmlEnumValue("octagon")

+    OCTAGON("octagon"),

+

+    /**

+     * Decagon Shape

+     * 

+     */

+    @XmlEnumValue("decagon")

+    DECAGON("decagon"),

+

+    /**

+     * Dodecagon Shape

+     * 

+     */

+    @XmlEnumValue("dodecagon")

+    DODECAGON("dodecagon"),

+

+    /**

+     * Four Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star4")

+    STAR_4("star4"),

+

+    /**

+     * Five Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star5")

+    STAR_5("star5"),

+

+    /**

+     * Six Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star6")

+    STAR_6("star6"),

+

+    /**

+     * Seven Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star7")

+    STAR_7("star7"),

+

+    /**

+     * Eight Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star8")

+    STAR_8("star8"),

+

+    /**

+     * Ten Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star10")

+    STAR_10("star10"),

+

+    /**

+     * Twelve Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star12")

+    STAR_12("star12"),

+

+    /**

+     * Sixteen Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star16")

+    STAR_16("star16"),

+

+    /**

+     * Twenty Four Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star24")

+    STAR_24("star24"),

+

+    /**

+     * Thirty Two Pointed Star Shape

+     * 

+     */

+    @XmlEnumValue("star32")

+    STAR_32("star32"),

+

+    /**

+     * Round Corner Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("roundRect")

+    ROUND_RECT("roundRect"),

+

+    /**

+     * One Round Corner Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("round1Rect")

+    ROUND_1_RECT("round1Rect"),

+

+    /**

+     * Two Same-side Round Corner Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("round2SameRect")

+    ROUND_2_SAME_RECT("round2SameRect"),

+

+    /**

+     * Two Diagonal Round Corner Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("round2DiagRect")

+    ROUND_2_DIAG_RECT("round2DiagRect"),

+

+    /**

+     * One Snip One Round Corner Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("snipRoundRect")

+    SNIP_ROUND_RECT("snipRoundRect"),

+

+    /**

+     * One Snip Corner Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("snip1Rect")

+    SNIP_1_RECT("snip1Rect"),

+

+    /**

+     * Two Same-side Snip Corner Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("snip2SameRect")

+    SNIP_2_SAME_RECT("snip2SameRect"),

+

+    /**

+     * Two Diagonal Snip Corner Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("snip2DiagRect")

+    SNIP_2_DIAG_RECT("snip2DiagRect"),

+

+    /**

+     * Plaque Shape

+     * 

+     */

+    @XmlEnumValue("plaque")

+    PLAQUE("plaque"),

+

+    /**

+     * Ellipse Shape

+     * 

+     */

+    @XmlEnumValue("ellipse")

+    ELLIPSE("ellipse"),

+

+    /**

+     * Teardrop Shape

+     * 

+     */

+    @XmlEnumValue("teardrop")

+    TEARDROP("teardrop"),

+

+    /**

+     * Home Plate Shape

+     * 

+     */

+    @XmlEnumValue("homePlate")

+    HOME_PLATE("homePlate"),

+

+    /**

+     * Chevron Shape

+     * 

+     */

+    @XmlEnumValue("chevron")

+    CHEVRON("chevron"),

+

+    /**

+     * Pie Wedge Shape

+     * 

+     */

+    @XmlEnumValue("pieWedge")

+    PIE_WEDGE("pieWedge"),

+

+    /**

+     * Pie Shape

+     * 

+     */

+    @XmlEnumValue("pie")

+    PIE("pie"),

+

+    /**

+     * Block Arc Shape

+     * 

+     */

+    @XmlEnumValue("blockArc")

+    BLOCK_ARC("blockArc"),

+

+    /**

+     * Donut Shape

+     * 

+     */

+    @XmlEnumValue("donut")

+    DONUT("donut"),

+

+    /**

+     * No Smoking Shape

+     * 

+     */

+    @XmlEnumValue("noSmoking")

+    NO_SMOKING("noSmoking"),

+

+    /**

+     * Right Arrow Shape

+     * 

+     */

+    @XmlEnumValue("rightArrow")

+    RIGHT_ARROW("rightArrow"),

+

+    /**

+     * Left Arrow Shape

+     * 

+     */

+    @XmlEnumValue("leftArrow")

+    LEFT_ARROW("leftArrow"),

+

+    /**

+     * Up Arrow Shape

+     * 

+     */

+    @XmlEnumValue("upArrow")

+    UP_ARROW("upArrow"),

+

+    /**

+     * Down Arrow Shape

+     * 

+     */

+    @XmlEnumValue("downArrow")

+    DOWN_ARROW("downArrow"),

+

+    /**

+     * Striped Right Arrow Shape

+     * 

+     */

+    @XmlEnumValue("stripedRightArrow")

+    STRIPED_RIGHT_ARROW("stripedRightArrow"),

+

+    /**

+     * Notched Right Arrow Shape

+     * 

+     */

+    @XmlEnumValue("notchedRightArrow")

+    NOTCHED_RIGHT_ARROW("notchedRightArrow"),

+

+    /**

+     * Bent Up Arrow Shape

+     * 

+     */

+    @XmlEnumValue("bentUpArrow")

+    BENT_UP_ARROW("bentUpArrow"),

+

+    /**

+     * Left Right Arrow Shape

+     * 

+     */

+    @XmlEnumValue("leftRightArrow")

+    LEFT_RIGHT_ARROW("leftRightArrow"),

+

+    /**

+     * Up Down Arrow Shape

+     * 

+     */

+    @XmlEnumValue("upDownArrow")

+    UP_DOWN_ARROW("upDownArrow"),

+

+    /**

+     * Left Up Arrow Shape

+     * 

+     */

+    @XmlEnumValue("leftUpArrow")

+    LEFT_UP_ARROW("leftUpArrow"),

+

+    /**

+     * Left Right Up Arrow Shape

+     * 

+     */

+    @XmlEnumValue("leftRightUpArrow")

+    LEFT_RIGHT_UP_ARROW("leftRightUpArrow"),

+

+    /**

+     * Quad-Arrow Shape

+     * 

+     */

+    @XmlEnumValue("quadArrow")

+    QUAD_ARROW("quadArrow"),

+

+    /**

+     * Callout Left Arrow Shape

+     * 

+     */

+    @XmlEnumValue("leftArrowCallout")

+    LEFT_ARROW_CALLOUT("leftArrowCallout"),

+

+    /**

+     * Callout Right Arrow Shape

+     * 

+     */

+    @XmlEnumValue("rightArrowCallout")

+    RIGHT_ARROW_CALLOUT("rightArrowCallout"),

+

+    /**

+     * Callout Up Arrow Shape

+     * 

+     */

+    @XmlEnumValue("upArrowCallout")

+    UP_ARROW_CALLOUT("upArrowCallout"),

+

+    /**

+     * Callout Down Arrow Shape

+     * 

+     */

+    @XmlEnumValue("downArrowCallout")

+    DOWN_ARROW_CALLOUT("downArrowCallout"),

+

+    /**

+     * Callout Left Right Arrow Shape

+     * 

+     */

+    @XmlEnumValue("leftRightArrowCallout")

+    LEFT_RIGHT_ARROW_CALLOUT("leftRightArrowCallout"),

+

+    /**

+     * Callout Up Down Arrow Shape

+     * 

+     */

+    @XmlEnumValue("upDownArrowCallout")

+    UP_DOWN_ARROW_CALLOUT("upDownArrowCallout"),

+

+    /**

+     * Callout Quad-Arrow Shape

+     * 

+     */

+    @XmlEnumValue("quadArrowCallout")

+    QUAD_ARROW_CALLOUT("quadArrowCallout"),

+

+    /**

+     * Bent Arrow Shape

+     * 

+     */

+    @XmlEnumValue("bentArrow")

+    BENT_ARROW("bentArrow"),

+

+    /**

+     * U-Turn Arrow Shape

+     * 

+     */

+    @XmlEnumValue("uturnArrow")

+    UTURN_ARROW("uturnArrow"),

+

+    /**

+     * Circular Arrow Shape

+     * 

+     */

+    @XmlEnumValue("circularArrow")

+    CIRCULAR_ARROW("circularArrow"),

+

+    /**

+     * Left Circular Arrow Shape

+     * 

+     */

+    @XmlEnumValue("leftCircularArrow")

+    LEFT_CIRCULAR_ARROW("leftCircularArrow"),

+

+    /**

+     * Left Right Circular Arrow Shape

+     * 

+     */

+    @XmlEnumValue("leftRightCircularArrow")

+    LEFT_RIGHT_CIRCULAR_ARROW("leftRightCircularArrow"),

+

+    /**

+     * Curved Right Arrow Shape

+     * 

+     */

+    @XmlEnumValue("curvedRightArrow")

+    CURVED_RIGHT_ARROW("curvedRightArrow"),

+

+    /**

+     * Curved Left Arrow Shape

+     * 

+     */

+    @XmlEnumValue("curvedLeftArrow")

+    CURVED_LEFT_ARROW("curvedLeftArrow"),

+

+    /**

+     * Curved Up Arrow Shape

+     * 

+     */

+    @XmlEnumValue("curvedUpArrow")

+    CURVED_UP_ARROW("curvedUpArrow"),

+

+    /**

+     * Curved Down Arrow Shape

+     * 

+     */

+    @XmlEnumValue("curvedDownArrow")

+    CURVED_DOWN_ARROW("curvedDownArrow"),

+

+    /**

+     * Swoosh Arrow Shape

+     * 

+     */

+    @XmlEnumValue("swooshArrow")

+    SWOOSH_ARROW("swooshArrow"),

+

+    /**

+     * Cube Shape

+     * 

+     */

+    @XmlEnumValue("cube")

+    CUBE("cube"),

+

+    /**

+     * Can Shape

+     * 

+     */

+    @XmlEnumValue("can")

+    CAN("can"),

+

+    /**

+     * Lightning Bolt Shape

+     * 

+     */

+    @XmlEnumValue("lightningBolt")

+    LIGHTNING_BOLT("lightningBolt"),

+

+    /**

+     * Heart Shape

+     * 

+     */

+    @XmlEnumValue("heart")

+    HEART("heart"),

+

+    /**

+     * Sun Shape

+     * 

+     */

+    @XmlEnumValue("sun")

+    SUN("sun"),

+

+    /**

+     * Moon Shape

+     * 

+     */

+    @XmlEnumValue("moon")

+    MOON("moon"),

+

+    /**

+     * Smiley Face Shape

+     * 

+     */

+    @XmlEnumValue("smileyFace")

+    SMILEY_FACE("smileyFace"),

+

+    /**

+     * Irregular Seal 1 Shape

+     * 

+     */

+    @XmlEnumValue("irregularSeal1")

+    IRREGULAR_SEAL_1("irregularSeal1"),

+

+    /**

+     * Irregular Seal 2 Shape

+     * 

+     */

+    @XmlEnumValue("irregularSeal2")

+    IRREGULAR_SEAL_2("irregularSeal2"),

+

+    /**

+     * Folded Corner Shape

+     * 

+     */

+    @XmlEnumValue("foldedCorner")

+    FOLDED_CORNER("foldedCorner"),

+

+    /**

+     * Bevel Shape

+     * 

+     */

+    @XmlEnumValue("bevel")

+    BEVEL("bevel"),

+

+    /**

+     * Frame Shape

+     * 

+     */

+    @XmlEnumValue("frame")

+    FRAME("frame"),

+

+    /**

+     * Half Frame Shape

+     * 

+     */

+    @XmlEnumValue("halfFrame")

+    HALF_FRAME("halfFrame"),

+

+    /**

+     * Corner Shape

+     * 

+     */

+    @XmlEnumValue("corner")

+    CORNER("corner"),

+

+    /**

+     * Diagonal Stripe Shape

+     * 

+     */

+    @XmlEnumValue("diagStripe")

+    DIAG_STRIPE("diagStripe"),

+

+    /**

+     * Chord Shape

+     * 

+     */

+    @XmlEnumValue("chord")

+    CHORD("chord"),

+

+    /**

+     * Curved Arc Shape

+     * 

+     */

+    @XmlEnumValue("arc")

+    ARC("arc"),

+

+    /**

+     * Left Bracket Shape

+     * 

+     */

+    @XmlEnumValue("leftBracket")

+    LEFT_BRACKET("leftBracket"),

+

+    /**

+     * Right Bracket Shape

+     * 

+     */

+    @XmlEnumValue("rightBracket")

+    RIGHT_BRACKET("rightBracket"),

+

+    /**

+     * Left Brace Shape

+     * 

+     */

+    @XmlEnumValue("leftBrace")

+    LEFT_BRACE("leftBrace"),

+

+    /**

+     * Right Brace Shape

+     * 

+     */

+    @XmlEnumValue("rightBrace")

+    RIGHT_BRACE("rightBrace"),

+

+    /**

+     * Bracket Pair Shape

+     * 

+     */

+    @XmlEnumValue("bracketPair")

+    BRACKET_PAIR("bracketPair"),

+

+    /**

+     * Brace Pair Shape

+     * 

+     */

+    @XmlEnumValue("bracePair")

+    BRACE_PAIR("bracePair"),

+

+    /**

+     * Straight Connector 1 Shape

+     * 

+     */

+    @XmlEnumValue("straightConnector1")

+    STRAIGHT_CONNECTOR_1("straightConnector1"),

+

+    /**

+     * Bent Connector 2 Shape

+     * 

+     */

+    @XmlEnumValue("bentConnector2")

+    BENT_CONNECTOR_2("bentConnector2"),

+

+    /**

+     * Bent Connector 3 Shape

+     * 

+     */

+    @XmlEnumValue("bentConnector3")

+    BENT_CONNECTOR_3("bentConnector3"),

+

+    /**

+     * Bent Connector 4 Shape

+     * 

+     */

+    @XmlEnumValue("bentConnector4")

+    BENT_CONNECTOR_4("bentConnector4"),

+

+    /**

+     * Bent Connector 5 Shape

+     * 

+     */

+    @XmlEnumValue("bentConnector5")

+    BENT_CONNECTOR_5("bentConnector5"),

+

+    /**

+     * Curved Connector 2 Shape

+     * 

+     */

+    @XmlEnumValue("curvedConnector2")

+    CURVED_CONNECTOR_2("curvedConnector2"),

+

+    /**

+     * Curved Connector 3 Shape

+     * 

+     */

+    @XmlEnumValue("curvedConnector3")

+    CURVED_CONNECTOR_3("curvedConnector3"),

+

+    /**

+     * Curved Connector 4 Shape

+     * 

+     */

+    @XmlEnumValue("curvedConnector4")

+    CURVED_CONNECTOR_4("curvedConnector4"),

+

+    /**

+     * Curved Connector 5 Shape

+     * 

+     */

+    @XmlEnumValue("curvedConnector5")

+    CURVED_CONNECTOR_5("curvedConnector5"),

+

+    /**

+     * Callout 1 Shape

+     * 

+     */

+    @XmlEnumValue("callout1")

+    CALLOUT_1("callout1"),

+

+    /**

+     * Callout 2 Shape

+     * 

+     */

+    @XmlEnumValue("callout2")

+    CALLOUT_2("callout2"),

+

+    /**

+     * Callout 3 Shape

+     * 

+     */

+    @XmlEnumValue("callout3")

+    CALLOUT_3("callout3"),

+

+    /**

+     * Callout 1 Shape

+     * 

+     */

+    @XmlEnumValue("accentCallout1")

+    ACCENT_CALLOUT_1("accentCallout1"),

+

+    /**

+     * Callout 2 Shape

+     * 

+     */

+    @XmlEnumValue("accentCallout2")

+    ACCENT_CALLOUT_2("accentCallout2"),

+

+    /**

+     * Callout 3 Shape

+     * 

+     */

+    @XmlEnumValue("accentCallout3")

+    ACCENT_CALLOUT_3("accentCallout3"),

+

+    /**

+     * Callout 1 with Border Shape

+     * 

+     */

+    @XmlEnumValue("borderCallout1")

+    BORDER_CALLOUT_1("borderCallout1"),

+

+    /**

+     * Callout 2 with Border Shape

+     * 

+     */

+    @XmlEnumValue("borderCallout2")

+    BORDER_CALLOUT_2("borderCallout2"),

+

+    /**

+     * Callout 3 with Border Shape

+     * 

+     */

+    @XmlEnumValue("borderCallout3")

+    BORDER_CALLOUT_3("borderCallout3"),

+

+    /**

+     * Callout 1 with Border and Accent Shape

+     * 

+     */

+    @XmlEnumValue("accentBorderCallout1")

+    ACCENT_BORDER_CALLOUT_1("accentBorderCallout1"),

+

+    /**

+     * Callout 2 with Border and Accent Shape

+     * 

+     */

+    @XmlEnumValue("accentBorderCallout2")

+    ACCENT_BORDER_CALLOUT_2("accentBorderCallout2"),

+

+    /**

+     * Callout 3 with Border and Accent Shape

+     * 

+     */

+    @XmlEnumValue("accentBorderCallout3")

+    ACCENT_BORDER_CALLOUT_3("accentBorderCallout3"),

+

+    /**

+     * Callout Wedge Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("wedgeRectCallout")

+    WEDGE_RECT_CALLOUT("wedgeRectCallout"),

+

+    /**

+     * Callout Wedge Round Rectangle Shape

+     * 

+     */

+    @XmlEnumValue("wedgeRoundRectCallout")

+    WEDGE_ROUND_RECT_CALLOUT("wedgeRoundRectCallout"),

+

+    /**

+     * Callout Wedge Ellipse Shape

+     * 

+     */

+    @XmlEnumValue("wedgeEllipseCallout")

+    WEDGE_ELLIPSE_CALLOUT("wedgeEllipseCallout"),

+

+    /**

+     * Callout Cloud Shape

+     * 

+     */

+    @XmlEnumValue("cloudCallout")

+    CLOUD_CALLOUT("cloudCallout"),

+

+    /**

+     * Cloud Shape

+     * 

+     */

+    @XmlEnumValue("cloud")

+    CLOUD("cloud"),

+

+    /**

+     * Ribbon Shape

+     * 

+     */

+    @XmlEnumValue("ribbon")

+    RIBBON("ribbon"),

+

+    /**

+     * Ribbon 2 Shape

+     * 

+     */

+    @XmlEnumValue("ribbon2")

+    RIBBON_2("ribbon2"),

+

+    /**

+     * Ellipse Ribbon Shape

+     * 

+     */

+    @XmlEnumValue("ellipseRibbon")

+    ELLIPSE_RIBBON("ellipseRibbon"),

+

+    /**

+     * Ellipse Ribbon 2 Shape

+     * 

+     */

+    @XmlEnumValue("ellipseRibbon2")

+    ELLIPSE_RIBBON_2("ellipseRibbon2"),

+

+    /**

+     * Left Right Ribbon Shape

+     * 

+     */

+    @XmlEnumValue("leftRightRibbon")

+    LEFT_RIGHT_RIBBON("leftRightRibbon"),

+

+    /**

+     * Vertical Scroll Shape

+     * 

+     */

+    @XmlEnumValue("verticalScroll")

+    VERTICAL_SCROLL("verticalScroll"),

+

+    /**

+     * Horizontal Scroll Shape

+     * 

+     */

+    @XmlEnumValue("horizontalScroll")

+    HORIZONTAL_SCROLL("horizontalScroll"),

+

+    /**

+     * Wave Shape

+     * 

+     */

+    @XmlEnumValue("wave")

+    WAVE("wave"),

+

+    /**

+     * Double Wave Shape

+     * 

+     */

+    @XmlEnumValue("doubleWave")

+    DOUBLE_WAVE("doubleWave"),

+

+    /**

+     * Plus Shape

+     * 

+     */

+    @XmlEnumValue("plus")

+    PLUS("plus"),

+

+    /**

+     * Process Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartProcess")

+    FLOW_CHART_PROCESS("flowChartProcess"),

+

+    /**

+     * Decision Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartDecision")

+    FLOW_CHART_DECISION("flowChartDecision"),

+

+    /**

+     * Input Output Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartInputOutput")

+    FLOW_CHART_INPUT_OUTPUT("flowChartInputOutput"),

+

+    /**

+     * Predefined Process Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartPredefinedProcess")

+    FLOW_CHART_PREDEFINED_PROCESS("flowChartPredefinedProcess"),

+

+    /**

+     * Internal Storage Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartInternalStorage")

+    FLOW_CHART_INTERNAL_STORAGE("flowChartInternalStorage"),

+

+    /**

+     * Document Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartDocument")

+    FLOW_CHART_DOCUMENT("flowChartDocument"),

+

+    /**

+     * Multi-Document Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartMultidocument")

+    FLOW_CHART_MULTIDOCUMENT("flowChartMultidocument"),

+

+    /**

+     * Terminator Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartTerminator")

+    FLOW_CHART_TERMINATOR("flowChartTerminator"),

+

+    /**

+     * Preparation Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartPreparation")

+    FLOW_CHART_PREPARATION("flowChartPreparation"),

+

+    /**

+     * Manual Input Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartManualInput")

+    FLOW_CHART_MANUAL_INPUT("flowChartManualInput"),

+

+    /**

+     * Manual Operation Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartManualOperation")

+    FLOW_CHART_MANUAL_OPERATION("flowChartManualOperation"),

+

+    /**

+     * Connector Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartConnector")

+    FLOW_CHART_CONNECTOR("flowChartConnector"),

+

+    /**

+     * Punched Card Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartPunchedCard")

+    FLOW_CHART_PUNCHED_CARD("flowChartPunchedCard"),

+

+    /**

+     * Punched Tape Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartPunchedTape")

+    FLOW_CHART_PUNCHED_TAPE("flowChartPunchedTape"),

+

+    /**

+     * Summing Junction Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartSummingJunction")

+    FLOW_CHART_SUMMING_JUNCTION("flowChartSummingJunction"),

+

+    /**

+     * Or Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartOr")

+    FLOW_CHART_OR("flowChartOr"),

+

+    /**

+     * Collate Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartCollate")

+    FLOW_CHART_COLLATE("flowChartCollate"),

+

+    /**

+     * Sort Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartSort")

+    FLOW_CHART_SORT("flowChartSort"),

+

+    /**

+     * Extract Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartExtract")

+    FLOW_CHART_EXTRACT("flowChartExtract"),

+

+    /**

+     * Merge Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartMerge")

+    FLOW_CHART_MERGE("flowChartMerge"),

+

+    /**

+     * Offline Storage Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartOfflineStorage")

+    FLOW_CHART_OFFLINE_STORAGE("flowChartOfflineStorage"),

+

+    /**

+     * Online Storage Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartOnlineStorage")

+    FLOW_CHART_ONLINE_STORAGE("flowChartOnlineStorage"),

+

+    /**

+     * Magnetic Tape Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartMagneticTape")

+    FLOW_CHART_MAGNETIC_TAPE("flowChartMagneticTape"),

+

+    /**

+     * Magnetic Disk Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartMagneticDisk")

+    FLOW_CHART_MAGNETIC_DISK("flowChartMagneticDisk"),

+

+    /**

+     * Magnetic Drum Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartMagneticDrum")

+    FLOW_CHART_MAGNETIC_DRUM("flowChartMagneticDrum"),

+

+    /**

+     * Display Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartDisplay")

+    FLOW_CHART_DISPLAY("flowChartDisplay"),

+

+    /**

+     * Delay Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartDelay")

+    FLOW_CHART_DELAY("flowChartDelay"),

+

+    /**

+     * Alternate Process Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartAlternateProcess")

+    FLOW_CHART_ALTERNATE_PROCESS("flowChartAlternateProcess"),

+

+    /**

+     * Off-Page Connector Flow Shape

+     * 

+     */

+    @XmlEnumValue("flowChartOffpageConnector")

+    FLOW_CHART_OFFPAGE_CONNECTOR("flowChartOffpageConnector"),

+

+    /**

+     * Blank Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonBlank")

+    ACTION_BUTTON_BLANK("actionButtonBlank"),

+

+    /**

+     * Home Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonHome")

+    ACTION_BUTTON_HOME("actionButtonHome"),

+

+    /**

+     * Help Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonHelp")

+    ACTION_BUTTON_HELP("actionButtonHelp"),

+

+    /**

+     * Information Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonInformation")

+    ACTION_BUTTON_INFORMATION("actionButtonInformation"),

+

+    /**

+     * Forward or Next Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonForwardNext")

+    ACTION_BUTTON_FORWARD_NEXT("actionButtonForwardNext"),

+

+    /**

+     * Back or Previous Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonBackPrevious")

+    ACTION_BUTTON_BACK_PREVIOUS("actionButtonBackPrevious"),

+

+    /**

+     * End Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonEnd")

+    ACTION_BUTTON_END("actionButtonEnd"),

+

+    /**

+     * Beginning Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonBeginning")

+    ACTION_BUTTON_BEGINNING("actionButtonBeginning"),

+

+    /**

+     * Return Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonReturn")

+    ACTION_BUTTON_RETURN("actionButtonReturn"),

+

+    /**

+     * Document Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonDocument")

+    ACTION_BUTTON_DOCUMENT("actionButtonDocument"),

+

+    /**

+     * Sound Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonSound")

+    ACTION_BUTTON_SOUND("actionButtonSound"),

+

+    /**

+     * Movie Button Shape

+     * 

+     */

+    @XmlEnumValue("actionButtonMovie")

+    ACTION_BUTTON_MOVIE("actionButtonMovie"),

+

+    /**

+     * Gear 6 Shape

+     * 

+     */

+    @XmlEnumValue("gear6")

+    GEAR_6("gear6"),

+

+    /**

+     * Gear 9 Shape

+     * 

+     */

+    @XmlEnumValue("gear9")

+    GEAR_9("gear9"),

+

+    /**

+     * Funnel Shape

+     * 

+     */

+    @XmlEnumValue("funnel")

+    FUNNEL("funnel"),

+

+    /**

+     * Plus Math Shape

+     * 

+     */

+    @XmlEnumValue("mathPlus")

+    MATH_PLUS("mathPlus"),

+

+    /**

+     * Minus Math Shape

+     * 

+     */

+    @XmlEnumValue("mathMinus")

+    MATH_MINUS("mathMinus"),

+

+    /**

+     * Multiply Math Shape

+     * 

+     */

+    @XmlEnumValue("mathMultiply")

+    MATH_MULTIPLY("mathMultiply"),

+

+    /**

+     * Divide Math Shape

+     * 

+     */

+    @XmlEnumValue("mathDivide")

+    MATH_DIVIDE("mathDivide"),

+

+    /**

+     * Equal Math Shape

+     * 

+     */

+    @XmlEnumValue("mathEqual")

+    MATH_EQUAL("mathEqual"),

+

+    /**

+     * Not Equal Math Shape

+     * 

+     */

+    @XmlEnumValue("mathNotEqual")

+    MATH_NOT_EQUAL("mathNotEqual"),

+

+    /**

+     * Corner Tabs Shape

+     * 

+     */

+    @XmlEnumValue("cornerTabs")

+    CORNER_TABS("cornerTabs"),

+

+    /**

+     * Square Tabs Shape

+     * 

+     */

+    @XmlEnumValue("squareTabs")

+    SQUARE_TABS("squareTabs"),

+

+    /**

+     * Plaque Tabs Shape

+     * 

+     */

+    @XmlEnumValue("plaqueTabs")

+    PLAQUE_TABS("plaqueTabs"),

+

+    /**

+     * Chart X Shape

+     * 

+     */

+    @XmlEnumValue("chartX")

+    CHART_X("chartX"),

+

+    /**

+     * Chart Star Shape

+     * 

+     */

+    @XmlEnumValue("chartStar")

+    CHART_STAR("chartStar"),

+

+    /**

+     * Chart Plus Shape

+     * 

+     */

+    @XmlEnumValue("chartPlus")

+    CHART_PLUS("chartPlus");

+    private final String value;

+

+    STShapeType(String v) {

+        value = v;

+    }

+

+    public String value() {

+        return value;

+    }

+

+    public static STShapeType fromValue(String v) {

+        for (STShapeType c: STShapeType.values()) {

+            if (c.value.equals(v)) {

+                return c;

+            }

+        }

+        throw new IllegalArgumentException(v);

+    }

+

+}

diff --git a/src/java/org/apache/poi/sl/draw/binding/STTextShapeType.java b/src/java/org/apache/poi/sl/draw/binding/STTextShapeType.java
new file mode 100644
index 0000000..f3ed4b0
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/binding/STTextShapeType.java
@@ -0,0 +1,389 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.draw.binding;

+

+import javax.xml.bind.annotation.XmlEnum;

+import javax.xml.bind.annotation.XmlEnumValue;

+import javax.xml.bind.annotation.XmlType;

+

+

+/**

+ * <p>Java class for ST_TextShapeType.

+ * 

+ * <p>The following schema fragment specifies the expected content contained within this class.

+ * <p>

+ * <pre>

+ * &lt;simpleType name="ST_TextShapeType">

+ *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}token">

+ *     &lt;enumeration value="textNoShape"/>

+ *     &lt;enumeration value="textPlain"/>

+ *     &lt;enumeration value="textStop"/>

+ *     &lt;enumeration value="textTriangle"/>

+ *     &lt;enumeration value="textTriangleInverted"/>

+ *     &lt;enumeration value="textChevron"/>

+ *     &lt;enumeration value="textChevronInverted"/>

+ *     &lt;enumeration value="textRingInside"/>

+ *     &lt;enumeration value="textRingOutside"/>

+ *     &lt;enumeration value="textArchUp"/>

+ *     &lt;enumeration value="textArchDown"/>

+ *     &lt;enumeration value="textCircle"/>

+ *     &lt;enumeration value="textButton"/>

+ *     &lt;enumeration value="textArchUpPour"/>

+ *     &lt;enumeration value="textArchDownPour"/>

+ *     &lt;enumeration value="textCirclePour"/>

+ *     &lt;enumeration value="textButtonPour"/>

+ *     &lt;enumeration value="textCurveUp"/>

+ *     &lt;enumeration value="textCurveDown"/>

+ *     &lt;enumeration value="textCanUp"/>

+ *     &lt;enumeration value="textCanDown"/>

+ *     &lt;enumeration value="textWave1"/>

+ *     &lt;enumeration value="textWave2"/>

+ *     &lt;enumeration value="textDoubleWave1"/>

+ *     &lt;enumeration value="textWave4"/>

+ *     &lt;enumeration value="textInflate"/>

+ *     &lt;enumeration value="textDeflate"/>

+ *     &lt;enumeration value="textInflateBottom"/>

+ *     &lt;enumeration value="textDeflateBottom"/>

+ *     &lt;enumeration value="textInflateTop"/>

+ *     &lt;enumeration value="textDeflateTop"/>

+ *     &lt;enumeration value="textDeflateInflate"/>

+ *     &lt;enumeration value="textDeflateInflateDeflate"/>

+ *     &lt;enumeration value="textFadeRight"/>

+ *     &lt;enumeration value="textFadeLeft"/>

+ *     &lt;enumeration value="textFadeUp"/>

+ *     &lt;enumeration value="textFadeDown"/>

+ *     &lt;enumeration value="textSlantUp"/>

+ *     &lt;enumeration value="textSlantDown"/>

+ *     &lt;enumeration value="textCascadeUp"/>

+ *     &lt;enumeration value="textCascadeDown"/>

+ *   &lt;/restriction>

+ * &lt;/simpleType>

+ * </pre>

+ * 

+ */

+@XmlType(name = "ST_TextShapeType", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")

+@XmlEnum

+public enum STTextShapeType {

+

+

+    /**

+     * No Text Shape

+     * 

+     */

+    @XmlEnumValue("textNoShape")

+    TEXT_NO_SHAPE("textNoShape"),

+

+    /**

+     * Plain Text Shape

+     * 

+     */

+    @XmlEnumValue("textPlain")

+    TEXT_PLAIN("textPlain"),

+

+    /**

+     * Stop Sign Text Shape

+     * 

+     */

+    @XmlEnumValue("textStop")

+    TEXT_STOP("textStop"),

+

+    /**

+     * Triangle Text Shape

+     * 

+     */

+    @XmlEnumValue("textTriangle")

+    TEXT_TRIANGLE("textTriangle"),

+

+    /**

+     * Inverted Triangle Text Shape

+     * 

+     */

+    @XmlEnumValue("textTriangleInverted")

+    TEXT_TRIANGLE_INVERTED("textTriangleInverted"),

+

+    /**

+     * Chevron Text Shape

+     * 

+     */

+    @XmlEnumValue("textChevron")

+    TEXT_CHEVRON("textChevron"),

+

+    /**

+     * Inverted Chevron Text Shape

+     * 

+     */

+    @XmlEnumValue("textChevronInverted")

+    TEXT_CHEVRON_INVERTED("textChevronInverted"),

+

+    /**

+     * Inside Ring Text Shape

+     * 

+     */

+    @XmlEnumValue("textRingInside")

+    TEXT_RING_INSIDE("textRingInside"),

+

+    /**

+     * Outside Ring Text Shape

+     * 

+     */

+    @XmlEnumValue("textRingOutside")

+    TEXT_RING_OUTSIDE("textRingOutside"),

+

+    /**

+     * Upward Arch Text Shape

+     * 

+     */

+    @XmlEnumValue("textArchUp")

+    TEXT_ARCH_UP("textArchUp"),

+

+    /**

+     * Downward Arch Text Shape

+     * 

+     */

+    @XmlEnumValue("textArchDown")

+    TEXT_ARCH_DOWN("textArchDown"),

+

+    /**

+     * Circle Text Shape

+     * 

+     */

+    @XmlEnumValue("textCircle")

+    TEXT_CIRCLE("textCircle"),

+

+    /**

+     * Button Text Shape

+     * 

+     */

+    @XmlEnumValue("textButton")

+    TEXT_BUTTON("textButton"),

+

+    /**

+     * Upward Pour Arch Text Shape

+     * 

+     */

+    @XmlEnumValue("textArchUpPour")

+    TEXT_ARCH_UP_POUR("textArchUpPour"),

+

+    /**

+     * Downward Pour Arch Text Shape

+     * 

+     */

+    @XmlEnumValue("textArchDownPour")

+    TEXT_ARCH_DOWN_POUR("textArchDownPour"),

+

+    /**

+     * Circle Pour Text Shape

+     * 

+     */

+    @XmlEnumValue("textCirclePour")

+    TEXT_CIRCLE_POUR("textCirclePour"),

+

+    /**

+     * Button Pour Text Shape

+     * 

+     */

+    @XmlEnumValue("textButtonPour")

+    TEXT_BUTTON_POUR("textButtonPour"),

+

+    /**

+     * Upward Curve Text Shape

+     * 

+     */

+    @XmlEnumValue("textCurveUp")

+    TEXT_CURVE_UP("textCurveUp"),

+

+    /**

+     * Downward Curve Text Shape

+     * 

+     */

+    @XmlEnumValue("textCurveDown")

+    TEXT_CURVE_DOWN("textCurveDown"),

+

+    /**

+     * Upward Can Text Shape

+     * 

+     */

+    @XmlEnumValue("textCanUp")

+    TEXT_CAN_UP("textCanUp"),

+

+    /**

+     * Downward Can Text Shape

+     * 

+     */

+    @XmlEnumValue("textCanDown")

+    TEXT_CAN_DOWN("textCanDown"),

+

+    /**

+     * Wave 1 Text Shape

+     * 

+     */

+    @XmlEnumValue("textWave1")

+    TEXT_WAVE_1("textWave1"),

+

+    /**

+     * Wave 2 Text Shape

+     * 

+     */

+    @XmlEnumValue("textWave2")

+    TEXT_WAVE_2("textWave2"),

+

+    /**

+     * Double Wave 1 Text Shape

+     * 

+     */

+    @XmlEnumValue("textDoubleWave1")

+    TEXT_DOUBLE_WAVE_1("textDoubleWave1"),

+

+    /**

+     * Wave 4 Text Shape

+     * 

+     */

+    @XmlEnumValue("textWave4")

+    TEXT_WAVE_4("textWave4"),

+

+    /**

+     * Inflate Text Shape

+     * 

+     */

+    @XmlEnumValue("textInflate")

+    TEXT_INFLATE("textInflate"),

+

+    /**

+     * Deflate Text Shape

+     * 

+     */

+    @XmlEnumValue("textDeflate")

+    TEXT_DEFLATE("textDeflate"),

+

+    /**

+     * Bottom Inflate Text Shape

+     * 

+     */

+    @XmlEnumValue("textInflateBottom")

+    TEXT_INFLATE_BOTTOM("textInflateBottom"),

+

+    /**

+     * Bottom Deflate Text Shape

+     * 

+     */

+    @XmlEnumValue("textDeflateBottom")

+    TEXT_DEFLATE_BOTTOM("textDeflateBottom"),

+

+    /**

+     * Top Inflate Text Shape

+     * 

+     */

+    @XmlEnumValue("textInflateTop")

+    TEXT_INFLATE_TOP("textInflateTop"),

+

+    /**

+     * Top Deflate Text Shape

+     * 

+     */

+    @XmlEnumValue("textDeflateTop")

+    TEXT_DEFLATE_TOP("textDeflateTop"),

+

+    /**

+     * Deflate-Inflate Text Shape

+     * 

+     */

+    @XmlEnumValue("textDeflateInflate")

+    TEXT_DEFLATE_INFLATE("textDeflateInflate"),

+

+    /**

+     * Deflate-Inflate-Deflate Text Shape

+     * 

+     */

+    @XmlEnumValue("textDeflateInflateDeflate")

+    TEXT_DEFLATE_INFLATE_DEFLATE("textDeflateInflateDeflate"),

+

+    /**

+     * Right Fade Text Shape

+     * 

+     */

+    @XmlEnumValue("textFadeRight")

+    TEXT_FADE_RIGHT("textFadeRight"),

+

+    /**

+     * Left Fade Text Shape

+     * 

+     */

+    @XmlEnumValue("textFadeLeft")

+    TEXT_FADE_LEFT("textFadeLeft"),

+

+    /**

+     * Upward Fade Text Shape

+     * 

+     */

+    @XmlEnumValue("textFadeUp")

+    TEXT_FADE_UP("textFadeUp"),

+

+    /**

+     * Downward Fade Text Shape

+     * 

+     */

+    @XmlEnumValue("textFadeDown")

+    TEXT_FADE_DOWN("textFadeDown"),

+

+    /**

+     * Upward Slant Text Shape

+     * 

+     */

+    @XmlEnumValue("textSlantUp")

+    TEXT_SLANT_UP("textSlantUp"),

+

+    /**

+     * Downward Slant Text Shape

+     * 

+     */

+    @XmlEnumValue("textSlantDown")

+    TEXT_SLANT_DOWN("textSlantDown"),

+

+    /**

+     * Upward Cascade Text Shape

+     * 

+     */

+    @XmlEnumValue("textCascadeUp")

+    TEXT_CASCADE_UP("textCascadeUp"),

+

+    /**

+     * Downward Cascade Text Shape

+     * 

+     */

+    @XmlEnumValue("textCascadeDown")

+    TEXT_CASCADE_DOWN("textCascadeDown");

+    private final String value;

+

+    STTextShapeType(String v) {

+        value = v;

+    }

+

+    public String value() {

+        return value;

+    }

+

+    public static STTextShapeType fromValue(String v) {

+        for (STTextShapeType c: STTextShapeType.values()) {

+            if (c.value.equals(v)) {

+                return c;

+            }

+        }

+        throw new IllegalArgumentException(v);

+    }

+

+}

diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/AbsExpression.java b/src/java/org/apache/poi/sl/draw/geom/AbsExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/AbsExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/AbsExpression.java
index 5790e53..0f94e14 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/AbsExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/AbsExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/AddDivideExpression.java b/src/java/org/apache/poi/sl/draw/geom/AddDivideExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/AddDivideExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/AddDivideExpression.java
index 7fe14e8..2a01de4 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/AddDivideExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/AddDivideExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/AddSubtractExpression.java b/src/java/org/apache/poi/sl/draw/geom/AddSubtractExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/AddSubtractExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/AddSubtractExpression.java
index bd7e47e..5d5f1e6 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/AddSubtractExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/AddSubtractExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/AdjustValue.java b/src/java/org/apache/poi/sl/draw/geom/AdjustValue.java
similarity index 92%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/AdjustValue.java
rename to src/java/org/apache/poi/sl/draw/geom/AdjustValue.java
index 8df1d6f..8a2f0a4 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/AdjustValue.java
+++ b/src/java/org/apache/poi/sl/draw/geom/AdjustValue.java
@@ -17,9 +17,9 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
+import org.apache.poi.sl.draw.binding.CTGeomGuide;
 
 /**
  * Represents a shape adjust values (see section 20.1.9.5 in the spec)
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ArcTanExpression.java b/src/java/org/apache/poi/sl/draw/geom/ArcTanExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ArcTanExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/ArcTanExpression.java
index 252c0fc..9044e8a 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ArcTanExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/ArcTanExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ArcToCommand.java b/src/java/org/apache/poi/sl/draw/geom/ArcToCommand.java
similarity index 95%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ArcToCommand.java
rename to src/java/org/apache/poi/sl/draw/geom/ArcToCommand.java
index b1ea0de..0382d7f 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ArcToCommand.java
+++ b/src/java/org/apache/poi/sl/draw/geom/ArcToCommand.java
@@ -17,9 +17,9 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo;
+import org.apache.poi.sl.draw.binding.CTPath2DArcTo;
 
 import java.awt.geom.Arc2D;
 import java.awt.geom.GeneralPath;
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ClosePathCommand.java b/src/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ClosePathCommand.java
rename to src/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java
index b9a9540..9d29062 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ClosePathCommand.java
+++ b/src/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.awt.geom.GeneralPath;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Context.java b/src/java/org/apache/poi/sl/draw/geom/Context.java
similarity index 97%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Context.java
rename to src/java/org/apache/poi/sl/draw/geom/Context.java
index ea86c51..8fd5147 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Context.java
+++ b/src/java/org/apache/poi/sl/draw/geom/Context.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.awt.geom.Rectangle2D;
 import java.util.HashMap;
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/CosExpression.java b/src/java/org/apache/poi/sl/draw/geom/CosExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/CosExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/CosExpression.java
index 47e38f1..56373d9 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/CosExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/CosExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/CosineArcTanExpression.java b/src/java/org/apache/poi/sl/draw/geom/CosineArcTanExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/CosineArcTanExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/CosineArcTanExpression.java
index cb9928b..4bed9b7 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/CosineArcTanExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/CosineArcTanExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/CurveToCommand.java b/src/java/org/apache/poi/sl/draw/geom/CurveToCommand.java
similarity index 94%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/CurveToCommand.java
rename to src/java/org/apache/poi/sl/draw/geom/CurveToCommand.java
index 6f342d2..02eeb29 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/CurveToCommand.java
+++ b/src/java/org/apache/poi/sl/draw/geom/CurveToCommand.java
@@ -17,9 +17,9 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
-import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+import org.apache.poi.sl.draw.binding.CTAdjPoint2D;
 
 import java.awt.geom.GeneralPath;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/CustomGeometry.java b/src/java/org/apache/poi/sl/draw/geom/CustomGeometry.java
similarity index 69%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/CustomGeometry.java
rename to src/java/org/apache/poi/sl/draw/geom/CustomGeometry.java
index 4e30ac9..ce1b26c 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/CustomGeometry.java
+++ b/src/java/org/apache/poi/sl/draw/geom/CustomGeometry.java
@@ -17,18 +17,11 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
-import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuideList;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomRect;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DList;
+import org.apache.poi.sl.draw.binding.*;
 
 /**
  * Definition of a custom geometric shape
@@ -41,25 +34,30 @@
     List<Path> paths = new ArrayList<Path>();
     Path textBounds;
 
-    @SuppressWarnings("deprecation")
     public CustomGeometry(CTCustomGeometry2D geom) {
         CTGeomGuideList avLst = geom.getAvLst();
-        if(avLst != null) for(CTGeomGuide gd : avLst.getGdArray()){
-            adjusts.add(new AdjustValue(gd));
+        if(avLst != null) {
+            for(CTGeomGuide gd : avLst.getGd()){
+                adjusts.add(new AdjustValue(gd));
+            }
         }
 
         CTGeomGuideList gdLst = geom.getGdLst();
-        if(gdLst != null) for(CTGeomGuide gd : gdLst.getGdArray()){
-            guides.add(new Guide(gd));
+        if(gdLst != null) {
+            for(CTGeomGuide gd : gdLst.getGd()){
+                guides.add(new Guide(gd));
+            }
         }
 
         CTPath2DList pathLst = geom.getPathLst();
-        if(pathLst != null) for(CTPath2D spPath : pathLst.getPathArray()){
-            paths.add(new Path(spPath));
+        if(pathLst != null) {
+            for(CTPath2D spPath : pathLst.getPath()){
+                paths.add(new Path(spPath));
+            }
         }
 
-        if(geom.isSetRect()) {
-            CTGeomRect rect = geom.getRect();
+        CTGeomRect rect = geom.getRect();
+        if(rect != null) {
             textBounds = new Path();
             textBounds.addCommand(
                     new MoveToCommand(rect.getL().toString(), rect.getT().toString()));
@@ -73,9 +71,7 @@
                     new ClosePathCommand());
         }
     }
-
-
-
+    
     public Iterator<Path> iterator() {
         return paths.iterator();
     }
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Expression.java b/src/java/org/apache/poi/sl/draw/geom/Expression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Expression.java
rename to src/java/org/apache/poi/sl/draw/geom/Expression.java
index 2b0f751..2403c85 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Expression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/Expression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 /**
  * Date: 10/24/11
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ExpressionParser.java b/src/java/org/apache/poi/sl/draw/geom/ExpressionParser.java
similarity index 98%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ExpressionParser.java
rename to src/java/org/apache/poi/sl/draw/geom/ExpressionParser.java
index 699f995..f1f0193 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ExpressionParser.java
+++ b/src/java/org/apache/poi/sl/draw/geom/ExpressionParser.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.HashMap;
 import java.util.regex.Matcher;
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Formula.java b/src/java/org/apache/poi/sl/draw/geom/Formula.java
similarity index 99%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Formula.java
rename to src/java/org/apache/poi/sl/draw/geom/Formula.java
index 0d3b2bb..4745347 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Formula.java
+++ b/src/java/org/apache/poi/sl/draw/geom/Formula.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.awt.geom.Rectangle2D;
 import java.util.HashMap;
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Guide.java b/src/java/org/apache/poi/sl/draw/geom/Guide.java
similarity index 93%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Guide.java
rename to src/java/org/apache/poi/sl/draw/geom/Guide.java
index 584e224..f142132 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Guide.java
+++ b/src/java/org/apache/poi/sl/draw/geom/Guide.java
@@ -17,9 +17,9 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
+import org.apache.poi.sl.draw.binding.CTGeomGuide;
 
 /**
  * Date: 10/24/11
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java b/src/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java
rename to src/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java
index 44f5a56..920acb8 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/IAdjustableShape.java
+++ b/src/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 
 /**
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/IfElseExpression.java b/src/java/org/apache/poi/sl/draw/geom/IfElseExpression.java
similarity index 97%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/IfElseExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/IfElseExpression.java
index 3e16645..443115a 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/IfElseExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/IfElseExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/LineToCommand.java b/src/java/org/apache/poi/sl/draw/geom/LineToCommand.java
similarity index 93%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/LineToCommand.java
rename to src/java/org/apache/poi/sl/draw/geom/LineToCommand.java
index 5142dd2..99c5a6b 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/LineToCommand.java
+++ b/src/java/org/apache/poi/sl/draw/geom/LineToCommand.java
@@ -17,9 +17,9 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
-import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+import org.apache.poi.sl.draw.binding.CTAdjPoint2D;
 
 import java.awt.geom.GeneralPath;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/LiteralValueExpression.java b/src/java/org/apache/poi/sl/draw/geom/LiteralValueExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/LiteralValueExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/LiteralValueExpression.java
index f84483c..ab3abc7 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/LiteralValueExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/LiteralValueExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/MaxExpression.java b/src/java/org/apache/poi/sl/draw/geom/MaxExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/MaxExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/MaxExpression.java
index 0c7ac3e..88a9c60 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/MaxExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/MaxExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/MinExpression.java b/src/java/org/apache/poi/sl/draw/geom/MinExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/MinExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/MinExpression.java
index 3e28cdd..8c1864c 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/MinExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/MinExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/ModExpression.java b/src/java/org/apache/poi/sl/draw/geom/ModExpression.java
similarity index 97%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/ModExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/ModExpression.java
index cf17f05..ff20fc2 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/ModExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/ModExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/MoveToCommand.java b/src/java/org/apache/poi/sl/draw/geom/MoveToCommand.java
similarity index 93%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/MoveToCommand.java
rename to src/java/org/apache/poi/sl/draw/geom/MoveToCommand.java
index 9d9575a..22ccd54 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/MoveToCommand.java
+++ b/src/java/org/apache/poi/sl/draw/geom/MoveToCommand.java
@@ -17,9 +17,9 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
-import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+import org.apache.poi.sl.draw.binding.CTAdjPoint2D;
 
 import java.awt.geom.GeneralPath;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/MultiplyDivideExpression.java b/src/java/org/apache/poi/sl/draw/geom/MultiplyDivideExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/MultiplyDivideExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/MultiplyDivideExpression.java
index 17aca48..5af0ff1 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/MultiplyDivideExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/MultiplyDivideExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Outline.java b/src/java/org/apache/poi/sl/draw/geom/Outline.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Outline.java
rename to src/java/org/apache/poi/sl/draw/geom/Outline.java
index dbf9f1f..b4ffc42 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Outline.java
+++ b/src/java/org/apache/poi/sl/draw/geom/Outline.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.awt.Shape;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/Path.java b/src/java/org/apache/poi/sl/draw/geom/Path.java
similarity index 87%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/Path.java
rename to src/java/org/apache/poi/sl/draw/geom/Path.java
index 3f552a4..b496e9f 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/Path.java
+++ b/src/java/org/apache/poi/sl/draw/geom/Path.java
@@ -17,15 +17,14 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
-
-import org.apache.xmlbeans.XmlObject;
-import org.openxmlformats.schemas.drawingml.x2006.main.*;
+package org.apache.poi.sl.draw.geom;
 
 import java.awt.geom.GeneralPath;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.poi.sl.draw.binding.*;
+
 /**
  * Specifies a creation path consisting of a series of moves, lines and curves
  * that when combined forms a geometric shape
@@ -51,12 +50,13 @@
 
     public Path(CTPath2D spPath){
         _fill = spPath.getFill() != STPathFillMode.NONE;
-        _stroke = spPath.getStroke();
+        _stroke = spPath.isStroke();
         _w = spPath.isSetW() ? spPath.getW() : -1;	
         _h = spPath.isSetH() ? spPath.getH() : -1;	
         
         commands = new ArrayList<PathCommand>();
-        for(XmlObject ch : spPath.selectPath("*")){
+        
+        for(Object ch : spPath.getCloseOrMoveToOrLnTo()){
             if(ch instanceof CTPath2DMoveTo){
                 CTAdjPoint2D pt = ((CTPath2DMoveTo)ch).getPt();
                 commands.add(new MoveToCommand(pt));
@@ -68,14 +68,14 @@
                 commands.add(new ArcToCommand(arc));
             } else if (ch instanceof CTPath2DQuadBezierTo){
                 CTPath2DQuadBezierTo bez = ((CTPath2DQuadBezierTo)ch);
-                CTAdjPoint2D pt1 = bez.getPtArray(0);
-                CTAdjPoint2D pt2 = bez.getPtArray(1);
+                CTAdjPoint2D pt1 = bez.getPt().get(0);
+                CTAdjPoint2D pt2 = bez.getPt().get(1);
                 commands.add(new QuadToCommand(pt1, pt2));
             } else if (ch instanceof CTPath2DCubicBezierTo){
                 CTPath2DCubicBezierTo bez = ((CTPath2DCubicBezierTo)ch);
-                CTAdjPoint2D pt1 = bez.getPtArray(0);
-                CTAdjPoint2D pt2 = bez.getPtArray(1);
-                CTAdjPoint2D pt3 = bez.getPtArray(2);
+                CTAdjPoint2D pt1 = bez.getPt().get(0);
+                CTAdjPoint2D pt2 = bez.getPt().get(1);
+                CTAdjPoint2D pt3 = bez.getPt().get(2);
                 commands.add(new CurveToCommand(pt1, pt2, pt3));
             } else if (ch instanceof CTPath2DClose){
                 commands.add(new ClosePathCommand());
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/PathCommand.java b/src/java/org/apache/poi/sl/draw/geom/PathCommand.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/PathCommand.java
rename to src/java/org/apache/poi/sl/draw/geom/PathCommand.java
index 7b3ec49..3063ab8 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/PathCommand.java
+++ b/src/java/org/apache/poi/sl/draw/geom/PathCommand.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.awt.geom.GeneralPath;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/PinExpression.java b/src/java/org/apache/poi/sl/draw/geom/PinExpression.java
similarity index 97%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/PinExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/PinExpression.java
index c1b7fe4..ee0d4e5 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/PinExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/PinExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/java/org/apache/poi/sl/draw/geom/PresetGeometries.java b/src/java/org/apache/poi/sl/draw/geom/PresetGeometries.java
new file mode 100644
index 0000000..e2caa08
--- /dev/null
+++ b/src/java/org/apache/poi/sl/draw/geom/PresetGeometries.java
@@ -0,0 +1,113 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.sl.draw.geom;
+
+import java.io.InputStream;
+import java.util.LinkedHashMap;
+
+import javax.xml.bind.*;
+import javax.xml.stream.*;
+import javax.xml.stream.events.StartElement;
+import javax.xml.stream.events.XMLEvent;
+
+import org.apache.poi.sl.draw.binding.CTCustomGeometry2D;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
+/**
+ * 
+ */
+public class PresetGeometries extends LinkedHashMap<String, CustomGeometry> {
+    private final static POILogger LOG = POILogFactory.getLogger(PresetGeometries.class);
+    protected final static String BINDING_PACKAGE = "org.apache.poi.sl.draw.binding";
+    
+    protected static PresetGeometries _inst;
+
+    protected PresetGeometries(){}
+
+    @SuppressWarnings("unused")
+    public void init(InputStream is) throws XMLStreamException, JAXBException {
+        // Reader xml = new InputStreamReader( is, Charset.forName("UTF-8") );
+        
+
+        // StAX:
+        EventFilter startElementFilter = new EventFilter() {
+            @Override
+            public boolean accept(XMLEvent event) {
+                return event.isStartElement();
+            }
+        };
+        
+        long cntElem = 0;
+        XMLInputFactory staxFactory = XMLInputFactory.newInstance();
+        XMLEventReader staxReader = staxFactory.createXMLEventReader(is);
+        XMLEventReader staxFiltRd = staxFactory.createFilteredReader(staxReader, startElementFilter);
+        // ignore StartElement:
+        XMLEvent evDoc = staxFiltRd.nextEvent();
+        // JAXB:
+        JAXBContext jaxbContext = JAXBContext.newInstance(BINDING_PACKAGE);
+        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+
+        while (staxFiltRd.peek() != null) {
+            StartElement evRoot = (StartElement)staxFiltRd.peek();
+            String name = evRoot.getName().getLocalPart();
+            JAXBElement<CTCustomGeometry2D> el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class);
+            CTCustomGeometry2D cus = el.getValue();
+            cntElem++;
+            
+            if(containsKey(name)) {
+                LOG.log(POILogger.WARN, "Duplicate definoition of " + name);
+            }
+            put(name, new CustomGeometry(cus));
+        }       
+    }
+    
+    /**
+     * Convert a single CustomGeometry object, i.e. from xmlbeans
+     */
+    public static CustomGeometry convertCustomGeometry(XMLStreamReader staxReader) {
+        try {
+            JAXBContext jaxbContext = JAXBContext.newInstance(BINDING_PACKAGE);
+            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+            JAXBElement<CTCustomGeometry2D> el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class);
+            return new CustomGeometry(el.getValue());
+        } catch (JAXBException e) {
+            LOG.log(POILogger.ERROR, "Unable to parse single custom geometry", e);
+            return null;
+        }
+    }
+
+    public static synchronized PresetGeometries getInstance(){
+        if(_inst == null) {
+            _inst = new PresetGeometries();
+            try {
+                InputStream is = PresetGeometries.class.
+                    getResourceAsStream("presetShapeDefinitions.xml");
+                _inst.init(is);
+                is.close();
+            } catch (Exception e){
+                throw new RuntimeException(e);
+            }
+        }
+
+        return _inst;
+    }
+
+}
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/QuadToCommand.java b/src/java/org/apache/poi/sl/draw/geom/QuadToCommand.java
similarity index 93%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/QuadToCommand.java
rename to src/java/org/apache/poi/sl/draw/geom/QuadToCommand.java
index 65fd7d4..e9a9364 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/QuadToCommand.java
+++ b/src/java/org/apache/poi/sl/draw/geom/QuadToCommand.java
@@ -17,9 +17,9 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
-import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+import org.apache.poi.sl.draw.binding.CTAdjPoint2D;
 
 import java.awt.geom.GeneralPath;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/SinArcTanExpression.java b/src/java/org/apache/poi/sl/draw/geom/SinArcTanExpression.java
similarity index 97%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/SinArcTanExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/SinArcTanExpression.java
index 8ac68e0..e14acb9 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/SinArcTanExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/SinArcTanExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/SinExpression.java b/src/java/org/apache/poi/sl/draw/geom/SinExpression.java
similarity index 97%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/SinExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/SinExpression.java
index 9e82f5a..ca0c110 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/SinExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/SinExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java b/src/java/org/apache/poi/sl/draw/geom/SqrtExpression.java
similarity index 96%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/SqrtExpression.java
index d798e93..5cdd67c 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/SqrtExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/SqrtExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java b/src/java/org/apache/poi/sl/draw/geom/TanExpression.java
similarity index 97%
rename from src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java
rename to src/java/org/apache/poi/sl/draw/geom/TanExpression.java
index 3435f35..7eebdce 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/TanExpression.java
+++ b/src/java/org/apache/poi/sl/draw/geom/TanExpression.java
@@ -17,7 +17,7 @@
  * ====================================================================
  */
 
-package org.apache.poi.xslf.model.geom;
+package org.apache.poi.sl.draw.geom;
 
 import java.util.regex.Matcher;
 
diff --git a/src/java/org/apache/poi/sl/usermodel/AutoNumberingScheme.java b/src/java/org/apache/poi/sl/usermodel/AutoNumberingScheme.java
new file mode 100644
index 0000000..3a68313
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/AutoNumberingScheme.java
@@ -0,0 +1,287 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+public enum AutoNumberingScheme {

+    /** Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ... */

+    alphaLcParenBoth(0x0008, 1),

+    /** Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ... */

+    alphaUcParenBoth(0x000A, 2),

+    /** Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ... */

+    alphaLcParenRight(0x0009, 3),

+    /** Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ... */

+    alphaUcParenRight(0x000B, 4),

+    /** Lowercase Latin character followed by a period. Example: a., b., c., ... */

+    alphaLcPeriod(0x0000, 5),

+    /** Uppercase Latin character followed by a period. Example: A., B., C., ... */

+    alphaUcPeriod(0x0001, 6),

+    /** Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ... */

+    arabicParenBoth(0x000C, 7),

+    /** Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ... */

+    arabicParenRight(0x0002, 8),

+    /** Arabic numeral followed by a period. Example: 1., 2., 3., ... */

+    arabicPeriod(0x0003, 9),

+    /** Arabic numeral. Example: 1, 2, 3, ... */

+    arabicPlain(0x000D, 10),

+    /** Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ... */

+    romanLcParenBoth(0x0004, 11),

+    /** Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ... */

+    romanUcParenBoth(0x000E, 12),

+    /** Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ... */

+    romanLcParenRight(0x0005, 13),

+    /** Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), .... */

+    romanUcParenRight(0x000F, 14),

+    /** Lowercase Roman numeral followed by a period. Example: i., ii., iii., ... */

+    romanLcPeriod(0x0006, 15),

+    /** Uppercase Roman numeral followed by a period. Example: I., II., III., ... */

+    romanUcPeriod(0x0007, 16),

+    /** Double byte circle numbers. */

+    circleNumDbPlain(0x0012, 17),

+    /** Wingdings black circle numbers. */

+    circleNumWdBlackPlain(0x0014, 18),

+    /** Wingdings white circle numbers. */

+    circleNumWdWhitePlain(0x0013, 19),

+    /** Double-byte Arabic numbers with double-byte period. */

+    arabicDbPeriod(0x001D, 20),

+    /** Double-byte Arabic numbers. */

+    arabicDbPlain(0x001C, 21),

+    /** Simplified Chinese with single-byte period. */

+    ea1ChsPeriod(0x0011, 22),

+    /** Simplified Chinese. */

+    ea1ChsPlain(0x0010, 23),

+    /** Traditional Chinese with single-byte period. */

+    ea1ChtPeriod(0x0015, 24),

+    /** Traditional Chinese. */

+    ea1ChtPlain(0x0014, 25),

+    /** Japanese with double-byte period. */

+    ea1JpnChsDbPeriod(0x0026, 26),

+    /** Japanese/Korean. */

+    ea1JpnKorPlain(0x001A, 27),

+    /** Japanese/Korean with single-byte period. */

+    ea1JpnKorPeriod(0x001B, 28),

+    /** Bidi Arabic 1 (AraAlpha) with ANSI minus symbol. */

+    arabic1Minus(0x0017, 29),

+    /** Bidi Arabic 2 (AraAbjad) with ANSI minus symbol. */

+    arabic2Minus(0x0018, 30),

+    /** Bidi Hebrew 2 with ANSI minus symbol. */

+    hebrew2Minus(0x0019, 31),

+    /** Thai alphabetic character followed by a period. */

+    thaiAlphaPeriod(0x001E, 32),

+    /** Thai alphabetic character followed by a closing parenthesis. */

+    thaiAlphaParenRight(0x001F, 33),

+    /** Thai alphabetic character enclosed by parentheses. */

+    thaiAlphaParenBoth(0x0020, 34),

+    /** Thai numeral followed by a period. */

+    thaiNumPeriod(0x0021, 35),

+    /** Thai numeral followed by a closing parenthesis. */

+    thaiNumParenRight(0x0022, 36),

+    /** Thai numeral enclosed in parentheses. */

+    thaiNumParenBoth(0x0023, 37),

+    /** Hindi alphabetic character followed by a period. */

+    hindiAlphaPeriod(0x0024, 38),

+    /** Hindi numeric character followed by a period. */

+    hindiNumPeriod(0x0025, 39),

+    /** Hindi numeric character followed by a closing parenthesis. */

+    hindiNumParenRight(0x0027, 40),

+    /** Hindi alphabetic character followed by a period. */

+    hindiAlpha1Period(0x0027, 41);

+

+    public final int nativeId, ooxmlId;

+

+    AutoNumberingScheme(int nativeId, int ooxmlId) {

+        this.nativeId = nativeId;

+        this.ooxmlId = ooxmlId;

+    }

+

+    public static AutoNumberingScheme forNativeID(int nativeId) {

+        for (AutoNumberingScheme ans : values()) {

+            if (ans.nativeId == nativeId) return ans;

+        }

+        return null;

+    }

+

+    public static AutoNumberingScheme forOoxmlID(int ooxmlId) {

+        for (AutoNumberingScheme ans : values()) {

+            if (ans.ooxmlId == ooxmlId) return ans;

+        }

+        return null;

+    }

+

+    public String getDescription() {

+        switch (this) {

+        case alphaLcPeriod          : return "Lowercase Latin character followed by a period. Example: a., b., c., ...";

+        case alphaUcPeriod          : return "Uppercase Latin character followed by a period. Example: A., B., C., ...";

+        case arabicParenRight       : return "Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ...";

+        case arabicPeriod           : return "Arabic numeral followed by a period. Example: 1., 2., 3., ...";

+        case romanLcParenBoth       : return "Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ...";

+        case romanLcParenRight      : return "Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ...";

+        case romanLcPeriod          : return "Lowercase Roman numeral followed by a period. Example: i., ii., iii., ...";

+        case romanUcPeriod          : return "Uppercase Roman numeral followed by a period. Example: I., II., III., ...";

+        case alphaLcParenBoth       : return "Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ...";

+        case alphaLcParenRight      : return "Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ...";

+        case alphaUcParenBoth       : return "Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ...";

+        case alphaUcParenRight      : return "Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ...";

+        case arabicParenBoth        : return "Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ...";

+        case arabicPlain            : return "Arabic numeral. Example: 1, 2, 3, ...";

+        case romanUcParenBoth       : return "Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ...";

+        case romanUcParenRight      : return "Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), ...";

+        case ea1ChsPlain            : return "Simplified Chinese.";

+        case ea1ChsPeriod           : return "Simplified Chinese with single-byte period.";

+        case circleNumDbPlain       : return "Double byte circle numbers.";

+        case circleNumWdWhitePlain  : return "Wingdings white circle numbers.";

+        case circleNumWdBlackPlain  : return "Wingdings black circle numbers.";

+        case ea1ChtPlain            : return "Traditional Chinese.";

+        case ea1ChtPeriod           : return "Traditional Chinese with single-byte period.";

+        case arabic1Minus           : return "Bidi Arabic 1 (AraAlpha) with ANSI minus symbol.";

+        case arabic2Minus           : return "Bidi Arabic 2 (AraAbjad) with ANSI minus symbol.";

+        case hebrew2Minus           : return "Bidi Hebrew 2 with ANSI minus symbol.";

+        case ea1JpnKorPlain         : return "Japanese/Korean.";

+        case ea1JpnKorPeriod        : return "Japanese/Korean with single-byte period.";

+        case arabicDbPlain          : return "Double-byte Arabic numbers.";

+        case arabicDbPeriod         : return "Double-byte Arabic numbers with double-byte period.";

+        case thaiAlphaPeriod        : return "Thai alphabetic character followed by a period.";

+        case thaiAlphaParenRight    : return "Thai alphabetic character followed by a closing parenthesis.";

+        case thaiAlphaParenBoth     : return "Thai alphabetic character enclosed by parentheses.";

+        case thaiNumPeriod          : return "Thai numeral followed by a period.";

+        case thaiNumParenRight      : return "Thai numeral followed by a closing parenthesis.";

+        case thaiNumParenBoth       : return "Thai numeral enclosed in parentheses.";

+        case hindiAlphaPeriod       : return "Hindi alphabetic character followed by a period.";

+        case hindiNumPeriod         : return "Hindi numeric character followed by a period.";

+        case ea1JpnChsDbPeriod      : return "Japanese with double-byte period.";

+        case hindiNumParenRight     : return "Hindi numeric character followed by a closing parenthesis.";

+        case hindiAlpha1Period      : return "Hindi alphabetic character followed by a period.";

+        default                     : return "Unknown Numbered Scheme";

+        }

+    }

+

+    public String format(int value) {

+        String index = formatIndex(value);

+        String cased = formatCase(index);

+        String seperated = formatSeperator(cased);

+        return seperated;

+    }

+

+    private String formatSeperator(String cased) {

+        String name = name().toLowerCase();

+        if (name.contains("plain")) return cased;

+        if (name.contains("parenright")) return cased+")";

+        if (name.contains("parenboth")) return "("+cased+")";

+        if (name.contains("period")) return cased+".";

+        if (name.contains("minus")) return cased+"-"; // ???

+        return cased;

+    }

+

+    private String formatCase(String index) {

+        String name = name().toLowerCase();

+        if (name.contains("lc")) return index.toLowerCase();

+        if (name.contains("uc")) return index.toUpperCase();

+        return index;

+    }

+

+    private static final String ARABIC_LIST = "0123456789";

+    private static final String ALPHA_LIST = "abcdefghijklmnopqrstuvwxyz";

+    private static final String WINGDINGS_WHITE_LIST =

+            "\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089";

+    private static final String WINGDINGS_BLACK_LIST =

+            "\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094";

+    private static final String CIRCLE_DB_LIST =

+            "\u2776\u2777\u2778\u2779\u277A\u277B\u277C\u277D\u277E";

+

+    private String formatIndex(int value) {

+        String name = name().toLowerCase();

+        if (name.startsWith("roman")) {

+            return formatRomanIndex(value);

+        } else if (name.startsWith("arabic") && !name.contains("db")) {

+            return getIndexedList(value, ARABIC_LIST, false);

+        } else if (name.startsWith("alpha")) {

+            return getIndexedList(value, ALPHA_LIST, true);

+        } else if (name.contains("WdWhite")) {

+            return (value == 10) ? "\u008A"

+                : getIndexedList(value, WINGDINGS_WHITE_LIST, false);

+        } else if (name.contains("WdBlack")) {

+            return (value == 10) ? "\u0095"

+                : getIndexedList(value, WINGDINGS_BLACK_LIST, false);

+        } else if (name.contains("NumDb")) {

+            return (value == 10) ? "\u277F"

+                : getIndexedList(value, CIRCLE_DB_LIST, true);

+        } else {

+            return "?";

+        }

+    }

+

+    private static String getIndexedList(int val, String list, boolean oneBased) {

+        StringBuilder sb = new StringBuilder();

+        addIndexedChar(val, list, oneBased, sb);

+        return sb.toString();

+    }

+

+    private static void addIndexedChar(int val, String list, boolean oneBased, StringBuilder sb) {

+        if (oneBased) val -= 1;

+        final int len = list.length();

+        if (val >= len) {

+            addIndexedChar(val/len, list, oneBased, sb);

+        }

+        sb.append(list.charAt(val%len));

+    }

+

+

+    private String formatRomanIndex(int value) {

+        //M (1000), CM (900), D (500), CD (400), C (100), XC (90), L (50), XL (40), X (10), IX (9), V (5), IV (4) and I (1).

+        final int[] VALUES = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};

+        final String[] ROMAN = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

+        final String conciseList[][] = {

+            {"XLV", "VL"}, //45

+            {"XCV", "VC"}, //95

+            {"CDL", "LD"}, //450

+            {"CML", "LM"}, //950

+            {"CMVC", "LMVL"}, //995

+            {"CDXC", "LDXL"}, //490

+            {"CDVC", "LDVL"}, //495

+            {"CMXC", "LMXL"}, //990

+            {"XCIX", "VCIV"}, //99

+            {"XLIX", "VLIV"}, //49

+            {"XLIX", "IL"}, //49

+            {"XCIX", "IC"}, //99

+            {"CDXC", "XD"}, //490

+            {"CDVC", "XDV"}, //495

+            {"CDIC", "XDIX"}, //499

+            {"LMVL", "XMV"}, //995

+            {"CMIC", "XMIX"}, //999

+            {"CMXC", "XM"}, // 990

+            {"XDV", "VD"},  //495

+            {"XDIX", "VDIV"}, //499

+            {"XMV", "VM"}, // 995

+            {"XMIX", "VMIV"}, //999

+            {"VDIV", "ID"}, //499

+            {"VMIV", "IM"} //999

+        };

+

+        StringBuilder sb = new StringBuilder();

+        for (int i = 0; i < 13; i++) {

+            while (value >= VALUES[i]) {

+                value -= VALUES[i];

+                sb.append(ROMAN[i]);

+            }

+        }

+        String result = sb.toString();

+        for (String cc[] : conciseList) {

+            result = result.replace(cc[0], cc[1]);

+        }

+        return result;

+    }

+}
\ No newline at end of file
diff --git a/src/java/org/apache/poi/sl/usermodel/AutoShape.java b/src/java/org/apache/poi/sl/usermodel/AutoShape.java
index ae2fb7c..1bf073d 100644
--- a/src/java/org/apache/poi/sl/usermodel/AutoShape.java
+++ b/src/java/org/apache/poi/sl/usermodel/AutoShape.java
@@ -17,6 +17,5 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface AutoShape extends SimpleShape {
-	public TextRun getTextRun();
+public interface AutoShape<T extends TextParagraph<? extends TextRun>> extends TextShape<T> {
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/Background.java b/src/java/org/apache/poi/sl/usermodel/Background.java
index f67c57b..8d868b8 100644
--- a/src/java/org/apache/poi/sl/usermodel/Background.java
+++ b/src/java/org/apache/poi/sl/usermodel/Background.java
@@ -18,5 +18,5 @@
 package org.apache.poi.sl.usermodel;
 
 public interface Background extends Shape {
-
+    FillStyle getFillStyle();
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/ColorStyle.java b/src/java/org/apache/poi/sl/usermodel/ColorStyle.java
new file mode 100644
index 0000000..9be847b
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/ColorStyle.java
@@ -0,0 +1,69 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+import java.awt.Color;

+

+

+public interface ColorStyle {

+    Color getColor();

+    

+    /**

+     * the opacity as expressed by a percentage value

+     *

+     * @return  opacity in percents in the range [0..100000]

+     * or -1 if the value is not set

+     */

+    int getAlpha();

+    

+    /**

+     * the luminance shift as expressed by a percentage relative to the input color

+     *

+     * @return  luminance shift in percents in the range [0..100000]

+     * or -1 if the value is not set

+     */

+    int getLumOff();

+    

+    /**

+     * the luminance as expressed by a percentage relative to the input color

+     *

+     * @return  luminance in percents in the range [0..100000]

+     * or -1 if the value is not set

+     */

+    int getLumMod();

+    

+    /**

+     * specifies a darker version of its input color.

+     * A 10% shade is 10% of the input color combined with 90% black.

+     * 

+     * @return the value of the shade specified as percents in the range [0..100000]

+     * with 0% indicating minimal shade and 100% indicating maximum

+     * or -1 if the value is not set

+     */

+    int getShade();

+

+    /**

+     * specifies a lighter version of its input color.

+     * A 10% tint is 10% of the input color combined with 90% white.

+     *

+     * @return the value of the tint specified as percents in the range [0..100000]

+     * with 0% indicating minimal tint and 100% indicating maximum

+     * or -1 if the value is not set

+     */

+    int getTint();

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/ShapeGroup.java b/src/java/org/apache/poi/sl/usermodel/ConnectorShape.java
similarity index 94%
copy from src/java/org/apache/poi/sl/usermodel/ShapeGroup.java
copy to src/java/org/apache/poi/sl/usermodel/ConnectorShape.java
index 3c2ff6b..7e2bbf0 100644
--- a/src/java/org/apache/poi/sl/usermodel/ShapeGroup.java
+++ b/src/java/org/apache/poi/sl/usermodel/ConnectorShape.java
@@ -1,22 +1,22 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.sl.usermodel;
-
-public interface ShapeGroup extends ShapeContainer {
-
-}
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+public interface ConnectorShape extends SimpleShape {

+

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/Fill.java b/src/java/org/apache/poi/sl/usermodel/Fill.java
deleted file mode 100644
index e62b048..0000000
--- a/src/java/org/apache/poi/sl/usermodel/Fill.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.sl.usermodel;
-
-public interface Fill extends org.apache.poi.common.usermodel.Fill {
-}
diff --git a/src/java/org/apache/poi/sl/usermodel/ShapeGroup.java b/src/java/org/apache/poi/sl/usermodel/FillStyle.java
similarity index 94%
rename from src/java/org/apache/poi/sl/usermodel/ShapeGroup.java
rename to src/java/org/apache/poi/sl/usermodel/FillStyle.java
index 3c2ff6b..8414000 100644
--- a/src/java/org/apache/poi/sl/usermodel/ShapeGroup.java
+++ b/src/java/org/apache/poi/sl/usermodel/FillStyle.java
@@ -1,22 +1,22 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.sl.usermodel;
-
-public interface ShapeGroup extends ShapeContainer {
-
-}
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+public interface FillStyle {

+    PaintStyle getPaint();

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/Picture.java b/src/java/org/apache/poi/sl/usermodel/FreeformShape.java
similarity index 90%
copy from src/java/org/apache/poi/sl/usermodel/Picture.java
copy to src/java/org/apache/poi/sl/usermodel/FreeformShape.java
index 9a55313..e0843a1 100644
--- a/src/java/org/apache/poi/sl/usermodel/Picture.java
+++ b/src/java/org/apache/poi/sl/usermodel/FreeformShape.java
@@ -1,22 +1,22 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.sl.usermodel;
-
-public interface Picture extends SimpleShape {
-	public PictureData getPictureData();
-}
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+public interface FreeformShape<T extends TextParagraph<? extends TextRun>> extends AutoShape<T> {

+

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/Picture.java b/src/java/org/apache/poi/sl/usermodel/GroupShape.java
similarity index 62%
copy from src/java/org/apache/poi/sl/usermodel/Picture.java
copy to src/java/org/apache/poi/sl/usermodel/GroupShape.java
index 9a55313..d71bb25 100644
--- a/src/java/org/apache/poi/sl/usermodel/Picture.java
+++ b/src/java/org/apache/poi/sl/usermodel/GroupShape.java
@@ -17,6 +17,23 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface Picture extends SimpleShape {
-	public PictureData getPictureData();
+import java.awt.geom.Rectangle2D;
+
+public interface GroupShape<T extends Shape> extends Shape, ShapeContainer<T>, PlaceableShape {
+
+    /**
+     * Gets the coordinate space of this group.  All children are constrained
+     * to these coordinates.
+     *
+     * @param anchor the coordinate space of this group
+     */
+    Rectangle2D getInteriorAnchor();
+    
+    /**
+     * Sets the coordinate space of this group.  All children are constrained
+     * to these coordinates.
+     *
+     * @param anchor the coordinate space of this group
+     */
+    void setInteriorAnchor(Rectangle2D anchor);
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/Insets2D.java b/src/java/org/apache/poi/sl/usermodel/Insets2D.java
new file mode 100644
index 0000000..04b4d77
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/Insets2D.java
@@ -0,0 +1,146 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+import java.awt.Insets;

+

+/**

+ * This is a replacement for {@link java.awt.Insets} which works on doubles

+ * instead of ints

+ */

+public class Insets2D {

+

+    /**

+     * The inset from the top.

+     * This value is added to the Top of the rectangle

+     * to yield a new location for the Top.

+     */

+    public double top;

+

+    /**

+     * The inset from the left.

+     * This value is added to the Left of the rectangle

+     * to yield a new location for the Left edge.

+     */

+    public double left;

+

+    /**

+     * The inset from the bottom.

+     * This value is subtracted from the Bottom of the rectangle

+     * to yield a new location for the Bottom.

+     */

+    public double bottom;

+

+    /**

+     * The inset from the right.

+     * This value is subtracted from the Right of the rectangle

+     * to yield a new location for the Right edge.

+     */

+    public double right;

+    

+    /**

+     * Creates and initializes a new <code>Insets</code> object with the 

+     * specified top, left, bottom, and right insets. 

+     * @param       top   the inset from the top.

+     * @param       left   the inset from the left.

+     * @param       bottom   the inset from the bottom.

+     * @param       right   the inset from the right.

+     */

+    public Insets2D(double top, double left, double bottom, double right) {

+    this.top = top;

+    this.left = left;

+    this.bottom = bottom;

+    this.right = right;

+    }

+

+    /**

+     * Set top, left, bottom, and right to the specified values

+     *

+     * @param       top   the inset from the top.

+     * @param       left   the inset from the left.

+     * @param       bottom   the inset from the bottom.

+     * @param       right   the inset from the right.

+     * @since 1.5

+     */

+    public void set(double top, double left, double bottom, double right) {

+        this.top = top;

+        this.left = left;

+        this.bottom = bottom;

+        this.right = right;

+    }

+

+    /**

+     * Checks whether two insets objects are equal. Two instances 

+     * of <code>Insets</code> are equal if the four integer values

+     * of the fields <code>top</code>, <code>left</code>, 

+     * <code>bottom</code>, and <code>right</code> are all equal.

+     * @return      <code>true</code> if the two insets are equal;

+     *                          otherwise <code>false</code>.

+     * @since       JDK1.1

+     */

+    public boolean equals(Object obj) {

+    if (obj instanceof Insets) {

+        Insets insets = (Insets)obj;

+        return ((top == insets.top) && (left == insets.left) &&

+            (bottom == insets.bottom) && (right == insets.right));

+    }

+    return false;

+    }

+

+    /**

+     * Returns the hash code for this Insets.

+     *

+     * @return    a hash code for this Insets.

+     */

+    public int hashCode() {

+        double sum1 = left + bottom;

+        double sum2 = right + top;

+        double val1 = sum1 * (sum1 + 1)/2 + left;

+        double val2 = sum2 * (sum2 + 1)/2 + top;

+        double sum3 = val1 + val2;

+        return (int)(sum3 * (sum3 + 1)/2 + val2);

+    }

+

+    /**

+     * Returns a string representation of this <code>Insets</code> object. 

+     * This method is intended to be used only for debugging purposes, and 

+     * the content and format of the returned string may vary between 

+     * implementations. The returned string may be empty but may not be 

+     * <code>null</code>.

+     * 

+     * @return  a string representation of this <code>Insets</code> object.

+     */

+    public String toString() {

+    return getClass().getName() + "[top="  + top + ",left=" + left + ",bottom=" + bottom + ",right=" + right + "]";

+    }

+

+    /**

+     * Create a copy of this object.

+     * @return     a copy of this <code>Insets2D</code> object.

+     */

+    public Object clone() { 

+        try { 

+            return super.clone();

+        } catch (CloneNotSupportedException e) { 

+            // this shouldn't happen, since we are Cloneable

+            throw new InternalError();

+        }

+    }

+    

+

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/Line.java b/src/java/org/apache/poi/sl/usermodel/Line.java
index 630c37d..b06764e 100644
--- a/src/java/org/apache/poi/sl/usermodel/Line.java
+++ b/src/java/org/apache/poi/sl/usermodel/Line.java
@@ -17,6 +17,6 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface Line extends AutoShape {
+public interface Line<T extends TextParagraph<? extends TextRun>> extends AutoShape<T> {
 
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/LineDecoration.java b/src/java/org/apache/poi/sl/usermodel/LineDecoration.java
new file mode 100644
index 0000000..e95551c
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/LineDecoration.java
@@ -0,0 +1,95 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+public interface LineDecoration {

+    /**

+     *  Represents the shape decoration that appears at the ends of lines.

+     */

+    enum DecorationShape {

+        NONE(1),

+        TRIANGLE(2),

+        STEALTH(3),

+        DIAMOND(4),

+        OVAL(5),

+        ARROW(6);

+        

+        public final int ooxmlId;

+        

+        DecorationShape(int ooxmlId) {

+            this.ooxmlId = ooxmlId;

+        }

+    

+        public static DecorationShape fromOoxmlId(int ooxmlId) {

+            for (DecorationShape ds : values()) {

+                if (ds.ooxmlId == ooxmlId) return ds;

+            }

+            return null;

+        }

+    }

+    

+    enum DecorationSize {

+        SMALL(1),

+        MEDIUM(2),

+        LARGE(3);

+        

+        public final int ooxmlId;

+        

+        DecorationSize(int ooxmlId) {

+            this.ooxmlId = ooxmlId;

+        }

+        

+        public static DecorationSize fromOoxmlId(int ooxmlId) {

+            for (DecorationSize ds : values()) {

+                if (ds.ooxmlId == ooxmlId) return ds;

+            }

+            return null;

+        }

+    }

+    

+    /**

+     * @return the line start shape

+     */

+    DecorationShape getHeadShape();

+    

+    /**

+     * @return the width of the start shape

+     */

+    DecorationSize getHeadWidth();

+    

+    /**

+     * @return the length of the start shape

+     */

+    DecorationSize getHeadLength();

+    

+    /**

+     * @return the line end shape

+     */

+    DecorationShape getTailShape();

+    

+    /**

+     * @return the width of the end shape

+     */

+    DecorationSize getTailWidth();

+    

+    /**

+     * @return the length of the end shape

+     */

+    DecorationSize getTailLength();

+

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/LineStyle.java b/src/java/org/apache/poi/sl/usermodel/LineStyle.java
deleted file mode 100644
index 43ef4a7..0000000
--- a/src/java/org/apache/poi/sl/usermodel/LineStyle.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.sl.usermodel;
-
-public interface LineStyle extends org.apache.poi.common.usermodel.LineStyle {
-}
diff --git a/src/java/org/apache/poi/sl/usermodel/MasterSheet.java b/src/java/org/apache/poi/sl/usermodel/MasterSheet.java
index 61792cd..727217d 100644
--- a/src/java/org/apache/poi/sl/usermodel/MasterSheet.java
+++ b/src/java/org/apache/poi/sl/usermodel/MasterSheet.java
@@ -17,6 +17,6 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface MasterSheet extends Sheet {
+public interface MasterSheet<T extends Shape, SS extends SlideShow> extends Sheet<T,SS> {
 
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/Notes.java b/src/java/org/apache/poi/sl/usermodel/Notes.java
index 5d5ba98..3e4b924 100644
--- a/src/java/org/apache/poi/sl/usermodel/Notes.java
+++ b/src/java/org/apache/poi/sl/usermodel/Notes.java
@@ -17,6 +17,8 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface Notes extends Sheet {
-	public TextRun getTextRun();
+import java.util.List;
+
+public interface Notes<T extends Shape, SS extends SlideShow> extends Sheet<T,SS> {
+	List<? extends List<? extends TextParagraph<? extends TextRun>>> getTextParagraphs();
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/PaintStyle.java b/src/java/org/apache/poi/sl/usermodel/PaintStyle.java
new file mode 100644
index 0000000..2551201
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/PaintStyle.java
@@ -0,0 +1,63 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.sl.usermodel;
+
+import java.awt.Color;
+import java.io.InputStream;
+
+import org.apache.poi.sl.draw.DrawPaint;
+
+
+
+public interface PaintStyle {
+    public interface SolidPaint extends PaintStyle {
+        ColorStyle getSolidColor();
+    }
+
+    public interface GradientPaint extends PaintStyle {
+        enum GradientType { linear, circular, shape }
+        
+        /**
+         * @return the angle of the gradient
+         */
+        double getGradientAngle();
+        ColorStyle[] getGradientColors();
+        float[] getGradientFractions();
+        boolean isRotatedWithShape();
+        GradientType getGradientType();
+    }    
+    
+    public interface TexturePaint extends PaintStyle {
+        /**
+         * @return the raw image stream
+         */
+        InputStream getImageData();
+
+        /**
+         * @return the content type of the image data
+         */
+        String getContentType();
+        
+        /**
+         * @return the alpha mask in percents [0..100000]
+         */
+        int getAlpha();
+    }
+
+    SolidPaint TRANSPARENT_PAINT = DrawPaint.createSolidPaint(new Color(0xFF, 0xFF, 0xFF, 0));
+}
diff --git a/src/java/org/apache/poi/sl/usermodel/PictureData.java b/src/java/org/apache/poi/sl/usermodel/PictureData.java
index e325e5a..8697d33 100644
--- a/src/java/org/apache/poi/sl/usermodel/PictureData.java
+++ b/src/java/org/apache/poi/sl/usermodel/PictureData.java
@@ -17,10 +17,11 @@
 
 package org.apache.poi.sl.usermodel;
 
+import java.io.IOException;
+
 public interface PictureData {
-	public int getType();
-	public byte[] getUID();
+	public String getContentType();
 
 	public byte[] getData();
-	public void setData(byte[] data);
+	public void setData(byte[] data) throws IOException;
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/Picture.java b/src/java/org/apache/poi/sl/usermodel/PictureShape.java
similarity index 64%
copy from src/java/org/apache/poi/sl/usermodel/Picture.java
copy to src/java/org/apache/poi/sl/usermodel/PictureShape.java
index 9a55313..a2c0824 100644
--- a/src/java/org/apache/poi/sl/usermodel/Picture.java
+++ b/src/java/org/apache/poi/sl/usermodel/PictureShape.java
@@ -17,6 +17,21 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface Picture extends SimpleShape {
-	public PictureData getPictureData();
+import java.awt.Insets;
+
+public interface PictureShape extends SimpleShape {
+    /**
+     * Returns the picture data for this picture.
+     *
+     * @return the picture data for this picture.
+     */
+    PictureData getPictureData();
+
+	/**
+	 * Returns the clipping values as percent ratio relatively to the image size.
+	 * The clipping are returned as insets converted/scaled to 100000 (=100%).
+	 * 
+	 * @return the clipping rectangle, which is given in percent in relation to the image width/height
+	 */
+	Insets getClipping();
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/PlaceableShape.java b/src/java/org/apache/poi/sl/usermodel/PlaceableShape.java
new file mode 100644
index 0000000..f81a344
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/PlaceableShape.java
@@ -0,0 +1,84 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+import java.awt.geom.Rectangle2D;

+

+public interface PlaceableShape {

+    ShapeContainer<? extends Shape> getParent();

+    

+    /**

+     * @return the position of this shape within the drawing canvas.

+     *         The coordinates are expressed in points

+     */

+    Rectangle2D getAnchor();

+

+    /**

+     * @param anchor the position of this shape within the drawing canvas.

+     *               The coordinates are expressed in points

+     */

+    void setAnchor(Rectangle2D anchor);

+

+    /**

+     * Rotation angle in degrees

+     * <p>

+     * Positive angles are clockwise (i.e., towards the positive y axis);

+     * negative angles are counter-clockwise (i.e., towards the negative y axis).

+     * </p>

+     *

+     * @return rotation angle in degrees

+     */

+    double getRotation();

+

+    /**

+     * Rotate this shape.

+     * <p>

+     * Positive angles are clockwise (i.e., towards the positive y axis);

+     * negative angles are counter-clockwise (i.e., towards the negative y axis).

+     * </p>

+     *

+     * @param theta the rotation angle in degrees.

+     */

+    void setRotation(double theta);

+

+    /**

+     * @param flip whether the shape is horizontally flipped

+     */

+    void setFlipHorizontal(boolean flip);

+

+    /**

+     * Whether the shape is vertically flipped

+     *

+     * @param flip whether the shape is vertically flipped

+     */

+    void setFlipVertical(boolean flip);

+

+    /**

+     * Whether the shape is horizontally flipped

+     *

+     * @return whether the shape is horizontally flipped

+     */

+    boolean getFlipHorizontal();

+

+    /**

+     * Whether the shape is vertically flipped

+     *

+     * @return whether the shape is vertically flipped

+     */

+    boolean getFlipVertical();

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/Shadow.java b/src/java/org/apache/poi/sl/usermodel/Shadow.java
new file mode 100644
index 0000000..430dbe3
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/Shadow.java
@@ -0,0 +1,50 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;

+

+

+

+public interface Shadow {

+    SimpleShape getShadowParent();

+    

+    /**

+     * @return the offset of this shadow in points

+     */

+    double getDistance();

+    

+    /**

+     * 

+     * @return the direction to offset the shadow in angles

+     */

+    double getAngle();

+

+    /**

+     * 

+     * @return the blur radius of the shadow

+     * TODO: figure out how to make sense of this property when rendering shadows 

+     */

+    double getBlur();

+

+    /**

+     * @return the color of this shadow. 

+     * Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow

+     */

+    SolidPaint getFillStyle();    

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/Shape.java b/src/java/org/apache/poi/sl/usermodel/Shape.java
index 11c0bf6..4de645d 100644
--- a/src/java/org/apache/poi/sl/usermodel/Shape.java
+++ b/src/java/org/apache/poi/sl/usermodel/Shape.java
@@ -17,15 +17,13 @@
 
 package org.apache.poi.sl.usermodel;
 
-import java.awt.geom.Rectangle2D;
 
 public interface Shape {
-	public int getShapeType();
-
-	public Rectangle2D getAnchor();
-	public void setAnchor(Rectangle2D anchor);
-
-	public void moveTo(float x, float y);
-
-	public Shape getParent();
+	ShapeContainer<? extends Shape> getParent();
+	
+    /**
+    *
+    * @return the sheet this shape belongs to
+    */
+   Sheet<? extends Shape, ? extends SlideShow> getSheet();
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/ShapeContainer.java b/src/java/org/apache/poi/sl/usermodel/ShapeContainer.java
index cabcf4b..1741a73 100644
--- a/src/java/org/apache/poi/sl/usermodel/ShapeContainer.java
+++ b/src/java/org/apache/poi/sl/usermodel/ShapeContainer.java
@@ -17,8 +17,30 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface ShapeContainer {
-	public Shape[] getShapes();
-	public void addShape(Shape shape);
-	public boolean removeShape(Shape shape);
+import java.util.List;
+
+
+public interface ShapeContainer<T extends Shape> extends Iterable<T> {
+    /**
+     * Returns an list containing all of the elements in this container in proper
+     * sequence (from first to last element).
+     *
+     * @return an list containing all of the elements in this container in proper
+     *         sequence
+     */
+	List<T> getShapes();
+
+	void addShape(T shape);
+
+    /**
+     * Removes the specified shape from this sheet, if it is present
+     * (optional operation).  If this sheet does not contain the element,
+     * it is unchanged.
+     *
+     * @param xShape shape to be removed from this sheet, if present
+     * @return <tt>true</tt> if this sheet contained the specified element
+     * @throws IllegalArgumentException if the type of the specified shape
+     *         is incompatible with this sheet (optional)
+     */
+	boolean removeShape(T shape);
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/ShapeType.java b/src/java/org/apache/poi/sl/usermodel/ShapeType.java
new file mode 100644
index 0000000..91974b7
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/ShapeType.java
@@ -0,0 +1,316 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.sl.usermodel;
+
+/**
+ * known preset shape geometries in PresentationML
+ */
+public enum ShapeType {
+    NOT_PRIMITIVE(-1, 0, "NotPrimitive"),
+    LINE(1, 20, "Line"),
+    LINE_INV(2, -1, null),
+    TRIANGLE(3, 5, "IsocelesTriangle"),
+    RT_TRIANGLE(4, 6, "RightTriangle"),
+    RECT(5, 1, "Rectangle"),
+    DIAMOND(6, 4, "Diamond"),
+    PARALLELOGRAM(7, 7, "Parallelogram"),
+    TRAPEZOID(8, 8, "Trapezoid"),
+    NON_ISOSCELES_TRAPEZOID(9, -1, null),
+    PENTAGON(10, 56, "Pentagon"),
+    HEXAGON(11, 9, "Hexagon"),
+    HEPTAGON(12, -1, null),
+    OCTAGON(13, 10, "Octagon"),
+    DECAGON(14, -1, null),
+    DODECAGON(15, -1, null),
+    STAR_4(16, 187, "Star4"),
+    STAR_5(17, 12, "Star"), // aka star in native
+    STAR_6(18, -1, null),
+    STAR_7(19, -1, null),
+    STAR_8(20, 58, "Star8"),
+    STAR_10(21, -1, null),
+    STAR_12(22, -1, null),
+    STAR_16(23, 59, "Star16"),
+    SEAL(23, 18, "Seal"), // same as star_16, but twice in native
+    STAR_24(24, 92, "Star24"),
+    STAR_32(25, 60, "Star32"),
+    ROUND_RECT(26, 2, "RoundRectangle"),
+    ROUND_1_RECT(27, -1, null),
+    ROUND_2_SAME_RECT(28, -1, null),
+    ROUND_2_DIAG_RECT(29, -1, null),
+    SNIP_ROUND_RECT(30, -1, null),
+    SNIP_1_RECT(31, -1, null),
+    SNIP_2_SAME_RECT(32, -1, null),
+    SNIP_2_DIAG_RECT(33, -1, null),
+    PLAQUE(34, 21, "Plaque"),
+    ELLIPSE(35, 3, "Ellipse"),
+    TEARDROP(36, -1, null),
+    HOME_PLATE(37, 15, "HomePlate"),
+    CHEVRON(38, 55, "Chevron"),
+    PIE_WEDGE(39, -1, null),
+    PIE(40, -1, null),
+    BLOCK_ARC(41, 95, "BlockArc"),
+    DONUT(42, 23, "Donut"),
+    NO_SMOKING(43, 57, "NoSmoking"),
+    RIGHT_ARROW(44, 13, "Arrow"), // aka arrow in native
+    LEFT_ARROW(45, 66, "LeftArrow"),
+    UP_ARROW(46, 68, "UpArrow"),
+    DOWN_ARROW(47, 67, "DownArrow"),
+    STRIPED_RIGHT_ARROW(48, 93, "StripedRightArrow"),
+    NOTCHED_RIGHT_ARROW(49, 94, "NotchedRightArrow"),
+    BENT_UP_ARROW(50, 90, "BentUpArrow"),
+    LEFT_RIGHT_ARROW(51, 69, "LeftRightArrow"),
+    UP_DOWN_ARROW(52, 70, "UpDownArrow"),
+    LEFT_UP_ARROW(53, 89, "LeftUpArrow"),
+    LEFT_RIGHT_UP_ARROW(54, 182, "LeftRightUpArrow"),
+    QUAD_ARROW(55, 76, "QuadArrow"),
+    LEFT_ARROW_CALLOUT(56, 77, "LeftArrowCallout"),
+    RIGHT_ARROW_CALLOUT(57, 78, "RightArrowCallout"),
+    UP_ARROW_CALLOUT(58, 79, "UpArrowCallout"),
+    DOWN_ARROW_CALLOUT(59, 80, "DownArrowCallout"),
+    LEFT_RIGHT_ARROW_CALLOUT(60, 81, "LeftRightArrowCallout"),
+    UP_DOWN_ARROW_CALLOUT(61, 82, "UpDownArrowCallout"),
+    QUAD_ARROW_CALLOUT(62, 83, "QuadArrowCallout"),
+    BENT_ARROW(63, 91, "BentArrow"),
+    UTURN_ARROW(64, 101, "UturnArrow"),
+    CIRCULAR_ARROW(65, 99, "CircularArrow"),
+    LEFT_CIRCULAR_ARROW(66, -1, null),
+    LEFT_RIGHT_CIRCULAR_ARROW(67, -1, null),
+    CURVED_RIGHT_ARROW(68, 102, "CurvedRightArrow"),
+    CURVED_LEFT_ARROW(69, 103, "CurvedLeftArrow"),
+    CURVED_UP_ARROW(70, 104, "CurvedUpArrow"),
+    CURVED_DOWN_ARROW(71, 105, "CurvedDownArrow"),
+    SWOOSH_ARROW(72, -1, null),
+    CUBE(73, 16, "Cube"),
+    CAN(74, 22, "Can"),
+    LIGHTNING_BOLT(75, 73, "LightningBolt"),
+    HEART(76, 74, "Heart"),
+    SUN(77, 183, "Sun"),
+    MOON(78, 184, "Moon"),
+    SMILEY_FACE(79, 96, "SmileyFace"),
+    IRREGULAR_SEAL_1(80, 71, "IrregularSeal1"),
+    IRREGULAR_SEAL_2(81, 72, "IrregularSeal2"),
+    FOLDED_CORNER(82, 65, "FoldedCorner"),
+    BEVEL(83, 84, "Bevel"),
+    FRAME(84, 75, "PictureFrame"),
+    HALF_FRAME(85, -1, null),
+    CORNER(86, -1, null),
+    DIAG_STRIPE(87, -1, null),
+    CHORD(88, -1, null),
+    ARC(89, 19, "Arc"),
+    LEFT_BRACKET(90, 85, "LeftBracket"),
+    RIGHT_BRACKET(91, 86, "RightBracket"),
+    LEFT_BRACE(92, 87, "LeftBrace"),
+    RIGHT_BRACE(93, 88, "RightBrace"),
+    BRACKET_PAIR(94, 185, "BracketPair"),
+    BRACE_PAIR(95, 186, "BracePair"),
+    STRAIGHT_CONNECTOR_1(96, 32, "StraightConnector1"),
+    BENT_CONNECTOR_2(97, 33, "BentConnector2"),
+    BENT_CONNECTOR_3(98, 34, "BentConnector3"),
+    BENT_CONNECTOR_4(99, 35, "BentConnector4"),
+    BENT_CONNECTOR_5(100, 36, "BentConnector5"),
+    CURVED_CONNECTOR_2(101, 37, "CurvedConnector2"),
+    CURVED_CONNECTOR_3(102, 38, "CurvedConnector3"),
+    CURVED_CONNECTOR_4(103, 39, "CurvedConnector4"),
+    CURVED_CONNECTOR_5(104, 40, "CurvedConnector5"),
+    CALLOUT_1(105, 41, "Callout1"),
+    CALLOUT_2(106, 42, "Callout2"),
+    CALLOUT_3(107, 43, "Callout3"),
+    ACCENT_CALLOUT_1(108, 44, "AccentCallout1"),
+    ACCENT_CALLOUT_2(109, 45, "AccentCallout2"),
+    ACCENT_CALLOUT_3(110, 46, "AccentCallout3"),
+    BORDER_CALLOUT_1(111, 47, "BorderCallout1"),
+    BORDER_CALLOUT_2(112, 48, "BorderCallout2"),
+    BORDER_CALLOUT_3(113, 49, "BorderCallout3"),
+    ACCENT_BORDER_CALLOUT_1(114, 50, "AccentBorderCallout1"),
+    ACCENT_BORDER_CALLOUT_2(115, 51, "AccentBorderCallout2"),
+    ACCENT_BORDER_CALLOUT_3(116, 52, "AccentBorderCallout3"),
+    WEDGE_RECT_CALLOUT(117, 61, "WedgeRectCallout"),
+    WEDGE_ROUND_RECT_CALLOUT(118, 62, "WedgeRRectCallout"),
+    WEDGE_ELLIPSE_CALLOUT(119, 63, "WedgeEllipseCallout"),
+    CLOUD_CALLOUT(120, 106, "CloudCallout"),
+    CLOUD(121, -1, null),
+    RIBBON(122, 53, "Ribbon"),
+    RIBBON_2(123, 54, "Ribbon2"),
+    ELLIPSE_RIBBON(124, 107, "EllipseRibbon"),
+    ELLIPSE_RIBBON_2(125, 108, "EllipseRibbon2"),
+    LEFT_RIGHT_RIBBON(126, -1, null),
+    VERTICAL_SCROLL(127, 97, "VerticalScroll"),
+    HORIZONTAL_SCROLL(128, 98, "HorizontalScroll"),
+    WAVE(129, 64, "Wave"),
+    DOUBLE_WAVE(130, 188, "DoubleWave"),
+    PLUS(131, 11, "Plus"),
+    FLOW_CHART_PROCESS(132, 109, "FlowChartProcess"),
+    FLOW_CHART_DECISION(133, 110, "FlowChartDecision"),
+    FLOW_CHART_INPUT_OUTPUT(134, 111, "FlowChartInputOutput"),
+    FLOW_CHART_PREDEFINED_PROCESS(135, 112, "FlowChartPredefinedProcess"),
+    FLOW_CHART_INTERNAL_STORAGE(136, 113, "FlowChartInternalStorage"),
+    FLOW_CHART_DOCUMENT(137, 114, "FlowChartDocument"),
+    FLOW_CHART_MULTIDOCUMENT(138, 115, "FlowChartMultidocument"),
+    FLOW_CHART_TERMINATOR(139, 116, "FlowChartTerminator"),
+    FLOW_CHART_PREPARATION(140, 117, "FlowChartPreparation"),
+    FLOW_CHART_MANUAL_INPUT(141, 118, "FlowChartManualInput"),
+    FLOW_CHART_MANUAL_OPERATION(142, 119, "FlowChartManualOperation"),
+    FLOW_CHART_CONNECTOR(143, 120, "FlowChartConnector"),
+    FLOW_CHART_PUNCHED_CARD(144, 121, "FlowChartPunchedCard"),
+    FLOW_CHART_PUNCHED_TAPE(145, 122, "FlowChartPunchedTape"),
+    FLOW_CHART_SUMMING_JUNCTION(146, 123, "FlowChartSummingJunction"),
+    FLOW_CHART_OR(147, 124, "FlowChartOr"),
+    FLOW_CHART_COLLATE(148, 125, "FlowChartCollate"),
+    FLOW_CHART_SORT(149, 126, "FlowChartSort"),
+    FLOW_CHART_EXTRACT(150, 127, "FlowChartExtract"),
+    FLOW_CHART_MERGE(151, 128, "FlowChartMerge"),
+    FLOW_CHART_OFFLINE_STORAGE(152, 129, "FlowChartOfflineStorage"),
+    FLOW_CHART_ONLINE_STORAGE(153, 130, "FlowChartOnlineStorage"),
+    FLOW_CHART_MAGNETIC_TAPE(154, 131, "FlowChartMagneticTape"),
+    FLOW_CHART_MAGNETIC_DISK(155, 132, "FlowChartMagneticDisk"),
+    FLOW_CHART_MAGNETIC_DRUM(156, 133, "FlowChartMagneticDrum"),
+    FLOW_CHART_DISPLAY(157, 134, "FlowChartDisplay"),
+    FLOW_CHART_DELAY(158, 135, "FlowChartDelay"),
+    FLOW_CHART_ALTERNATE_PROCESS(159, 176, "FlowChartAlternateProcess"),
+    FLOW_CHART_OFFPAGE_CONNECTOR(160, 177, "FlowChartOffpageConnector"),
+    ACTION_BUTTON_BLANK(161, 189, "ActionButtonBlank"),
+    ACTION_BUTTON_HOME(162, 190, "ActionButtonHome"),
+    ACTION_BUTTON_HELP(163, 191, "ActionButtonHelp"),
+    ACTION_BUTTON_INFORMATION(164, 192, "ActionButtonInformation"),
+    ACTION_BUTTON_FORWARD_NEXT(165, 193, "ActionButtonForwardNext"),
+    ACTION_BUTTON_BACK_PREVIOUS(166, 194, "ActionButtonBackPrevious"),
+    ACTION_BUTTON_END(167, 195, "ActionButtonEnd"),
+    ACTION_BUTTON_BEGINNING(168, 196, "ActionButtonBeginning"),
+    ACTION_BUTTON_RETURN(169, 197, "ActionButtonReturn"),
+    ACTION_BUTTON_DOCUMENT(170, 198, "ActionButtonDocument"),
+    ACTION_BUTTON_SOUND(171, 199, "ActionButtonSound"),
+    ACTION_BUTTON_MOVIE(172, 200, "ActionButtonMovie"),
+    GEAR_6(173, -1, null),
+    GEAR_9(174, -1, null),
+    FUNNEL(175, -1, null),
+    MATH_PLUS(176, -1, null),
+    MATH_MINUS(177, -1, null),
+    MATH_MULTIPLY(178, -1, null),
+    MATH_DIVIDE(179, -1, null),
+    MATH_EQUAL(180, -1, null),
+    MATH_NOT_EQUAL(181, -1, null),
+    CORNER_TABS(182, -1, null),
+    SQUARE_TABS(183, -1, null),
+    PLAQUE_TABS(184, -1, null),
+    CHART_X(185, -1, null),
+    CHART_STAR(186, -1, null),
+    CHART_PLUS(187, -1, null),
+    // below are shape types only found in native
+    NOTCHED_CIRCULAR_ARROW(-1, 100, "NotchedCircularArrow"),
+    THICK_ARROW(-1, 14, "ThickArrow"),
+    BALLOON(-1, 17, "Balloon"),
+    TEXT_SIMPLE(-1, 24, "TextSimple"),
+    TEXT_OCTAGON(-1, 25, "TextOctagon"),
+    TEXT_HEXAGON(-1, 26, "TextHexagon"),
+    TEXT_CURVE(-1, 27, "TextCurve"),
+    TEXT_WAVE(-1, 28, "TextWave"),
+    TEXT_RING(-1, 29, "TextRing"),
+    TEXT_ON_CURVE(-1, 30, "TextOnCurve"),
+    TEXT_ON_RING(-1, 31, "TextOnRing"),
+    TEXT_PLAIN_TEXT(-1, 136, "TextPlainText"),
+    TEXT_STOP(-1, 137, "TextStop"),
+    TEXT_TRIANGLE(-1, 138, "TextTriangle"),
+    TEXT_TRIANGLE_INVERTED(-1, 139, "TextTriangleInverted"),
+    TEXT_CHEVRON(-1, 140, "TextChevron"),
+    TEXT_CHEVRON_INVERTED(-1, 141, "TextChevronInverted"),
+    TEXT_RING_INSIDE(-1, 142, "TextRingInside"),
+    TEXT_RING_OUTSIDE(-1, 143, "TextRingOutside"),
+    TEXT_ARCH_UP_CURVE(-1, 144, "TextArchUpCurve"),
+    TEXT_ARCH_DOWN_CURVE(-1, 145, "TextArchDownCurve"),
+    TEXT_CIRCLE_CURVE(-1, 146, "TextCircleCurve"),
+    TEXT_BUTTON_CURVE(-1, 147, "TextButtonCurve"),
+    TEXT_ARCH_UP_POUR(-1, 148, "TextArchUpPour"),
+    TEXT_ARCH_DOWN_POUR(-1, 149, "TextArchDownPour"),
+    TEXT_CIRCLE_POUR(-1, 150, "TextCirclePour"),
+    TEXT_BUTTON_POUR(-1, 151, "TextButtonPour"),
+    TEXT_CURVE_UP(-1, 152, "TextCurveUp"),
+    TEXT_CURVE_DOWN(-1, 153, "TextCurveDown"),
+    TEXT_CASCADE_UP(-1, 154, "TextCascadeUp"),
+    TEXT_CASCADE_DOWN(-1, 155, "TextCascadeDown"),
+    TEXT_WAVE_1(-1, 156, "TextWave1"),
+    TEXT_WAVE_2(-1, 157, "TextWave2"),
+    TEXT_WAVE_3(-1, 158, "TextWave3"),
+    TEXT_WAVE_4(-1, 159, "TextWave4"),
+    TEXT_INFLATE(-1, 160, "TextInflate"),
+    TEXT_DEFLATE(-1, 161, "TextDeflate"),
+    TEXT_INFLATE_BOTTOM(-1, 162, "TextInflateBottom"),
+    TEXT_DEFLATE_BOTTOM(-1, 163, "TextDeflateBottom"),
+    TEXT_INFLATE_TOP(-1, 164, "TextInflateTop"),
+    TEXT_DEFLATE_TOP(-1, 165, "TextDeflateTop"),
+    TEXT_DEFLATE_INFLATE(-1, 166, "TextDeflateInflate"),
+    TEXT_DEFLATE_INFLATE_DEFLATE(-1, 167, "TextDeflateInflateDeflate"),
+    TEXT_FADE_RIGHT(-1, 168, "TextFadeRight"),
+    TEXT_FADE_LEFT(-1, 169, "TextFadeLeft"),
+    TEXT_FADE_UP(-1, 170, "TextFadeUp"),
+    TEXT_FADE_DOWN(-1, 171, "TextFadeDown"),
+    TEXT_SLANT_UP(-1, 172, "TextSlantUp"),
+    TEXT_SLANT_DOWN(-1, 173, "TextSlantDown"),
+    TEXT_CAN_UP(-1, 174, "TextCanUp"),
+    TEXT_CAN_DOWN(-1, 175, "TextCanDown"),
+    CALLOUT_90(-1, 178, "Callout90"),
+    ACCENT_CALLOUT_90(-1, 179, "AccentCallout90"),
+    BORDER_CALLOUT_90(-1, 180, "BorderCallout90"),
+    ACCENT_BORDER_CALLOUT_90(-1, 181, "AccentBorderCallout90"),
+    HOST_CONTROL(-1, 201, "HostControl"),
+    TEXT_BOX(-1, 202, "TextBox")
+    ;
+
+    /** Preset-ID for XML-based shapes */
+    public final int ooxmlId;
+    
+    /** Preset-ID for binary-based shapes */
+    public final int nativeId;
+    
+    /** POI-specific name for the binary-based type */
+    public final String nativeName;
+
+    ShapeType(int ooxmlId, int nativeId, String nativeName){
+        this.ooxmlId = ooxmlId;
+        this.nativeId = nativeId;
+        this.nativeName = nativeName;
+    }
+
+    /** name of the presetShapeDefinit(i)on entry */
+    public String getOoxmlName() {
+        if (this == SEAL) return STAR_16.getOoxmlName();
+        if (ooxmlId == -1) {
+            return (name().startsWith("TEXT")) ? RECT.getOoxmlName() : null;
+        }
+        
+        StringBuilder sb = new StringBuilder();
+        boolean toLower = true;
+        for (char ch : name().toCharArray()) {
+            if (ch == '_') {
+                toLower = false;
+                continue;
+            }
+            sb.append(toLower ? Character.toLowerCase(ch) : Character.toUpperCase(ch));
+            toLower = true;
+        }
+        
+        return sb.toString();
+    }
+    
+    public static ShapeType forId(int id, boolean isOoxmlId){
+        for(ShapeType t : values()){
+            if((isOoxmlId && t.ooxmlId == id) ||
+               (!isOoxmlId && t.nativeId == id)) return t;
+        }
+        throw new IllegalArgumentException("Unknown shape type: " + id);
+    }
+}
diff --git a/src/java/org/apache/poi/sl/usermodel/ShapeTypes.java b/src/java/org/apache/poi/sl/usermodel/ShapeTypes.java
deleted file mode 100644
index 69325fe..0000000
--- a/src/java/org/apache/poi/sl/usermodel/ShapeTypes.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.sl.usermodel;
-
-public interface ShapeTypes {
-    public static final int NotPrimitive = 0;
-    public static final int Rectangle = 1;
-    public static final int RoundRectangle = 2;
-    public static final int Ellipse = 3;
-    public static final int Diamond = 4;
-    public static final int IsocelesTriangle = 5;
-    public static final int RightTriangle = 6;
-    public static final int Parallelogram = 7;
-    public static final int Trapezoid = 8;
-    public static final int Hexagon = 9;
-    public static final int Octagon = 10;
-    public static final int Plus = 11;
-    public static final int Star = 12;
-    public static final int Arrow = 13;
-    public static final int ThickArrow = 14;
-    public static final int HomePlate = 15;
-    public static final int Cube = 16;
-    public static final int Balloon = 17;
-    public static final int Seal = 18;
-    public static final int Arc = 19;
-    public static final int Line = 20;
-    public static final int Plaque = 21;
-    public static final int Can = 22;
-    public static final int Donut = 23;
-    public static final int TextSimple = 24;
-    public static final int TextOctagon = 25;
-    public static final int TextHexagon = 26;
-    public static final int TextCurve = 27;
-    public static final int TextWave = 28;
-    public static final int TextRing = 29;
-    public static final int TextOnCurve = 30;
-    public static final int TextOnRing = 31;
-    public static final int StraightConnector1 = 32;
-    public static final int BentConnector2 = 33;
-    public static final int BentConnector3 = 34;
-    public static final int BentConnector4 = 35;
-    public static final int BentConnector5 = 36;
-    public static final int CurvedConnector2 = 37;
-    public static final int CurvedConnector3 = 38;
-    public static final int CurvedConnector4 = 39;
-    public static final int CurvedConnector5 = 40;
-    public static final int Callout1 = 41;
-    public static final int Callout2 = 42;
-    public static final int Callout3 = 43;
-    public static final int AccentCallout1 = 44;
-    public static final int AccentCallout2 = 45;
-    public static final int AccentCallout3 = 46;
-    public static final int BorderCallout1 = 47;
-    public static final int BorderCallout2 = 48;
-    public static final int BorderCallout3 = 49;
-    public static final int AccentBorderCallout1 = 50;
-    public static final int AccentBorderCallout2 = 51;
-    public static final int AccentBorderCallout3 = 52;
-    public static final int Ribbon = 53;
-    public static final int Ribbon2 = 54;
-    public static final int Chevron = 55;
-    public static final int Pentagon = 56;
-    public static final int NoSmoking = 57;
-    public static final int Star8 = 58;
-    public static final int Star16 = 59;
-    public static final int Star32 = 60;
-    public static final int WedgeRectCallout = 61;
-    public static final int WedgeRRectCallout = 62;
-    public static final int WedgeEllipseCallout = 63;
-    public static final int Wave = 64;
-    public static final int FoldedCorner = 65;
-    public static final int LeftArrow = 66;
-    public static final int DownArrow = 67;
-    public static final int UpArrow = 68;
-    public static final int LeftRightArrow = 69;
-    public static final int UpDownArrow = 70;
-    public static final int IrregularSeal1 = 71;
-    public static final int IrregularSeal2 = 72;
-    public static final int LightningBolt = 73;
-    public static final int Heart = 74;
-    public static final int PictureFrame = 75;
-    public static final int QuadArrow = 76;
-    public static final int LeftArrowCallout = 77;
-    public static final int RightArrowCallout = 78;
-    public static final int UpArrowCallout = 79;
-    public static final int DownArrowCallout = 80;
-    public static final int LeftRightArrowCallout = 81;
-    public static final int UpDownArrowCallout = 82;
-    public static final int QuadArrowCallout = 83;
-    public static final int Bevel = 84;
-    public static final int LeftBracket = 85;
-    public static final int RightBracket = 86;
-    public static final int LeftBrace = 87;
-    public static final int RightBrace = 88;
-    public static final int LeftUpArrow = 89;
-    public static final int BentUpArrow = 90;
-    public static final int BentArrow = 91;
-    public static final int Star24 = 92;
-    public static final int StripedRightArrow = 93;
-    public static final int NotchedRightArrow = 94;
-    public static final int BlockArc = 95;
-    public static final int SmileyFace = 96;
-    public static final int VerticalScroll = 97;
-    public static final int HorizontalScroll = 98;
-    public static final int CircularArrow = 99;
-    public static final int NotchedCircularArrow = 100;
-    public static final int UturnArrow = 101;
-    public static final int CurvedRightArrow = 102;
-    public static final int CurvedLeftArrow = 103;
-    public static final int CurvedUpArrow = 104;
-    public static final int CurvedDownArrow = 105;
-    public static final int CloudCallout = 106;
-    public static final int EllipseRibbon = 107;
-    public static final int EllipseRibbon2 = 108;
-    public static final int FlowChartProcess = 109;
-    public static final int FlowChartDecision = 110;
-    public static final int FlowChartInputOutput = 111;
-    public static final int FlowChartPredefinedProcess = 112;
-    public static final int FlowChartInternalStorage = 113;
-    public static final int FlowChartDocument = 114;
-    public static final int FlowChartMultidocument = 115;
-    public static final int FlowChartTerminator = 116;
-    public static final int FlowChartPreparation = 117;
-    public static final int FlowChartManualInput = 118;
-    public static final int FlowChartManualOperation = 119;
-    public static final int FlowChartConnector = 120;
-    public static final int FlowChartPunchedCard = 121;
-    public static final int FlowChartPunchedTape = 122;
-    public static final int FlowChartSummingJunction = 123;
-    public static final int FlowChartOr = 124;
-    public static final int FlowChartCollate = 125;
-    public static final int FlowChartSort = 126;
-    public static final int FlowChartExtract = 127;
-    public static final int FlowChartMerge = 128;
-    public static final int FlowChartOfflineStorage = 129;
-    public static final int FlowChartOnlineStorage = 130;
-    public static final int FlowChartMagneticTape = 131;
-    public static final int FlowChartMagneticDisk = 132;
-    public static final int FlowChartMagneticDrum = 133;
-    public static final int FlowChartDisplay = 134;
-    public static final int FlowChartDelay = 135;
-    public static final int TextPlainText = 136;
-    public static final int TextStop = 137;
-    public static final int TextTriangle = 138;
-    public static final int TextTriangleInverted = 139;
-    public static final int TextChevron = 140;
-    public static final int TextChevronInverted = 141;
-    public static final int TextRingInside = 142;
-    public static final int TextRingOutside = 143;
-    public static final int TextArchUpCurve = 144;
-    public static final int TextArchDownCurve = 145;
-    public static final int TextCircleCurve = 146;
-    public static final int TextButtonCurve = 147;
-    public static final int TextArchUpPour = 148;
-    public static final int TextArchDownPour = 149;
-    public static final int TextCirclePour = 150;
-    public static final int TextButtonPour = 151;
-    public static final int TextCurveUp = 152;
-    public static final int TextCurveDown = 153;
-    public static final int TextCascadeUp = 154;
-    public static final int TextCascadeDown = 155;
-    public static final int TextWave1 = 156;
-    public static final int TextWave2 = 157;
-    public static final int TextWave3 = 158;
-    public static final int TextWave4 = 159;
-    public static final int TextInflate = 160;
-    public static final int TextDeflate = 161;
-    public static final int TextInflateBottom = 162;
-    public static final int TextDeflateBottom = 163;
-    public static final int TextInflateTop = 164;
-    public static final int TextDeflateTop = 165;
-    public static final int TextDeflateInflate = 166;
-    public static final int TextDeflateInflateDeflate = 167;
-    public static final int TextFadeRight = 168;
-    public static final int TextFadeLeft = 169;
-    public static final int TextFadeUp = 170;
-    public static final int TextFadeDown = 171;
-    public static final int TextSlantUp = 172;
-    public static final int TextSlantDown = 173;
-    public static final int TextCanUp = 174;
-    public static final int TextCanDown = 175;
-    public static final int FlowChartAlternateProcess = 176;
-    public static final int FlowChartOffpageConnector = 177;
-    public static final int Callout90 = 178;
-    public static final int AccentCallout90 = 179;
-    public static final int BorderCallout90 = 180;
-    public static final int AccentBorderCallout90 = 181;
-    public static final int LeftRightUpArrow = 182;
-    public static final int Sun = 183;
-    public static final int Moon = 184;
-    public static final int BracketPair = 185;
-    public static final int BracePair = 186;
-    public static final int Star4 = 187;
-    public static final int DoubleWave = 188;
-    public static final int ActionButtonBlank = 189;
-    public static final int ActionButtonHome = 190;
-    public static final int ActionButtonHelp = 191;
-    public static final int ActionButtonInformation = 192;
-    public static final int ActionButtonForwardNext = 193;
-    public static final int ActionButtonBackPrevious = 194;
-    public static final int ActionButtonEnd = 195;
-    public static final int ActionButtonBeginning = 196;
-    public static final int ActionButtonReturn = 197;
-    public static final int ActionButtonDocument = 198;
-    public static final int ActionButtonSound = 199;
-    public static final int ActionButtonMovie = 200;
-    public static final int HostControl = 201;
-    public static final int TextBox = 202;
-}
diff --git a/src/java/org/apache/poi/sl/usermodel/Sheet.java b/src/java/org/apache/poi/sl/usermodel/Sheet.java
index 7959838..f94b772 100644
--- a/src/java/org/apache/poi/sl/usermodel/Sheet.java
+++ b/src/java/org/apache/poi/sl/usermodel/Sheet.java
@@ -17,13 +17,30 @@
 
 package org.apache.poi.sl.usermodel;
 
+import java.awt.Graphics2D;
+
+
 /**
  * Common parent of Slides, Notes and Masters
  */
-public interface Sheet extends ShapeContainer {
-	public SlideShow getSlideShow();
+public interface Sheet<T extends Shape, SS extends SlideShow> extends ShapeContainer<T> {
+	SS getSlideShow();
 
-	public MasterSheet getMasterSheet();
+    /**
+     * @return whether shapes on the master sheet should be shown. By default master graphics is turned off.
+     * Sheets that support the notion of master (slide, slideLayout) should override it and
+     * check this setting in the sheet XML
+     */
+	boolean getFollowMasterGraphics();
+	
+	MasterSheet<T,SS> getMasterSheet();
 
-	public Background getBackground();
+	Background getBackground();
+	
+	/**
+	 * Convenience method to draw a sheet to a graphics context
+	 *
+	 * @param graphics
+	 */
+	void draw(Graphics2D graphics);
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/SimpleShape.java b/src/java/org/apache/poi/sl/usermodel/SimpleShape.java
index 449433a..e4e8efe 100644
--- a/src/java/org/apache/poi/sl/usermodel/SimpleShape.java
+++ b/src/java/org/apache/poi/sl/usermodel/SimpleShape.java
@@ -17,10 +17,20 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface SimpleShape extends Shape {
-	public Fill getFill();
-	public LineStyle getLineStyle();
+import org.apache.poi.sl.draw.geom.CustomGeometry;
+import org.apache.poi.sl.draw.geom.IAdjustableShape;
 
-	public Hyperlink getHyperlink();
-	public void setHyperlink(Hyperlink hyperlink);
+
+public interface SimpleShape extends Shape, IAdjustableShape, PlaceableShape {
+    FillStyle getFillStyle();
+    LineDecoration getLineDecoration();
+    StrokeStyle getStrokeStyle();
+
+    CustomGeometry getGeometry();
+    
+    ShapeType getShapeType();
+
+    boolean isPlaceholder();
+    
+	Shadow getShadow();
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/Slide.java b/src/java/org/apache/poi/sl/usermodel/Slide.java
index d3c4af2..7b238de 100644
--- a/src/java/org/apache/poi/sl/usermodel/Slide.java
+++ b/src/java/org/apache/poi/sl/usermodel/Slide.java
@@ -17,16 +17,21 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface Slide extends Sheet {
-	public Notes getNotes();
-	public void setNotes(Notes notes);
+public interface Slide<T extends Shape, SS extends SlideShow, N extends Notes<T,SS>> extends Sheet<T, SS> {
+	N getNotes();
+	void setNotes(N notes);
 
-	public boolean getFollowMasterBackground();
-	public void setFollowMasterBackground(boolean follow);
+	boolean getFollowMasterBackground();
+	void setFollowMasterBackground(boolean follow);
 
-	public boolean getFollowMasterColourScheme();
-	public void setFollowMasterColourScheme(boolean follow);
+	boolean getFollowMasterColourScheme();
+	void setFollowMasterColourScheme(boolean follow);
 
-	public boolean getFollowMasterObjects();
-	public void setFollowMasterObjects(boolean follow);
+	boolean getFollowMasterObjects();
+	void setFollowMasterObjects(boolean follow);
+
+	/**
+	 * @return the 1-based slide no.
+	 */
+	int getSlideNumber();
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/SlideShow.java b/src/java/org/apache/poi/sl/usermodel/SlideShow.java
index 8239bb9..ca0ddf3 100644
--- a/src/java/org/apache/poi/sl/usermodel/SlideShow.java
+++ b/src/java/org/apache/poi/sl/usermodel/SlideShow.java
@@ -17,14 +17,29 @@
 
 package org.apache.poi.sl.usermodel;
 
+import java.awt.Dimension;
 import java.io.IOException;
+import java.util.List;
 
 public interface SlideShow {
-	public Slide createSlide() throws IOException;
-	public MasterSheet createMasterSheet() throws IOException;
+	Slide<? extends Shape, ? extends SlideShow, ? extends Notes<?,?>> createSlide() throws IOException;
 
-	public Slide[] getSlides();
-	public MasterSheet[] getMasterSheet();
+	List<? extends Slide<? extends Shape, ? extends SlideShow, ? extends Notes<?,?>>> getSlides();
 
-	public Resources getResources();
+    MasterSheet<? extends Shape, ? extends SlideShow> createMasterSheet() throws IOException;
+
+	/**
+     * Returns all slide masters.
+     * This doesn't include notes master and other arbitrary masters.
+     */
+	List<? extends MasterSheet<? extends Shape, ? extends SlideShow>> getSlideMasters();
+
+	Resources getResources();
+
+    /**
+     * Returns the current page size
+     *
+     * @return the page size
+     */
+    Dimension getPageSize();    
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/StrokeStyle.java b/src/java/org/apache/poi/sl/usermodel/StrokeStyle.java
new file mode 100644
index 0000000..244173f
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/StrokeStyle.java
@@ -0,0 +1,129 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.sl.usermodel;
+
+public interface StrokeStyle {
+    enum LineCap {
+        /** Rounded ends */
+        ROUND(1),
+        /** Square protrudes by half line width */
+        SQUARE(2),
+        /** Line ends at end point*/
+        FLAT(3);
+        
+        public final int ooxmlId;
+        
+        LineCap(int ooxmlId) {
+            this.ooxmlId = ooxmlId;
+        }
+
+        public static LineCap fromOoxmlId(int ooxmlId) {
+            for (LineCap lc : values()) {
+                if (lc.ooxmlId == ooxmlId) return lc;
+            }
+            return null;
+        }
+    }
+
+    /**
+     * The line dash with pattern.
+     * The pattern is derived empirically on PowerPoint 2010 and needs to be multiplied
+     * with actual line width
+     */
+    enum LineDash {
+        /** Solid (continuous) pen - native 1 */
+        SOLID(1, 1, null),
+        /** square dot style - native 6 */
+        DOT(6, 2, 1,1),
+        /** dash style - native 7 */
+        DASH(7, 3, 3,4),
+        /** dash short dash - native 9*/
+        DASH_DOT(9, 5, 4,3,1,3),
+        /** long dash style - native 8 */
+        LG_DASH(8, 4, 8,3),
+        /** long dash short dash - native 10 */
+        LG_DASH_DOT(10, 6, 8,3,1,3),
+        /** long dash short dash short dash - native 11 */
+        LG_DASH_DOT_DOT(11, 7, 8,3,1,3,1,3),
+        /** PS_DASH system dash style - native 2 */
+        SYS_DASH(2, 8, 2,2),
+        /** PS_DOT system dash style - native 3 */
+        SYS_DOT(3, 9, 1,1),
+        /** PS_DASHDOT system dash style - native 4 */
+        SYS_DASH_DOT(4, 10, 2,2,1,1),
+        /** PS_DASHDOTDOT system dash style / native 5 */
+        SYS_DASH_DOT_DOT(5, 11, 2,2,1,1,1,1);
+
+        public final int pattern[];
+        public final int nativeId;
+        public final int ooxmlId;
+
+        LineDash(int nativeId, int ooxmlId, int... pattern) {
+            this.nativeId = nativeId;
+            this.ooxmlId = ooxmlId;
+            this.pattern = (pattern == null || pattern.length == 0) ? null : pattern;
+        }
+
+        public static LineDash fromNativeId(int nativeId) {
+            for (LineDash ld : values()) {
+                if (ld.nativeId == nativeId) return ld;
+            }
+            return null;
+        }
+
+        public static LineDash fromOoxmlId(int ooxmlId) {
+            for (LineDash ld : values()) {
+                if (ld.ooxmlId == ooxmlId) return ld;
+            }
+            return null;
+        }
+    }
+
+    enum LineCompound {
+        /** Single line (of width lineWidth) - native 0 / ooxml default */
+        SINGLE(0),
+        /** Double lines of equal width - native 1 / ooxml "dbl" */
+        DOUBLE(1),
+        /** Double lines, one thick, one thin - native 2 / ooxml "thickThin" */
+        THICK_THIN(2),
+        /** Double lines, reverse order - native 3 / ooxml "thinThick" */
+        THIN_THICK(3),
+        /** Three lines, thin, thick, thin - native 4 / ooxml "tri" */
+        TRIPLE(4);
+        
+        public final int nativeId;
+        
+        LineCompound(int nativeId) {
+            this.nativeId = nativeId;
+        }
+
+        public static LineCompound fromNativeId(int nativeId) {
+            for (LineCompound lc : values()) {
+                if (lc.nativeId == nativeId) return lc;
+            }
+            return null;
+        }
+    }
+
+
+    PaintStyle getPaint();
+    LineCap getLineCap();
+    LineDash getLineDash();
+    LineCompound getLineCompound();
+    double getLineWidth();
+}
diff --git a/src/java/org/apache/poi/sl/usermodel/Picture.java b/src/java/org/apache/poi/sl/usermodel/TableShape.java
similarity index 91%
rename from src/java/org/apache/poi/sl/usermodel/Picture.java
rename to src/java/org/apache/poi/sl/usermodel/TableShape.java
index 9a55313..4fda40f 100644
--- a/src/java/org/apache/poi/sl/usermodel/Picture.java
+++ b/src/java/org/apache/poi/sl/usermodel/TableShape.java
@@ -1,22 +1,22 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.sl.usermodel;
-
-public interface Picture extends SimpleShape {
-	public PictureData getPictureData();
-}
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+public interface TableShape extends Shape, PlaceableShape {

+    // to be defined ...

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/TextBox.java b/src/java/org/apache/poi/sl/usermodel/TextBox.java
index 5a88815..3fa3bbe 100644
--- a/src/java/org/apache/poi/sl/usermodel/TextBox.java
+++ b/src/java/org/apache/poi/sl/usermodel/TextBox.java
@@ -17,5 +17,5 @@
 
 package org.apache.poi.sl.usermodel;
 
-public interface TextBox extends AutoShape {
+public interface TextBox<T extends TextParagraph<? extends TextRun>> extends AutoShape<T> {
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/TextPainter.java b/src/java/org/apache/poi/sl/usermodel/TextPainter.java
deleted file mode 100644
index e2490de..0000000
--- a/src/java/org/apache/poi/sl/usermodel/TextPainter.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.sl.usermodel;
-
-import java.awt.RenderingHints;
-import java.text.AttributedString;
-
-/**
- * Common parent for painting Text into a Graphics2D object
- *  for rendering
- */
-public interface TextPainter {
-    public static final Key KEY_FONTFALLBACK = new Key(50, "Font fallback map");
-    public static final Key KEY_FONTMAP = new Key(51, "Font map");
-
-    public static class TextElement {
-        public AttributedString _text;
-        public int _textOffset;
-        public AttributedString _bullet;
-        public int _bulletOffset;
-        public int _align;
-        public float ascent, descent;
-        public float advance;
-        public int textStartIndex, textEndIndex;
-    }
-
-    public static class Key extends RenderingHints.Key {
-        String description;
-
-        public Key(int paramInt, String paramString) {
-            super(paramInt);
-            this.description = paramString;
-        }
-
-        public final int getIndex() {
-            return intKey();
-        }
-
-        public final String toString() {
-            return this.description;
-        }
-
-        public boolean isCompatibleValue(Object paramObject) {
-            return true;
-        }
-    }
-}
diff --git a/src/java/org/apache/poi/sl/usermodel/TextParagraph.java b/src/java/org/apache/poi/sl/usermodel/TextParagraph.java
new file mode 100644
index 0000000..a914dd7
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/TextParagraph.java
@@ -0,0 +1,324 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+import java.awt.Color;

+

+

+public interface TextParagraph<T extends TextRun> extends Iterable<T> {

+

+    /**

+     * Specifies a list of text alignment types

+     */

+    public enum TextAlign {

+        /**

+         * For horizontal text, left aligned.

+         * For vertical text, top aligned.

+         */

+        LEFT,

+

+        /**

+         * For horizontal text, centered.

+         * For vertical text, middle aligned.

+         */

+        CENTER,

+

+        /**

+         * For horizontal text, right aligned.

+         * For vertical text, bottom aligned.

+         */

+        RIGHT,

+

+        /**

+         * Align text so that it is justified across the whole line. It

+         * is smart in the sense that it will not justify sentences

+         * which are short

+         * 

+         * For horizontal text, flush left and right.

+         * For vertical text, flush top and bottom.

+         */

+        JUSTIFY,

+        

+        /**

+         * Kashida justify low.

+         */    

+        JUSTIFY_LOW,

+

+        /**

+         * Distribute space between characters.

+         */

+        DIST,

+        

+        /**

+         * Thai distribution justification.

+         */

+        THAI_DIST

+    }

+

+    /**

+     * 

+     */

+    public enum FontAlign {

+        AUTO,

+        

+        /**

+         * Characters hang from top of line height.

+         * Also known as "Hanging"

+         */

+        TOP,

+        

+        /**

+         * Characters centered within line height.

+         */

+        CENTER,

+        

+        /**

+         * Place characters on font baseline.

+         * Also known as "Roman" 

+         */

+        BASELINE,

+        

+        /**

+         * Characters are anchored to the very bottom of a single line.

+         * This is different than BASELINE because of letters such as "g", "q", and "y".

+         * Also known as "UpholdFixed"

+         */

+        BOTTOM; 

+    }

+    

+    public interface BulletStyle {

+        String getBulletCharacter();

+        String getBulletFont();

+        

+        /**

+         * The bullet point font size

+         * If bulletFontSize >= 0, then space is a percentage of normal line height.

+         * If bulletFontSize < 0, the absolute value in points

+         *

+         * @return the bullet point font size

+         */

+        Double getBulletFontSize();

+        Color getBulletFontColor();

+        

+        AutoNumberingScheme getAutoNumberingScheme();

+        /**

+         * Index (1-based) of the first auto number value, or null if auto numbering scheme

+         * wasn't assigned.

+         */

+        Integer getAutoNumberingStartAt();

+    }

+

+    /**

+     * The amount of vertical white space before the paragraph

+     * This may be specified in two different ways, percentage spacing and font point spacing:

+     * <p>

+     * If spaceBefore >= 0, then space is a percentage of normal line height.

+     * If spaceBefore < 0, the absolute value in points

+     * </p>

+     *

+     * @return the vertical white space before the paragraph, or null if unset

+     */

+    Double getSpaceBefore();

+

+    /**

+     * Set the amount of vertical white space that will be present before the paragraph.

+     * This space is specified in either percentage or points:

+     * <p>

+     * If spaceBefore >= 0, then space is a percentage of normal line height.

+     * If spaceBefore < 0, the absolute value of linespacing is the spacing in points

+     * </p>

+     * Examples:

+     * <pre><code>

+     *      // The paragraph will be formatted to have a spacing before the paragraph text.

+     *      // The spacing will be 200% of the size of the largest text on each line

+     *      paragraph.setSpaceBefore(200);

+     *

+     *      // The spacing will be a size of 48 points

+     *      paragraph.setSpaceBefore(-48.0);

+     * </code></pre>

+     *

+     * @param spaceBefore the vertical white space before the paragraph, null to unset

+     */

+    void setSpaceBefore(Double spaceBefore);    

+    

+    /**

+     * The amount of vertical white space after the paragraph

+     * This may be specified in two different ways, percentage spacing and font point spacing:

+     * <p>

+     * If spaceBefore >= 0, then space is a percentage of normal line height.

+     * If spaceBefore < 0, the absolute value of linespacing is the spacing in points

+     * </p>

+     *

+     * @return the vertical white space after the paragraph or null, if unset

+     */

+    Double getSpaceAfter();    

+

+    /**

+     * Set the amount of vertical white space that will be present after the paragraph.

+     * This space is specified in either percentage or points:

+     * <p>

+     * If spaceAfter >= 0, then space is a percentage of normal line height.

+     * If spaceAfter < 0, the absolute value of linespacing is the spacing in points

+     * </p>

+     * Examples:

+     * <pre><code>

+     *      // The paragraph will be formatted to have a spacing after the paragraph text.

+     *      // The spacing will be 200% of the size of the largest text on each line

+     *      paragraph.setSpaceAfter(200);

+     *

+     *      // The spacing will be a size of 48 points

+     *      paragraph.setSpaceAfter(-48.0);

+     * </code></pre>

+     *

+     * @param spaceAfter the vertical white space after the paragraph, null to unset

+     */

+    public void setSpaceAfter(Double spaceAfter);

+    

+    /**

+     * @return the left margin (in points) of the paragraph or null, if unset

+     */

+    Double getLeftMargin();

+

+    /**

+     * Specifies the left margin of the paragraph. This is specified in addition to the text body

+     * inset and applies only to this text paragraph. That is the text body Inset and the LeftMargin

+     * attributes are additive with respect to the text position.

+     * 

+     * @param leftMargin the left margin (in points) or null to unset

+     */

+    void setLeftMargin(Double leftMargin);

+    

+    

+    /**

+     * Specifies the right margin of the paragraph. This is specified in addition to the text body

+     * inset and applies only to this text paragraph. That is the text body Inset and the RightMargin

+     * attributes are additive with respect to the text position.

+     * 

+     * The right margin is not support and therefore ignored by the HSLF implementation.

+     * 

+     * @return the right margin (in points) of the paragraph or null, if unset

+     */

+    Double getRightMargin();

+

+    /**

+     * @param rightMargin the right margin (in points) of the paragraph

+     */

+    void setRightMargin(Double rightMargin);

+    

+    /**

+     * @return the indent (in points) applied to the first line of text in the paragraph.

+     *  or null, if unset

+     */

+    Double getIndent();

+    

+    /**

+     * Specifies the indent size that will be applied to the first line of text in the paragraph.   

+     * 

+     * @param indent the indent (in points) applied to the first line of text in the paragraph

+     */

+    void setIndent(Double indent);

+

+

+    /**

+     * @return the text level of this paragraph (0-based). Default is 0.

+     */    

+    int getIndentLevel();

+

+    /**

+     * Specifies the particular level text properties that this paragraph will follow.

+     * The value for this attribute formats the text according to the corresponding level

+     * paragraph properties defined in the SlideMaster.

+     *

+     * @param level the level (0 ... 4)

+     */

+    void setIndentLevel(int level);

+    

+    /**

+     * Returns the vertical line spacing that is to be used within a paragraph.

+     * This may be specified in two different ways, percentage spacing and font point spacing:

+     * <p>

+     * If linespacing >= 0, then linespacing is a percentage of normal line height.

+     * If linespacing < 0, the absolute value of linespacing is the spacing in points

+     * </p>

+     *

+     * @return the vertical line spacing or null, if unset

+     */

+    Double getLineSpacing();

+    

+    /**

+     * This element specifies the vertical line spacing that is to be used within a paragraph.

+     * This may be specified in two different ways, percentage spacing and font point spacing:

+     * <p>

+     * If linespacing >= 0, then linespacing is a percentage of normal line height

+     * If linespacing < 0, the absolute value of linespacing is the spacing in points

+     * </p>

+     * Examples:

+     * <pre><code>

+     *      // spacing will be 120% of the size of the largest text on each line

+     *      paragraph.setLineSpacing(120);

+     *

+     *      // spacing will be 200% of the size of the largest text on each line

+     *      paragraph.setLineSpacing(200);

+     *

+     *      // spacing will be 48 points

+     *      paragraph.setLineSpacing(-48.0);

+     * </code></pre>

+     * 

+     * @param linespacing the vertical line spacing

+     */

+    void setLineSpacing(Double lineSpacing);

+

+    String getDefaultFontFamily();

+    

+    /**

+     * @return the default font size, in case its not set in the textrun or null, if unset

+     */

+    Double getDefaultFontSize();

+    

+    /**

+     * Returns the alignment that is applied to the paragraph.

+     *

+     * If this attribute is omitted, then a value of left is implied.

+     * @return ??? alignment that is applied to the paragraph

+     */

+    TextAlign getTextAlign();

+    

+    

+    /**

+     * Returns the font alignment that is applied to the paragraph.

+     *

+     * If this attribute is omitted, then null is return,

+     * user code can imply the a value of {@link FontAlign#AUTO}

+     * 

+     * @return alignment that is applied to the paragraph

+     */

+    FontAlign getFontAlign();

+    

+    /**

+     * @return the bullet style of the paragraph, if {@code null} then no bullets are used 

+     */

+    BulletStyle getBulletStyle();

+    

+    /**

+     * @return the default size for a tab character within this paragraph in points, null if unset

+     */

+    Double getDefaultTabSize();

+

+    

+    TextShape<? extends TextParagraph<T>> getParentShape();

+}

diff --git a/src/java/org/apache/poi/sl/usermodel/TextRun.java b/src/java/org/apache/poi/sl/usermodel/TextRun.java
index ae1a134..946bfc3 100644
--- a/src/java/org/apache/poi/sl/usermodel/TextRun.java
+++ b/src/java/org/apache/poi/sl/usermodel/TextRun.java
@@ -17,14 +17,47 @@
 
 package org.apache.poi.sl.usermodel;
 
+import java.awt.Color;
+
 /**
  * Some text.
- *
- * TODO - decide on how we do rich text stuff
  */
 public interface TextRun {
-	public String getText();
-	public void setText(String text);
+    enum TextCap {
+        NONE,
+        SMALL,
+        ALL
+    }
+    
+    String getRawText();
+	void setText(String text);
 
-	// TODO - rich text formatting stuff
+	TextCap getTextCap();
+	
+	Color getFontColor();
+	void setFontColor(Color color);
+	
+	
+    /**
+     * @return font size in points or null if font size is not set.
+     */
+	Double getFontSize();
+
+    /**
+     * @param fontSize font size in points, if null the underlying fontsize will be unset
+     */
+	void setFontSize(Double fontSize);
+	String getFontFamily();
+	
+	boolean isBold();
+	boolean isItalic();
+	boolean isUnderlined();
+	boolean isStrikethrough();
+	boolean isSubscript();
+	boolean isSuperscript();
+	
+	/**
+	 * @return the pitch and family id or -1 if not applicable
+	 */
+	byte getPitchAndFamily();
 }
diff --git a/src/java/org/apache/poi/sl/usermodel/TextShape.java b/src/java/org/apache/poi/sl/usermodel/TextShape.java
new file mode 100644
index 0000000..927fdf1
--- /dev/null
+++ b/src/java/org/apache/poi/sl/usermodel/TextShape.java
@@ -0,0 +1,128 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.sl.usermodel;

+

+import org.apache.poi.ss.usermodel.HorizontalAlignment;

+

+

+

+public interface TextShape<T extends TextParagraph<? extends TextRun>> extends SimpleShape, Iterable<T>  {

+    /**

+     * Vertical Text Types

+     */

+    public enum TextDirection {

+        /**

+         * Horizontal text. This should be default.

+         */

+        HORIZONTAL,

+        /**

+         * Vertical orientation.

+         * (each line is 90 degrees rotated clockwise, so it goes

+         * from top to bottom; each next line is to the left from

+         * the previous one).

+         */

+        VERTICAL,

+        /**

+         * Vertical orientation.

+         * (each line is 270 degrees rotated clockwise, so it goes

+         * from bottom to top; each next line is to the right from

+         * the previous one).

+         */

+        VERTICAL_270,

+        /**

+         * Determines if all of the text is vertical

+         * ("one letter on top of another").

+         */

+        STACKED;

+    }

+

+    /**

+     * Specifies alist of auto-fit types.

+     * <p>

+     * Autofit specofies that a shape should be auto-fit to fully contain the text described within it.

+     * Auto-fitting is when text within a shape is scaled in order to contain all the text inside

+     * </p>

+     */

+    public enum TextAutofit {

+        /**

+         * Specifies that text within the text body should not be auto-fit to the bounding box.

+         * Auto-fitting is when text within a text box is scaled in order to remain inside

+         * the text box.

+         */

+        NONE,

+        /**

+         * Specifies that text within the text body should be normally auto-fit to the bounding box.

+         * Autofitting is when text within a text box is scaled in order to remain inside the text box.

+         *

+         * <p>

+         * <em>Example:</em> Consider the situation where a user is building a diagram and needs

+         * to have the text for each shape that they are using stay within the bounds of the shape.

+         * An easy way this might be done is by using NORMAL autofit

+         * </p>

+         */

+        NORMAL,

+        /**

+         * Specifies that a shape should be auto-fit to fully contain the text described within it.

+         * Auto-fitting is when text within a shape is scaled in order to contain all the text inside.

+         *

+         * <p>

+         * <em>Example:</em> Consider the situation where a user is building a diagram and needs to have

+         * the text for each shape that they are using stay within the bounds of the shape.

+         * An easy way this might be done is by using SHAPE autofit

+         * </p>

+         */

+        SHAPE

+    }    

+    

+    /**

+     * @return text shape margin

+     */

+    Insets2D getInsets();

+    

+    /**

+     * Compute the cumulative height occupied by the text

+     */

+    double getTextHeight();

+    

+    /**

+     * Returns the type of vertical alignment for the text.

+     *

+     * @return the type of vertical alignment

+     */

+    VerticalAlignment getVerticalAlignment();

+    

+    /**

+     * Returns if the text is centered.

+     * If true and if the individual paragraph settings allow it,

+     * the whole text block will be displayed centered, i.e. its left and right

+     * margin will be maximized while still keeping the alignment of the paragraphs

+     *

+     * @return true, if the text anchor is horizontal centered 

+     */

+    boolean isHorizontalCentered();

+    

+    /**

+     * @return whether to wrap words within the bounding rectangle

+     */

+    boolean getWordWrap();

+    

+    /**

+     * @return vertical orientation of the text

+     */

+    TextDirection getTextDirection();

+}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/VerticalAlignment.java b/src/java/org/apache/poi/sl/usermodel/VerticalAlignment.java
similarity index 98%
rename from src/ooxml/java/org/apache/poi/xslf/usermodel/VerticalAlignment.java
rename to src/java/org/apache/poi/sl/usermodel/VerticalAlignment.java
index fd00a64..540bf2e 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/VerticalAlignment.java
+++ b/src/java/org/apache/poi/sl/usermodel/VerticalAlignment.java
@@ -16,7 +16,7 @@
  *    limitations under the License.

  * ====================================================================

  */

-package org.apache.poi.xslf.usermodel;

+package org.apache.poi.sl.usermodel;

 

 /**

  * Specifies a list of available anchoring types for text

diff --git a/src/java/org/apache/poi/util/HexDump.java b/src/java/org/apache/poi/util/HexDump.java
index d88a2fb..02d9b6a 100644
--- a/src/java/org/apache/poi/util/HexDump.java
+++ b/src/java/org/apache/poi/util/HexDump.java
@@ -170,49 +170,41 @@
      * @return output string
      */
 
-    public static String dump(final byte [] data, final long offset,
-                            final int index) {
-        StringBuffer buffer;
-        if ((index < 0) || (index >= data.length))
+    public static String dump(final byte [] data, final long offset, final int index) {
+        if ((index < 0) || (index > data.length))
         {
             throw new ArrayIndexOutOfBoundsException(
                 "illegal index: " + index + " into array of length "
                 + data.length);
         }
-        long         display_offset = offset + index;
-        buffer         = new StringBuffer(74);
+        long  display_offset = offset + index;
+        StringBuilder buffer = new StringBuilder(74);
 
-        for (int j = index; j < data.length; j += 16)
-        {
+        for (int j = index; j <= data.length; j += 16) {
             int chars_read = data.length - j;
 
-            if (chars_read > 16)
-            {
+            if (chars_read > 16) {
                 chars_read = 16;
             }
+            
             buffer.append(dump(display_offset)).append(' ');
-            for (int k = 0; k < 16; k++)
-            {
-                if (k < chars_read)
-                {
-                    buffer.append(dump(data[ k + j ]));
-                }
-                else
-                {
-                    buffer.append("  ");
-                }
+            for (int k = 0; k < 16; k++) {
+                String hexDmp = (k < chars_read) ? dump(data[ k + j ]) : "  ";
+                buffer.append(hexDmp);
                 buffer.append(' ');
             }
-            for (int k = 0; k < chars_read; k++)
-            {
-                if ((data[ k + j ] >= ' ') && (data[ k + j ] < 127))
-                {
-                    buffer.append(( char ) data[ k + j ]);
+            for (int k = 0; k < chars_read; k++) {
+                byte dataB = data[ k + j ];
+                char charB = (char)(dataB & 0xFF);
+                switch (charB) {
+                case 127: case 128: case 129: case 141: case 142: case 143: case 144: case 157: case 158:
+                    charB = '.';
+                    break;
+                default:
+                    if (charB < ' ') charB = '.';
+                    break;
                 }
-                else
-                {
-                    buffer.append('.');
-                }
+                buffer.append(charB);
             }
             buffer.append(EOL);
             display_offset += chars_read;
diff --git a/src/java/org/apache/poi/util/Units.java b/src/java/org/apache/poi/util/Units.java
index d402156..d7f211d 100644
--- a/src/java/org/apache/poi/util/Units.java
+++ b/src/java/org/apache/poi/util/Units.java
@@ -24,6 +24,22 @@
     public static final int EMU_PER_POINT = 12700;

 

     /**

+     * Master DPI (576 pixels per inch).

+     * Used by the reference coordinate system in PowerPoint (HSLF)

+     */

+    public static final int MASTER_DPI = 576;    

+

+    /**

+     * Pixels DPI (96 pixels per inch)

+     */

+    public static final int PIXEL_DPI = 96;

+

+    /**

+     * Points DPI (72 pixels per inch)

+     */

+    public static final int POINT_DPI = 72;    

+

+    /**

      * Converts points to EMUs

      * @param points points

      * @return emus

@@ -42,17 +58,45 @@
     }

     

     /**

-     * Converts a value of type FixedPoint to a decimal number

+     * Converts a value of type FixedPoint to a floating point

      *

      * @param fixedPoint

-     * @return decimal number

+     * @return floating point (double)

      * 

      * @see <a href="http://msdn.microsoft.com/en-us/library/dd910765(v=office.12).aspx">[MS-OSHARED] - 2.2.1.6 FixedPoint</a>

      */

-    public static double fixedPointToDecimal(int fixedPoint) {

+    public static double fixedPointToDouble(int fixedPoint) {

         int i = (fixedPoint >> 16);

         int f = (fixedPoint >> 0) & 0xFFFF;

-        double decimal = (i + f/65536.0);

-        return decimal;

+        double floatPoint = (i + f/65536d);

+        return floatPoint;

+    }

+    

+    /**

+     * Converts a value of type floating point to a FixedPoint

+     *

+     * @param floatPoint

+     * @return fixedPoint

+     * 

+     * @see <a href="http://msdn.microsoft.com/en-us/library/dd910765(v=office.12).aspx">[MS-OSHARED] - 2.2.1.6 FixedPoint</a>

+     */

+    public static int doubleToFixedPoint(double floatPoint) {

+        int i = (int)Math.floor(floatPoint);

+        int f = (int)((floatPoint % 1d)*65536d);

+        int fixedPoint = (i << 16) | (f & 0xFFFF);

+        return fixedPoint;

+    }

+

+    public static double masterToPoints(int masterDPI) {

+        double points = masterDPI;

+        points *= POINT_DPI;

+        points /= MASTER_DPI;

+        return points;

+    }

+    

+    public static int pointsToMaster(double points) {

+        points *= MASTER_DPI;

+        points /= POINT_DPI;

+        return (int)points;

     }

 }

diff --git a/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java
index 67f1067..266ebb3 100644
--- a/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java
+++ b/src/ooxml/java/org/apache/poi/xslf/extractor/XSLFPowerPointExtractor.java
@@ -17,6 +17,7 @@
 package org.apache.poi.xslf.extractor;
 
 import java.io.IOException;
+import java.util.List;
 
 import org.apache.poi.POIXMLTextExtractor;
 import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
@@ -122,7 +123,7 @@
    public String getText(boolean slideText, boolean notesText, boolean masterText) {
       StringBuffer text = new StringBuffer();
 
-      XSLFSlide[] slides = slideshow.getSlides();
+      List<XSLFSlide> slides = slideshow.getSlides();
       XSLFCommentAuthors commentAuthors = slideshow.getCommentAuthors();
 
       for (XSLFSlide slide : slides) {
diff --git a/src/ooxml/java/org/apache/poi/xslf/model/ParagraphPropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/ParagraphPropertyFetcher.java
index 65c19e6..c6c5836 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/ParagraphPropertyFetcher.java
+++ b/src/ooxml/java/org/apache/poi/xslf/model/ParagraphPropertyFetcher.java
@@ -19,7 +19,7 @@
 

 package org.apache.poi.xslf.model;

 

-import org.apache.poi.xslf.usermodel.XSLFSimpleShape;

+import org.apache.poi.xslf.usermodel.XSLFShape;

 import org.apache.xmlbeans.XmlObject;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;

 

@@ -34,7 +34,7 @@
         _level = level;

     }

 

-    public boolean fetch(XSLFSimpleShape shape) {

+    public boolean fetch(XSLFShape shape) {

 

         XmlObject[] o = shape.getXmlObject().selectPath(

                 "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +

diff --git a/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java
index d446cce..f9e8a78 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java
+++ b/src/ooxml/java/org/apache/poi/xslf/model/PropertyFetcher.java
@@ -19,8 +19,8 @@
 

 package org.apache.poi.xslf.model;

 

-import org.apache.poi.xslf.usermodel.XSLFSimpleShape;

 import org.apache.poi.util.Internal;

+import org.apache.poi.xslf.usermodel.XSLFShape;

 

 /**

  *  Used internally to navigate the PresentationML text style hierarchy and fetch properties

@@ -36,7 +36,7 @@
      * @param shape the shape being examined

      * @return true if the desired property was fetched

      */

-    public abstract boolean fetch(XSLFSimpleShape shape) ;

+    public abstract boolean fetch(XSLFShape shape);

 

     public T getValue(){

         return _value;

diff --git a/src/ooxml/java/org/apache/poi/xslf/model/TextBodyPropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/TextBodyPropertyFetcher.java
index b66a1e5..cc8486a 100644
--- a/src/ooxml/java/org/apache/poi/xslf/model/TextBodyPropertyFetcher.java
+++ b/src/ooxml/java/org/apache/poi/xslf/model/TextBodyPropertyFetcher.java
@@ -19,7 +19,7 @@
 

 package org.apache.poi.xslf.model;

 

-import org.apache.poi.xslf.usermodel.XSLFSimpleShape;

+import org.apache.poi.xslf.usermodel.XSLFShape;

 import org.apache.xmlbeans.XmlObject;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;

 

@@ -32,7 +32,7 @@
  */

 public abstract class TextBodyPropertyFetcher<T> extends PropertyFetcher<T> {

 

-    public boolean fetch(XSLFSimpleShape shape) {

+    public boolean fetch(XSLFShape shape) {

 

         XmlObject[] o = shape.getXmlObject().selectPath(

                 "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +

diff --git a/src/ooxml/java/org/apache/poi/xslf/model/geom/PresetGeometries.java b/src/ooxml/java/org/apache/poi/xslf/model/geom/PresetGeometries.java
deleted file mode 100644
index 86abf67..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/model/geom/PresetGeometries.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  ====================================================================
- *    Licensed to the Apache Software Foundation (ASF) under one or more
- *    contributor license agreements.  See the NOTICE file distributed with
- *    this work for additional information regarding copyright ownership.
- *    The ASF licenses this file to You under the Apache License, Version 2.0
- *    (the "License"); you may not use this file except in compliance with
- *    the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- * ====================================================================
- */
-
-package org.apache.poi.xslf.model.geom;
-
-import org.apache.poi.xslf.usermodel.XMLSlideShow;
-import org.apache.xmlbeans.XmlObject;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
-
-import java.io.InputStream;
-import java.util.LinkedHashMap;
-
-/**
- * Date: 10/25/11
- *
- * @author Yegor Kozlov
- */
-public class PresetGeometries extends LinkedHashMap<String, CustomGeometry> {
-    private static PresetGeometries _inst;
-
-    private PresetGeometries(){
-        try {
-            InputStream is =
-                    XMLSlideShow.class.getResourceAsStream("presetShapeDefinitions.xml");
-            try {
-            	read(is);
-            } finally {
-            	is.close();
-            }
-        } catch (Exception e){
-            throw new RuntimeException(e);
-        }
-    }
-
-    private void read(InputStream is) throws Exception {
-        XmlObject obj = XmlObject.Factory.parse(is);
-        for (XmlObject def : obj.selectPath("*/*")) {
-
-            String name = def.getDomNode().getLocalName();
-            CTCustomGeometry2D geom = CTCustomGeometry2D.Factory.parse(def.toString());
-
-            if(containsKey(name)) {
-                System.out.println("Duplicate definoition of " + name) ;
-            }
-            put(name, new CustomGeometry(geom));
-        }
-    }
-
-    public static PresetGeometries getInstance(){
-        if(_inst == null) _inst = new PresetGeometries();
-
-        return _inst;
-    }
-
-}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDecoration.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDecoration.java
deleted file mode 100644
index 72b28c0..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDecoration.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/* ====================================================================

-   Licensed to the Apache Software Foundation (ASF) under one or more

-   contributor license agreements.  See the NOTICE file distributed with

-   this work for additional information regarding copyright ownership.

-   The ASF licenses this file to You under the Apache License, Version 2.0

-   (the "License"); you may not use this file except in compliance with

-   the License.  You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

-==================================================================== */

-package org.apache.poi.xslf.usermodel;

-

-/**

- *  Represents the shape decoration that appears at the ends of lines.

- */

-public enum LineDecoration {

-    NONE,

-    TRIANGLE,

-    STEALTH,

-    DIAMOND,

-    OVAL,

-    ARROW

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndLength.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndLength.java
deleted file mode 100644
index 43ccb56..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndLength.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* ====================================================================

-   Licensed to the Apache Software Foundation (ASF) under one or more

-   contributor license agreements.  See the NOTICE file distributed with

-   this work for additional information regarding copyright ownership.

-   The ASF licenses this file to You under the Apache License, Version 2.0

-   (the "License"); you may not use this file except in compliance with

-   the License.  You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

-==================================================================== */

-package org.apache.poi.xslf.usermodel;

-

-/**

- * @author Yegor Kozlov

- */

-public enum LineEndLength {

-    SMALL,

-    MEDIUM,

-    LARGE

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndWidth.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndWidth.java
deleted file mode 100644
index cee716b..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineEndWidth.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/* ====================================================================

-   Licensed to the Apache Software Foundation (ASF) under one or more

-   contributor license agreements.  See the NOTICE file distributed with

-   this work for additional information regarding copyright ownership.

-   The ASF licenses this file to You under the Apache License, Version 2.0

-   (the "License"); you may not use this file except in compliance with

-   the License.  You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

-==================================================================== */

-package org.apache.poi.xslf.usermodel;

-

-/**

- * @author Yegor Kozlov

- */

-public enum LineEndWidth {

-    SMALL,

-    MEDIUM,

-    LARGE

-}
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/ListAutoNumber.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/ListAutoNumber.java
deleted file mode 100644
index aa1e25b..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/ListAutoNumber.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*

- *  ====================================================================

- *    Licensed to the Apache Software Foundation (ASF) under one or more

- *    contributor license agreements.  See the NOTICE file distributed with

- *    this work for additional information regarding copyright ownership.

- *    The ASF licenses this file to You under the Apache License, Version 2.0

- *    (the "License"); you may not use this file except in compliance with

- *    the License.  You may obtain a copy of the License at

- *

- *        http://www.apache.org/licenses/LICENSE-2.0

- *

- *    Unless required by applicable law or agreed to in writing, software

- *    distributed under the License is distributed on an "AS IS" BASIS,

- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- *    See the License for the specific language governing permissions and

- *    limitations under the License.

- * ====================================================================

- */

-package org.apache.poi.xslf.usermodel;

-

-/**

- * Specifies type of automatic numbered bullet points that should be applied to a paragraph.

- *

- * @author Yegor Kozlov

- */

-public enum ListAutoNumber {

-    /**

-     * (a), (b), (c), ...

-     */

-    ALPHA_LC_PARENT_BOTH,

-    /**

-     * (A), (B), (C), ...

-     */

-    ALPHA_UC_PARENT_BOTH,

-    /**

-     * a), b), c), ...

-     */

-    ALPHA_LC_PARENT_R,

-    /**

-     * A), B), C), ...

-     */

-    ALPHA_UC_PARENT_R,

-    /**

-     *  a., b., c., ...

-     */

-    ALPHA_LC_PERIOD,

-    /**

-     * A., B., C., ...

-     */

-    ALPHA_UC_PERIOD,

-    /**

-     * (1), (2), (3), ...

-     */

-    ARABIC_PARENT_BOTH,

-    /**

-     * 1), 2), 3), ...

-     */

-    ARABIC_PARENT_R,

-

-    /**

-     * 1., 2., 3., ...

-     */

-    ARABIC_PERIOD,

-    /**

-     * 1, 2, 3, ...

-     */

-    ARABIC_PLAIN,

-

-    /**

-     * (i), (ii), (iii), ...

-     */

-    ROMAN_LC_PARENT_BOTH,

-    /**

-     * (I), (II), (III), ...

-     */

-    ROMAN_UC_PARENT_BOTH,

-    /**

-     * i), ii), iii), ...

-     */

-    ROMAN_LC_PARENT_R,

-    /**

-     * I), II), III), ...

-     */

-    ROMAN_UC_PARENT_R,

-    /**

-     *  i., ii., iii., ...

-     */

-    ROMAN_LC_PERIOD ,

-    /**

-     * I., II., III., ...

-     */

-    ROMAN_UC_PERIOD,

-    /**

-     * Dbl-byte circle numbers

-     */

-    CIRCLE_NUM_DB_PLAIN,

-    /**

-     * Wingdings black circle numbers

-     */

-    CIRCLE_NUM_WD_BLACK_PLAIN,

-    /**

-     * Wingdings white circle numbers

-     */

-    CIRCLE_NUM_WD_WHITE_PLAIN

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java
deleted file mode 100644
index a128056..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java
+++ /dev/null
@@ -1,633 +0,0 @@
-/*

- *  ====================================================================

- *    Licensed to the Apache Software Foundation (ASF) under one or more

- *    contributor license agreements.  See the NOTICE file distributed with

- *    this work for additional information regarding copyright ownership.

- *    The ASF licenses this file to You under the Apache License, Version 2.0

- *    (the "License"); you may not use this file except in compliance with

- *    the License.  You may obtain a copy of the License at

- *

- *        http://www.apache.org/licenses/LICENSE-2.0

- *

- *    Unless required by applicable law or agreed to in writing, software

- *    distributed under the License is distributed on an "AS IS" BASIS,

- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- *    See the License for the specific language governing permissions and

- *    limitations under the License.

- * ====================================================================

- */

-

-package org.apache.poi.xslf.usermodel;

-

-import java.awt.AlphaComposite;

-import java.awt.BasicStroke;

-import java.awt.Color;

-import java.awt.GradientPaint;

-import java.awt.Graphics2D;

-import java.awt.Paint;

-import java.awt.Shape;

-import java.awt.Stroke;

-import java.awt.TexturePaint;

-import java.awt.geom.AffineTransform;

-import java.awt.geom.Point2D;

-import java.awt.geom.Rectangle2D;

-import java.awt.image.BufferedImage;

-import java.lang.reflect.Constructor;

-import java.util.ArrayList;

-import java.util.Arrays;

-import java.util.Collection;

-import java.util.Comparator;

-

-import org.apache.poi.openxml4j.opc.PackagePart;

-import org.apache.poi.openxml4j.opc.PackageRelationship;

-import org.apache.poi.util.Internal;

-import org.apache.poi.util.Units;

-import org.apache.poi.xslf.model.PropertyFetcher;

-import org.apache.poi.xslf.model.geom.Context;

-import org.apache.poi.xslf.model.geom.CustomGeometry;

-import org.apache.poi.xslf.model.geom.Guide;

-import org.apache.poi.xslf.model.geom.IAdjustableShape;

-import org.apache.poi.xslf.model.geom.Outline;

-import org.apache.poi.xslf.model.geom.Path;

-import org.apache.xmlbeans.XmlObject;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTGradientFillProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTGradientStop;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTNoFillProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTPathShadeProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeStyle;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference;

-import org.openxmlformats.schemas.drawingml.x2006.main.STPathShadeType;

-

-/**

- * Encapsulates logic to translate DrawingML objects to Java2D

- */

-@Internal

-class RenderableShape {

-    public final static Color NO_PAINT = new Color(0xFF, 0xFF, 0xFF, 0);

-

-    private XSLFSimpleShape _shape;

-

-    public RenderableShape(XSLFSimpleShape shape){

-        _shape = shape;

-    }

-

-    /**

-     * Convert shape fill into java.awt.Paint. The result is either Color or

-     * TexturePaint or GradientPaint or null

-     *

-     * @param graphics  the target graphics

-     * @param obj       the xml to read. Must contain elements from the EG_ColorChoice group:

-     * <code>

-     *     a:scrgbClr    RGB Color Model - Percentage Variant

-     *     a:srgbClr    RGB Color Model - Hex Variant

-     *     a:hslClr    Hue, Saturation, Luminance Color Model

-     *     a:sysClr    System Color

-     *     a:schemeClr    Scheme Color

-     *     a:prstClr    Preset Color

-     *  </code>

-     *

-     * @param phClr     context color

-     * @param parentPart    the parent package part. Any external references (images, etc.) are resolved relative to it.

-     *

-     * @return  the applied Paint or null if none was applied

-     */

-    public Paint selectPaint(Graphics2D graphics, XmlObject obj, CTSchemeColor phClr, PackagePart parentPart) {

-        XSLFTheme theme = _shape.getSheet().getTheme();

-

-        Paint paint = null;

-        if (obj instanceof CTNoFillProperties) {

-            paint = NO_PAINT;

-

-        }

-        else if (obj instanceof CTSolidColorFillProperties) {

-            CTSolidColorFillProperties solidFill = (CTSolidColorFillProperties) obj;

-            XSLFColor c = new XSLFColor(solidFill, theme, phClr);

-            paint = c.getColor();

-        }

-        else if (obj instanceof CTBlipFillProperties) {

-            CTBlipFillProperties blipFill = (CTBlipFillProperties)obj;

-            paint = createTexturePaint(blipFill, graphics, parentPart);

-        }

-        else if (obj instanceof CTGradientFillProperties) {

-            Rectangle2D anchor = getAnchor(graphics);

-            CTGradientFillProperties gradFill = (CTGradientFillProperties) obj;

-            if (gradFill.isSetLin()) {

-                 paint = createLinearGradientPaint(graphics, gradFill, anchor, theme, phClr);

-            } else if (gradFill.isSetPath()){

-                CTPathShadeProperties ps = gradFill.getPath();

-                if(ps.getPath() ==  STPathShadeType.CIRCLE){

-                    paint = createRadialGradientPaint(gradFill, anchor, theme, phClr);

-                } else if (ps.getPath() ==  STPathShadeType.SHAPE){

-                    paint = toRadialGradientPaint(gradFill, anchor, theme, phClr);

-                }

-            }

-        }

-

-        return paint;

-    }

-

-    private Paint createTexturePaint(CTBlipFillProperties blipFill, Graphics2D graphics,

-            PackagePart parentPart){

-        Paint paint = null;

-        CTBlip blip = blipFill.getBlip();

-        String blipId = blip.getEmbed();

-        PackageRelationship rel = parentPart.getRelationship(blipId);

-        if (rel != null) {

-            XSLFImageRenderer renderer = null;

-            if (graphics != null)

-                renderer = (XSLFImageRenderer) graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER);

-            if (renderer == null) renderer = new XSLFImageRenderer();

-

-            try {

-                BufferedImage img = renderer.readImage(parentPart.getRelatedPart(rel));

-                if (blip.sizeOfAlphaModFixArray() > 0) {

-                    float alpha = blip.getAlphaModFixArray(0).getAmt() / 100000.f;

-                    AlphaComposite ac = AlphaComposite.getInstance(

-                            AlphaComposite.SRC_OVER, alpha);

-                    if (graphics != null) graphics.setComposite(ac);

-                }

-

-                if(img != null) {

-                    paint = new TexturePaint(

-                            img, new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight()));

-                }

-            }

-            catch (Exception e) {

-                e.printStackTrace();

-            }

-        }

-        return paint;

-    }

-

-    @SuppressWarnings("unchecked")

-    private Paint createLinearGradientPaint(

-            Graphics2D graphics,

-            CTGradientFillProperties gradFill, Rectangle2D anchor,

-            XSLFTheme theme, CTSchemeColor phClr) {

-        double angle = gradFill.getLin().getAng() / 60000;

-        @SuppressWarnings("deprecation")

-        CTGradientStop[] gs = gradFill.getGsLst().getGsArray();

-

-        Arrays.sort(gs, new Comparator<CTGradientStop>() {

-            public int compare(CTGradientStop o1, CTGradientStop o2) {

-                Integer pos1 = o1.getPos();

-                Integer pos2 = o2.getPos();

-                return pos1.compareTo(pos2);

-            }

-        });

-

-        Color[] colors = new Color[gs.length];

-        float[] fractions = new float[gs.length];

-

-        AffineTransform at = AffineTransform.getRotateInstance(

-                Math.toRadians(angle),

-                anchor.getX() + anchor.getWidth() / 2,

-                anchor.getY() + anchor.getHeight() / 2);

-

-        double diagonal = Math.sqrt(anchor.getHeight() * anchor.getHeight() + anchor.getWidth() * anchor.getWidth());

-        Point2D p1 = new Point2D.Double(anchor.getX() + anchor.getWidth() / 2 - diagonal / 2,

-                anchor.getY() + anchor.getHeight() / 2);

-        p1 = at.transform(p1, null);

-

-        Point2D p2 = new Point2D.Double(anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight() / 2);

-        p2 = at.transform(p2, null);

-

-        snapToAnchor(p1, anchor);

-        snapToAnchor(p2, anchor);

-

-        for (int i = 0; i < gs.length; i++) {

-            CTGradientStop stop = gs[i];

-            colors[i] = new XSLFColor(stop, theme, phClr).getColor();

-            fractions[i] = stop.getPos() / 100000.f;

-        }

-

-        AffineTransform grAt  = new AffineTransform();

-        if(gradFill.isSetRotWithShape() || !gradFill.getRotWithShape()) {

-            double rotation = _shape.getRotation();

-            if (rotation != 0.) {

-                double centerX = anchor.getX() + anchor.getWidth() / 2;

-                double centerY = anchor.getY() + anchor.getHeight() / 2;

-

-                grAt.translate(centerX, centerY);

-                grAt.rotate(Math.toRadians(-rotation));

-                grAt.translate(-centerX, -centerY);

-            }

-        }

-

-        // Trick to return GradientPaint on JDK 1.5 and LinearGradientPaint on JDK 1.6+

-        Paint paint;

-        try {

-            Class<?> clz = Class.forName("java.awt.LinearGradientPaint");

-            @SuppressWarnings("rawtypes")

-			Class clzCycleMethod = Class.forName("java.awt.MultipleGradientPaint$CycleMethod");

-            @SuppressWarnings("rawtypes")

-			Class clzColorSpaceType = Class.forName("java.awt.MultipleGradientPaint$ColorSpaceType");

-            Constructor<?> c =

-                    clz.getConstructor(Point2D.class, Point2D.class, float[].class, Color[].class,

-                            clzCycleMethod, clzColorSpaceType, AffineTransform.class);

-            paint = (Paint) c.newInstance(p1, p2, fractions, colors,

-                    Enum.valueOf(clzCycleMethod, "NO_CYCLE"),

-                    Enum.valueOf(clzColorSpaceType, "SRGB"), grAt);

-        } catch (ClassNotFoundException e) {

-            paint = new GradientPaint(p1, colors[0], p2, colors[colors.length - 1]);

-        } catch (Exception e) {

-            throw new RuntimeException(e);

-        }

-        return paint;

-    }

-

-    /**

-     * gradients with type=shape are enot supported by Java graphics.

-     * We approximate it with a radial gradient.

-     */

-    private static Paint toRadialGradientPaint(

-            CTGradientFillProperties gradFill, Rectangle2D anchor,

-            XSLFTheme theme, CTSchemeColor phClr) {

-

-        @SuppressWarnings("deprecation")

-        CTGradientStop[] gs = gradFill.getGsLst().getGsArray();

-        Arrays.sort(gs, new Comparator<CTGradientStop>() {

-            public int compare(CTGradientStop o1, CTGradientStop o2) {

-                Integer pos1 = o1.getPos();

-                Integer pos2 = o2.getPos();

-                return pos1.compareTo(pos2);

-            }

-        });

-        gs[1].setPos(50000);

-

-        CTGradientFillProperties g = CTGradientFillProperties.Factory.newInstance();

-        g.set(gradFill);

-        g.getGsLst().setGsArray(new CTGradientStop[]{gs[0], gs[1]});

-        return createRadialGradientPaint(g, anchor, theme, phClr);

-    }

-

-    private static Paint createRadialGradientPaint(

-            CTGradientFillProperties gradFill, Rectangle2D anchor,

-            XSLFTheme theme, CTSchemeColor phClr) {

-        @SuppressWarnings("deprecation")

-        CTGradientStop[] gs = gradFill.getGsLst().getGsArray();

-

-        Point2D pCenter = new Point2D.Double(anchor.getX() + anchor.getWidth()/2,

-                anchor.getY() + anchor.getHeight()/2);

-

-        float radius = (float)Math.max(anchor.getWidth(), anchor.getHeight());

-

-        Arrays.sort(gs, new Comparator<CTGradientStop>() {

-            public int compare(CTGradientStop o1, CTGradientStop o2) {

-                Integer pos1 = o1.getPos();

-                Integer pos2 = o2.getPos();

-                return pos1.compareTo(pos2);

-            }

-        });

-

-        Color[] colors = new Color[gs.length];

-        float[] fractions = new float[gs.length];

-

-

-        for (int i = 0; i < gs.length; i++) {

-            CTGradientStop stop = gs[i];

-            colors[i] = new XSLFColor(stop, theme, phClr).getColor();

-            fractions[i] = stop.getPos() / 100000.f;

-        }

-

-        // Trick to return GradientPaint on JDK 1.5 and RadialGradientPaint on JDK 1.6+

-        Paint paint;

-        try {

-            Class<?> clz = Class.forName("java.awt.RadialGradientPaint");

-            Constructor<?> c =

-                    clz.getConstructor(Point2D.class, float.class,

-                            float[].class, Color[].class);

-            paint = (Paint) c.newInstance(pCenter, radius, fractions, colors);

-        } catch (ClassNotFoundException e) {

-            // the result on JDK 1.5 is incorrect, but it is better than nothing

-            paint = new GradientPaint(

-                    new Point2D.Double(anchor.getX(), anchor.getY()),

-                    colors[0], pCenter, colors[colors.length - 1]);

-        } catch (Exception e) {

-            throw new RuntimeException(e);

-        }

-        return paint;

-    }

-

-    private static void snapToAnchor(Point2D p, Rectangle2D anchor) {

-        if (p.getX() < anchor.getX()) {

-            p.setLocation(anchor.getX(), p.getY());

-        } else if (p.getX() > (anchor.getX() + anchor.getWidth())) {

-            p.setLocation(anchor.getX() + anchor.getWidth(), p.getY());

-        }

-

-        if (p.getY() < anchor.getY()) {

-            p.setLocation(p.getX(), anchor.getY());

-        } else if (p.getY() > (anchor.getY() + anchor.getHeight())) {

-            p.setLocation(p.getX(), anchor.getY() + anchor.getHeight());

-        }

-    }

-

-

-    Paint getPaint(Graphics2D graphics, XmlObject spPr, CTSchemeColor phClr) {

-

-        Paint paint = null;

-        for (XmlObject obj : spPr.selectPath("*")) {

-            paint = selectPaint(graphics, obj, phClr, _shape.getSheet().getPackagePart());

-            if(paint != null) break;

-        }

-        return paint == NO_PAINT ? null : paint;

-    }

-

-

-    /**

-     * fetch shape fill as a java.awt.Paint

-     *

-     * @return either Color or GradientPaint or TexturePaint or null

-     */

-    Paint getFillPaint(final Graphics2D graphics) {

-        PropertyFetcher<Paint> fetcher = new PropertyFetcher<Paint>() {

-            public boolean fetch(XSLFSimpleShape shape) {

-                CTShapeProperties spPr = shape.getSpPr();

-                if (spPr.isSetNoFill()) {

-                    setValue(RenderableShape.NO_PAINT); // use it as 'nofill' value

-                    return true;

-                }

-                Paint paint = getPaint(graphics, spPr, null);

-                if (paint != null) {

-                    setValue(paint);

-                    return true;

-                }

-                return false;

-            }

-        };

-        _shape.fetchShapeProperty(fetcher);

-

-        Paint paint = fetcher.getValue();

-        if (paint == null) {

-            // fill color was not found, check if it is defined in the theme

-            CTShapeStyle style = _shape.getSpStyle();

-            if (style != null) {

-                // get a reference to a fill style within the style matrix.

-                CTStyleMatrixReference fillRef = style.getFillRef();

-                // The idx attribute refers to the index of a fill style or

-                // background fill style within the presentation's style matrix, defined by the fmtScheme element.

-                // value of 0 or 1000 indicates no background,

-                // values 1-999 refer to the index of a fill style within the fillStyleLst element

-                // values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element.

-                int idx = (int)fillRef.getIdx();

-                CTSchemeColor phClr = fillRef.getSchemeClr();

-                XSLFSheet sheet = _shape.getSheet();

-                XSLFTheme theme = sheet.getTheme();

-                XmlObject fillProps = null;

-                if(idx >= 1 && idx <= 999){

-                    fillProps = theme.getXmlObject().

-                            getThemeElements().getFmtScheme().getFillStyleLst().selectPath("*")[idx - 1];

-                } else if (idx >= 1001 ){

-                    fillProps = theme.getXmlObject().

-                            getThemeElements().getFmtScheme().getBgFillStyleLst().selectPath("*")[idx - 1001];

-                }

-                if(fillProps != null) {

-                    paint = selectPaint(graphics, fillProps, phClr, sheet.getPackagePart());

-                }

-            }

-        }

-        return paint == RenderableShape.NO_PAINT ? null : paint;

-    }

-

-    public Paint getLinePaint(final Graphics2D graphics) {

-        PropertyFetcher<Paint> fetcher = new PropertyFetcher<Paint>() {

-            public boolean fetch(XSLFSimpleShape shape) {

-                CTLineProperties spPr = shape.getSpPr().getLn();

-                if (spPr != null) {

-                    if (spPr.isSetNoFill()) {

-                        setValue(NO_PAINT); // use it as 'nofill' value

-                        return true;

-                    }

-                    Paint paint = getPaint(graphics, spPr, null);

-                    if (paint != null) {

-                        setValue(paint);

-                        return true;

-                    }

-                }

-                return false;

-

-            }

-        };

-        _shape.fetchShapeProperty(fetcher);

-

-        Paint paint = fetcher.getValue();

-        if (paint == null) {

-            // line color was not found, check if it is defined in the theme

-            CTShapeStyle style = _shape.getSpStyle();

-            if (style != null) {

-                // get a reference to a line style within the style matrix.

-                CTStyleMatrixReference lnRef = style.getLnRef();

-                int idx = (int)lnRef.getIdx();

-                CTSchemeColor phClr = lnRef.getSchemeClr();

-                if(idx > 0){

-                    XSLFTheme theme = _shape.getSheet().getTheme();

-                    XmlObject lnProps = theme.getXmlObject().

-                            getThemeElements().getFmtScheme().getLnStyleLst().selectPath("*")[idx - 1];

-                    paint = getPaint(graphics, lnProps, phClr);

-                }

-            }

-        }

-

-        return paint == NO_PAINT ? null : paint;

-    }

-

-    /**

-     * convert PPT dash into java.awt.BasicStroke

-     *

-     * The mapping is derived empirically on PowerPoint 2010

-     */

-    private static float[] getDashPattern(LineDash lineDash, float lineWidth) {

-        float[] dash = null;

-        switch (lineDash) {

-            case SYS_DOT:

-                dash = new float[]{lineWidth, lineWidth};

-                break;

-            case SYS_DASH:

-                dash = new float[]{2 * lineWidth, 2 * lineWidth};

-                break;

-            case DASH:

-                dash = new float[]{3 * lineWidth, 4 * lineWidth};

-                break;

-            case DASH_DOT:

-                dash = new float[]{4 * lineWidth, 3 * lineWidth, lineWidth,

-                        3 * lineWidth};

-                break;

-            case LG_DASH:

-                dash = new float[]{8 * lineWidth, 3 * lineWidth};

-                break;

-            case LG_DASH_DOT:

-                dash = new float[]{8 * lineWidth, 3 * lineWidth, lineWidth,

-                        3 * lineWidth};

-                break;

-            case LG_DASH_DOT_DOT:

-                dash = new float[]{8 * lineWidth, 3 * lineWidth, lineWidth,

-                        3 * lineWidth, lineWidth, 3 * lineWidth};

-                break;

-        }

-        return dash;

-    }

-

-

-    public Stroke applyStroke(Graphics2D graphics) {

-

-        float lineWidth = (float) _shape.getLineWidth();

-        if(lineWidth == 0.0f) lineWidth = 0.25f; // Both PowerPoint and OOo draw zero-length lines as 0.25pt

-

-        LineDash lineDash = _shape.getLineDash();

-        float[] dash = null;

-        float dash_phase = 0;

-        if (lineDash != null) {

-            dash = getDashPattern(lineDash, lineWidth);

-        }

-

-        int cap = BasicStroke.CAP_BUTT;

-        LineCap lineCap = _shape.getLineCap();

-        if (lineCap != null) {

-            switch (lineCap) {

-                case ROUND:

-                    cap = BasicStroke.CAP_ROUND;

-                    break;

-                case SQUARE:

-                    cap = BasicStroke.CAP_SQUARE;

-                    break;

-                default:

-                    cap = BasicStroke.CAP_BUTT;

-                    break;

-            }

-        }

-

-        int meter = BasicStroke.JOIN_ROUND;

-

-        Stroke stroke = new BasicStroke(lineWidth, cap, meter, Math.max(1, lineWidth), dash,

-                dash_phase);

-        graphics.setStroke(stroke);

-        return stroke;

-    }

-

-    public void render(Graphics2D graphics){

-        Collection<Outline> elems = computeOutlines(graphics);

-

-        // shadow

-        XSLFShadow shadow = _shape.getShadow();

-

-        // first fill

-        Paint fill = getFillPaint(graphics);

-        Paint line = getLinePaint(graphics);

-        applyStroke(graphics); // the stroke applies both to the shadow and the shape

-

-        // first paint the shadow

-        if(shadow != null) for(Outline o : elems){

-            if(o.getPath().isFilled()){

-                if(fill != null) shadow.fill(graphics, o.getOutline());

-                else if(line != null) shadow.draw(graphics, o.getOutline());

-            }

-        }

-        // then fill the shape interior

-        if(fill != null) for(Outline o : elems){

-            if(o.getPath().isFilled()){

-                graphics.setPaint(fill);

-                graphics.fill(o.getOutline());

-            }

-        }

-

-        // then draw any content within this shape (text, image, etc.)

-        _shape.drawContent(graphics);

-

-        // then stroke the shape outline

-        if(line != null) for(Outline o : elems){

-            if(o.getPath().isStroked()){

-                graphics.setPaint(line);

-                graphics.draw(o.getOutline());

-            }

-        }

-    }

-

-    @SuppressWarnings("deprecation")

-    private Collection<Outline> computeOutlines(Graphics2D graphics) {

-

-        Collection<Outline> lst = new ArrayList<Outline>();

-        CustomGeometry geom = _shape.getGeometry();

-        if(geom == null) {

-            return lst;

-        }

-

-        Rectangle2D anchor = getAnchor(graphics);

-        for (Path p : geom) {

-

-            double w = p.getW() == -1 ? anchor.getWidth() * Units.EMU_PER_POINT : p.getW();

-            double h = p.getH() == -1 ? anchor.getHeight() * Units.EMU_PER_POINT : p.getH();

-

-            // the guides in the shape definitions are all defined relative to each other,

-            // so we build the path starting from (0,0).

-            final Rectangle2D pathAnchor = new Rectangle2D.Double(

-                    0,

-                    0,

-                    w,

-                    h

-            );

-

-            Context ctx = new Context(geom, pathAnchor, new IAdjustableShape() {

-

-                public Guide getAdjustValue(String name) {

-                    CTPresetGeometry2D prst = _shape.getSpPr().getPrstGeom();

-                    if (prst != null && prst.isSetAvLst()) {

-                        for (CTGeomGuide g : prst.getAvLst().getGdArray()) {

-                            if (g.getName().equals(name)) {

-                                return new Guide(g);

-                            }

-                        }

-                    }

-                    return null;

-                }

-            }) ;

-

-            Shape gp = p.getPath(ctx);

-

-            // translate the result to the canvas coordinates in points

-            AffineTransform at = new AffineTransform();

-            at.translate(anchor.getX(), anchor.getY());

-

-            double scaleX, scaleY;

-            if (p.getW() != -1) {

-                scaleX = anchor.getWidth() / p.getW();

-            } else {

-                scaleX = 1.0 / Units.EMU_PER_POINT;

-            }

-            if (p.getH() != -1) {

-                scaleY = anchor.getHeight() / p.getH();

-            } else {

-                scaleY = 1.0 / Units.EMU_PER_POINT;

-            }

-

-            at.scale(scaleX, scaleY);

-

-            Shape canvasShape = at.createTransformedShape(gp);

-

-            lst.add(new Outline(canvasShape, p));

-        }

-

-        return lst;

-    }

-

-    public Rectangle2D getAnchor(Graphics2D graphics) {

-        Rectangle2D anchor = _shape.getAnchor();

-        if(graphics == null)  {

-            return anchor;

-        }

-

-        AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM);

-        if(tx != null) {

-            anchor = tx.createTransformedShape(anchor).getBounds2D();

-        }

-        return anchor;

-    }    

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAlign.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAlign.java
deleted file mode 100644
index 2570e6c..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAlign.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*

- *  ====================================================================

- *    Licensed to the Apache Software Foundation (ASF) under one or more

- *    contributor license agreements.  See the NOTICE file distributed with

- *    this work for additional information regarding copyright ownership.

- *    The ASF licenses this file to You under the Apache License, Version 2.0

- *    (the "License"); you may not use this file except in compliance with

- *    the License.  You may obtain a copy of the License at

- *

- *        http://www.apache.org/licenses/LICENSE-2.0

- *

- *    Unless required by applicable law or agreed to in writing, software

- *    distributed under the License is distributed on an "AS IS" BASIS,

- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- *    See the License for the specific language governing permissions and

- *    limitations under the License.

- * ====================================================================

- */

-package org.apache.poi.xslf.usermodel;

-

-/**

- * Specified a list of text alignment types

- *

- * @author Yegor Kozlov

- */

-public enum TextAlign {

-    /**

-     * Align text to the left margin.

-     */

-    LEFT,

-    /**

-     * Align text in the center.

-     */

-    CENTER,

-

-    /**

-     * Align text to the right margin.

-     */

-    RIGHT,

-

-    /**

-     * Align text so that it is justified across the whole line. It

-     * is smart in the sense that it will not justify sentences

-     * which are short

-     */

-    JUSTIFY,

-    JUSTIFY_LOW,

-    DIST,

-    THAI_DIST

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAutofit.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAutofit.java
deleted file mode 100644
index 94d6b24..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextAutofit.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*

- *  ====================================================================

- *    Licensed to the Apache Software Foundation (ASF) under one or more

- *    contributor license agreements.  See the NOTICE file distributed with

- *    this work for additional information regarding copyright ownership.

- *    The ASF licenses this file to You under the Apache License, Version 2.0

- *    (the "License"); you may not use this file except in compliance with

- *    the License.  You may obtain a copy of the License at

- *

- *        http://www.apache.org/licenses/LICENSE-2.0

- *

- *    Unless required by applicable law or agreed to in writing, software

- *    distributed under the License is distributed on an "AS IS" BASIS,

- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- *    See the License for the specific language governing permissions and

- *    limitations under the License.

- * ====================================================================

- */

-package org.apache.poi.xslf.usermodel;

-

-/**

- * Specifies alist of auto-fit types.

- * <p>

- * Autofit specofies that a shape should be auto-fit to fully contain the text described within it.

- * Auto-fitting is when text within a shape is scaled in order to contain all the text inside

- * </p>

- * 

- * @author Yegor Kozlov

- */

-public enum TextAutofit {

-    /**

-     * Specifies that text within the text body should not be auto-fit to the bounding box.

-     * Auto-fitting is when text within a text box is scaled in order to remain inside

-     * the text box.

-     */

-    NONE,

-    /**

-     * Specifies that text within the text body should be normally auto-fit to the bounding box.

-     * Autofitting is when text within a text box is scaled in order to remain inside the text box.

-     *

-     * <p>

-     * <em>Example:</em> Consider the situation where a user is building a diagram and needs

-     * to have the text for each shape that they are using stay within the bounds of the shape.

-     * An easy way this might be done is by using NORMAL autofit

-     * </p>

-     */

-    NORMAL,

-    /**

-     * Specifies that a shape should be auto-fit to fully contain the text described within it.

-     * Auto-fitting is when text within a shape is scaled in order to contain all the text inside.

-     *

-     * <p>

-     * <em>Example:</em> Consider the situation where a user is building a diagram and needs to have

-     * the text for each shape that they are using stay within the bounds of the shape.

-     * An easy way this might be done is by using SHAPE autofit

-     * </p>

-     */

-    SHAPE

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextCap.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextCap.java
deleted file mode 100644
index c4ad625..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextCap.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*

- *  ====================================================================

- *    Licensed to the Apache Software Foundation (ASF) under one or more

- *    contributor license agreements.  See the NOTICE file distributed with

- *    this work for additional information regarding copyright ownership.

- *    The ASF licenses this file to You under the Apache License, Version 2.0

- *    (the "License"); you may not use this file except in compliance with

- *    the License.  You may obtain a copy of the License at

- *

- *        http://www.apache.org/licenses/LICENSE-2.0

- *

- *    Unless required by applicable law or agreed to in writing, software

- *    distributed under the License is distributed on an "AS IS" BASIS,

- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- *    See the License for the specific language governing permissions and

- *    limitations under the License.

- * ====================================================================

- */

-

-package org.apache.poi.xslf.usermodel;

-

-/**

- * @author Yegor Kozlov

- */

-public enum TextCap {

-    NONE,

-    SMALL,

-    ALL

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextDirection.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextDirection.java
deleted file mode 100644
index 3f35ec2..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextDirection.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*

- *  ====================================================================

- *    Licensed to the Apache Software Foundation (ASF) under one or more

- *    contributor license agreements.  See the NOTICE file distributed with

- *    this work for additional information regarding copyright ownership.

- *    The ASF licenses this file to You under the Apache License, Version 2.0

- *    (the "License"); you may not use this file except in compliance with

- *    the License.  You may obtain a copy of the License at

- *

- *        http://www.apache.org/licenses/LICENSE-2.0

- *

- *    Unless required by applicable law or agreed to in writing, software

- *    distributed under the License is distributed on an "AS IS" BASIS,

- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- *    See the License for the specific language governing permissions and

- *    limitations under the License.

- * ====================================================================

- */

-package org.apache.poi.xslf.usermodel;

-

-/**

- * Vertical Text Types

- */

-public enum TextDirection {

-    /**

-     * Horizontal text. This should be default.

-     */

-    HORIZONTAL,

-    /**

-     * Vertical orientation.

-     * (each line is 90 degrees rotated clockwise, so it goes

-     * from top to bottom; each next line is to the left from

-     * the previous one).

-     */

-    VERTICAL,

-    /**

-     * Vertical orientation.

-     * (each line is 270 degrees rotated clockwise, so it goes

-     * from bottom to top; each next line is to the right from

-     * the previous one).

-     */

-    VERTICAL_270,

-    /**

-     * Determines if all of the text is vertical

-     * ("one letter on top of another").

-     */

-    STACKED;

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextFragment.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/TextFragment.java
deleted file mode 100644
index 1114b89..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/TextFragment.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*

- *  ====================================================================

- *    Licensed to the Apache Software Foundation (ASF) under one or more

- *    contributor license agreements.  See the NOTICE file distributed with

- *    this work for additional information regarding copyright ownership.

- *    The ASF licenses this file to You under the Apache License, Version 2.0

- *    (the "License"); you may not use this file except in compliance with

- *    the License.  You may obtain a copy of the License at

- *

- *        http://www.apache.org/licenses/LICENSE-2.0

- *

- *    Unless required by applicable law or agreed to in writing, software

- *    distributed under the License is distributed on an "AS IS" BASIS,

- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- *    See the License for the specific language governing permissions and

- *    limitations under the License.

- * ====================================================================

- */

-

-package org.apache.poi.xslf.usermodel;

-

-import java.awt.*;

-import java.awt.font.TextLayout;

-import java.text.AttributedCharacterIterator;

-import java.text.AttributedString;

-import java.text.CharacterIterator;

-

-/**

- * a renderable text fragment

-*/

-class TextFragment {

-    final TextLayout _layout;

-    final AttributedString _str;

-

-    TextFragment(TextLayout layout, AttributedString str){

-        _layout = layout;

-        _str = str;

-    }

-

-    void draw(Graphics2D graphics, double x, double y){

-        if(_str == null) {

-            return;

-        }

-

-        double yBaseline = y + _layout.getAscent();

-

-        Integer textMode = (Integer)graphics.getRenderingHint(XSLFRenderingHint.TEXT_RENDERING_MODE);

-        if(textMode != null && textMode == XSLFRenderingHint.TEXT_AS_SHAPES){

-            _layout.draw(graphics, (float)x, (float)yBaseline);

-        } else {

-            graphics.drawString(_str.getIterator(), (float)x, (float)yBaseline );

-        }

-    }

-

-    /**

-     * @return full height of this text run which is sum of ascent, descent and leading

-     */

-    public float getHeight(){

-        double h = Math.ceil(_layout.getAscent()) + Math.ceil(_layout.getDescent()) + _layout.getLeading();

-        return (float)h;

-    }

-

-    /**

-     *

-     * @return width if this text run

-     */

-    public float getWidth(){

-        return _layout.getAdvance();

-    }

-

-    /**

-     *

-     * @return the string to be painted

-     */

-    public String getString(){

-        if(_str == null) return "";

-

-        AttributedCharacterIterator it = _str.getIterator();

-         StringBuffer buf = new StringBuffer();

-         for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {

-             buf.append(c);

-         }

-        return buf.toString();

-    }

-

-    @Override

-    public String toString(){

-        return "[" + getClass().getSimpleName() + "] " + getString();

-    }

-}

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
index b1c6be4..6bdca81 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java
@@ -17,41 +17,20 @@
 package org.apache.poi.xslf.usermodel;
 
 import java.awt.Dimension;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.*;
 import java.util.*;
 import java.util.regex.Pattern;
 
-import org.apache.poi.POIXMLDocument;
-import org.apache.poi.POIXMLDocumentPart;
-import org.apache.poi.POIXMLException;
-import org.apache.poi.POIXMLRelation;
+import org.apache.poi.*;
 import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.PackagePartName;
-import org.apache.poi.openxml4j.opc.TargetMode;
-import org.apache.poi.util.Beta;
-import org.apache.poi.util.IOUtils;
-import org.apache.poi.util.Internal;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.PackageHelper;
-import org.apache.poi.util.Units;
+import org.apache.poi.openxml4j.opc.*;
+import org.apache.poi.sl.usermodel.*;
+import org.apache.poi.util.*;
 import org.apache.poi.xslf.XSLFSlideShow;
-import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlOptions;
+import org.apache.xmlbeans.*;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;
 import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesMasterIdList;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesMasterIdListEntry;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPresentation;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdList;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideSize;
-import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument;
+import org.openxmlformats.schemas.presentationml.x2006.main.*;
 
 /**
  * High level representation of a ooxml slideshow.
@@ -60,7 +39,7 @@
  *  top level object for creating new slides/etc.
  */
 @Beta
-public class XMLSlideShow  extends POIXMLDocument {
+public class XMLSlideShow extends POIXMLDocument implements SlideShow {
     private static POILogger _logger = POILogFactory.getLogger(XMLSlideShow.class);
 
     private CTPresentation _presentation;
@@ -323,7 +302,7 @@
         
         XSLFTheme theme = (XSLFTheme) createRelationship(XSLFRelation.THEME, 
                 XSLFFactory.getInstance(), themeIndex);
-        theme.importTheme(getSlides()[0].getTheme());
+        theme.importTheme(getSlides().get(0).getTheme());
         
         _notesMaster.addRelation(theme.getPackageRelationship().getId(), theme);
         PackagePartName themePackagePartName = theme.getPackagePart().getPartName();
@@ -339,15 +318,16 @@
         return _notesMaster; 
     }
 
-    public XSLFSlideMaster[] getSlideMasters() {
-        return _masters.values().toArray(new XSLFSlideMaster[_masters.size()]);
+    @Override
+    public List<XSLFSlideMaster> getSlideMasters() {
+        return new ArrayList<XSLFSlideMaster>(_masters.values());
     }
 
     /**
      * Return all the slides in the slideshow
      */
-    public XSLFSlide[] getSlides() {
-        return _slides.toArray(new XSLFSlide[_slides.size()]);
+    public List<XSLFSlide> getSlides() {
+        return _slides;
     }
     
     /**
@@ -437,7 +417,7 @@
      */
     public int addPicture(byte[] pictureData, int format) {
         XSLFPictureData img = findPictureData(pictureData);
-        POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format];
+        // POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format];
 
         if(img == null) {
             int imageNumber = _pictures.size();
@@ -485,4 +465,13 @@
         return null;
     }
 
+    public MasterSheet createMasterSheet() throws IOException {
+        // TODO: implement!
+        throw new UnsupportedOperationException();
+    }
+
+    public Resources getResources() {
+        // TODO: implement!
+        throw new UnsupportedOperationException();
+    }
 }
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java
index 1ee8f6f..a87d91b 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java
@@ -19,6 +19,7 @@
 

 package org.apache.poi.xslf.usermodel;

 

+import org.apache.poi.sl.usermodel.AutoShape;

 import org.apache.poi.util.Beta;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;

@@ -35,7 +36,7 @@
  * @author Yegor Kozlov

  */

 @Beta

-public class XSLFAutoShape extends XSLFTextShape {

+public class XSLFAutoShape extends XSLFTextShape implements AutoShape<XSLFTextParagraph> {

 

     /*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) {

         super(shape, sheet);

@@ -71,7 +72,7 @@
     }

 

     protected CTTextBody getTextBody(boolean create){

-        CTShape shape = (CTShape) getXmlObject();

+        CTShape shape = (CTShape)getXmlObject();

         CTTextBody txBody = shape.getTxBody();

         if (txBody == null && create) {

             txBody = shape.addNewTxBody();

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
index 604c9df..bfa3f31 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
@@ -17,25 +17,21 @@
 

 package org.apache.poi.xslf.usermodel;

 

-import org.apache.xmlbeans.XmlObject;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTBackgroundFillStyleList;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference;

+import java.awt.*;

+import java.awt.geom.Rectangle2D;

+

+import org.apache.poi.sl.draw.DrawPaint;

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;

 import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;

 

-import java.awt.Color;

-import java.awt.Dimension;

-import java.awt.Graphics2D;

-import java.awt.Paint;

-import java.awt.geom.Rectangle2D;

-

 /**

  * Background shape

  *

  * @author Yegor Kozlov

  */

-public class XSLFBackground extends XSLFSimpleShape {

+public class XSLFBackground extends XSLFSimpleShape implements Background {

 

     /* package */XSLFBackground(CTBackground shape, XSLFSheet sheet) {

         super(shape, sheet);

@@ -47,48 +43,14 @@
         return new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight());

     }

 

-    public void draw(Graphics2D graphics) {

-        Rectangle2D anchor = getAnchor();

-

-        Paint fill = getPaint(graphics);

-        if(fill != null) {

-            graphics.setPaint(fill);

-            graphics.fill(anchor);

-        }

-    }

-

-    /**

-     * @return the Paint object to fill

-     */

-    Paint getPaint(Graphics2D graphics){

-        RenderableShape rShape = new RenderableShape(this);

-

-        Paint fill = null;

-        CTBackground bg = (CTBackground)getXmlObject();

-        if(bg.isSetBgPr()){

-            XmlObject spPr = bg.getBgPr();

-            fill = rShape.getPaint(graphics, spPr, null);

-        } else if (bg.isSetBgRef()){

-            CTStyleMatrixReference bgRef= bg.getBgRef();

-            CTSchemeColor phClr = bgRef.getSchemeClr();

-

-            int idx = (int)bgRef.getIdx() - 1001;

-            XSLFTheme theme = getSheet().getTheme();

-            CTBackgroundFillStyleList bgStyles =

-                    theme.getXmlObject().getThemeElements().getFmtScheme().getBgFillStyleLst();

-

-            XmlObject bgStyle = bgStyles.selectPath("*")[idx];

-            fill = rShape.selectPaint(graphics, bgStyle, phClr, theme.getPackagePart());

-        }

-

-        return fill;

-    }

-

     @Override

     public Color getFillColor(){

-        Paint p = getPaint(null);

-        if(p instanceof Color){

-            return (Color)p;

+        FillStyle fs = getFillStyle();

+        PaintStyle ps = fs.getPaint();

+        if (ps instanceof SolidPaint) {

+            SolidPaint sp = (SolidPaint)ps;

+            ColorStyle cs = sp.getSolidColor();

+            return DrawPaint.applyColorTransform(cs);

         }

         return null;

     }

@@ -100,7 +62,7 @@
      * @return  dummy  CTTransform2D bean

      */

     @Override

-    CTTransform2D getXfrm() {

+    protected CTTransform2D getXfrm() {

         return CTTransform2D.Factory.newInstance();

     }

 }

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java
index c0f4762..527cef7 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFColor.java
@@ -18,22 +18,18 @@
  */

 package org.apache.poi.xslf.usermodel;

 

-import org.apache.poi.util.Beta;

-import org.apache.poi.util.Internal;

-import org.apache.xmlbeans.XmlObject;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTHslColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTScRgbColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSystemColor;

-import org.w3c.dom.Node;

-

 import java.awt.Color;

 import java.util.HashMap;

 import java.util.Map;

 

+import org.apache.poi.sl.draw.DrawPaint;

+import org.apache.poi.sl.usermodel.ColorStyle;

+import org.apache.poi.util.Beta;

+import org.apache.poi.util.Internal;

+import org.apache.xmlbeans.XmlObject;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

+import org.w3c.dom.Node;

+

 /**

  * Encapsulates logic to read color definitions from DrawingML and convert them to java.awt.Color

  *

@@ -63,40 +59,37 @@
      * If not color information was found in the supplied xml object then a null is returned.

      */

     public Color getColor() {

-        return _color == null ? null : applyColorTransform(_color);

+        return DrawPaint.applyColorTransform(getColorStyle());

     }

 

-    private Color applyColorTransform(Color color){

-        Color result = color;

+    public ColorStyle getColorStyle() {

+        return new ColorStyle() {

+            public Color getColor() {

+                return _color;

+            }

 

-        int alpha = getAlpha();

-        if(alpha != -1){

-            result = new Color(

-                    result.getRed(), result.getGreen(), result.getBlue(), 

-                    Math.round(255 * alpha * 0.01f));

-        }

+            public int getAlpha() {

+                return getRawValue("alpha");

+            }

 

-        int lumOff = getLumOff();

-        int lumMod = getLumMod();

-        if(lumMod != -1 || lumOff != -1){

-            result = modulateLuminanace(result,

-                    lumMod == -1 ? 100 : lumMod,

-                    lumOff == -1 ? 0 : lumOff);

-        }

+            public int getLumOff() {

+                return getRawValue("lumOff");

+            }

 

-        int shade = getShade();

-        if(shade != -1){

-        	result = shade(result, shade);

-        }

+            public int getLumMod() {

+                return getRawValue("lumMod");

+            }

 

-        int tint = getTint();

-        if(tint != -1){

-            result = tint(result, tint);

-        }

+            public int getShade() {

+                return getRawValue("shade");

+            }

 

-        return result;

+            public int getTint() {

+                return getRawValue("tint");

+            }

+        };

     }

-

+    

     Color toColor(XmlObject obj, XSLFTheme theme) {

         Color color = null;

         for (XmlObject ch : obj.selectPath("*")) {

@@ -140,6 +133,7 @@
                     color = new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);

                 } else {

                     // YK: color is a string like "menuText" or "windowText", we return black for such cases

+                    @SuppressWarnings("unused")

                     String colorName = sys.getVal().toString();

                     color = Color.black;

                 }

@@ -150,6 +144,33 @@
         return color;

     }

 

+    private int getRawValue(String elem) {

+        String query = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem;

+

+        XmlObject[] obj;

+

+        // first ask the context color and if not found, ask the actual color bean

+        if (_phClr != null){

+            obj = _phClr.selectPath(query);

+            if (obj.length == 1){

+                Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");

+                if(attr != null) {

+                    return Integer.parseInt(attr.getNodeValue());

+                }

+            }

+        }

+

+        obj = _xmlObject.selectPath(query);

+        if (obj.length == 1){

+            Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");

+            if(attr != null) {

+                return Integer.parseInt(attr.getNodeValue());

+            }

+        }

+

+        return -1;        

+    }

+    

     /**

      * Read a perecentage value from the supplied xml bean.

      * Example:

@@ -160,56 +181,13 @@
      * @return  the percentage value in the range [0 .. 100]

      */

     private int getPercentageValue(String elem){

-        String query = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem;

-

-        XmlObject[] obj;

-

-        // first ask the context color and if not found, ask the actual color bean

-        if(_phClr != null){

-            obj = _phClr.selectPath(query);

-            if(obj.length == 1){

-                Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");

-                if(attr != null) {

-                    return Integer.parseInt(attr.getNodeValue()) / 1000;

-                }

-            }

-        }

-

-        obj = _xmlObject.selectPath(query);

-        if(obj.length == 1){

-            Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");

-            if(attr != null) {

-                return Integer.parseInt(attr.getNodeValue()) / 1000;

-            }

-        }

-

-

-        return -1;

+        int val = getRawValue(elem);

+        return (val == -1) ? val : (val / 1000);

     }

 

     private int getAngleValue(String elem){

-        String color = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem;

-        XmlObject[] obj;

-

-        // first ask the context color and if not found, ask the actual color bean

-        if(_phClr != null){

-            obj = _xmlObject.selectPath( color );

-            if(obj.length == 1){

-                Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");

-                if(attr != null) {

-                    return Integer.parseInt(attr.getNodeValue()) / 60000;

-                }

-            }

-        }

-

-        obj = _xmlObject.selectPath( color );

-        if(obj.length == 1){

-            Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");

-            if(attr != null) {

-                return Integer.parseInt(attr.getNodeValue()) / 60000;

-            }

-        }

-        return -1;

+        int val = getRawValue(elem);

+        return (val == -1) ? val : (val / 60000);

     }

 

     /**

@@ -387,7 +365,7 @@
      * percentage with 0% indicating minimal shade and 100% indicating maximum

      * or -1 if the value is not set

      */

-    int getShade(){

+    public int getShade(){

         return getPercentageValue("shade");

     }

 

@@ -399,70 +377,12 @@
      * percentage with 0% indicating minimal tint and 100% indicating maximum

      * or -1 if the value is not set

      */

-    int getTint(){

+    public int getTint(){

         return getPercentageValue("tint");

     }

 

 

     /**

-     * Apply lumMod / lumOff adjustments

-     *

-     * @param c the color to modify

-     * @param lumMod luminance modulation in the range [0..100]

-     * @param lumOff luminance offset in the range [0..100]

-     * @return  modified color

-     */

-    private static Color modulateLuminanace(Color c, int lumMod, int lumOff) {

-        Color color;

-        if (lumOff > 0) {

-            color = new Color(

-                    (int) (Math.round((255 - c.getRed()) * (100.0 - lumMod) / 100.0 + c.getRed())),

-                    (int) (Math.round((255 - c.getGreen()) * lumOff / 100.0 + c.getGreen())),

-                    (int) (Math.round((255 - c.getBlue()) * lumOff / 100.0 + c.getBlue())),

-                    c.getAlpha()

-            );

-        } else {

-            color = new Color(

-                    (int) (Math.round(c.getRed() * lumMod / 100.0)),

-                    (int) (Math.round(c.getGreen() * lumMod / 100.0)),

-                    (int) (Math.round(c.getBlue() * lumMod / 100.0)),

-                    c.getAlpha()

-            );

-        }

-        return color;

-    }

-

-    /**

-     * This algorithm returns result different from PowerPoint.

-     * TODO: revisit and improve

-     */

-    private static Color shade(Color c, int shade) {

-        return new Color(

-                (int)(c.getRed() * shade * 0.01),

-                (int)(c.getGreen() * shade * 0.01),

-                (int)(c.getBlue() * shade * 0.01),

-                c.getAlpha());

-    }

-

-    /**

-     * This algorithm returns result different from PowerPoint.

-     * TODO: revisit and improve

-     */

-    private static Color tint(Color c, int tint) {

-        int r = c.getRed();

-        int g = c.getGreen();

-        int b = c.getBlue();

-

-        float ftint = tint / 100.0f;

-

-        int red = Math.round(ftint * r + (1 - ftint) * 255);

-        int green = Math.round(ftint * g + (1 - ftint) * 255);

-        int blue = Math.round(ftint * b + (1 - ftint) * 255);

-

-        return new Color(red, green, blue);

-    }

-

-    /**

      * Preset colors defined in DrawingML

      */

     static final Map<String, Color> presetColors;

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java
index 8cc1c92..b894cd0 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFConnectorShape.java
@@ -19,6 +19,7 @@
 

 package org.apache.poi.xslf.usermodel;

 

+import org.apache.poi.sl.usermodel.ConnectorShape;

 import org.apache.poi.util.Beta;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;

@@ -34,7 +35,7 @@
  * @author Yegor Kozlov

  */

 @Beta

-public class XSLFConnectorShape extends XSLFSimpleShape {

+public class XSLFConnectorShape extends XSLFSimpleShape implements ConnectorShape {

 

     /*package*/ XSLFConnectorShape(CTConnector shape, XSLFSheet sheet) {

         super(shape, sheet);

@@ -43,6 +44,7 @@
     /**

      * @param shapeId 1-based shapeId

      */

+    @SuppressWarnings("unused")

     static CTConnector prototype(int shapeId) {

         CTConnector ct = CTConnector.Factory.newInstance();

         CTConnectorNonVisual nvSpPr = ct.addNewNvCxnSpPr();

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
index 529bacf..608cb3a 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
@@ -19,59 +19,37 @@
 

 package org.apache.poi.xslf.usermodel;

 

+import java.awt.geom.Rectangle2D;

+

+import javax.xml.namespace.QName;

+

 import org.apache.poi.POIXMLException;

 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

 import org.apache.poi.openxml4j.opc.PackagePart;

 import org.apache.poi.openxml4j.opc.PackageRelationship;

+import org.apache.poi.sl.usermodel.ShapeType;

 import org.apache.poi.util.Beta;

 import org.apache.poi.util.Units;

 import org.apache.xmlbeans.XmlCursor;

 import org.apache.xmlbeans.XmlObject;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

 import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;

 

-import javax.xml.namespace.QName;

-import java.awt.Graphics2D;

-import java.awt.geom.Rectangle2D;

-

 /**

  * @author Yegor Kozlov

  */

 @Beta

 public class XSLFGraphicFrame extends XSLFShape {

-    private final CTGraphicalObjectFrame _shape;

-    private final XSLFSheet _sheet;

-

     /*package*/ XSLFGraphicFrame(CTGraphicalObjectFrame shape, XSLFSheet sheet){

-        _shape = shape;

-        _sheet = sheet;

+        super(shape,sheet);

     }

 

-    public CTGraphicalObjectFrame getXmlObject(){

-        return _shape;

-    }

-

-    public XSLFSheet getSheet(){

-        return _sheet;

-    }

-

-    public int getShapeType(){

-        throw new RuntimeException("NotImplemented");

-    }

-

-    public int getShapeId(){

-        return (int)_shape.getNvGraphicFramePr().getCNvPr().getId();

-    }

-

-    public String getShapeName(){

-        return _shape.getNvGraphicFramePr().getCNvPr().getName();

+    public ShapeType getShapeType(){

+        throw new UnsupportedOperationException();

     }

 

     public Rectangle2D getAnchor(){

-        CTTransform2D xfrm = _shape.getXfrm();

+        CTTransform2D xfrm = ((CTGraphicalObjectFrame)getXmlObject()).getXfrm();

         CTPoint2D off = xfrm.getOff();

         long x = off.getX();

         long y = off.getY();

@@ -84,7 +62,7 @@
     }

 

     public void setAnchor(Rectangle2D anchor){

-        CTTransform2D xfrm = _shape.getXfrm();

+        CTTransform2D xfrm = ((CTGraphicalObjectFrame)getXmlObject()).getXfrm();

         CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();

         long x = Units.toEMU(anchor.getX());

         long y = Units.toEMU(anchor.getY());

@@ -155,15 +133,11 @@
     	return false;

     }

 

-    public void draw(Graphics2D graphics){

-

-    }

-

     @Override

     void copy(XSLFShape sh){

         super.copy(sh);

 

-        CTGraphicalObjectData data = _shape.getGraphic().getGraphicData();

+        CTGraphicalObjectData data = ((CTGraphicalObjectFrame)getXmlObject()).getGraphic().getGraphicData();

         String uri = data.getUri();

         if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){

             copyDiagram(data, (XSLFGraphicFrame)sh);

@@ -185,22 +159,22 @@
                 String dm = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "dm"));

                 PackageRelationship dmRel = sheet.getPackagePart().getRelationship(dm);

                 PackagePart dmPart = sheet.getPackagePart().getRelatedPart(dmRel);

-                _sheet.importPart(dmRel, dmPart);

+                getSheet().importPart(dmRel, dmPart);

 

                 String lo = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "lo"));

                 PackageRelationship loRel = sheet.getPackagePart().getRelationship(lo);

                 PackagePart loPart = sheet.getPackagePart().getRelatedPart(loRel);

-                _sheet.importPart(loRel, loPart);

+                getSheet().importPart(loRel, loPart);

 

                 String qs = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "qs"));

                 PackageRelationship qsRel = sheet.getPackagePart().getRelationship(qs);

                 PackagePart qsPart = sheet.getPackagePart().getRelatedPart(qsRel);

-                _sheet.importPart(qsRel, qsPart);

+                getSheet().importPart(qsRel, qsPart);

 

                 String cs = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "cs"));

                 PackageRelationship csRel = sheet.getPackagePart().getRelationship(cs);

                 PackagePart csPart = sheet.getPackagePart().getRelatedPart(csRel);

-                _sheet.importPart(csRel, csPart);

+                getSheet().importPart(csRel, csPart);

 

             } catch (InvalidFormatException e){

                 throw new POIXMLException(e);

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java
index 2ad699b..18191a5 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java
@@ -19,58 +19,52 @@
 

 package org.apache.poi.xslf.usermodel;

 

-import org.apache.poi.openxml4j.opc.PackagePart;

-import org.apache.poi.openxml4j.opc.PackageRelationship;

-import org.apache.poi.openxml4j.opc.TargetMode;

-import org.apache.poi.util.Beta;

-import org.apache.poi.util.Units;

-import org.apache.xmlbeans.XmlObject;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;

-

-import java.awt.Graphics2D;

-import java.awt.geom.AffineTransform;

 import java.awt.geom.Rectangle2D;

-import java.util.Iterator;

-import java.util.List;

+import java.util.*;

 import java.util.regex.Pattern;

 

+import org.apache.poi.openxml4j.opc.*;

+import org.apache.poi.sl.usermodel.GroupShape;

+import org.apache.poi.util.*;

+import org.apache.xmlbeans.XmlObject;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

+import org.openxmlformats.schemas.presentationml.x2006.main.*;

+

 /**

  * Represents a group shape that consists of many shapes grouped together.

  * 

  * @author Yegor Kozlov

  */

 @Beta

-public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {

-    private final CTGroupShape _shape;

-    private final XSLFSheet _sheet;

+public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, GroupShape<XSLFShape> {

+    private static POILogger _logger = POILogFactory.getLogger(XSLFGroupShape.class);

+    

     private final List<XSLFShape> _shapes;

-    private final CTGroupShapeProperties _spPr;

+    private final CTGroupShapeProperties _grpSpPr;

     private XSLFDrawing _drawing;

 

-    /*package*/ XSLFGroupShape(CTGroupShape shape, XSLFSheet sheet){

-        _shape = shape;

-        _sheet = sheet;

-

-        _shapes = _sheet.buildShapes(_shape);

-        _spPr = shape.getGrpSpPr();

+    protected XSLFGroupShape(CTGroupShape shape, XSLFSheet sheet){

+        super(shape,sheet);

+        _shapes = sheet.buildShapes(shape);

+        _grpSpPr = shape.getGrpSpPr();

     }

 

-    @Override

-    public CTGroupShape getXmlObject(){

-        return _shape;

+    protected CTGroupShapeProperties getGrpSpPr() {

+        return _grpSpPr;

+    }

+    

+    protected CTGroupTransform2D getSafeXfrm() {

+        CTGroupTransform2D xfrm = getXfrm();

+        return (xfrm == null ? getGrpSpPr().addNewXfrm() : xfrm);

+    }

+    

+    protected CTGroupTransform2D getXfrm() {

+        return getGrpSpPr().getXfrm();

     }

 

     @Override

     public Rectangle2D getAnchor(){

-        CTGroupTransform2D xfrm = _spPr.getXfrm();

+        CTGroupTransform2D xfrm = getXfrm();

         CTPoint2D off = xfrm.getOff();

         long x = off.getX();

         long y = off.getY();

@@ -84,7 +78,7 @@
 

     @Override

     public void setAnchor(Rectangle2D anchor){

-        CTGroupTransform2D xfrm = _spPr.isSetXfrm() ? _spPr.getXfrm() : _spPr.addNewXfrm();

+        CTGroupTransform2D xfrm = getSafeXfrm();

         CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();

         long x = Units.toEMU(anchor.getX());

         long y = Units.toEMU(anchor.getY());

@@ -104,7 +98,7 @@
      * behavior of shapes placed within a group.

      */

     public Rectangle2D getInteriorAnchor(){

-        CTGroupTransform2D xfrm = _spPr.getXfrm();

+        CTGroupTransform2D xfrm = getXfrm();

         CTPoint2D off = xfrm.getChOff();

         long x = off.getX();

         long y = off.getY();

@@ -122,8 +116,8 @@
      * used for calculations of grouping, scaling, and rotation

      * behavior of shapes placed within a group.

      */

-    public void setInteriorAnchor(Rectangle2D anchor){

-        CTGroupTransform2D xfrm = _spPr.isSetXfrm() ? _spPr.getXfrm() : _spPr.addNewXfrm();

+    public void setInteriorAnchor(Rectangle2D anchor) {

+        CTGroupTransform2D xfrm = getSafeXfrm();

         CTPoint2D off = xfrm.isSetChOff() ? xfrm.getChOff() : xfrm.addNewChOff();

         long x = Units.toEMU(anchor.getX());

         long y = Units.toEMU(anchor.getY());

@@ -140,8 +134,9 @@
      *

      * @return child shapes contained witin this group

      */

-    public XSLFShape[] getShapes(){

-        return _shapes.toArray(new XSLFShape[_shapes.size()]);

+    @Override

+    public List<XSLFShape> getShapes(){

+        return _shapes;

     }

 

     /**

@@ -158,28 +153,19 @@
      */

     public boolean removeShape(XSLFShape xShape) {

         XmlObject obj = xShape.getXmlObject();

+        CTGroupShape grpSp = (CTGroupShape)getXmlObject();

         if(obj instanceof CTShape){

-            _shape.getSpList().remove(obj);

+            grpSp.getSpList().remove(obj);

         } else if (obj instanceof CTGroupShape){

-            _shape.getGrpSpList().remove(obj);

+            grpSp.getGrpSpList().remove(obj);

         } else if (obj instanceof CTConnector){

-            _shape.getCxnSpList().remove(obj);

+            grpSp.getCxnSpList().remove(obj);

         } else {

             throw new IllegalArgumentException("Unsupported shape: " + xShape);

         }

         return _shapes.remove(xShape);

     }

 

-    @Override

-    public String getShapeName(){

-        return _shape.getNvGrpSpPr().getCNvPr().getName();

-    }

-

-    @Override

-    public int getShapeId(){

-        return (int)_shape.getNvGrpSpPr().getCNvPr().getId();

-    }

-

     /**

      * @param shapeId 1-based shapeId

      */

@@ -199,7 +185,7 @@
     // shape factory methods

     private XSLFDrawing getDrawing(){

         if(_drawing == null) {

-            _drawing = new XSLFDrawing(_sheet, _shape);

+            _drawing = new XSLFDrawing(getSheet(), (CTGroupShape)getXmlObject());

         }

         return _drawing;

     }

@@ -207,36 +193,41 @@
     public XSLFAutoShape createAutoShape(){

         XSLFAutoShape sh = getDrawing().createAutoShape();

         _shapes.add(sh);

+        sh.setParent(this);

         return sh;

     }

 

     public XSLFFreeformShape createFreeform(){

         XSLFFreeformShape sh = getDrawing().createFreeform();

         _shapes.add(sh);

+        sh.setParent(this);

         return sh;

     }

 

     public XSLFTextBox createTextBox(){

         XSLFTextBox sh = getDrawing().createTextBox();

         _shapes.add(sh);

+        sh.setParent(this);

         return sh;

     }

 

     public XSLFConnectorShape createConnector(){

         XSLFConnectorShape sh = getDrawing().createConnector();

         _shapes.add(sh);

+        sh.setParent(this);

         return sh;

     }

 

     public XSLFGroupShape createGroup(){

         XSLFGroupShape sh = getDrawing().createGroup();

         _shapes.add(sh);

+        sh.setParent(this);

         return sh;

     }

 

     public XSLFPictureShape createPicture(int pictureIndex){

 

-        List<PackagePart>  pics = _sheet.getPackagePart().getPackage()

+        List<PackagePart>  pics = getSheet().getPackagePart().getPackage()

                 .getPartsByName(Pattern.compile("/ppt/media/image" + (pictureIndex + 1) + ".*?"));

 

         if(pics.size() == 0) {

@@ -245,91 +236,89 @@
 

         PackagePart pic = pics.get(0);

 

-        PackageRelationship rel = _sheet.getPackagePart().addRelationship(

+        PackageRelationship rel = getSheet().getPackagePart().addRelationship(

                 pic.getPartName(), TargetMode.INTERNAL, XSLFRelation.IMAGES.getRelation());

 

         XSLFPictureShape sh = getDrawing().createPicture(rel.getId());

         sh.resize();

         _shapes.add(sh);

+        sh.setParent(this);

         return sh;

     }

 

+    public XSLFTable createTable(){

+        XSLFTable sh = getDrawing().createTable();

+        _shapes.add(sh);

+        sh.setParent(this);

+        return sh;

+    }

+    

     @Override

     public void setFlipHorizontal(boolean flip){

-        _spPr.getXfrm().setFlipH(flip);

+        getSafeXfrm().setFlipH(flip);

     }

 

     @Override

     public void setFlipVertical(boolean flip){

-        _spPr.getXfrm().setFlipV(flip);

+        getSafeXfrm().setFlipV(flip);

     }

 

     @Override

     public boolean getFlipHorizontal(){

-         return _spPr.getXfrm().getFlipH();

+        CTGroupTransform2D xfrm = getXfrm();

+        return (xfrm == null || !xfrm.isSetFlipH()) ? false : xfrm.getFlipH();

     }

 

     @Override

     public boolean getFlipVertical(){

-         return _spPr.getXfrm().getFlipV();

+        CTGroupTransform2D xfrm = getXfrm();

+        return (xfrm == null || !xfrm.isSetFlipV()) ? false : xfrm.getFlipV();

     }

 

     @Override

     public void setRotation(double theta){

-        _spPr.getXfrm().setRot((int)(theta*60000));

+        getSafeXfrm().setRot((int) (theta * 60000));

     }

 

     @Override

     public double getRotation(){

-        return (double)_spPr.getXfrm().getRot()/60000;

-    }

-

-    @Override

-    public void draw(Graphics2D graphics){

-

-    	// the coordinate system of this group of shape

-        Rectangle2D interior = getInteriorAnchor();

-        // anchor of this group relative to the parent shape

-        Rectangle2D exterior = getAnchor();

-

-        AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM);

-        AffineTransform tx0 = new AffineTransform(tx);

-

-        double scaleX = interior.getWidth() == 0. ? 1.0 : exterior.getWidth() / interior.getWidth();

-        double scaleY = interior.getHeight() == 0. ? 1.0 : exterior.getHeight() / interior.getHeight();

-

-        tx.translate(exterior.getX(), exterior.getY());

-        tx.scale(scaleX, scaleY);

-        tx.translate(-interior.getX(), -interior.getY());

-

-        for (XSLFShape shape : getShapes()) {

-        	// remember the initial transform and restore it after we are done with the drawing

-        	AffineTransform at = graphics.getTransform();

-            graphics.setRenderingHint(XSLFRenderingHint.GSAVE, true);

-

-            shape.applyTransform(graphics);

-        	shape.draw(graphics);

-

-            // restore the coordinate system

-            graphics.setTransform(at);

-            graphics.setRenderingHint(XSLFRenderingHint.GRESTORE, true);

-        }

-

-        graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, tx0);

-        

+        CTGroupTransform2D xfrm = getXfrm();

+        return (xfrm == null || !xfrm.isSetRot()) ? 0 : (xfrm.getRot() / 60000.d);

     }

 

     @Override

     void copy(XSLFShape src){

         XSLFGroupShape gr = (XSLFGroupShape)src;

+        

+        // clear shapes

+        clear();

+        

         // recursively update each shape

-        XSLFShape[] tgtShapes = getShapes();

-        XSLFShape[] srcShapes = gr.getShapes();

-        for(int i = 0; i < tgtShapes.length; i++){

-            XSLFShape s1 = srcShapes[i];

-            XSLFShape s2 = tgtShapes[i];

+        for(XSLFShape shape : gr.getShapes()) {

+            XSLFShape newShape = null;

+            if (shape instanceof XSLFTextBox) {

+                newShape = createTextBox();

+            } else if (shape instanceof XSLFAutoShape) {

+                newShape = createAutoShape();

+            } else if (shape instanceof XSLFConnectorShape) {

+                newShape = createConnector();

+            } else if (shape instanceof XSLFFreeformShape) {

+                newShape = createFreeform();

+            } else if (shape instanceof XSLFPictureShape) {

+                XSLFPictureShape p = (XSLFPictureShape)shape;

+                XSLFPictureData pd = p.getPictureData();

+                int picId = getSheet().getSlideShow().addPicture(pd.getData(), pd.getPictureType());

+                newShape = createPicture(picId);

+            } else if (shape instanceof XSLFGroupShape) {

+                newShape = createGroup();

+            } else if (shape instanceof XSLFTable) {

+                newShape = createTable();

+            } else {

+                _logger.log(POILogger.WARN, "copying of class "+shape.getClass()+" not supported.");

+                continue;

+            }

 

-            s2.copy(s1);

+            newShape.copy(shape);

         }

     }

 

@@ -338,9 +327,15 @@
      * The container will be empty after this call returns.

      */

     public void clear() {

-        for(XSLFShape shape : getShapes()){

+        List<XSLFShape> shapes = new ArrayList<XSLFShape>(getShapes());

+        for(XSLFShape shape : shapes){

             removeShape(shape);

         }

     }

 

+    public void addShape(XSLFShape shape) {

+        throw new UnsupportedOperationException(

+            "Adding a shape from a different container is not supported -"

+            + " create it from scratch with XSLFGroupShape.create* methods");

+    }

 }
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java
index 0a33132..7296d1d 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotes.java
@@ -17,18 +17,19 @@
 package org.apache.poi.xslf.usermodel;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.sl.usermodel.Notes;
 import org.apache.poi.util.Beta;
 import org.apache.xmlbeans.XmlException;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide;
-import org.openxmlformats.schemas.presentationml.x2006.main.NotesDocument;
+import org.openxmlformats.schemas.presentationml.x2006.main.*;
 
 @Beta
-public final class XSLFNotes extends XSLFSheet {
+public final class XSLFNotes extends XSLFSheet implements Notes<XSLFShape,XMLSlideShow> {
    private CTNotesSlide _notes;
 
     /**
@@ -80,7 +81,6 @@
     	return getMasterSheet().getTheme();
     }
 
-    @Override
     public XSLFNotesMaster getMasterSheet() {
         for (POIXMLDocumentPart p : getRelations()) {
            if (p instanceof XSLFNotesMaster){
@@ -89,4 +89,16 @@
         }
         return null;
     }
+
+    @Override
+    public List<List<XSLFTextParagraph>> getTextParagraphs() {
+        List<List<XSLFTextParagraph>> tp = new ArrayList<List<XSLFTextParagraph>>();
+        for (XSLFShape sh : super.getShapes()) {
+            if (sh instanceof XSLFTextShape) {
+                XSLFTextShape txt = (XSLFTextShape)sh;
+                tp.add(txt.getTextParagraphs());
+            }
+        }
+        return tp;
+    }
 }
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java
index 40937e8..aeea5cc 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFNotesMaster.java
@@ -23,6 +23,7 @@
 import org.apache.poi.POIXMLException;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.sl.usermodel.MasterSheet;
 import org.apache.poi.util.Beta;
 import org.apache.xmlbeans.XmlException;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping;
@@ -46,7 +47,7 @@
  * @author Yegor Kozlov
 */
 @Beta
- public class XSLFNotesMaster extends XSLFSheet {
+ public class XSLFNotesMaster extends XSLFSheet implements MasterSheet<XSLFShape,XMLSlideShow> {
 	 private CTNotesMaster _slide;
      private XSLFTheme _theme;
 
@@ -93,7 +94,7 @@
     }
 
     @Override
-    public XSLFSheet getMasterSheet() {
+    public MasterSheet<XSLFShape,XMLSlideShow> getMasterSheet() {
         return null;
     }
     
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java
index 7ade4f9..3b6053b 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java
@@ -20,12 +20,12 @@
 package org.apache.poi.xslf.usermodel;
 
 import java.io.IOException;
+import java.io.OutputStream;
 
-import org.apache.poi.POIXMLDocumentPart;
-import org.apache.poi.POIXMLException;
-import org.apache.poi.POIXMLRelation;
+import org.apache.poi.*;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.sl.usermodel.PictureData;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.IOUtils;
 
@@ -35,7 +35,7 @@
  * @author Yegor Kozlov
  */
 @Beta
-public final class XSLFPictureData extends POIXMLDocumentPart {
+public final class XSLFPictureData extends POIXMLDocumentPart implements PictureData {
     /**
      * Extended windows meta file
      */
@@ -215,4 +215,17 @@
     protected void prepareForCommit() {
         // do not clear the part here
     }
+    
+    public String getContentType() {
+        POIXMLRelation rel = RELATIONS[getPictureType()];
+        return (rel == null) ? null : rel.getContentType();
+    }
+
+    public void setData(byte[] data) throws IOException {
+        OutputStream os = getPackagePart().getOutputStream();
+        os.write(data);
+        os.close();
+    }
+    
+    
 }
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
index a7e7e5e..3d532bb 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureShape.java
@@ -19,7 +19,6 @@
 

 package org.apache.poi.xslf.usermodel;

 

-import java.awt.Graphics2D;

 import java.awt.Insets;

 import java.awt.geom.Rectangle2D;

 import java.awt.image.BufferedImage;

@@ -32,27 +31,18 @@
 import org.apache.poi.POIXMLException;

 import org.apache.poi.openxml4j.opc.PackagePart;

 import org.apache.poi.openxml4j.opc.PackageRelationship;

+import org.apache.poi.sl.usermodel.PictureShape;

 import org.apache.poi.util.Beta;

 import org.apache.xmlbeans.XmlCursor;

 import org.apache.xmlbeans.XmlObject;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeArtExtension;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeArtExtensionList;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTRelativeRect;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTPictureNonVisual;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

+import org.openxmlformats.schemas.presentationml.x2006.main.*;

 

 /**

  * Represents a picture shape

  */

 @Beta

-public class XSLFPictureShape extends XSLFSimpleShape {

+public class XSLFPictureShape extends XSLFSimpleShape implements PictureShape {

     private XSLFPictureData _data;

 

     /*package*/ XSLFPictureShape(CTPicture shape, XSLFSheet sheet) {

@@ -179,30 +169,14 @@
         return id;

     }

 

-    public Insets getBlipClip(){

+    @Override

+    public Insets getClipping(){

         CTPicture ct = (CTPicture)getXmlObject();

         CTRelativeRect r = ct.getBlipFill().getSrcRect();

         return (r == null) ? null : new Insets(r.getT(), r.getL(), r.getB(), r.getR());

     }

 

-    @Override

-    public void drawContent(Graphics2D graphics) {

-

-        XSLFPictureData data = getPictureData();

-    	if(data == null) return;

-

-        XSLFImageRenderer renderer = (XSLFImageRenderer)graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER);

-        if(renderer == null) renderer = new XSLFImageRenderer();

-

-        RenderableShape rShape = new RenderableShape(this);

-        Rectangle2D anchor = rShape.getAnchor(graphics);

-        

-        Insets insets = getBlipClip();

-

-        renderer.drawImage(graphics, data, anchor, insets);

-    }

-

-

+    @SuppressWarnings("deprecation")

     @Override

     void copy(XSLFShape sh){

         super.copy(sh);

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java
index 42dc360..0b0e4f0 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java
@@ -17,21 +17,22 @@
 

 package org.apache.poi.xslf.usermodel;

 

+import java.awt.Color;

+import java.awt.geom.Rectangle2D;

+

+import org.apache.poi.sl.draw.DrawPaint;

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;

 import org.apache.poi.util.Units;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;

 

-import java.awt.Color;

-import java.awt.Graphics2D;

-import java.awt.Shape;

-import java.awt.geom.Rectangle2D;

-

 /**

  * Represents a shadow of a shape. For now supports only outer shadows.

  *

  * @author Yegor Kozlov

  */

-public class XSLFShadow extends XSLFSimpleShape {

+public class XSLFShadow extends XSLFShape implements Shadow {

 

     private XSLFSimpleShape _parent;

 

@@ -41,54 +42,15 @@
         _parent = parentShape;

     }

 

-

-    public void fill(Graphics2D graphics, Shape outline) {

-

-        double shapeRotation = _parent.getRotation();

-        if(_parent.getFlipVertical()){

-            shapeRotation += 180;

-        }

-        double angle = getAngle() - shapeRotation;

-        double dist = getDistance();

-        double dx = dist * Math.cos(Math.toRadians(angle));

-        double dy = dist * Math.sin(Math.toRadians(angle));

-

-        graphics.translate(dx, dy);

-

-        Color fillColor = getFillColor();

-        if (fillColor != null) {

-            graphics.setColor(fillColor);

-            graphics.fill(outline);

-        }

-

-        graphics.translate(-dx, -dy);

-    }

-

-    public void draw(Graphics2D graphics, Shape outline) {

-

-        double angle = getAngle();

-        double dist = getDistance();

-        double dx = dist * Math.cos(Math.toRadians(angle));

-        double dy = dist * Math.sin(Math.toRadians(angle));

-

-        graphics.translate(dx, dy);

-

-        Color fillColor = getFillColor();

-        if (fillColor != null) {

-            graphics.setColor(fillColor);

-            graphics.draw(outline);

-        }

-

-        graphics.translate(-dx, -dy);

-    }

-

-

     @Override

+    public XSLFSimpleShape getShadowParent() {

+        return _parent;

+    }

+

     public Rectangle2D getAnchor(){

         return _parent.getAnchor();

     }

 

-    @Override

     public void setAnchor(Rectangle2D anchor){

         throw new IllegalStateException("You can't set anchor of a shadow");

     }

@@ -124,15 +86,25 @@
      * @return the color of this shadow. 

      * Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow

      */

-    @Override

     public Color getFillColor() {

+        SolidPaint ps = getFillStyle();

+        if (ps == PaintStyle.TRANSPARENT_PAINT) return null;

+        Color col = DrawPaint.applyColorTransform(ps.getSolidColor());

+        return col;

+    }

+

+    @Override

+    public SolidPaint getFillStyle() {

         XSLFTheme theme = getSheet().getTheme();

         CTOuterShadowEffect ct = (CTOuterShadowEffect)getXmlObject();

-        if(ct == null) {

-            return null;

-        } else {

-            CTSchemeColor phClr = ct.getSchemeClr();

-            return new XSLFColor(ct, theme, phClr).getColor();

-        }

+        if(ct == null) return PaintStyle.TRANSPARENT_PAINT;

+            

+        CTSchemeColor phClr = ct.getSchemeClr();

+        final XSLFColor xc = new XSLFColor(ct, theme, phClr);

+        return new SolidPaint(){

+            public ColorStyle getSolidColor() {

+                return xc.getColorStyle();

+            }

+        };

     }

 }
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
index 82addf7..6a9637b 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
@@ -19,13 +19,24 @@
 

 package org.apache.poi.xslf.usermodel;

 

-import java.awt.Graphics2D;

-import java.awt.geom.AffineTransform;

-import java.awt.geom.Rectangle2D;

+import java.io.IOException;

+import java.io.InputStream;

+import java.util.Arrays;

+import java.util.Comparator;

 

+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

+import org.apache.poi.openxml4j.opc.PackagePart;

+import org.apache.poi.openxml4j.opc.PackageRelationship;

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint;

+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;

+import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint;

 import org.apache.poi.util.Beta;

 import org.apache.poi.util.Internal;

+import org.apache.poi.xslf.model.PropertyFetcher;

 import org.apache.xmlbeans.XmlObject;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

+import org.openxmlformats.schemas.presentationml.x2006.main.*;

 

 /**

  * Base super-class class for all shapes in PresentationML

@@ -33,29 +44,40 @@
  * @author Yegor Kozlov

  */

 @Beta

-public abstract class XSLFShape {

+public abstract class XSLFShape implements Shape {

+    private final XmlObject _shape;

+    private final XSLFSheet _sheet;

+    private XSLFShapeContainer _parent;

 

-    /**

-     * @return the position of this shape within the drawing canvas.

-     *         The coordinates are expressed in points

-     */

-    public abstract Rectangle2D getAnchor();

+    private CTShapeProperties _spPr;

+    private CTShapeStyle _spStyle;

+    private CTNonVisualDrawingProps _nvPr;

+    private CTPlaceholder _ph;

 

-    /**

-     * @param anchor the position of this shape within the drawing canvas.

-     *               The coordinates are expressed in points

-     */

-    public abstract void setAnchor(Rectangle2D anchor);

-

+    protected XSLFShape(XmlObject shape, XSLFSheet sheet) {

+        _shape = shape;

+        _sheet = sheet;

+    }

+    

     /**

      * @return the xml bean holding this shape's data

      */

-    public abstract XmlObject getXmlObject();

-

+    public final XmlObject getXmlObject() {

+        // it's final because the xslf inheritance hierarchy is not necessary the same as

+        // the (not existing) xmlbeans hierarchy and subclasses shouldn't narrow it's return value

+        return _shape;

+    }

+    

+    public XSLFSheet getSheet() {

+        return _sheet;

+    }

+    

     /**

      * @return human-readable name of this shape, e.g. "Rectange 3"

      */

-    public abstract String getShapeName();

+    public String getShapeName(){

+        return getCNvPr().getName();

+    }

 

     /**

      * Returns a unique identifier for this shape within the current document.

@@ -68,132 +90,8 @@
      *

      * @return unique id of this shape

      */

-    public abstract int getShapeId();

-

-    /**

-     * Rotate this shape.

-     * <p>

-     * Positive angles are clockwise (i.e., towards the positive y axis);

-     * negative angles are counter-clockwise (i.e., towards the negative y axis).

-     * </p>

-     *

-     * @param theta the rotation angle in degrees.

-     */

-    public abstract void setRotation(double theta);

-

-    /**

-     * Rotation angle in degrees

-     * <p>

-     * Positive angles are clockwise (i.e., towards the positive y axis);

-     * negative angles are counter-clockwise (i.e., towards the negative y axis).

-     * </p>

-     *

-     * @return rotation angle in degrees

-     */

-    public abstract double getRotation();

-

-    /**

-     * @param flip whether the shape is horizontally flipped

-     */

-    public abstract void setFlipHorizontal(boolean flip);

-

-    /**

-     * Whether the shape is vertically flipped

-     *

-     * @param flip whether the shape is vertically flipped

-     */

-    public abstract void setFlipVertical(boolean flip);

-

-    /**

-     * Whether the shape is horizontally flipped

-     *

-     * @return whether the shape is horizontally flipped

-     */

-    public abstract boolean getFlipHorizontal();

-

-    /**

-     * Whether the shape is vertically flipped

-     *

-     * @return whether the shape is vertically flipped

-     */

-    public abstract boolean getFlipVertical();

-

-    /**

-     * Draw this shape into the supplied canvas

-     *

-     * @param graphics the graphics to draw into

-     */

-    public abstract void draw(Graphics2D graphics);

-

-    /**

-     * Apply 2-D transforms before drawing this shape. This includes rotation and flipping.

-     *

-     * @param graphics the graphics whos transform matrix will be modified

-     */

-    protected void applyTransform(Graphics2D graphics) {

-        Rectangle2D anchor = getAnchor();

-        AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM);

-        if(tx != null) {

-            anchor = tx.createTransformedShape(anchor).getBounds2D();

-        }

-

-        // rotation

-        double rotation = getRotation();

-        if (rotation != 0.) {

-            // PowerPoint rotates shapes relative to the geometric center

-            double centerX = anchor.getCenterX();

-            double centerY = anchor.getCenterY();

-

-            // normalize rotation

-            rotation = (360.+(rotation%360.))%360.;

-            int quadrant = (((int)rotation+45)/90)%4;

-            double scaleX = 1.0, scaleY = 1.0;

-

-            // scale to bounding box (bug #53176)

-            if (quadrant == 1 || quadrant == 3) {

-                // In quadrant 1 and 3, which is basically a shape in a more or less portrait orientation 

-                // (45-135 degrees and 225-315 degrees), we need to first rotate the shape by a multiple 

-                // of 90 degrees and then resize the bounding box to its original bbox. After that we can 

-                // rotate the shape to the exact rotation amount.

-                // It's strange that you'll need to rotate the shape back and forth again, but you can

-                // think of it, as if you paint the shape on a canvas. First you rotate the canvas, which might

-                // be already (differently) scaled, so you can paint the shape in its default orientation

-                // and later on, turn it around again to compare it with its original size ...

-                AffineTransform txg = new AffineTransform(); // graphics coordinate space

-                AffineTransform txs = new AffineTransform(tx); // shape coordinate space

-                txg.translate(centerX, centerY);

-                txg.rotate(Math.toRadians(quadrant*90));

-                txg.translate(-centerX, -centerY);

-                txs.translate(centerX, centerY);

-                txs.rotate(Math.toRadians(-quadrant*90));

-                txs.translate(-centerX, -centerY);

-                txg.concatenate(txs);

-                Rectangle2D anchor2 = txg.createTransformedShape(getAnchor()).getBounds2D();

-                scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth();

-                scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight();

-            }

-

-            // transformation is applied reversed ...

-            graphics.translate(centerX, centerY);

-            graphics.rotate(Math.toRadians(rotation-(double)(quadrant*90)));

-            graphics.scale(scaleX, scaleY);

-            graphics.rotate(Math.toRadians(quadrant*90));

-            graphics.translate(-centerX, -centerY);

-        }

-

-        //flip horizontal

-        if (getFlipHorizontal()) {

-            graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());

-            graphics.scale(-1, 1);

-            graphics.translate(-anchor.getX(), -anchor.getY());

-        }

-

-        //flip vertical

-        if (getFlipVertical()) {

-            graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());

-            graphics.scale(1, -1);

-            graphics.translate(-anchor.getX(), -anchor.getY());

-        }

+    public int getShapeId() {

+        return (int)getCNvPr().getId();

     }

 

     /**

@@ -210,6 +108,404 @@
                     "Can't copy " + sh.getClass().getSimpleName() + " into " + getClass().getSimpleName());

         }

 

-        setAnchor(sh.getAnchor());

+        if (this instanceof PlaceableShape) {

+            PlaceableShape ps = (PlaceableShape)this;

+            ps.setAnchor(((PlaceableShape)sh).getAnchor());

+        }

+        

+        

+    }

+    

+    public void setParent(XSLFShapeContainer parent) {

+        this._parent = parent;

+    }

+    

+    public XSLFShapeContainer getParent() {

+        return this._parent;

+    }

+    

+    protected PaintStyle getFillPaint() {

+        PropertyFetcher<PaintStyle> fetcher = new PropertyFetcher<PaintStyle>() {

+            public boolean fetch(XSLFShape shape) {

+                XmlObject pr = null;

+                try {

+                    pr = shape.getSpPr();

+                    if (((CTShapeProperties)pr).isSetNoFill()) {

+                        setValue(PaintStyle.TRANSPARENT_PAINT);

+                        return true;

+                    }                    

+                } catch (IllegalStateException e) {}

+                // trying background properties now

+                if (pr == null) {

+                    pr = shape.getBgPr();

+                }

+                if (pr == null) {

+                    pr = shape.getGrpSpPr();

+                }

+                if (pr == null) {

+                    if (shape.getXmlObject() instanceof CTBackground) {

+                        pr = shape.getXmlObject();

+                    }

+                }

+                

+                if (pr == null) {

+                    setValue(PaintStyle.TRANSPARENT_PAINT);

+                    return true;

+                }

+                

+                PaintStyle paint = null;

+                for (XmlObject obj : pr.selectPath("*")) {

+                    paint = selectPaint(obj, null, getSheet().getPackagePart());

+                    if (paint != null) break;

+                }

+                

+                if (paint == null) return false;

+                

+                setValue(paint);

+                return true;

+            }

+        };

+        fetchShapeProperty(fetcher);

+

+        PaintStyle paint = fetcher.getValue();

+        if (paint != null) return paint;

+        

+        // fill color was not found, check if it is defined in the theme

+        // get a reference to a fill style within the style matrix.

+        CTStyleMatrixReference fillRef = null;

+        if (fillRef == null) {

+            CTShapeStyle style = getSpStyle();

+            if (style != null) fillRef = style.getFillRef();

+        }

+        if (fillRef == null) {

+            fillRef = getBgRef();

+        }

+        paint = selectPaint(fillRef);

+

+        return paint == null ? PaintStyle.TRANSPARENT_PAINT : paint;

+    }

+

+    protected CTBackgroundProperties getBgPr() {

+        String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:bgPr";

+        return selectProperty(CTBackgroundProperties.class, xquery);

+    }

+    

+    protected CTStyleMatrixReference getBgRef() {

+        String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:bgRef";

+        return selectProperty(CTStyleMatrixReference.class, xquery);

+    }

+    

+    protected CTGroupShapeProperties getGrpSpPr() {

+        String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:grpSpPr";

+        return selectProperty(CTGroupShapeProperties.class, xquery);

+    }

+    

+    protected CTNonVisualDrawingProps getCNvPr() {

+        if (_nvPr == null) {

+            String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:cNvPr";

+            _nvPr = selectProperty(CTNonVisualDrawingProps.class, xquery);

+        }

+        return _nvPr;

+    }

+

+    protected CTShapeProperties getSpPr() {

+        if (_spPr == null) {

+            String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:spPr";

+            _spPr = selectProperty(CTShapeProperties.class, xquery);

+        }

+        if (_spPr == null) {

+            throw new IllegalStateException("CTShapeProperties was not found.");

+        }

+        return _spPr;

+    }

+

+    protected CTShapeStyle getSpStyle() {

+        if (_spStyle == null) {

+            String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' p:style";

+            _spStyle = selectProperty(CTShapeStyle.class, xquery);

+        }

+        return _spStyle;

+    }

+

+    protected CTPlaceholder getCTPlaceholder() {

+        if (_ph == null) {

+            String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph";

+            _ph = selectProperty(CTPlaceholder.class, xquery);

+        }

+        return _ph;

+    }

+

+    /**

+     * Specifies that the corresponding shape should be represented by the generating application

+     * as a placeholder. When a shape is considered a placeholder by the generating application

+     * it can have special properties to alert the user that they may enter content into the shape.

+     * Different types of placeholders are allowed and can be specified by using the placeholder

+     * type attribute for this element

+     *

+     * @param placeholder

+     */

+    protected void setPlaceholder(Placeholder placeholder) {

+        String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr";

+        CTApplicationNonVisualDrawingProps nv = selectProperty(CTApplicationNonVisualDrawingProps.class, xquery);

+        if (nv == null) return;

+        if(placeholder == null) {

+            if (nv.isSetPh()) nv.unsetPh();

+            _ph = null;

+        } else {

+            nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1));

+        }

+    }

+    

+    

+    /**

+     * As there's no xmlbeans hierarchy, but XSLF works with subclassing, not all

+     * child classes work with a {@link CTShape} object, but often contain the same

+     * properties. This method is the generalized form of selecting and casting those

+     * properties.

+     *

+     * @param resultClass

+     * @param xquery

+     * @return

+     */

+    @SuppressWarnings("unchecked")

+    protected <T extends XmlObject> T selectProperty(Class<T> resultClass, String xquery) {

+        XmlObject[] rs = getXmlObject().selectPath(xquery);

+        if (rs.length == 0) return null;

+        return (resultClass.isInstance(rs[0])) ? (T)rs[0] : null;

+    }

+

+    /**

+     * Walk up the inheritance tree and fetch shape properties.

+     *

+     * The following order of inheritance is assumed:

+     * <p>

+     * slide <-- slideLayout <-- slideMaster

+     * </p>

+     *

+     * @param visitor the object that collects the desired property

+     * @return true if the property was fetched

+     */

+    protected boolean fetchShapeProperty(PropertyFetcher<?> visitor) {

+        boolean ok = visitor.fetch(this);

+

+        XSLFSimpleShape masterShape;

+        XSLFSheet masterSheet = (XSLFSheet)getSheet().getMasterSheet();

+        CTPlaceholder ph = getCTPlaceholder();

+

+        if (masterSheet != null && ph != null) {

+            if (!ok) {

+                masterShape = masterSheet.getPlaceholder(ph);

+                if (masterShape != null) {

+                    ok = visitor.fetch(masterShape);

+                }

+            }

+

+            // try slide master

+            if (!ok ) {

+                int textType;

+                if ( !ph.isSetType()) textType = STPlaceholderType.INT_BODY;

+                else {

+                    switch (ph.getType().intValue()) {

+                        case STPlaceholderType.INT_TITLE:

+                        case STPlaceholderType.INT_CTR_TITLE:

+                            textType = STPlaceholderType.INT_TITLE;

+                            break;

+                        case STPlaceholderType.INT_FTR:

+                        case STPlaceholderType.INT_SLD_NUM:

+                        case STPlaceholderType.INT_DT:

+                            textType = ph.getType().intValue();

+                            break;

+                        default:

+                            textType = STPlaceholderType.INT_BODY;

+                            break;

+                    }

+                }

+                XSLFSheet master = (XSLFSheet)masterSheet.getMasterSheet();

+                if (master != null) {

+                    masterShape = master.getPlaceholderByType(textType);

+                    if (masterShape != null) {

+                        ok = visitor.fetch(masterShape);

+                    }

+                }

+            }

+        }

+        return ok;

+    }

+

+    protected PaintStyle getPaint(XmlObject spPr, CTSchemeColor phClr) {

+        PaintStyle paint = null;

+        PackagePart pp = getSheet().getPackagePart();

+        for (XmlObject obj : spPr.selectPath("*")) {

+            paint = selectPaint(obj, phClr, pp);

+            if(paint != null) break;

+        }

+        return paint == null ? PaintStyle.TRANSPARENT_PAINT : paint;

+    }    

+    

+    /**

+     * Convert shape fill into java.awt.Paint. The result is either Color or

+     * TexturePaint or GradientPaint or null

+     *

+     * @param graphics  the target graphics

+     * @param obj       the xml to read. Must contain elements from the EG_ColorChoice group:

+     * <code>

+     *     a:scrgbClr    RGB Color Model - Percentage Variant

+     *     a:srgbClr    RGB Color Model - Hex Variant

+     *     a:hslClr    Hue, Saturation, Luminance Color Model

+     *     a:sysClr    System Color

+     *     a:schemeClr    Scheme Color

+     *     a:prstClr    Preset Color

+     *  </code>

+     *

+     * @param phClr     context color

+     * @param parentPart    the parent package part. Any external references (images, etc.) are resolved relative to it.

+     *

+     * @return  the applied Paint or null if none was applied

+     */

+    protected PaintStyle selectPaint(XmlObject obj, final CTSchemeColor phClr, final PackagePart parentPart) {

+        if (obj instanceof CTNoFillProperties) {

+            return PaintStyle.TRANSPARENT_PAINT;

+        } else if (obj instanceof CTSolidColorFillProperties) {

+            return selectPaint((CTSolidColorFillProperties)obj, phClr, parentPart);

+        } else if (obj instanceof CTBlipFillProperties) {

+            return selectPaint((CTBlipFillProperties)obj, phClr, parentPart);

+        } else if (obj instanceof CTGradientFillProperties) {

+            return selectPaint((CTGradientFillProperties) obj, phClr, parentPart);

+        } else if (obj instanceof CTStyleMatrixReference) {

+            return selectPaint((CTStyleMatrixReference)obj);

+        } else {

+            return null;

+        }

+    }

+

+    protected PaintStyle selectPaint(final CTSolidColorFillProperties solidFill, final CTSchemeColor phClr, final PackagePart parentPart) {

+        final XSLFTheme theme = getSheet().getTheme();

+        final XSLFColor c = new XSLFColor(solidFill, theme, phClr);

+        return new SolidPaint() {

+            public ColorStyle getSolidColor() {

+                return c.getColorStyle();

+            }

+        };

+    }

+    

+    protected PaintStyle selectPaint(final CTBlipFillProperties blipFill, final CTSchemeColor phClr, final PackagePart parentPart) {

+        final CTBlip blip = blipFill.getBlip();

+        return new TexturePaint() {

+            private PackagePart getPart() {

+                try {

+                    String blipId = blip.getEmbed();

+                    PackageRelationship rel = parentPart.getRelationship(blipId);

+                    return parentPart.getRelatedPart(rel);

+                } catch (InvalidFormatException e) {

+                    throw new RuntimeException(e);

+                }

+            }

+            

+            public InputStream getImageData() {

+                try {

+                    return getPart().getInputStream();

+                } catch (IOException e) {

+                    throw new RuntimeException(e);

+                }

+            }

+

+            public String getContentType() {

+                /* TOOD: map content-type */

+                return getPart().getContentType();

+            }

+

+            public int getAlpha() {

+                return (blip.sizeOfAlphaModFixArray() > 0)

+                    ? blip.getAlphaModFixArray(0).getAmt()

+                    : 0;

+            }

+        };        

+    }

+    

+    protected PaintStyle selectPaint(final CTGradientFillProperties gradFill, final CTSchemeColor phClr, final PackagePart parentPart) {

+

+        @SuppressWarnings("deprecation")

+        final CTGradientStop[] gs = gradFill.getGsLst().getGsArray();

+

+        Arrays.sort(gs, new Comparator<CTGradientStop>() {

+            public int compare(CTGradientStop o1, CTGradientStop o2) {

+                Integer pos1 = o1.getPos();

+                Integer pos2 = o2.getPos();

+                return pos1.compareTo(pos2);

+            }

+        });

+

+        final ColorStyle cs[] = new ColorStyle[gs.length];

+        final float fractions[] = new float[gs.length];

+        XSLFTheme theme = getSheet().getTheme();

+        

+        int i=0;

+        for (CTGradientStop cgs : gs) {

+            cs[i] = new XSLFColor(cgs, theme, phClr).getColorStyle();

+            fractions[i] = cgs.getPos() / 100000.f;

+            i++;

+        }

+        

+        return new GradientPaint() {

+

+            public double getGradientAngle() {

+                return (gradFill.isSetLin())

+                    ? gradFill.getLin().getAng() / 60000.d

+                    : 0;

+            }

+

+            public ColorStyle[] getGradientColors() {

+                return cs;

+            }

+

+            public float[] getGradientFractions() {

+                return fractions;

+            }

+

+            public boolean isRotatedWithShape() {

+                // TODO: is this correct???

+                return (gradFill.isSetRotWithShape() || !gradFill.getRotWithShape());

+            }

+

+            public GradientType getGradientType() {

+                if (gradFill.isSetLin()) {

+                    return GradientType.linear;

+                }

+                

+                if (gradFill.isSetPath()) {

+                    /* TODO: handle rect path */

+                    STPathShadeType.Enum ps = gradFill.getPath().getPath();

+                    if (ps == STPathShadeType.CIRCLE) {

+                        return GradientType.circular;

+                    } else if (ps == STPathShadeType.SHAPE) {

+                        return GradientType.shape;

+                    }

+                }

+                

+                return GradientType.linear;

+            }

+        };        

+    }

+    

+    protected PaintStyle selectPaint(CTStyleMatrixReference fillRef) {

+        if (fillRef == null) return null;

+        

+        // The idx attribute refers to the index of a fill style or

+        // background fill style within the presentation's style matrix, defined by the fmtScheme element.

+        // value of 0 or 1000 indicates no background,

+        // values 1-999 refer to the index of a fill style within the fillStyleLst element

+        // values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element.

+        int idx = (int)fillRef.getIdx();

+        CTSchemeColor phClr = fillRef.getSchemeClr();

+        XSLFSheet sheet = getSheet();

+        XSLFTheme theme = sheet.getTheme();

+        XmlObject fillProps = null;

+        CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme();

+        if (idx >= 1 && idx <= 999) {

+            fillProps = matrix.getFillStyleLst().selectPath("*")[idx - 1];

+        } else if (idx >= 1001 ){

+            fillProps = matrix.getBgFillStyleLst().selectPath("*")[idx - 1001];

+        }

+        return (fillProps == null) ? null : selectPaint(fillProps, phClr, theme.getPackagePart());

     }

 }
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java
index 3a20891..e1d00c5 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeContainer.java
@@ -19,10 +19,12 @@
 
 package org.apache.poi.xslf.usermodel;
 
+import org.apache.poi.sl.usermodel.ShapeContainer;
+
 /**
  * Common interface for shape containers, e.g. sheets or groups of shapes
  */
-public interface XSLFShapeContainer extends Iterable<XSLFShape> {
+public interface XSLFShapeContainer extends ShapeContainer<XSLFShape> {
 
     /**
      * create a new shape with a predefined geometry and add it to this shape container
@@ -56,27 +58,6 @@
     XSLFPictureShape createPicture(int pictureIndex);
 
     /**
-     * Returns an array containing all of the elements in this container in proper
-     * sequence (from first to last element).
-     *
-     * @return an array containing all of the elements in this container in proper
-     *         sequence
-     */
-    XSLFShape[] getShapes();
-
-    /**
-     * Removes the specified shape from this sheet, if it is present
-     * (optional operation).  If this sheet does not contain the element,
-     * it is unchanged.
-     *
-     * @param xShape shape to be removed from this sheet, if present
-     * @return <tt>true</tt> if this sheet contained the specified element
-     * @throws IllegalArgumentException if the type of the specified shape
-     *         is incompatible with this sheet (optional)
-     */
-    boolean removeShape(XSLFShape xShape) ;
-
-    /**
      * Removes all of the elements from this container (optional operation).
      * The container will be empty after this call returns.
      */
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeType.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeType.java
deleted file mode 100644
index 57163ff..0000000
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShapeType.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- *  ====================================================================
- *    Licensed to the Apache Software Foundation (ASF) under one or more
- *    contributor license agreements.  See the NOTICE file distributed with
- *    this work for additional information regarding copyright ownership.
- *    The ASF licenses this file to You under the Apache License, Version 2.0
- *    (the "License"); you may not use this file except in compliance with
- *    the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- * ==================================================================== 
- */
-
-package org.apache.poi.xslf.usermodel;
-
-/**
- * known preset shape geometries in PresentationML
- *
- * @author Yegor Kozlov
- */
-public enum XSLFShapeType {
-    LINE(1),
-    LINE_INV(2),
-    TRIANGLE(3),
-    RT_TRIANGLE(4),
-    RECT(5),
-    DIAMOND(6),
-    PARALLELOGRAM(7),
-    TRAPEZOID(8),
-    NON_ISOSCELES_TRAPEZOID(9),
-    PENTAGON(10),
-    HEXAGON(11),
-    HEPTAGON(12),
-    OCTAGON(13),
-    DECAGON(14),
-    DODECAGON(15),
-    STAR_4(16),
-    STAR_5(17),
-    STAR_6(18),
-    STAR_7(19),
-    STAR_8(20),
-    STAR_10(21),
-    STAR_12(22),
-    STAR_16(23),
-    STAR_24(24),
-    STAR_32(25),
-    ROUND_RECT(26),
-    ROUND_1_RECT(27),
-    ROUND_2_SAME_RECT(28),
-    ROUND_2_DIAG_RECT(29),
-    SNIP_ROUND_RECT(30),
-    SNIP_1_RECT(31),
-    SNIP_2_SAME_RECT(32),
-    SNIP_2_DIAG_RECT(33),
-    PLAQUE(34),
-    ELLIPSE(35),
-    TEARDROP(36),
-    HOME_PLATE(37),
-    CHEVRON(38),
-    PIE_WEDGE(39),
-    PIE(40),
-    BLOCK_ARC(41),
-    DONUT(42),
-    NO_SMOKING(43),
-    RIGHT_ARROW(44),
-    LEFT_ARROW(45),
-    UP_ARROW(46),
-    DOWN_ARROW(47),
-    STRIPED_RIGHT_ARROW(48),
-    NOTCHED_RIGHT_ARROW(49),
-    BENT_UP_ARROW(50),
-    LEFT_RIGHT_ARROW(51),
-    UP_DOWN_ARROW(52),
-    LEFT_UP_ARROW(53),
-    LEFT_RIGHT_UP_ARROW(54),
-    QUAD_ARROW(55),
-    LEFT_ARROW_CALLOUT(56),
-    RIGHT_ARROW_CALLOUT(57),
-    UP_ARROW_CALLOUT(58),
-    DOWN_ARROW_CALLOUT(59),
-    LEFT_RIGHT_ARROW_CALLOUT(60),
-    UP_DOWN_ARROW_CALLOUT(61),
-    QUAD_ARROW_CALLOUT(62),
-    BENT_ARROW(63),
-    UTURN_ARROW(64),
-    CIRCULAR_ARROW(65),
-    LEFT_CIRCULAR_ARROW(66),
-    LEFT_RIGHT_CIRCULAR_ARROW(67),
-    CURVED_RIGHT_ARROW(68),
-    CURVED_LEFT_ARROW(69),
-    CURVED_UP_ARROW(70),
-    CURVED_DOWN_ARROW(71),
-    SWOOSH_ARROW(72),
-    CUBE(73),
-    CAN(74),
-    LIGHTNING_BOLT(75),
-    HEART(76),
-    SUN(77),
-    MOON(78),
-    SMILEY_FACE(79),
-    IRREGULAR_SEAL_1(80),
-    IRREGULAR_SEAL_2(81),
-    FOLDED_CORNER(82),
-    BEVEL(83),
-    FRAME(84),
-    HALF_FRAME(85),
-    CORNER(86),
-    DIAG_STRIPE(87),
-    CHORD(88),
-    ARC(89),
-    LEFT_BRACKET(90),
-    RIGHT_BRACKET(91),
-    LEFT_BRACE(92),
-    RIGHT_BRACE(93),
-    BRACKET_PAIR(94),
-    BRACE_PAIR(95),
-    STRAIGHT_CONNECTOR_1(96),
-    BENT_CONNECTOR_2(97),
-    BENT_CONNECTOR_3(98),
-    BENT_CONNECTOR_4(99),
-    BENT_CONNECTOR_5(100),
-    CURVED_CONNECTOR_2(101),
-    CURVED_CONNECTOR_3(102),
-    CURVED_CONNECTOR_4(103),
-    CURVED_CONNECTOR_5(104),
-    CALLOUT_1(105),
-    CALLOUT_2(106),
-    CALLOUT_3(107),
-    ACCENT_CALLOUT_1(108),
-    ACCENT_CALLOUT_2(109),
-    ACCENT_CALLOUT_3(110),
-    BORDER_CALLOUT_1(111),
-    BORDER_CALLOUT_2(112),
-    BORDER_CALLOUT_3(113),
-    ACCENT_BORDER_CALLOUT_1(114),
-    ACCENT_BORDER_CALLOUT_2(115),
-    ACCENT_BORDER_CALLOUT_3(116),
-    WEDGE_RECT_CALLOUT(117),
-    WEDGE_ROUND_RECT_CALLOUT(118),
-    WEDGE_ELLIPSE_CALLOUT(119),
-    CLOUD_CALLOUT(120),
-    CLOUD(121),
-    RIBBON(122),
-    RIBBON_2(123),
-    ELLIPSE_RIBBON(124),
-    ELLIPSE_RIBBON_2(125),
-    LEFT_RIGHT_RIBBON(126),
-    VERTICAL_SCROLL(127),
-    HORIZONTAL_SCROLL(128),
-    WAVE(129),
-    DOUBLE_WAVE(130),
-    PLUS(131),
-    FLOW_CHART_PROCESS(132),
-    FLOW_CHART_DECISION(133),
-    FLOW_CHART_INPUT_OUTPUT(134),
-    FLOW_CHART_PREDEFINED_PROCESS(135),
-    FLOW_CHART_INTERNAL_STORAGE(136),
-    FLOW_CHART_DOCUMENT(137),
-    FLOW_CHART_MULTIDOCUMENT(138),
-    FLOW_CHART_TERMINATOR(139),
-    FLOW_CHART_PREPARATION(140),
-    FLOW_CHART_MANUAL_INPUT(141),
-    FLOW_CHART_MANUAL_OPERATION(142),
-    FLOW_CHART_CONNECTOR(143),
-    FLOW_CHART_PUNCHED_CARD(144),
-    FLOW_CHART_PUNCHED_TAPE(145),
-    FLOW_CHART_SUMMING_JUNCTION(146),
-    FLOW_CHART_OR(147),
-    FLOW_CHART_COLLATE(148),
-    FLOW_CHART_SORT(149),
-    FLOW_CHART_EXTRACT(150),
-    FLOW_CHART_MERGE(151),
-    FLOW_CHART_OFFLINE_STORAGE(152),
-    FLOW_CHART_ONLINE_STORAGE(153),
-    FLOW_CHART_MAGNETIC_TAPE(154),
-    FLOW_CHART_MAGNETIC_DISK(155),
-    FLOW_CHART_MAGNETIC_DRUM(156),
-    FLOW_CHART_DISPLAY(157),
-    FLOW_CHART_DELAY(158),
-    FLOW_CHART_ALTERNATE_PROCESS(159),
-    FLOW_CHART_OFFPAGE_CONNECTOR(160),
-    ACTION_BUTTON_BLANK(161),
-    ACTION_BUTTON_HOME(162),
-    ACTION_BUTTON_HELP(163),
-    ACTION_BUTTON_INFORMATION(164),
-    ACTION_BUTTON_FORWARD_NEXT(165),
-    ACTION_BUTTON_BACK_PREVIOUS(166),
-    ACTION_BUTTON_END(167),
-    ACTION_BUTTON_BEGINNING(168),
-    ACTION_BUTTON_RETURN(169),
-    ACTION_BUTTON_DOCUMENT(170),
-    ACTION_BUTTON_SOUND(171),
-    ACTION_BUTTON_MOVIE(172),
-    GEAR_6(173),
-    GEAR_9(174),
-    FUNNEL(175),
-    MATH_PLUS(176),
-    MATH_MINUS(177),
-    MATH_MULTIPLY(178),
-    MATH_DIVIDE(179),
-    MATH_EQUAL(180),
-    MATH_NOT_EQUAL(181),
-    CORNER_TABS(182),
-    SQUARE_TABS(183),
-    PLAQUE_TABS(184),
-    CHART_X(185),
-    CHART_STAR(186),
-    CHART_PLUS(187);
-
-    private int _idx;
-
-    XSLFShapeType(int idx){
-        _idx = idx;
-    }
-
-    /**
-     *
-     * @return index in the STShapeType enum
-     */
-    int getIndex(){
-        return _idx;
-    }
-
-    static XSLFShapeType forInt(int idx){
-        for(XSLFShapeType t : values()){
-            if(t._idx == idx) return t;
-        }
-        throw new IllegalArgumentException("Unknown shape type: " + idx);
-    }
-}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
index 35100d1..651a31a 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
@@ -16,42 +16,28 @@
 ==================================================================== */
 package org.apache.poi.xslf.usermodel;
 
+import java.awt.Graphics2D;
+import java.io.*;
+import java.util.*;
+import java.util.regex.Pattern;
+
+import javax.xml.namespace.QName;
+
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.POIXMLException;
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.PackageRelationship;
-import org.apache.poi.openxml4j.opc.TargetMode;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
-import org.apache.poi.util.Beta;
-import org.apache.poi.util.IOUtils;
-import org.apache.poi.util.Internal;
+import org.apache.poi.openxml4j.opc.*;
+import org.apache.poi.sl.draw.DrawFactory;
+import org.apache.poi.sl.draw.Drawable;
+import org.apache.poi.sl.usermodel.Sheet;
+import org.apache.poi.util.*;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
 import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
-
-import javax.xml.namespace.QName;
-import java.awt.Graphics2D;
-import java.awt.geom.AffineTransform;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
+import org.openxmlformats.schemas.presentationml.x2006.main.*;
 
 @Beta
-public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer {
+public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet<XSLFShape, XMLSlideShow> {
     private XSLFCommonSlideData _commonSlideData;
     private XSLFDrawing _drawing;
     private List<XSLFShape> _shapes;
@@ -142,6 +128,7 @@
         List<XSLFShape> shapes = getShapeList();
         XSLFAutoShape sh = getDrawing().createAutoShape();
         shapes.add(sh);
+        sh.setParent(this);
         return sh;
     }
 
@@ -149,6 +136,7 @@
         List<XSLFShape> shapes = getShapeList();
         XSLFFreeformShape sh = getDrawing().createFreeform();
         shapes.add(sh);
+        sh.setParent(this);
         return sh;
     }
 
@@ -156,6 +144,7 @@
         List<XSLFShape> shapes = getShapeList();
         XSLFTextBox sh = getDrawing().createTextBox();
         shapes.add(sh);
+        sh.setParent(this);
         return sh;
     }
 
@@ -163,6 +152,7 @@
         List<XSLFShape> shapes = getShapeList();
         XSLFConnectorShape sh = getDrawing().createConnector();
         shapes.add(sh);
+        sh.setParent(this);
         return sh;
     }
 
@@ -170,6 +160,7 @@
         List<XSLFShape> shapes = getShapeList();
         XSLFGroupShape sh = getDrawing().createGroup();
         shapes.add(sh);
+        sh.setParent(this);
         return sh;
     }
 
@@ -191,6 +182,7 @@
         sh.resize();
 
         getShapeList().add(sh);
+        sh.setParent(this);
         return sh;
     }
 
@@ -198,6 +190,7 @@
         List<XSLFShape> shapes = getShapeList();
         XSLFTable sh = getDrawing().createTable();
         shapes.add(sh);
+        sh.setParent(this);
         return sh;
     }
 
@@ -206,8 +199,8 @@
      *
      * @return an array of all shapes in this sheet
      */
-    public XSLFShape[] getShapes(){
-        return getShapeList().toArray(new XSLFShape[_shapes.size()]);
+    public List<XSLFShape> getShapes(){
+        return getShapeList();
     }
 
     /**
@@ -219,6 +212,12 @@
         return getShapeList().iterator();
     }
 
+    public void addShape(XSLFShape shape) {
+        throw new UnsupportedOperationException(
+            "Adding a shape from a different container is not supported -"
+            + " create it from scratch witht XSLFSheet.create* methods");
+    }
+    
     /**
      * Removes the specified shape from this sheet, if it is present
      * (optional operation).  If this sheet does not contain the element,
@@ -249,7 +248,8 @@
      * The container will be empty after this call returns.
      */
     public void clear() {
-        for(XSLFShape shape : getShapes()){
+        List<XSLFShape> shapes = new ArrayList<XSLFShape>(getShapes());
+        for(XSLFShape shape : shapes){
             removeShape(shape);
         }
     }
@@ -302,6 +302,9 @@
         _spTree = null;
         _placeholders = null;
 
+        // fix-me: wth would this ever happen to work ...
+        
+        
         // first copy the source xml
         getSpTree().set(src.getSpTree());
 
@@ -370,12 +373,6 @@
     	return null;
     }
 
-    /**
-     *
-     * @return master of this sheet.
-     */
-    public abstract XSLFSheet getMasterSheet();
-
     protected XSLFTextShape getTextShapeByType(Placeholder type){
         for(XSLFShape shape : this.getShapes()){
             if(shape instanceof XSLFTextShape) {
@@ -485,32 +482,11 @@
      *
      * @param graphics
      */
+    @Override
     public void draw(Graphics2D graphics){
-        XSLFSheet master = getMasterSheet();
-        if(getFollowMasterGraphics() && master != null) master.draw(graphics);
-
-        graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, new AffineTransform());
-        for(XSLFShape shape : getShapeList()) {
-            if(!canDraw(shape)) continue;
-
-        	// remember the initial transform and restore it after we are done with drawing
-        	AffineTransform at = graphics.getTransform();
-
-            // concrete implementations can make sense of this hint,
-            // for example PSGraphics2D or PDFGraphics2D would call gsave() / grestore
-            graphics.setRenderingHint(XSLFRenderingHint.GSAVE, true);
-
-            // apply rotation and flipping
-            shape.applyTransform(graphics);
-            // draw stuff
-            shape.draw(graphics);
-
-            // restore the coordinate system
-            graphics.setTransform(at);
-
-            graphics.setRenderingHint(XSLFRenderingHint.GRESTORE, true);
-
-        }
+        DrawFactory drawFact = DrawFactory.getInstance(graphics);
+        Drawable draw = drawFact.getDrawable(this);
+        draw.draw(graphics);
     }
 
     /**
@@ -545,25 +521,26 @@
      * Import a package part into this sheet.
      */
     PackagePart importPart(PackageRelationship srcRel, PackagePart srcPafrt) {
-
-        OPCPackage pkg = getPackagePart().getPackage();
-        if(!pkg.containPart(srcPafrt.getPartName())){
-            PackageRelationship rel = getPackagePart().addRelationship(
-                    srcPafrt.getPartName(), TargetMode.INTERNAL, srcRel.getRelationshipType());
-
-            PackagePart part = pkg.createPart(srcPafrt.getPartName(), srcPafrt.getContentType());
-            OutputStream out = part.getOutputStream();
-            try {
-                InputStream is = srcPafrt.getInputStream();
-                IOUtils.copy(is, out);
-                out.close();
-            } catch (IOException e){
-                throw new POIXMLException(e);
-            }
-            return part;
-        }  else {
+        PackagePart destPP = getPackagePart();
+        PackagePartName srcPPName = srcPafrt.getPartName();
+        
+        OPCPackage pkg = destPP.getPackage();
+        if(pkg.containPart(srcPPName)){
             // already exists
-            return pkg.getPart(srcPafrt.getPartName());
+            return pkg.getPart(srcPPName);
+        }            
+            
+        destPP.addRelationship(srcPPName, TargetMode.INTERNAL, srcRel.getRelationshipType());
+
+        PackagePart part = pkg.createPart(srcPPName, srcPafrt.getContentType());
+        OutputStream out = part.getOutputStream();
+        try {
+            InputStream is = srcPafrt.getInputStream();
+            IOUtils.copy(is, out);
+            out.close();
+        } catch (IOException e){
+            throw new POIXMLException(e);
         }
+        return part;
     }
 }
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
index d6cfa7f..a48b145 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
@@ -19,26 +19,28 @@
 

 package org.apache.poi.xslf.usermodel;

 

+import static org.apache.poi.sl.usermodel.PaintStyle.TRANSPARENT_PAINT;

+

+import java.awt.Color;

+import java.awt.geom.Rectangle2D;

+

+import javax.xml.stream.XMLStreamException;

+import javax.xml.stream.XMLStreamReader;

+

+import org.apache.poi.sl.draw.geom.*;

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape;

+import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;

+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;

+import org.apache.poi.sl.usermodel.StrokeStyle.LineCap;

+import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;

+import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;

 import org.apache.poi.util.Beta;

 import org.apache.poi.util.Units;

 import org.apache.poi.xslf.model.PropertyFetcher;

-import org.apache.poi.xslf.model.geom.CustomGeometry;

-import org.apache.poi.xslf.model.geom.Outline;

-import org.apache.poi.xslf.model.geom.Path;

-import org.apache.poi.xslf.model.geom.PresetGeometries;

 import org.apache.xmlbeans.XmlObject;

 import org.openxmlformats.schemas.drawingml.x2006.main.*;

 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;

-import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;

-

-import java.awt.*;

-import java.awt.geom.AffineTransform;

-import java.awt.geom.Ellipse2D;

-import java.awt.geom.GeneralPath;

-import java.awt.geom.Rectangle2D;

-import java.util.ArrayList;

-import java.util.List;

 

 /**

  * Represents a single (non-group) shape in a .pptx slide show

@@ -46,110 +48,35 @@
  * @author Yegor Kozlov

  */

 @Beta

-public abstract class XSLFSimpleShape extends XSLFShape {

+public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {

     private static CTOuterShadowEffect NO_SHADOW = CTOuterShadowEffect.Factory.newInstance();

 

-    private final XmlObject _shape;

-    private final XSLFSheet _sheet;

-    private CTShapeProperties _spPr;

-    private CTShapeStyle _spStyle;

-    private CTNonVisualDrawingProps _nvPr;

-    private CTPlaceholder _ph;

-

     /* package */XSLFSimpleShape(XmlObject shape, XSLFSheet sheet) {

-        _shape = shape;

-        _sheet = sheet;

-    }

-

-    @Override

-    public XmlObject getXmlObject() {

-        return _shape;

-    }

-

-    /**

-     *

-     * @return the sheet this shape belongs to

-     */

-    public XSLFSheet getSheet() {

-        return _sheet;

+        super(shape,sheet);

     }

 

     /**

      *

      * @param type

      */

-    public void setShapeType(XSLFShapeType type){

-        CTShape shape = (CTShape) getXmlObject();

-        STShapeType.Enum geom = STShapeType.Enum.forInt(type.getIndex());

-        shape.getSpPr().getPrstGeom().setPrst(geom);

+    public void setShapeType(ShapeType type){

+        STShapeType.Enum geom = STShapeType.Enum.forInt(type.ooxmlId);

+        getSpPr().getPrstGeom().setPrst(geom);

     }

 

-    public XSLFShapeType getShapeType(){

-        CTShape shape = (CTShape) getXmlObject();

-        STShapeType.Enum geom = shape.getSpPr().getPrstGeom().getPrst();

-        return XSLFShapeType.forInt(geom.intValue());

+    public ShapeType getShapeType(){

+        STShapeType.Enum geom = getSpPr().getPrstGeom().getPrst();

+        return ShapeType.forId(geom.intValue(), true);

     }

-

-    @Override

-    public String getShapeName() {

-        return getNvPr().getName();

+    

+    protected CTTransform2D getSafeXfrm() {

+        CTTransform2D xfrm = getXfrm();

+        return (xfrm == null ? getSpPr().addNewXfrm() : xfrm);

     }

-

-    @Override

-    public int getShapeId() {

-        return (int) getNvPr().getId();

-    }

-

-    protected CTNonVisualDrawingProps getNvPr() {

-        if (_nvPr == null) {

-            XmlObject[] rs = _shape

-                    .selectPath("declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:cNvPr");

-            if (rs.length != 0) {

-                _nvPr = (CTNonVisualDrawingProps) rs[0];

-            }

-        }

-        return _nvPr;

-    }

-

-    protected CTShapeProperties getSpPr() {

-        if (_spPr == null) {

-            for (XmlObject obj : _shape.selectPath("*")) {

-                if (obj instanceof CTShapeProperties) {

-                    _spPr = (CTShapeProperties) obj;

-                }

-            }

-        }

-        if (_spPr == null) {

-            throw new IllegalStateException("CTShapeProperties was not found.");

-        }

-        return _spPr;

-    }

-

-    protected CTShapeStyle getSpStyle() {

-        if (_spStyle == null) {

-            for (XmlObject obj : _shape.selectPath("*")) {

-                if (obj instanceof CTShapeStyle) {

-                    _spStyle = (CTShapeStyle) obj;

-                }

-            }

-        }

-        return _spStyle;

-    }

-

-    protected CTPlaceholder getCTPlaceholder() {

-        if (_ph == null) {

-            XmlObject[] obj = _shape.selectPath(

-                    "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph");

-            if (obj.length == 1) {

-                _ph = (CTPlaceholder) obj[0];

-            }

-        }

-        return _ph;

-    }

-

-    CTTransform2D getXfrm() {

+    

+    protected CTTransform2D getXfrm() {

         PropertyFetcher<CTTransform2D> fetcher = new PropertyFetcher<CTTransform2D>() {

-            public boolean fetch(XSLFSimpleShape shape) {

+            public boolean fetch(XSLFShape shape) {

                 CTShapeProperties pr = shape.getSpPr();

                 if (pr.isSetXfrm()) {

                     setValue(pr.getXfrm());

@@ -180,8 +107,7 @@
 

     @Override

     public void setAnchor(Rectangle2D anchor) {

-        CTShapeProperties spPr = getSpPr();

-        CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm();

+        CTTransform2D xfrm = getSafeXfrm();

         CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();

         long x = Units.toEMU(anchor.getX());

         long y = Units.toEMU(anchor.getY());

@@ -194,44 +120,41 @@
         ext.setCx(cx);

         ext.setCy(cy);

     }

-

+    

     @Override

     public void setRotation(double theta) {

-        CTShapeProperties spPr = getSpPr();

-        CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm();

-        xfrm.setRot((int) (theta * 60000));

+        getSafeXfrm().setRot((int) (theta * 60000));

     }

 

     @Override

     public double getRotation() {

         CTTransform2D xfrm = getXfrm();

-        return (double) xfrm.getRot() / 60000;

+        return (xfrm == null || !xfrm.isSetRot()) ? 0 : (xfrm.getRot() / 60000.d);

     }

 

     @Override

     public void setFlipHorizontal(boolean flip) {

-        CTShapeProperties spPr = getSpPr();

-        CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm();

-        xfrm.setFlipH(flip);

+        getSafeXfrm().setFlipH(flip);

     }

 

     @Override

     public void setFlipVertical(boolean flip) {

-        CTShapeProperties spPr = getSpPr();

-        CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm();

-        xfrm.setFlipV(flip);

+        getSafeXfrm().setFlipV(flip);

     }

 

     @Override

     public boolean getFlipHorizontal() {

-        return getXfrm().getFlipH();

+        CTTransform2D xfrm = getXfrm();

+        return (xfrm == null || !xfrm.isSetFlipH()) ? false : getXfrm().getFlipH();

     }

 

     @Override

     public boolean getFlipVertical() {

-        return getXfrm().getFlipV();

+        CTTransform2D xfrm = getXfrm();

+        return (xfrm == null || !xfrm.isSetFlipV()) ? false : getXfrm().getFlipV();

     }

 

+    

     /**

      * Get default line properties defined in the theme (if any).

      * Used internally to resolve shape properties.

@@ -239,15 +162,23 @@
      * @return line propeties from the theme of null

      */

     CTLineProperties getDefaultLineProperties() {

-        CTLineProperties ln = null;

         CTShapeStyle style = getSpStyle();

-        if (style != null) {

-            // 1-based index of a line style within the style matrix

-            int idx = (int) style.getLnRef().getIdx();

-            CTStyleMatrix styleMatrix = _sheet.getTheme().getXmlObject().getThemeElements().getFmtScheme();

-            ln = styleMatrix.getLnStyleLst().getLnArray(idx - 1);

-        }

-        return ln;

+        if (style == null) return null;

+        CTStyleMatrixReference lnRef = style.getLnRef();

+        if (lnRef == null) return null;

+        // 1-based index of a line style within the style matrix

+        int idx = (int)lnRef.getIdx();

+        

+        XSLFTheme theme = getSheet().getTheme();

+        if (theme == null) return null;

+        CTBaseStyles styles = theme.getXmlObject().getThemeElements();

+        if (styles == null) return null;

+        CTStyleMatrix styleMatrix = styles.getFmtScheme();

+        if (styleMatrix == null) return null;

+        CTLineStyleList lineStyles = styleMatrix.getLnStyleLst();

+        if (lineStyles == null || lineStyles.sizeOfLnArray() < idx) return null;

+        

+        return lineStyles.getLnArray(idx - 1);

     }

 

     /**

@@ -284,14 +215,56 @@
      * if outline is turned off

      */

     public Color getLineColor() {

-        RenderableShape rShape = new RenderableShape(this);

-        Paint paint = rShape.getLinePaint(null);

-        if (paint instanceof Color) {

-            return (Color) paint;

+        PaintStyle ps = getLinePaint();

+        if (ps == null || ps == TRANSPARENT_PAINT) return null;

+        if (ps instanceof SolidPaint) {

+            return ((SolidPaint)ps).getSolidColor().getColor();

         }

         return null;

     }

 

+    protected PaintStyle getLinePaint() {

+        PropertyFetcher<PaintStyle> fetcher = new PropertyFetcher<PaintStyle>() {

+            public boolean fetch(XSLFShape shape) {

+                CTLineProperties spPr = shape.getSpPr().getLn();

+                if (spPr != null) {

+                    if (spPr.isSetNoFill()) {

+                        setValue(TRANSPARENT_PAINT); // use it as 'nofill' value

+                        return true;

+                    }

+                    PaintStyle paint = getPaint(spPr, null);

+                    if (paint != null) {

+                        setValue(paint);

+                        return true;

+                    }

+                }

+                return false;

+

+            }

+        };

+        fetchShapeProperty(fetcher);

+

+        PaintStyle paint = fetcher.getValue();

+        if (paint != null) return paint;

+        

+        // line color was not found, check if it is defined in the theme

+        CTShapeStyle style = getSpStyle();

+        if (style == null) return TRANSPARENT_PAINT;

+        

+        // get a reference to a line style within the style matrix.

+        CTStyleMatrixReference lnRef = style.getLnRef();

+        int idx = (int)lnRef.getIdx();

+        CTSchemeColor phClr = lnRef.getSchemeClr();

+        if(idx > 0){

+            XSLFTheme theme = getSheet().getTheme();

+            XmlObject lnProps = theme.getXmlObject().

+                    getThemeElements().getFmtScheme().getLnStyleLst().selectPath("*")[idx - 1];

+            paint = getPaint(lnProps, phClr);

+        }

+

+        return paint == null ? TRANSPARENT_PAINT : paint;

+    }

+    

     /**

      *

      * @param width line width in points. <code>0</code> means no line

@@ -309,12 +282,11 @@
     }

 

     /**

-     *

      * @return line width in points. <code>0</code> means no line.

      */

     public double getLineWidth() {

         PropertyFetcher<Double> fetcher = new PropertyFetcher<Double>() {

-            public boolean fetch(XSLFSimpleShape shape) {

+            public boolean fetch(XSLFShape shape) {

                 CTShapeProperties spPr = shape.getSpPr();

                 CTLineProperties ln = spPr.getLn();

                 if (ln != null) {

@@ -347,6 +319,54 @@
     }

 

     /**

+     * @return the line compound

+     */

+    public LineCompound getLineCompound() {

+        PropertyFetcher<Integer> fetcher = new PropertyFetcher<Integer>() {

+            public boolean fetch(XSLFShape shape) {

+                CTShapeProperties spPr = shape.getSpPr();

+                CTLineProperties ln = spPr.getLn();

+                if (ln != null) {

+                    STCompoundLine.Enum stCmpd = ln.getCmpd();

+                    if (stCmpd != null) {

+                        setValue(stCmpd.intValue());

+                        return true;

+                    }

+                }

+                return false;

+            }

+        };

+        fetchShapeProperty(fetcher);

+

+        Integer cmpd = fetcher.getValue();

+        if (cmpd == null) {

+            CTLineProperties defaultLn = getDefaultLineProperties();

+            if (defaultLn != null) {

+                STCompoundLine.Enum stCmpd = defaultLn.getCmpd();

+                if (stCmpd != null) {

+                    cmpd = stCmpd.intValue();

+                }

+            }

+        }

+        

+        if (cmpd == null) return null;

+

+        switch (cmpd) {

+        default:

+        case STCompoundLine.INT_SNG:

+            return LineCompound.SINGLE;

+        case STCompoundLine.INT_DBL:

+            return LineCompound.DOUBLE;

+        case STCompoundLine.INT_THICK_THIN:

+            return LineCompound.THICK_THIN;

+        case STCompoundLine.INT_THIN_THICK:

+            return LineCompound.THIN_THICK;

+        case STCompoundLine.INT_TRI:

+            return LineCompound.TRIPLE;

+        }

+    }

+

+    /**

      *

      * @param dash a preset line dashing scheme to stroke thr shape outline

      */

@@ -358,7 +378,7 @@
         } else {

             CTPresetLineDashProperties val = CTPresetLineDashProperties.Factory

                     .newInstance();

-            val.setVal(STPresetLineDashVal.Enum.forInt(dash.ordinal() + 1));

+            val.setVal(STPresetLineDashVal.Enum.forInt(dash.ooxmlId));

             CTLineProperties ln = spPr.isSetLn() ? spPr.getLn() : spPr

                     .addNewLn();

             ln.setPrstDash(val);

@@ -371,13 +391,13 @@
     public LineDash getLineDash() {

 

         PropertyFetcher<LineDash> fetcher = new PropertyFetcher<LineDash>() {

-            public boolean fetch(XSLFSimpleShape shape) {

+            public boolean fetch(XSLFShape shape) {

                 CTShapeProperties spPr = shape.getSpPr();

                 CTLineProperties ln = spPr.getLn();

                 if (ln != null) {

                     CTPresetLineDashProperties ctDash = ln.getPrstDash();

                     if (ctDash != null) {

-                        setValue(LineDash.values()[ctDash.getVal().intValue() - 1]);

+                        setValue(LineDash.fromOoxmlId(ctDash.getVal().intValue()));

                         return true;

                     }

                 }

@@ -392,7 +412,7 @@
             if (defaultLn != null) {

                 CTPresetLineDashProperties ctDash = defaultLn.getPrstDash();

                 if (ctDash != null) {

-                    dash = LineDash.values()[ctDash.getVal().intValue() - 1];

+                    dash = LineDash.fromOoxmlId(ctDash.getVal().intValue());

                 }

             }

         }

@@ -411,7 +431,7 @@
         } else {

             CTLineProperties ln = spPr.isSetLn() ? spPr.getLn() : spPr

                     .addNewLn();

-            ln.setCap(STLineCap.Enum.forInt(cap.ordinal() + 1));

+            ln.setCap(STLineCap.Enum.forInt(cap.ooxmlId));

         }

     }

 

@@ -421,13 +441,13 @@
      */

     public LineCap getLineCap() {

         PropertyFetcher<LineCap> fetcher = new PropertyFetcher<LineCap>() {

-            public boolean fetch(XSLFSimpleShape shape) {

+            public boolean fetch(XSLFShape shape) {

                 CTShapeProperties spPr = shape.getSpPr();

                 CTLineProperties ln = spPr.getLn();

                 if (ln != null) {

                     STLineCap.Enum stCap = ln.getCap();

                     if (stCap != null) {

-                        setValue(LineCap.values()[stCap.intValue() - 1]);

+                        setValue(LineCap.fromOoxmlId(stCap.intValue()));

                         return true;

                     }

                 }

@@ -442,7 +462,7 @@
             if (defaultLn != null) {

                 STLineCap.Enum stCap = defaultLn.getCap();

                 if (stCap != null) {

-                    cap = LineCap.values()[stCap.intValue() - 1];

+                    cap = LineCap.fromOoxmlId(stCap.intValue());

                 }

             }

         }

@@ -486,10 +506,10 @@
      * is not solid (pattern or gradient)

      */

     public Color getFillColor() {

-        RenderableShape rShape = new RenderableShape(this);

-        Paint paint = rShape.getFillPaint(null);

-        if (paint instanceof Color) {

-            return (Color) paint;

+        PaintStyle ps = getFillPaint();

+        if (ps == null || ps == TRANSPARENT_PAINT) return null;

+        if (ps instanceof SolidPaint) {

+            return ((SolidPaint)ps).getSolidColor().getColor();

         }

         return null;

     }

@@ -499,7 +519,7 @@
      */

     public XSLFShadow getShadow() {

         PropertyFetcher<CTOuterShadowEffect> fetcher = new PropertyFetcher<CTOuterShadowEffect>() {

-            public boolean fetch(XSLFSimpleShape shape) {

+            public boolean fetch(XSLFShape shape) {

                 CTShapeProperties spPr = shape.getSpPr();

                 if (spPr.isSetEffectLst()) {

                     CTOuterShadowEffect obj = spPr.getEffectLst().getOuterShdw();

@@ -519,7 +539,7 @@
                 // 1-based index of a shadow style within the style matrix

                 int idx = (int) style.getEffectRef().getIdx();

                 if(idx != 0) {

-                    CTStyleMatrix styleMatrix = _sheet.getTheme().getXmlObject().getThemeElements().getFmtScheme();

+                    CTStyleMatrix styleMatrix = getSheet().getTheme().getXmlObject().getThemeElements().getFmtScheme();

                     CTEffectStyleItem ef = styleMatrix.getEffectStyleLst().getEffectStyleArray(idx - 1);

                     obj = ef.getEffectLst().getOuterShdw();

                 }

@@ -528,90 +548,11 @@
         return (obj == null || obj == NO_SHADOW) ? null : new XSLFShadow(obj, this);

     }

 

-    @Override

-    public void draw(Graphics2D graphics) {

-        RenderableShape rShape = new RenderableShape(this);

-        rShape.render(graphics);

-

-        // draw line decorations

-        Color lineColor = getLineColor();

-        if(lineColor != null) {

-            graphics.setPaint(lineColor);

-            for(Outline o : getDecorationOutlines(graphics)){

-                if(o.getPath().isFilled()){

-                    graphics.fill(o.getOutline());

-                }

-                if(o.getPath().isStroked()){

-                    graphics.draw(o.getOutline());

-                }

-            }

-        }

-    }

-

-

-    /**

-     * Walk up the inheritance tree and fetch shape properties.

-     *

-     * The following order of inheritance is assumed:

-     * <p>

-     * slide <-- slideLayout <-- slideMaster

-     * </p>

-     *

-     * @param visitor the object that collects the desired property

-     * @return true if the property was fetched

-     */

-    boolean fetchShapeProperty(PropertyFetcher visitor) {

-        boolean ok = visitor.fetch(this);

-

-        XSLFSimpleShape masterShape;

-        XSLFSheet masterSheet = getSheet().getMasterSheet();

-        CTPlaceholder ph = getCTPlaceholder();

-

-        if (masterSheet != null && ph != null) {

-            if (!ok) {

-                masterShape = masterSheet.getPlaceholder(ph);

-                if (masterShape != null) {

-                    ok = visitor.fetch(masterShape);

-                }

-            }

-

-            // try slide master

-            if (!ok ) {

-                int textType;

-                if ( !ph.isSetType()) textType = STPlaceholderType.INT_BODY;

-                else {

-                    switch (ph.getType().intValue()) {

-                        case STPlaceholderType.INT_TITLE:

-                        case STPlaceholderType.INT_CTR_TITLE:

-                            textType = STPlaceholderType.INT_TITLE;

-                            break;

-                        case STPlaceholderType.INT_FTR:

-                        case STPlaceholderType.INT_SLD_NUM:

-                        case STPlaceholderType.INT_DT:

-                            textType = ph.getType().intValue();

-                            break;

-                        default:

-                            textType = STPlaceholderType.INT_BODY;

-                            break;

-                    }

-                }

-                XSLFSheet master = masterSheet.getMasterSheet();

-                if (master != null) {

-                    masterShape = master.getPlaceholderByType(textType);

-                    if (masterShape != null) {

-                        ok = visitor.fetch(masterShape);

-                    }

-                }

-            }

-        }

-        return ok;

-    }

-

     /**

      *

      * @return definition of the shape geometry

      */

-    CustomGeometry getGeometry(){

+    public CustomGeometry getGeometry(){

         CTShapeProperties spPr = getSpPr();

         CustomGeometry geom;

         PresetGeometries dict = PresetGeometries.getInstance();

@@ -622,23 +563,16 @@
                 throw new IllegalStateException("Unknown shape geometry: " + name);

             }

         } else if (spPr.isSetCustGeom()){

-            geom = new CustomGeometry(spPr.getCustGeom());

+            XMLStreamReader staxReader = spPr.getCustGeom().newXMLStreamReader();

+            geom = PresetGeometries.convertCustomGeometry(staxReader);

+            try { staxReader.close(); }

+            catch (XMLStreamException e) {}

         } else {

             geom = dict.get("rect");

         }

         return geom;

     }

-

-

-    /**

-     * draw any content within this shape (image, text, etc.).

-     *

-     * @param graphics the graphics to draw into

-     */

-    public void drawContent(Graphics2D graphics){

-

-    }

-

+    

     @Override

     void copy(XSLFShape sh){

         super.copy(sh);

@@ -688,259 +622,213 @@
     /**

      * Specifies the line end decoration, such as a triangle or arrowhead.

      */

-    public void setLineHeadDecoration(LineDecoration style) {

+    public void setLineHeadDecoration(DecorationShape style) {

         CTLineProperties ln = getSpPr().getLn();

         CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();

         if (style == null) {

             if (lnEnd.isSetType()) lnEnd.unsetType();

         } else {

-            lnEnd.setType(STLineEndType.Enum.forInt(style.ordinal() + 1));

+            lnEnd.setType(STLineEndType.Enum.forInt(style.ooxmlId));

         }

     }

 

-    public LineDecoration getLineHeadDecoration() {

+    public DecorationShape getLineHeadDecoration() {

         CTLineProperties ln = getSpPr().getLn();

-        if (ln == null || !ln.isSetHeadEnd()) return LineDecoration.NONE;

+        if (ln == null || !ln.isSetHeadEnd()) return DecorationShape.NONE;

 

         STLineEndType.Enum end = ln.getHeadEnd().getType();

-        return end == null ? LineDecoration.NONE : LineDecoration.values()[end.intValue() - 1];

+        return end == null ? DecorationShape.NONE : DecorationShape.fromOoxmlId(end.intValue());

     }

 

     /**

      * specifies decorations which can be added to the head of a line.

      */

-    public void setLineHeadWidth(LineEndWidth style) {

+    public void setLineHeadWidth(DecorationSize style) {

         CTLineProperties ln = getSpPr().getLn();

         CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();

         if (style == null) {

             if (lnEnd.isSetW()) lnEnd.unsetW();

         } else {

-            lnEnd.setW(STLineEndWidth.Enum.forInt(style.ordinal() + 1));

+            lnEnd.setW(STLineEndWidth.Enum.forInt(style.ooxmlId));

         }

     }

 

-    public LineEndWidth getLineHeadWidth() {

+    public DecorationSize getLineHeadWidth() {

         CTLineProperties ln = getSpPr().getLn();

-        if (ln == null || !ln.isSetHeadEnd()) return LineEndWidth.MEDIUM;

+        if (ln == null || !ln.isSetHeadEnd()) return DecorationSize.MEDIUM;

 

         STLineEndWidth.Enum w = ln.getHeadEnd().getW();

-        return w == null ? LineEndWidth.MEDIUM : LineEndWidth.values()[w.intValue() - 1];

+        return w == null ? DecorationSize.MEDIUM : DecorationSize.fromOoxmlId(w.intValue());

     }

 

     /**

      * Specifies the line end width in relation to the line width.

      */

-    public void setLineHeadLength(LineEndLength style) {

+    public void setLineHeadLength(DecorationSize style) {

         CTLineProperties ln = getSpPr().getLn();

         CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();

 

         if (style == null) {

             if (lnEnd.isSetLen()) lnEnd.unsetLen();

         } else {

-            lnEnd.setLen(STLineEndLength.Enum.forInt(style.ordinal() + 1));

+            lnEnd.setLen(STLineEndLength.Enum.forInt(style.ooxmlId));

         }

     }

 

-    public LineEndLength getLineHeadLength() {

+    public DecorationSize getLineHeadLength() {

         CTLineProperties ln = getSpPr().getLn();

-        if (ln == null || !ln.isSetHeadEnd()) return LineEndLength.MEDIUM;

+        if (ln == null || !ln.isSetHeadEnd()) return DecorationSize.MEDIUM;

 

         STLineEndLength.Enum len = ln.getHeadEnd().getLen();

-        return len == null ? LineEndLength.MEDIUM : LineEndLength.values()[len.intValue() - 1];

+        return len == null ? DecorationSize.MEDIUM : DecorationSize.fromOoxmlId(len.intValue());

     }

 

     /**

      * Specifies the line end decoration, such as a triangle or arrowhead.

      */

-    public void setLineTailDecoration(LineDecoration style) {

+    public void setLineTailDecoration(DecorationShape style) {

         CTLineProperties ln = getSpPr().getLn();

         CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();

         if (style == null) {

             if (lnEnd.isSetType()) lnEnd.unsetType();

         } else {

-            lnEnd.setType(STLineEndType.Enum.forInt(style.ordinal() + 1));

+            lnEnd.setType(STLineEndType.Enum.forInt(style.ooxmlId));

         }

     }

 

-    public LineDecoration getLineTailDecoration() {

+    public DecorationShape getLineTailDecoration() {

         CTLineProperties ln = getSpPr().getLn();

-        if (ln == null || !ln.isSetTailEnd()) return LineDecoration.NONE;

+        if (ln == null || !ln.isSetTailEnd()) return DecorationShape.NONE;

 

         STLineEndType.Enum end = ln.getTailEnd().getType();

-        return end == null ? LineDecoration.NONE : LineDecoration.values()[end.intValue() - 1];

+        return end == null ? DecorationShape.NONE : DecorationShape.fromOoxmlId(end.intValue());

     }

 

     /**

      * specifies decorations which can be added to the tail of a line.

      */

-    public void setLineTailWidth(LineEndWidth style) {

+    public void setLineTailWidth(DecorationSize style) {

         CTLineProperties ln = getSpPr().getLn();

         CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();

         if (style == null) {

             if (lnEnd.isSetW()) lnEnd.unsetW();

         } else {

-            lnEnd.setW(STLineEndWidth.Enum.forInt(style.ordinal() + 1));

+            lnEnd.setW(STLineEndWidth.Enum.forInt(style.ooxmlId));

         }

     }

 

-    public LineEndWidth getLineTailWidth() {

+    public DecorationSize getLineTailWidth() {

         CTLineProperties ln = getSpPr().getLn();

-        if (ln == null || !ln.isSetTailEnd()) return LineEndWidth.MEDIUM;

+        if (ln == null || !ln.isSetTailEnd()) return DecorationSize.MEDIUM;

 

         STLineEndWidth.Enum w = ln.getTailEnd().getW();

-        return w == null ? LineEndWidth.MEDIUM : LineEndWidth.values()[w.intValue() - 1];

+        return w == null ? DecorationSize.MEDIUM : DecorationSize.fromOoxmlId(w.intValue());

     }

 

     /**

      * Specifies the line end width in relation to the line width.

      */

-    public void setLineTailLength(LineEndLength style) {

+    public void setLineTailLength(DecorationSize style) {

         CTLineProperties ln = getSpPr().getLn();

         CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();

 

         if (style == null) {

             if (lnEnd.isSetLen()) lnEnd.unsetLen();

         } else {

-            lnEnd.setLen(STLineEndLength.Enum.forInt(style.ordinal() + 1));

+            lnEnd.setLen(STLineEndLength.Enum.forInt(style.ooxmlId));

         }

     }

 

-    public LineEndLength getLineTailLength() {

+    public DecorationSize getLineTailLength() {

         CTLineProperties ln = getSpPr().getLn();

-        if (ln == null || !ln.isSetTailEnd()) return LineEndLength.MEDIUM;

+        if (ln == null || !ln.isSetTailEnd()) return DecorationSize.MEDIUM;

 

         STLineEndLength.Enum len = ln.getTailEnd().getLen();

-        return len == null ? LineEndLength.MEDIUM : LineEndLength.values()[len.intValue() - 1];

+        return len == null ? DecorationSize.MEDIUM : DecorationSize.fromOoxmlId(len.intValue());

     }

 

-    Outline getTailDecoration(Graphics2D graphics) {

-        LineEndLength tailLength = getLineTailLength();

-        LineEndWidth tailWidth = getLineTailWidth();

-

-        double lineWidth = Math.max(2.5, getLineWidth());

-

-        Rectangle2D anchor = new RenderableShape(this).getAnchor(graphics);

-        double x2 = anchor.getX() + anchor.getWidth(),

-                y2 = anchor.getY() + anchor.getHeight();

-

-        double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());

-

-        AffineTransform at = new AffineTransform();

-        Shape shape = null;

-        Path p = null;

-        Rectangle2D bounds;

-        double scaleY = Math.pow(2, tailWidth.ordinal());

-        double scaleX = Math.pow(2, tailLength.ordinal());

-        switch (getLineTailDecoration()) {

-            case OVAL:

-                p = new Path();

-                shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY);

-                bounds = shape.getBounds2D();

-                at.translate(x2 - bounds.getWidth() / 2, y2 - bounds.getHeight() / 2);

-                at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2);

-                break;

-            case ARROW:

-                p = new Path();

-                GeneralPath arrow = new GeneralPath();

-                arrow.moveTo((float) (-lineWidth * 3), (float) (-lineWidth * 2));

-                arrow.lineTo(0, 0);

-                arrow.lineTo((float) (-lineWidth * 3), (float) (lineWidth * 2));

-                shape = arrow;

-                at.translate(x2, y2);

-                at.rotate(alpha);

-                break;

-            case TRIANGLE:

-                p = new Path();

-                scaleY = tailWidth.ordinal() + 1;

-                scaleX = tailLength.ordinal() + 1;

-                GeneralPath triangle = new GeneralPath();

-                triangle.moveTo((float) (-lineWidth * scaleX), (float) (-lineWidth * scaleY / 2));

-                triangle.lineTo(0, 0);

-                triangle.lineTo((float) (-lineWidth * scaleX), (float) (lineWidth * scaleY / 2));

-                triangle.closePath();

-                shape = triangle;

-                at.translate(x2, y2);

-                at.rotate(alpha);

-                break;

-            default:

-                break;

-        }

-

-        if (shape != null) {

-            shape = at.createTransformedShape(shape);

-        }

-        return shape == null ? null : new Outline(shape, p);

+    public boolean isPlaceholder() {

+        CTPlaceholder ph = getCTPlaceholder();

+        return ph != null;

     }

 

-    Outline getHeadDecoration(Graphics2D graphics) {

-        LineEndLength headLength = getLineHeadLength();

-        LineEndWidth headWidth = getLineHeadWidth();

-

-        double lineWidth = Math.max(2.5, getLineWidth());

-

-        Rectangle2D anchor = new RenderableShape(this).getAnchor(graphics);

-        double x1 = anchor.getX(),

-                y1 = anchor.getY();

-

-        double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());

-

-        AffineTransform at = new AffineTransform();

-        Shape shape = null;

-        Path p = null;

-        Rectangle2D bounds;

-        double scaleY = 1;

-        double scaleX = 1;

-        switch (getLineHeadDecoration()) {

-            case OVAL:

-                p = new Path();

-                shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY);

-                bounds = shape.getBounds2D();

-                at.translate(x1 - bounds.getWidth() / 2, y1 - bounds.getHeight() / 2);

-                at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2);

-                break;

-            case STEALTH:

-            case ARROW:

-                p = new Path(false, true);

-                GeneralPath arrow = new GeneralPath();

-                arrow.moveTo((float) (lineWidth * 3 * scaleX), (float) (-lineWidth * scaleY * 2));

-                arrow.lineTo(0, 0);

-                arrow.lineTo((float) (lineWidth * 3 * scaleX), (float) (lineWidth * scaleY * 2));

-                shape = arrow;

-                at.translate(x1, y1);

-                at.rotate(alpha);

-                break;

-            case TRIANGLE:

-                p = new Path();

-                scaleY = headWidth.ordinal() + 1;

-                scaleX = headLength.ordinal() + 1;

-                GeneralPath triangle = new GeneralPath();

-                triangle.moveTo((float) (lineWidth * scaleX), (float) (-lineWidth * scaleY / 2));

-                triangle.lineTo(0, 0);

-                triangle.lineTo((float) (lineWidth * scaleX), (float) (lineWidth * scaleY / 2));

-                triangle.closePath();

-                shape = triangle;

-                at.translate(x1, y1);

-                at.rotate(alpha);

-                break;

-            default:

-                break;

+    @SuppressWarnings("deprecation")

+    public Guide getAdjustValue(String name) {

+        CTPresetGeometry2D prst = getSpPr().getPrstGeom();

+        if (prst.isSetAvLst()) {

+            for (CTGeomGuide g : prst.getAvLst().getGdArray()) {

+                if (g.getName().equals(name)) {

+                    return new Guide(g.getName(), g.getFmla());

+                }

+            }

         }

 

-        if (shape != null) {

-            shape = at.createTransformedShape(shape);

-        }

-        return shape == null ? null : new Outline(shape, p);

+        return null;

     }

 

-    private List<Outline> getDecorationOutlines(Graphics2D graphics){

-        List<Outline> lst = new ArrayList<Outline>();

+    public LineDecoration getLineDecoration() {

+        return new LineDecoration() {

+            public DecorationShape getHeadShape() {

+                return getLineHeadDecoration();

+            }

 

-        Outline head = getHeadDecoration(graphics);

-        if(head != null) lst.add(head);

+            public DecorationSize getHeadWidth() {

+                return getLineHeadWidth();

+            }

 

-        Outline tail = getTailDecoration(graphics);

-        if(tail != null) lst.add(tail);

-        return lst;

+            public DecorationSize getHeadLength() {

+                return getLineHeadLength();

+            }

+

+            public DecorationShape getTailShape() {

+                return getLineTailDecoration();

+            }

+

+            public DecorationSize getTailWidth() {

+                return getLineTailWidth();

+            }

+

+            public DecorationSize getTailLength() {

+                return getLineTailLength();

+            }

+        };

     }

 

+    /**

+     * fetch shape fill as a java.awt.Paint

+     *

+     * @return either Color or GradientPaint or TexturePaint or null

+     */

+    public FillStyle getFillStyle() {

+        return new FillStyle() {

+            public PaintStyle getPaint() {

+                return XSLFSimpleShape.this.getFillPaint();

+            }

+        };

+    }

+

+    public StrokeStyle getStrokeStyle() {

+        return new StrokeStyle() {

+            public PaintStyle getPaint() {

+                return XSLFSimpleShape.this.getLinePaint();

+            }

+

+            public LineCap getLineCap() {

+                return XSLFSimpleShape.this.getLineCap();

+            }

+

+            public LineDash getLineDash() {

+                return XSLFSimpleShape.this.getLineDash();

+            }

+

+            public double getLineWidth() {

+                return XSLFSimpleShape.this.getLineWidth();

+            }

+

+            public LineCompound getLineCompound() {

+                return XSLFSimpleShape.this.getLineCompound();

+            }

+            

+        };

+    }

 }

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
index f2d4b6e..abab57b 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
@@ -16,29 +16,22 @@
 ==================================================================== */
 package org.apache.poi.xslf.usermodel;
 
-import org.apache.poi.POIXMLDocumentPart;
-import org.apache.poi.openxml4j.opc.PackagePart;
-import org.apache.poi.openxml4j.opc.PackageRelationship;
-import org.apache.poi.util.Beta;
-import org.apache.xmlbeans.XmlException;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;
-import org.openxmlformats.schemas.presentationml.x2006.main.SldDocument;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
-
 import java.awt.Graphics2D;
 import java.io.IOException;
 
+import org.apache.poi.POIXMLDocumentPart;
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.sl.draw.DrawFactory;
+import org.apache.poi.sl.draw.Drawable;
+import org.apache.poi.sl.usermodel.Slide;
+import org.apache.poi.util.Beta;
+import org.apache.xmlbeans.XmlException;
+import org.openxmlformats.schemas.drawingml.x2006.main.*;
+import org.openxmlformats.schemas.presentationml.x2006.main.*;
+
 @Beta
-public final class XSLFSlide extends XSLFSheet {
+public final class XSLFSlide extends XSLFSheet implements Slide<XSLFShape, XMLSlideShow, XSLFNotes> {
    private final CTSlide _slide;
    private XSLFSlideLayout _layout;
    private XSLFComments _comments;
@@ -111,7 +104,6 @@
         return "sld";        
     }
 
-    @Override
     public XSLFSlideLayout getMasterSheet(){
         return getSlideLayout();
     }
@@ -211,15 +203,13 @@
     }
 
 
-    @Override
-    public void draw(Graphics2D graphics){
-
-        XSLFBackground bg = getBackground();
-        if(bg != null) bg.draw(graphics);
-
-        super.draw(graphics);
+    public boolean getFollowMasterObjects() {
+        return getFollowMasterGraphics();
     }
-
+    
+    public void setFollowMasterObjects(boolean follow) {
+        setFollowMasterGraphics(follow);
+    }
 
     @Override
     public XSLFSlide importContent(XSLFSheet src){
@@ -239,4 +229,44 @@
         return this;
     }
 
+    public boolean getFollowMasterBackground() {
+        return false;
+    }
+    
+    public void setFollowMasterBackground(boolean follow) {
+        // not implemented ... also not in the specs
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean getFollowMasterColourScheme() {
+        return false;
+    }
+    
+    public void setFollowMasterColourScheme(boolean follow) {
+        // not implemented ... only for OLE objects in the specs
+        throw new UnsupportedOperationException();
+    }
+
+    public void setNotes(XSLFNotes notes) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public int getSlideNumber() {
+        int idx = getSlideShow().getSlides().indexOf(this);
+        return (idx == -1) ? idx : idx+1;
+    }
+
+    /**
+     * Render this sheet into the supplied graphics object
+     *
+     * @param graphics
+     */
+    @Override
+    public void draw(Graphics2D graphics){
+        DrawFactory drawFact = DrawFactory.getInstance(graphics);
+        Drawable draw = drawFact.getDrawable(this);
+        draw.draw(graphics);
+    }
 }
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java
index f8cd23c..65487bd 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java
@@ -19,6 +19,7 @@
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.sl.usermodel.MasterSheet;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Internal;
 import org.apache.xmlbeans.XmlException;
@@ -30,7 +31,7 @@
 import java.io.IOException;
 
 @Beta
-public class XSLFSlideLayout extends XSLFSheet {
+public class XSLFSlideLayout extends XSLFSheet implements MasterSheet<XSLFShape, XMLSlideShow> {
     private CTSlideLayout _layout;
     private XSLFSlideMaster _master;
 
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java
index d4383c4..830a531 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java
@@ -19,6 +19,7 @@
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.sl.usermodel.MasterSheet;
 import org.apache.poi.util.Beta;
 import org.apache.xmlbeans.XmlException;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping;
@@ -53,7 +54,7 @@
  * @author Yegor Kozlov
 */
 @Beta
- public class XSLFSlideMaster extends XSLFSheet {
+ public class XSLFSlideMaster extends XSLFSheet implements MasterSheet<XSLFShape, XMLSlideShow> {
 	private CTSlideMaster _slide;
     private Map<String, XSLFSlideLayout> _layouts;
     private XSLFTheme _theme;
@@ -82,7 +83,7 @@
     }
 
     @Override
-    public XSLFSheet getMasterSheet() {
+    public MasterSheet<XSLFShape, XMLSlideShow> getMasterSheet() {
         return null;
     }
 
@@ -177,5 +178,4 @@
             return null;
         }
     }
-
 }
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
index a6ec8bc..9f2bb49 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
@@ -27,6 +27,7 @@
 import javax.xml.namespace.QName;

 

 import org.apache.poi.POIXMLException;

+import org.apache.poi.sl.usermodel.TableShape;

 import org.apache.poi.util.Internal;

 import org.apache.poi.util.Units;

 import org.apache.xmlbeans.XmlCursor;

@@ -45,7 +46,7 @@
  *

  * @author Yegor Kozlov

  */

-public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow> {

+public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow>, TableShape {

     static String TABLE_URI = "http://schemas.openxmlformats.org/drawingml/2006/table";

 

     private CTTable _table;

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java
index a3671ab..9381152 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java
@@ -21,43 +21,24 @@
 

 import java.awt.Color;

 

+import org.apache.poi.sl.usermodel.VerticalAlignment;

 import org.apache.poi.util.Units;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCellProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;

-import org.openxmlformats.schemas.drawingml.x2006.main.STCompoundLine;

-import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap;

-import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength;

-import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndType;

-import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndWidth;

-import org.openxmlformats.schemas.drawingml.x2006.main.STPenAlignment;

-import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal;

-import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

 

 /**

  * Represents a cell of a table in a .pptx presentation

- *

- * @author Yegor Kozlov

  */

 public class XSLFTableCell extends XSLFTextShape {

     static double defaultBorderWidth = 1.0;

+    private CTTableCellProperties _tcPr = null;

 

     /*package*/ XSLFTableCell(CTTableCell cell, XSLFSheet sheet){

         super(cell, sheet);

     }

 

     @Override

-    public CTTableCell getXmlObject(){

-        return (CTTableCell)super.getXmlObject();

-    }

-

-    @Override

     protected CTTextBody getTextBody(boolean create){

-        CTTableCell cell = getXmlObject();

+        CTTableCell cell = (CTTableCell)getXmlObject();

         CTTextBody txBody = cell.getTxBody();

         if (txBody == null && create) {

             txBody = cell.addNewTxBody();

@@ -77,135 +58,72 @@
         return cell;

     }

 

+    protected CTTableCellProperties getCellProperties(boolean create) {

+        if (_tcPr == null) {

+            CTTableCell cell = (CTTableCell)getXmlObject();

+            _tcPr = cell.getTcPr();

+            if (_tcPr == null && create) {

+                _tcPr = cell.addNewTcPr();

+            }

+        }

+        return _tcPr;

+    }

+    

     @Override

     public void setLeftInset(double margin){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-        if(pr == null) pr = getXmlObject().addNewTcPr();

-

+        CTTableCellProperties pr = getCellProperties(true);

         pr.setMarL(Units.toEMU(margin));

     }

 

     @Override

     public void setRightInset(double margin){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-        if(pr == null) pr = getXmlObject().addNewTcPr();

-

+        CTTableCellProperties pr = getCellProperties(true);

         pr.setMarR(Units.toEMU(margin));

     }

 

     @Override

     public void setTopInset(double margin){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-        if(pr == null) pr = getXmlObject().addNewTcPr();

-

+        CTTableCellProperties pr = getCellProperties(true);

         pr.setMarT(Units.toEMU(margin));

     }

 

     @Override

     public void setBottomInset(double margin){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-        if(pr == null) pr = getXmlObject().addNewTcPr();

-

+        CTTableCellProperties pr = getCellProperties(true);

         pr.setMarB(Units.toEMU(margin));

     }

 

-    public void setBorderLeft(double width){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-

-        CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL();

+    private CTLineProperties getCTLine(char bltr, boolean create) {

+        CTTableCellProperties pr = getCellProperties(create);

+        if (pr == null) return null;

+        

+        switch (bltr) {

+            case 'b':

+                return (pr.isSetLnB()) ? pr.getLnB() : (create ? pr.addNewLnB() : null);

+            case 'l':

+                return (pr.isSetLnL()) ? pr.getLnL() : (create ? pr.addNewLnL() : null);

+            case 't':

+                return (pr.isSetLnT()) ? pr.getLnT() : (create ? pr.addNewLnT() : null);

+            case 'r':

+                return (pr.isSetLnR()) ? pr.getLnR() : (create ? pr.addNewLnR() : null);

+            default:

+                return null;

+        }

+    }

+    

+    private void setBorderWidth(char bltr, double width) {

+        CTLineProperties ln = getCTLine(bltr, true);

         ln.setW(Units.toEMU(width));

     }

 

-    public double getBorderLeft(){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-

-        CTLineProperties ln = pr.getLnL();

-        return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());

+    private double getBorderWidth(char bltr) {

+        CTLineProperties ln = getCTLine(bltr, false);

+        return (ln == null || !ln.isSetW()) ? defaultBorderWidth : Units.toPoints(ln.getW());

     }

 

-    public void setBorderLeftColor(Color color){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-        CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL();

-        setLineColor(ln, color);

-    }

+    private void setBorderColor(char bltr, Color color) {

+        CTLineProperties ln = getCTLine(bltr, true);

 

-    public Color getBorderLeftColor(){

-        return getLineColor(getXmlObject().getTcPr().getLnL());

-    }

-

-    public void setBorderRight(double width){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-

-        CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR();

-        ln.setW(Units.toEMU(width));

-    }

-

-    public double getBorderRight(){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-

-        CTLineProperties ln = pr.getLnR();

-        return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());

-    }

-

-    public void setBorderRightColor(Color color){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-        CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR();

-        setLineColor(ln, color);

-    }

-

-    public Color getBorderRightColor(){

-        return getLineColor(getXmlObject().getTcPr().getLnR());

-    }

-

-    public void setBorderTop(double width){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-

-        CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT();

-        ln.setW(Units.toEMU(width));

-    }

-

-    public double getBorderTop(){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-

-        CTLineProperties ln = pr.getLnT();

-        return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());

-    }

-

-    public void setBorderTopColor(Color color){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-        CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT();

-        setLineColor(ln, color);

-    }

-

-    public Color getBorderTopColor(){

-        return getLineColor(getXmlObject().getTcPr().getLnT());

-    }

-

-    public void setBorderBottom(double width){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-

-        CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB();

-        ln.setW(Units.toEMU(width));

-    }

-

-    public double getBorderBottom(){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-

-        CTLineProperties ln = pr.getLnB();

-        return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());

-    }

-

-    public void setBorderBottomColor(Color color){

-        CTTableCellProperties pr = getXmlObject().getTcPr();

-        CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB();

-        setLineColor(ln, color);

-    }

-

-    public Color getBorderBottomColor(){

-        return getLineColor(getXmlObject().getTcPr().getLnB());

-    }

-

-    private void setLineColor(CTLineProperties ln, Color color){

         if(color == null){

             ln.addNewNoFill();

             if(ln.isSetSolidFill()) ln.unsetSolidFill();

@@ -232,19 +150,85 @@
             rgb.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()});

             ln.addNewSolidFill().setSrgbClr(rgb);

         }

-    }

-

-    private Color getLineColor(CTLineProperties ln){

-        if(ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null;

+    }    

+    

+    private Color getBorderColor(char bltr) {

+        CTLineProperties ln = getCTLine(bltr,false);

+        if (ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null;

 

         CTSolidColorFillProperties fill = ln.getSolidFill();

-        if(!fill.isSetSrgbClr()) {

+        if (!fill.isSetSrgbClr()) {

             // TODO for now return null for all colors except explicit RGB

             return null;

         }

         byte[] val = fill.getSrgbClr().getVal();

         return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);

+    }    

+    

+    public void setBorderLeft(double width) {

+        setBorderWidth('l', width);

     }

+

+    public double getBorderLeft() {

+        return getBorderWidth('l');

+    }

+

+    public void setBorderLeftColor(Color color) {

+        setBorderColor('l', color);

+    }

+

+    public Color getBorderLeftColor() {

+        return getBorderColor('l');

+    }

+

+    public void setBorderRight(double width) {

+        setBorderWidth('r', width);

+    }

+

+    public double getBorderRight() {

+        return getBorderWidth('r');

+    }

+

+    public void setBorderRightColor(Color color) {

+        setBorderColor('r', color);

+    }

+

+    public Color getBorderRightColor() {

+        return getBorderColor('r');

+    }

+

+    public void setBorderTop(double width) {

+        setBorderWidth('t', width);

+    }

+

+    public double getBorderTop() {

+        return getBorderWidth('t');

+    }

+

+    public void setBorderTopColor(Color color) {

+        setBorderColor('t', color);

+    }

+

+    public Color getBorderTopColor() {

+        return getBorderColor('t');

+    }

+

+    public void setBorderBottom(double width) {

+        setBorderWidth('b', width);

+    }

+

+    public double getBorderBottom() {

+        return getBorderWidth('b');

+    }

+

+    public void setBorderBottomColor(Color color) {

+        setBorderColor('b', color);

+    }

+

+    public Color getBorderBottomColor(){

+        return getBorderColor('b');

+    }

+

     /**

      * Specifies a solid color fill. The shape is filled entirely with the specified color.

      *

@@ -253,7 +237,7 @@
      */

     @Override

     public void setFillColor(Color color) {

-        CTTableCellProperties spPr = getXmlObject().getTcPr();

+        CTTableCellProperties spPr = getCellProperties(true);

         if (color == null) {

             if(spPr.isSetSolidFill()) spPr.unsetSolidFill();

         }

@@ -273,11 +257,11 @@
      */

     @Override

     public Color getFillColor(){

-        CTTableCellProperties spPr = getXmlObject().getTcPr();

-        if(!spPr.isSetSolidFill() ) return null;

+        CTTableCellProperties spPr = getCellProperties(false);

+        if (spPr == null || !spPr.isSetSolidFill()) return null;

 

         CTSolidColorFillProperties fill = spPr.getSolidFill();

-        if(!fill.isSetSrgbClr()) {

+        if (!fill.isSetSrgbClr()) {

             // TODO for now return null for all colors except explicit RGB

             return null;

         }

@@ -286,38 +270,36 @@
     }

 

     void setGridSpan(int gridSpan_) {

-    	getXmlObject().setGridSpan(gridSpan_);

+        ((CTTableCell)getXmlObject()).setGridSpan(gridSpan_);

     }

 

     void setRowSpan(int rowSpan_) {

-    	getXmlObject().setRowSpan(rowSpan_);

+        ((CTTableCell)getXmlObject()).setRowSpan(rowSpan_);

     }

 

     void setHMerge(boolean merge_) {

-    	getXmlObject().setHMerge(merge_);

+        ((CTTableCell)getXmlObject()).setHMerge(merge_);

     }

 

     void setVMerge(boolean merge_) {

-    	getXmlObject().setVMerge(merge_);

+        ((CTTableCell)getXmlObject()).setVMerge(merge_);

     }

     

     @Override

     public void setVerticalAlignment(VerticalAlignment anchor){

-    	CTTableCellProperties cellProps = getXmlObject().getTcPr();

-    	if(cellProps != null) {

-    		if(anchor == null) {

-    			if(cellProps.isSetAnchor()) {

-    				cellProps.unsetAnchor();

-    			}

-    		} else {

-				cellProps.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1));

+    	CTTableCellProperties cellProps = getCellProperties(true);

+		if(anchor == null) {

+			if(cellProps.isSetAnchor()) {

+				cellProps.unsetAnchor();

 			}

-    	}

+		} else {

+			cellProps.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1));

+		}

     }

 

     @Override

     public VerticalAlignment getVerticalAlignment(){

-        CTTableCellProperties cellProps = getXmlObject().getTcPr();

+        CTTableCellProperties cellProps = getCellProperties(false);

 

         VerticalAlignment align = VerticalAlignment.TOP;

         if(cellProps != null && cellProps.isSetAnchor()) {

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
index 13d80ae..994a603 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
@@ -17,43 +17,15 @@
 package org.apache.poi.xslf.usermodel;

 

 import java.awt.Color;

-import java.awt.Graphics2D;

-import java.awt.font.LineBreakMeasurer;

-import java.awt.font.TextAttribute;

-import java.awt.font.TextLayout;

-import java.awt.geom.Rectangle2D;

-import java.text.AttributedCharacterIterator;

-import java.text.AttributedString;

-import java.util.ArrayList;

-import java.util.Iterator;

-import java.util.List;

-import java.util.Map;

+import java.util.*;

 

-import org.apache.poi.sl.usermodel.TextPainter;

-import org.apache.poi.util.Beta;

-import org.apache.poi.util.Internal;

-import org.apache.poi.util.Units;

+import org.apache.poi.sl.usermodel.AutoNumberingScheme;

+import org.apache.poi.sl.usermodel.TextParagraph;

+import org.apache.poi.util.*;

 import org.apache.poi.xslf.model.ParagraphPropertyFetcher;

+import org.apache.xmlbeans.XmlCursor;

 import org.apache.xmlbeans.XmlObject;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextAutonumberBullet;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePercent;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePoint;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharBullet;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNormalAutofit;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStop;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStopList;

-import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType;

-import org.openxmlformats.schemas.drawingml.x2006.main.STTextAutonumberScheme;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;

 import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;

 

@@ -65,16 +37,10 @@
  * @since POI-3.8

  */

 @Beta

-public class XSLFTextParagraph implements Iterable<XSLFTextRun>{

+public class XSLFTextParagraph implements TextParagraph<XSLFTextRun> {

     private final CTTextParagraph _p;

     private final List<XSLFTextRun> _runs;

     private final XSLFTextShape _shape;

-    private List<TextFragment> _lines;

-    private TextFragment _bullet;

-    /**

-     * the highest line in this paragraph. Used for line spacing.

-     */

-    private double _maxLineHeight;

 

     XSLFTextParagraph(CTTextParagraph p, XSLFTextShape shape){

         _p = p;

@@ -104,7 +70,7 @@
     public String getText(){

         StringBuilder out = new StringBuilder();

         for (XSLFTextRun r : _runs) {

-            out.append(r.getText());

+            out.append(r.getRawText());

         }

         return out.toString();

     }

@@ -122,7 +88,7 @@
         return _p;

     }

 

-    XSLFTextShape getParentShape() {

+    public XSLFTextShape getParentShape() {

         return _shape;

 

     }

@@ -173,11 +139,13 @@
     /**

      * Returns the alignment that is applied to the paragraph.

      *

-     * If this attribute is omitted, then a value of left is implied.

-     * @return ??? alignment that is applied to the paragraph

+     * If this attribute is omitted, then null is returned.

+     * User code can imply the value {@link TextAlign#LEFT} then.

+     *

+     * @return alignment that is applied to the paragraph

      */

     public TextAlign getTextAlign(){

-        ParagraphPropertyFetcher<TextAlign> fetcher = new ParagraphPropertyFetcher<TextAlign>(getLevel()){

+        ParagraphPropertyFetcher<TextAlign> fetcher = new ParagraphPropertyFetcher<TextAlign>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetAlgn()){

                     TextAlign val = TextAlign.values()[props.getAlgn().intValue() - 1];

@@ -188,13 +156,13 @@
             }

         };

         fetchParagraphProperty(fetcher);

-        return fetcher.getValue() == null ? TextAlign.LEFT : fetcher.getValue();

+        return fetcher.getValue();

     }

 

     /**

      * Specifies the alignment that is to be applied to the paragraph.

      * Possible values for this include left, right, centered, justified and distributed,

-     * see {@link org.apache.poi.xslf.usermodel.TextAlign}.

+     * see {@link org.apache.poi.sl.usermodel.TextAlign}.

      *

      * @param align text align

      */

@@ -207,12 +175,45 @@
         }

     }

 

+    @Override

+    public FontAlign getFontAlign(){

+        ParagraphPropertyFetcher<FontAlign> fetcher = new ParagraphPropertyFetcher<FontAlign>(getIndentLevel()){

+            public boolean fetch(CTTextParagraphProperties props){

+                if(props.isSetFontAlgn()){

+                    FontAlign val = FontAlign.values()[props.getFontAlgn().intValue() - 1];

+                    setValue(val);

+                    return true;

+                }

+                return false;

+            }

+        };

+        fetchParagraphProperty(fetcher);

+        return fetcher.getValue();

+    }

+

+    /**

+     * Specifies the font alignment that is to be applied to the paragraph.

+     * Possible values for this include auto, top, center, baseline and bottom.

+     * see {@link org.apache.poi.sl.usermodel.TextParagraph.FontAlign}.

+     *

+     * @param align font align

+     */

+    public void setFontAlign(FontAlign align){

+        CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

+        if(align == null) {

+            if(pr.isSetFontAlgn()) pr.unsetFontAlgn();

+        } else {

+            pr.setFontAlgn(STTextFontAlignType.Enum.forInt(align.ordinal() + 1));

+        }

+    }

+

+    

 

     /**

      * @return the font to be used on bullet characters within a given paragraph

      */

     public String getBulletFont(){

-        ParagraphPropertyFetcher<String> fetcher = new ParagraphPropertyFetcher<String>(getLevel()){

+        ParagraphPropertyFetcher<String> fetcher = new ParagraphPropertyFetcher<String>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetBuFont()){

                     setValue(props.getBuFont().getTypeface());

@@ -235,7 +236,7 @@
      * @return the character to be used in place of the standard bullet point

      */

     public String getBulletCharacter(){

-        ParagraphPropertyFetcher<String> fetcher = new ParagraphPropertyFetcher<String>(getLevel()){

+        ParagraphPropertyFetcher<String> fetcher = new ParagraphPropertyFetcher<String>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetBuChar()){

                     setValue(props.getBuChar().getChar());

@@ -261,7 +262,7 @@
      */

     public Color getBulletFontColor(){

         final XSLFTheme theme = getParentShape().getSheet().getTheme();

-        ParagraphPropertyFetcher<Color> fetcher = new ParagraphPropertyFetcher<Color>(getLevel()){

+        ParagraphPropertyFetcher<Color> fetcher = new ParagraphPropertyFetcher<Color>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetBuClr()){

                     XSLFColor c = new XSLFColor(props.getBuClr(), theme, null);

@@ -297,8 +298,8 @@
      *

      * @return the bullet size

      */

-    public double getBulletFontSize(){

-        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){

+    public Double getBulletFontSize(){

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetBuSzPct()){

                     setValue(props.getBuSzPct().getVal() * 0.001);

@@ -312,7 +313,7 @@
             }

         };

         fetchParagraphProperty(fetcher);

-        return fetcher.getValue() == null ? 100 : fetcher.getValue();

+        return fetcher.getValue();

     }

 

     /**

@@ -338,26 +339,60 @@
    }

 

     /**

-     * Specifies the indent size that will be applied to the first line of text in the paragraph.

-     *

-     * @param value the indent in points. 

+     * @return the auto numbering scheme, or null if not defined

      */

-    public void setIndent(double value){

-        CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

-        if(value == -1) {

-            if(pr.isSetIndent()) pr.unsetIndent();

-        } else {

-            pr.setIndent(Units.toEMU(value));

-        }

+    public AutoNumberingScheme getAutoNumberingScheme() {

+        ParagraphPropertyFetcher<AutoNumberingScheme> fetcher = new ParagraphPropertyFetcher<AutoNumberingScheme>(getIndentLevel()) {

+            public boolean fetch(CTTextParagraphProperties props) {

+                if (props.isSetBuAutoNum()) {

+                    AutoNumberingScheme ans = AutoNumberingScheme.forOoxmlID(props.getBuAutoNum().getType().intValue());

+                    if (ans != null) {

+                        setValue(ans);

+                        return true;

+                    }

+                }

+                return false;

+            }

+        };

+        fetchParagraphProperty(fetcher);

+        return fetcher.getValue();

     }

 

     /**

-     *

-     * @return the indent applied to the first line of text in the paragraph.

+     * @return the auto numbering starting number, or null if not defined

      */

-    public double getIndent(){

+    public Integer getAutoNumberingStartAt() {

+        ParagraphPropertyFetcher<Integer> fetcher = new ParagraphPropertyFetcher<Integer>(getIndentLevel()) {

+            public boolean fetch(CTTextParagraphProperties props) {

+                if (props.isSetBuAutoNum()) {

+                    if (props.getBuAutoNum().isSetStartAt()) {

+                        setValue(props.getBuAutoNum().getStartAt());

+                        return true;

+                    }

+                }

+                return false;

+            }

+        };

+        fetchParagraphProperty(fetcher);

+        return fetcher.getValue();

+    }

+    

+    

+    @Override

+    public void setIndent(Double indent){

+        if ((indent == null) && !_p.isSetPPr()) return;

+        CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

+        if(indent == null) {

+            if(pr.isSetIndent()) pr.unsetIndent();

+        } else {

+            pr.setIndent(Units.toEMU(indent));

+        }

+    }

 

-        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){

+    @Override

+    public Double getIndent() {

+

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetIndent()){

                     setValue(Units.toPoints(props.getIndent()));

@@ -368,32 +403,27 @@
         };

         fetchParagraphProperty(fetcher);

 

-        return fetcher.getValue() == null ? 0 : fetcher.getValue();

+        return fetcher.getValue();

     }

 

-    /**

-     * Specifies the left margin of the paragraph. This is specified in addition to the text body

-     * inset and applies only to this text paragraph. That is the text body Inset and the LeftMargin

-     * attributes are additive with respect to the text position.

-     *

-     * @param value the left margin of the paragraph

-     */

-    public void setLeftMargin(double value){

+    @Override

+    public void setLeftMargin(Double leftMargin){

+        if (leftMargin == null && !_p.isSetPPr()) return;

         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

-        if(value == -1) {

+        if (leftMargin == null) {

             if(pr.isSetMarL()) pr.unsetMarL();

         } else {

-            pr.setMarL(Units.toEMU(value));

+            pr.setMarL(Units.toEMU(leftMargin));

         }

 

     }

 

     /**

-     *

-     * @return the left margin of the paragraph

+     * @return the left margin (in points) of the paragraph, null if unset

      */

-    public double getLeftMargin(){

-        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){

+    @Override

+    public Double getLeftMargin(){

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetMarL()){

                     double val = Units.toPoints(props.getMarL());

@@ -405,15 +435,43 @@
         };

         fetchParagraphProperty(fetcher);

         // if the marL attribute is omitted, then a value of 347663 is implied

-        return fetcher.getValue() == null ? 0 : fetcher.getValue();

+        return fetcher.getValue();

+    }

+

+    @Override

+    public void setRightMargin(Double rightMargin){

+        if (rightMargin == null && !_p.isSetPPr()) return;

+        CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

+        if(rightMargin == null) {

+            if(pr.isSetMarR()) pr.unsetMarR();

+        } else {

+            pr.setMarR(Units.toEMU(rightMargin));

+        }

     }

 

     /**

      *

-     * @return the default size for a tab character within this paragraph in points

+     * @return the right margin of the paragraph, null if unset

      */

-    public double getDefaultTabSize(){

-        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){

+    @Override

+    public Double getRightMargin(){

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

+            public boolean fetch(CTTextParagraphProperties props){

+                if(props.isSetMarR()){

+                    double val = Units.toPoints(props.getMarR());

+                    setValue(val);

+                    return true;

+                }

+                return false;

+            }

+        };

+        fetchParagraphProperty(fetcher);

+        return fetcher.getValue();

+    }

+

+    @Override

+    public Double getDefaultTabSize(){

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetDefTabSz()){

                     double val = Units.toPoints(props.getDefTabSz());

@@ -424,11 +482,11 @@
             }

         };

         fetchParagraphProperty(fetcher);

-        return fetcher.getValue() == null ? 0 : fetcher.getValue();

+        return fetcher.getValue();

     }

 

     public double getTabStop(final int idx){

-        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetTabLst()){

                     CTTextTabStopList tabStops = props.getTabLst();

@@ -452,47 +510,27 @@
         tabStops.addNewTab().setPos(Units.toEMU(value));

     }

 

-    /**

-     * This element specifies the vertical line spacing that is to be used within a paragraph.

-     * This may be specified in two different ways, percentage spacing and font point spacing:

-     * <p>

-     * If linespacing >= 0, then linespacing is a percentage of normal line height

-     * If linespacing < 0, the absolute value of linespacing is the spacing in points

-     * </p>

-     * Examples:

-     * <pre><code>

-     *      // spacing will be 120% of the size of the largest text on each line

-     *      paragraph.setLineSpacing(120);

-     *

-     *      // spacing will be 200% of the size of the largest text on each line

-     *      paragraph.setLineSpacing(200);

-     *

-     *      // spacing will be 48 points

-     *      paragraph.setLineSpacing(-48.0);

-     * </code></pre>

-     * 

-     * @param linespacing the vertical line spacing

-     */

-    public void setLineSpacing(double linespacing){

+    @Override

+    public void setLineSpacing(Double lineSpacing){

+        if (lineSpacing == null && !_p.isSetPPr()) return;

         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

-        CTTextSpacing spc = CTTextSpacing.Factory.newInstance();

-        if(linespacing >= 0) spc.addNewSpcPct().setVal((int)(linespacing*1000));

-        else spc.addNewSpcPts().setVal((int)(-linespacing*100));

-        pr.setLnSpc(spc);

+        if(lineSpacing == null) {

+            if (pr.isSetLnSpc()) pr.unsetLnSpc();

+        } else {

+            CTTextSpacing spc = (pr.isSetLnSpc()) ? pr.getLnSpc() : pr.addNewLnSpc();

+            if (lineSpacing >= 0) {

+                (spc.isSetSpcPct() ? spc.getSpcPct() : spc.addNewSpcPct()).setVal((int)(lineSpacing*1000));

+                if (spc.isSetSpcPts()) spc.unsetSpcPts();

+            } else {

+                (spc.isSetSpcPts() ? spc.getSpcPts() : spc.addNewSpcPts()).setVal((int)(-lineSpacing*100));

+                if (spc.isSetSpcPct()) spc.unsetSpcPct();

+            }

+        }

     }

 

-    /**

-     * Returns the vertical line spacing that is to be used within a paragraph.

-     * This may be specified in two different ways, percentage spacing and font point spacing:

-     * <p>

-     * If linespacing >= 0, then linespacing is a percentage of normal line height.

-     * If linespacing < 0, the absolute value of linespacing is the spacing in points

-     * </p>

-     *

-     * @return the vertical line spacing.

-     */

-    public double getLineSpacing(){

-        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){

+    @Override

+    public Double getLineSpacing(){

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetLnSpc()){

                     CTTextSpacing spc = props.getLnSpc();

@@ -506,8 +544,8 @@
         };

         fetchParagraphProperty(fetcher);

 

-        double lnSpc = fetcher.getValue() == null ? 100 : fetcher.getValue();

-        if(lnSpc > 0) {

+        Double lnSpc = fetcher.getValue();

+        if (lnSpc != null && lnSpc > 0) {

             // check if the percentage value is scaled

             CTTextNormalAutofit normAutofit = getParentShape().getTextBodyPr().getNormAutofit();

             if(normAutofit != null) {

@@ -519,26 +557,9 @@
         return lnSpc;

     }

 

-    /**

-     * Set the amount of vertical white space that will be present before the paragraph.

-     * This space is specified in either percentage or points:

-     * <p>

-     * If spaceBefore >= 0, then space is a percentage of normal line height.

-     * If spaceBefore < 0, the absolute value of linespacing is the spacing in points

-     * </p>

-     * Examples:

-     * <pre><code>

-     *      // The paragraph will be formatted to have a spacing before the paragraph text.

-     *      // The spacing will be 200% of the size of the largest text on each line

-     *      paragraph.setSpaceBefore(200);

-     *

-     *      // The spacing will be a size of 48 points

-     *      paragraph.setSpaceBefore(-48.0);

-     * </code></pre>

-     *

-     * @param spaceBefore the vertical white space before the paragraph.

-     */

-    public void setSpaceBefore(double spaceBefore){

+    @Override

+    public void setSpaceBefore(Double spaceBefore){

+        if (spaceBefore == null && !_p.isSetPPr()) return;

         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

         CTTextSpacing spc = CTTextSpacing.Factory.newInstance();

         if(spaceBefore >= 0) spc.addNewSpcPct().setVal((int)(spaceBefore*1000));

@@ -546,18 +567,9 @@
         pr.setSpcBef(spc);

     }

 

-    /**

-     * The amount of vertical white space before the paragraph

-     * This may be specified in two different ways, percentage spacing and font point spacing:

-     * <p>

-     * If spaceBefore >= 0, then space is a percentage of normal line height.

-     * If spaceBefore < 0, the absolute value of linespacing is the spacing in points

-     * </p>

-     *

-     * @return the vertical white space before the paragraph

-     */

-    public double getSpaceBefore(){

-        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){

+    @Override

+    public Double getSpaceBefore(){

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetSpcBef()){

                     CTTextSpacing spc = props.getSpcBef();

@@ -571,30 +583,11 @@
         };

         fetchParagraphProperty(fetcher);

 

-        double spcBef = fetcher.getValue() == null ? 0 : fetcher.getValue();

-        return spcBef;

+        return fetcher.getValue();

     }

 

-    /**

-     * Set the amount of vertical white space that will be present after the paragraph.

-     * This space is specified in either percentage or points:

-     * <p>

-     * If spaceAfter >= 0, then space is a percentage of normal line height.

-     * If spaceAfter < 0, the absolute value of linespacing is the spacing in points

-     * </p>

-     * Examples:

-     * <pre><code>

-     *      // The paragraph will be formatted to have a spacing after the paragraph text.

-     *      // The spacing will be 200% of the size of the largest text on each line

-     *      paragraph.setSpaceAfter(200);

-     *

-     *      // The spacing will be a size of 48 points

-     *      paragraph.setSpaceAfter(-48.0);

-     * </code></pre>

-     *

-     * @param spaceAfter the vertical white space after the paragraph.

-     */

-    public void setSpaceAfter(double spaceAfter){

+    @Override

+    public void setSpaceAfter(Double spaceAfter){

         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

         CTTextSpacing spc = CTTextSpacing.Factory.newInstance();

         if(spaceAfter >= 0) spc.addNewSpcPct().setVal((int)(spaceAfter*1000));

@@ -602,18 +595,9 @@
         pr.setSpcAft(spc);

     }

 

-    /**

-     * The amount of vertical white space after the paragraph

-     * This may be specified in two different ways, percentage spacing and font point spacing:

-     * <p>

-     * If spaceBefore >= 0, then space is a percentage of normal line height.

-     * If spaceBefore < 0, the absolute value of linespacing is the spacing in points

-     * </p>

-     *

-     * @return the vertical white space after the paragraph

-     */

-    public double getSpaceAfter(){

-        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){

+    @Override

+    public Double getSpaceAfter(){

+        ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetSpcAft()){

                     CTTextSpacing spc = props.getSpcAft();

@@ -626,39 +610,26 @@
             }

         };

         fetchParagraphProperty(fetcher);

-        return fetcher.getValue() == null ? 0 : fetcher.getValue();

+        return fetcher.getValue();

     }

 

-    /**

-     * Specifies the particular level text properties that this paragraph will follow.

-     * The value for this attribute formats the text according to the corresponding level

-     * paragraph properties defined in the SlideMaster.

-     *

-     * @param level the level (0 ... 4)

-     */

-    public void setLevel(int level){

+    @Override

+    public void setIndentLevel(int level){

         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

-

         pr.setLvl(level);

     }

 

-    /**

-     *

-     * @return the text level of this paragraph (0-based). Default is 0.

-     */

-    public int getLevel(){

+    @Override

+    public int getIndentLevel() {

         CTTextParagraphProperties pr = _p.getPPr();

-        if(pr == null) return 0;

-

-        return pr.getLvl();

-

+        return (pr == null || !pr.isSetLvl()) ? 0 : pr.getLvl();

     }

 

     /**

      * Returns whether this paragraph has bullets

      */

     public boolean isBullet() {

-        ParagraphPropertyFetcher<Boolean> fetcher = new ParagraphPropertyFetcher<Boolean>(getLevel()){

+        ParagraphPropertyFetcher<Boolean> fetcher = new ParagraphPropertyFetcher<Boolean>(getIndentLevel()){

             public boolean fetch(CTTextParagraphProperties props){

                 if(props.isSetBuNone()) {

                     setValue(false);

@@ -683,11 +654,22 @@
         if(isBullet() == flag) return;

 

         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

-        if(!flag) {

-            pr.addNewBuNone();

-        } else {

+        if(flag) {

             pr.addNewBuFont().setTypeface("Arial");

             pr.addNewBuChar().setChar("\u2022");

+        } else {

+            if (pr.isSetBuFont()) pr.unsetBuFont();

+            if (pr.isSetBuChar()) pr.unsetBuChar();

+            if (pr.isSetBuAutoNum()) pr.unsetBuAutoNum();

+            if (pr.isSetBuBlip()) pr.unsetBuBlip();

+            if (pr.isSetBuClr()) pr.unsetBuClr();

+            if (pr.isSetBuClrTx()) pr.unsetBuClrTx();

+            if (pr.isSetBuFont()) pr.unsetBuFont();

+            if (pr.isSetBuFontTx()) pr.unsetBuFontTx();

+            if (pr.isSetBuSzPct()) pr.unsetBuSzPct();

+            if (pr.isSetBuSzPts()) pr.unsetBuSzPts();

+            if (pr.isSetBuSzTx()) pr.unsetBuSzTx();

+            pr.addNewBuNone();

         }

     }

 

@@ -698,11 +680,11 @@
      * @param startAt the number that will start number for a given sequence of automatically

     numbered bullets (1-based).

      */

-    public void setBulletAutoNumber(ListAutoNumber scheme, int startAt) {

+    public void setBulletAutoNumber(AutoNumberingScheme scheme, int startAt) {

         if(startAt < 1) throw new IllegalArgumentException("Start Number must be greater or equal that 1") ;

         CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();

         CTTextAutonumberBullet lst = pr.isSetBuAutoNum() ? pr.getBuAutoNum() : pr.addNewBuAutoNum();

-        lst.setType(STTextAutonumberScheme.Enum.forInt(scheme.ordinal() + 1));

+        lst.setType(STTextAutonumberScheme.Enum.forInt(scheme.ooxmlId));

         lst.setStartAt(startAt);

     }

 

@@ -711,334 +693,72 @@
         return "[" + getClass() + "]" + getText();

     }

 

-    List<TextFragment> getTextLines(){

-        return _lines;

-    }

 

-    /**

-     * Returns wrapping width to break lines in this paragraph

-     *

-     * @param firstLine whether the first line is breaking

-     *

-     * @return  wrapping width in points

-     */

-    double getWrappingWidth(boolean firstLine, Graphics2D graphics){

-        // internal margins for the text box

-        double leftInset = _shape.getLeftInset();

-        double rightInset = _shape.getRightInset();

-

-        RenderableShape rShape = new RenderableShape(_shape);

-        Rectangle2D anchor = rShape.getAnchor(graphics);

-

-        double leftMargin = getLeftMargin();

-        double indent = getIndent();

-

-        double width;

-        if(!_shape.getWordWrap()) {

-            // if wordWrap == false then we return the advance to the right border of the sheet

-            width = _shape.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX();

-        } else {

-            width = anchor.getWidth() -  leftInset - rightInset - leftMargin;

-            if(firstLine) {

-                if(isBullet()){

-                    if(indent > 0) width -= indent;

-                } else {

-                    if(indent > 0) width -= indent; // first line indentation

-                    else if (indent < 0) { // hanging indentation: the first line start at the left margin

-                        width += leftMargin;

-                    }

-                }

-            }

-        }

-

-        return width;

-    }

-

-    public double draw(Graphics2D graphics, double x, double y){

-        double leftInset = _shape.getLeftInset();

-        double rightInset = _shape.getRightInset();

-        RenderableShape rShape = new RenderableShape(_shape);

-        Rectangle2D anchor = rShape.getAnchor(graphics);

-        double penY = y;

-

-        double leftMargin = getLeftMargin();

-        boolean firstLine = true;

-        double indent = getIndent();

-

-        //The vertical line spacing

-        double spacing = getLineSpacing();

-        for(TextFragment line : _lines){

-            double penX = x + leftMargin;

-

-            if(firstLine) {

-                if(_bullet != null){

-                    if(indent < 0) {

-                        // a negative value means "Hanging" indentation and

-                        // indicates the position of the actual bullet character.

-                        // (the bullet is shifted to right relative to the text)

-                        _bullet.draw(graphics, penX + indent,  penY);

-                    } else if(indent > 0){

-                        // a positive value means the "First Line" indentation:

-                        // the first line is indented and other lines start at the bullet ofset

-                        _bullet.draw(graphics, penX,  penY);

-                        penX += indent;

-                    } else {

-                        // a zero indent means that the bullet and text have the same offset

-                        _bullet.draw(graphics, penX,  penY);

-

-                        // don't let text overlay the bullet and advance by the bullet width

-                        penX += _bullet._layout.getAdvance() + 1;

-                    }

-                } else {

-                    penX += indent;

-                }

-            }

-

-

-            switch (getTextAlign()) {

-                case CENTER:

-                    penX += (anchor.getWidth() - leftMargin - line.getWidth() - leftInset - rightInset) / 2;

-                    break;

-                case RIGHT:

-                    penX += (anchor.getWidth() - line.getWidth() - leftInset - rightInset);

-                    break;

-                default:

-                    break;

-            }

-

-            line.draw(graphics, penX,  penY);

-

-            if(spacing > 0) {

-                // If linespacing >= 0, then linespacing is a percentage of normal line height.

-                penY += spacing*0.01* line.getHeight();

-            } else {

-                // positive value means absolute spacing in points

-                penY += -spacing;

-            }

-

-            firstLine = false;

-        }

-        

-        return penY - y;

-    }

-

-    AttributedString getAttributedString(Graphics2D graphics){

-

-        String text = getRenderableText();

-

-        AttributedString string = new AttributedString(text);

-

-        XSLFFontManager fontHandler = (XSLFFontManager)graphics.getRenderingHint(XSLFRenderingHint.FONT_HANDLER);

-

-        int startIndex = 0;

-        for (XSLFTextRun run : _runs){

-            int length = run.getRenderableText().length();

-            if(length == 0) {

-                // skip empty runs

-                continue;

-            }

-            int endIndex = startIndex + length;

-

-            string.addAttribute(TextAttribute.FOREGROUND, run.getFontColor(), startIndex, endIndex);

-

-            // user can pass an custom object to convert fonts

-            String fontFamily = run.getFontFamily();

-            @SuppressWarnings("unchecked")

-            Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(TextPainter.KEY_FONTMAP);

-            if (fontMap != null && fontMap.containsKey(fontFamily)) {

-                fontFamily = fontMap.get(fontFamily);

-            }

-            if(fontHandler != null) {

-                fontFamily = fontHandler.getRendererableFont(fontFamily, run.getPitchAndFamily());

-            }

-            string.addAttribute(TextAttribute.FAMILY, fontFamily, startIndex, endIndex);

-

-            float fontSz = (float)run.getFontSize();

-            string.addAttribute(TextAttribute.SIZE, fontSz , startIndex, endIndex);

-

-            if(run.isBold()) {

-                string.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIndex, endIndex);

-            }

-            if(run.isItalic()) {

-                string.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, startIndex, endIndex);

-            }

-            if(run.isUnderline()) {

-                string.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, startIndex, endIndex);

-                string.addAttribute(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, startIndex, endIndex);

-            }

-            if(run.isStrikethrough()) {

-                string.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, startIndex, endIndex);

-            }

-            if(run.isSubscript()) {

-                string.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUB, startIndex, endIndex);

-            }

-            if(run.isSuperscript()) {

-                string.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, startIndex, endIndex);

-            }

-

-

-            startIndex = endIndex;

-        }

-

-        return string;

-    }

-

-    /**

-     *  ensure that the paragraph contains at least one character.

-     *  We need this trick to correctly measure text

-     */

-    private void ensureNotEmpty(){

-        XSLFTextRun r = addNewTextRun();

-        r.setText(" ");

-        CTTextCharacterProperties endPr = _p.getEndParaRPr();

-        if(endPr != null) {

-            if(endPr.isSetSz()) r.setFontSize(endPr.getSz() / 100);

-        }

-    }

-

-    /**

-     * break text into lines

-     *

-     * @param graphics

-     * @return array of text fragments,

-     * each representing a line of text that fits in the wrapping width

-     */

-    List<TextFragment> breakText(Graphics2D graphics){

-        _lines = new ArrayList<TextFragment>();

-

-        // does this paragraph contain text?

-        boolean emptyParagraph = _runs.size() == 0;

-

-        // ensure that the paragraph contains at least one character

-        if(_runs.size() == 0) ensureNotEmpty();

-

-        String text = getRenderableText();

-        if(text.length() == 0) return _lines;

-

-        AttributedString at = getAttributedString(graphics);

-        AttributedCharacterIterator it = at.getIterator();

-        LineBreakMeasurer measurer = new LineBreakMeasurer(it, graphics.getFontRenderContext())  ;

-        for (;;) {

-            int startIndex = measurer.getPosition();

-

-            double wrappingWidth = getWrappingWidth(_lines.size() == 0, graphics) + 1; // add a pixel to compensate rounding errors

-            // shape width can be smaller that the sum of insets (this was proved by a test file)

-            if(wrappingWidth < 0) wrappingWidth = 1;

-

-            int nextBreak = text.indexOf('\n', startIndex + 1);

-            if(nextBreak == -1) nextBreak = it.getEndIndex();

-

-            TextLayout layout = measurer.nextLayout((float)wrappingWidth, nextBreak, true);

-            if (layout == null) {

-                 // layout can be null if the entire word at the current position

-                 // does not fit within the wrapping width. Try with requireNextWord=false.

-                 layout = measurer.nextLayout((float)wrappingWidth, nextBreak, false);

-            }

-

-            if(layout == null) {

-                // exit if can't break any more

-                break;

-            }

-

-            int endIndex = measurer.getPosition();

-            // skip over new line breaks (we paint 'clear' text runs not starting or ending with \n)

-            if(endIndex < it.getEndIndex() && text.charAt(endIndex) == '\n'){

-                measurer.setPosition(endIndex + 1);

-            }

-

-            TextAlign hAlign = getTextAlign();

-            if(hAlign == TextAlign.JUSTIFY || hAlign == TextAlign.JUSTIFY_LOW) {

-                layout = layout.getJustifiedLayout((float)wrappingWidth);

-            }

-

-            AttributedString str = new AttributedString(it, startIndex, endIndex);

-            TextFragment line = new TextFragment(

-                    layout, // we will not paint empty paragraphs

-                    emptyParagraph ? null : str);

-            _lines.add(line);

-

-            _maxLineHeight = Math.max(_maxLineHeight, line.getHeight());

-

-            if(endIndex == it.getEndIndex()) break;

-

-        }

-

-        if(isBullet() && !emptyParagraph) {

-            String buCharacter = getBulletCharacter();

-            String buFont = getBulletFont();

-            if(buFont == null) buFont = getTextRuns().get(0).getFontFamily();

-            if(buCharacter != null && buFont != null && _lines.size() > 0) {

-                AttributedString str = new AttributedString(buCharacter);

-

-                TextFragment firstLine = _lines.get(0);

-                AttributedCharacterIterator bit = firstLine._str.getIterator();

-

-                Color buColor = getBulletFontColor();

-                str.addAttribute(TextAttribute.FOREGROUND, buColor == null ?

-                        bit.getAttribute(TextAttribute.FOREGROUND) : buColor);

-                str.addAttribute(TextAttribute.FAMILY, buFont);

-

-                float fontSize = (Float)bit.getAttribute(TextAttribute.SIZE);

-                float buSz = (float)getBulletFontSize();

-                if(buSz > 0) fontSize *= buSz* 0.01;

-                else fontSize = -buSz;

-

-                str.addAttribute(TextAttribute.SIZE, fontSize);

-

-                TextLayout layout = new TextLayout(str.getIterator(), graphics.getFontRenderContext());

-                _bullet = new TextFragment(layout, str);

-            }

-        }

-        return _lines;

-    }

-

-    CTTextParagraphProperties getDefaultMasterStyle(){

+    /* package */ CTTextParagraphProperties getDefaultMasterStyle(){

         CTPlaceholder ph = _shape.getCTPlaceholder();

-        String defaultStyleSelector;

-        if(ph == null) defaultStyleSelector = "otherStyle";   // no placeholder means plain text box

-        else {

-            switch(ph.getType().intValue()){

-                case STPlaceholderType.INT_TITLE:

-                case STPlaceholderType.INT_CTR_TITLE:

-                    defaultStyleSelector = "titleStyle";

-                    break;

-                case STPlaceholderType.INT_FTR:

-                case STPlaceholderType.INT_SLD_NUM:

-                case STPlaceholderType.INT_DT:

-                    defaultStyleSelector = "otherStyle";

-                    break;

-                default:

-                    defaultStyleSelector = "bodyStyle";

-                    break;

-            }

+        String defaultStyleSelector;   

+        switch(ph == null ? -1 : ph.getType().intValue()) {

+            case STPlaceholderType.INT_TITLE:

+            case STPlaceholderType.INT_CTR_TITLE:

+                defaultStyleSelector = "titleStyle";

+                break;

+            case -1: // no placeholder means plain text box

+            case STPlaceholderType.INT_FTR:

+            case STPlaceholderType.INT_SLD_NUM:

+            case STPlaceholderType.INT_DT:

+                defaultStyleSelector = "otherStyle";

+                break;

+            default:

+                defaultStyleSelector = "bodyStyle";

+                break;

         }

-        int level = getLevel();

+        int level = getIndentLevel();

 

         // wind up and find the root master sheet which must be slide master

+        final String nsDecl =

+            "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +

+            "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' ";

+        final String xpaths[] = {

+            nsDecl+".//p:txStyles/p:" + defaultStyleSelector +"/a:lvl" +(level+1)+ "pPr",

+            nsDecl+".//p:notesStyle/a:lvl" +(level+1)+ "pPr"

+        };

         XSLFSheet masterSheet = _shape.getSheet();

-        while (masterSheet.getMasterSheet() != null){

-            masterSheet = masterSheet.getMasterSheet();

+        for (XSLFSheet m = masterSheet; m != null; m = (XSLFSheet)m.getMasterSheet()) {

+            masterSheet = m;

+

+            XmlObject xo = masterSheet.getXmlObject();

+            for (String xpath : xpaths) {

+                XmlObject[] o = xo.selectPath(xpath);

+                if (o.length == 1) {

+                    return (CTTextParagraphProperties)o[0];

+                }

+            }

         }

 

-        XmlObject[] o = masterSheet.getXmlObject().selectPath(

-                "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +

-                "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " +

-                ".//p:txStyles/p:" + defaultStyleSelector +"/a:lvl" +(level+1)+ "pPr");

-        if (o.length == 1){

-            return (CTTextParagraphProperties)o[0];

-        } else {

-                o = masterSheet.getXmlObject().selectPath(

-                "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +

-                "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " +

-                ".//p:notesStyle/a:lvl" +(level+1)+ "pPr");

-                

-            if (o.length == 1){

-                return (CTTextParagraphProperties)o[0];

-            }

-            

-            throw new IllegalArgumentException("Failed to fetch default style for " +

-                    defaultStyleSelector + " and level=" + level);

-        }

+        

+//        for (CTTextBody txBody : (CTTextBody[])xo.selectPath(nsDecl+".//p:txBody")) {

+//            CTTextParagraphProperties defaultPr = null, lastPr = null;

+//            boolean hasLvl = false;

+//            for (CTTextParagraph p : txBody.getPArray()) {

+//                CTTextParagraphProperties pr = p.getPPr();

+//                if (pr.isSetLvl()) {

+//                    hasLvl |= true;

+//                    lastPr = pr;

+//                    if (pr.getLvl() == level) return pr;

+//                } else {

+//                    defaultPr = pr;

+//                }

+//            }

+//            if (!hasLvl) continue;

+//            if (level == 0 && defaultPr != null) return defaultPr;

+//            if (lastPr != null) return lastPr;

+//            break;

+//        }

+//           

+//        String err = "Failed to fetch default style for " + defaultStyleSelector + " and level=" + level;

+//        throw new IllegalArgumentException(err);

+        

+        return null;

     }

 

     private <T> boolean fetchParagraphProperty(ParagraphPropertyFetcher<T> visitor){

@@ -1054,7 +774,7 @@
                 if(ph == null){

                     // if it is a plain text box then take defaults from presentation.xml

                     XMLSlideShow ppt = getParentShape().getSheet().getSlideShow();

-                    CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(getLevel());

+                    CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(getIndentLevel());

                     if(themeProps != null) ok = visitor.fetch(themeProps);

                 }

 

@@ -1069,65 +789,147 @@
         return ok;

     }

 

-    void copy(XSLFTextParagraph p){

-        TextAlign srcAlign = p.getTextAlign();

+    void copy(XSLFTextParagraph other){

+        if (other == this) return;

+        

+        CTTextParagraph thisP = getXmlObject();

+        CTTextParagraph otherP = other.getXmlObject();

+        

+        if (thisP.isSetPPr()) thisP.unsetPPr();

+        if (thisP.isSetEndParaRPr()) thisP.unsetEndParaRPr();

+        

+        _runs.clear();

+        for (int i=thisP.sizeOfBrArray(); i>0; i--) {

+            thisP.removeBr(i-1);

+        }

+        for (int i=thisP.sizeOfRArray(); i>0; i--) {

+            thisP.removeR(i-1);

+        }

+        for (int i=thisP.sizeOfFldArray(); i>0; i--) {

+            thisP.removeFld(i-1);

+        }

+

+        XmlCursor thisC = thisP.newCursor();

+        thisC.toEndToken();

+        XmlCursor otherC = otherP.newCursor();

+        otherC.copyXmlContents(thisC);

+        otherC.dispose();

+        thisC.dispose();

+        

+        List<XSLFTextRun> otherRs = other.getTextRuns();

+        int i=0;

+        for(CTRegularTextRun rtr : thisP.getRArray()) {

+            XSLFTextRun run = new XSLFTextRun(rtr, this);

+            run.copy(otherRs.get(i++));

+            _runs.add(run);

+        }

+        

+        

+        // set properties again, in case we are based on a different

+        // template

+        TextAlign srcAlign = other.getTextAlign();

         if(srcAlign != getTextAlign()){

             setTextAlign(srcAlign);

         }

 

-        boolean isBullet = p.isBullet();

+        boolean isBullet = other.isBullet();

         if(isBullet != isBullet()){

             setBullet(isBullet);

             if(isBullet) {

-                String buFont = p.getBulletFont();

+                String buFont = other.getBulletFont();

                 if(buFont != null && !buFont.equals(getBulletFont())){

                     setBulletFont(buFont);

                 }

-                String buChar = p.getBulletCharacter();

+                String buChar = other.getBulletCharacter();

                 if(buChar != null && !buChar.equals(getBulletCharacter())){

                     setBulletCharacter(buChar);

                 }

-                Color buColor = p.getBulletFontColor();

+                Color buColor = other.getBulletFontColor();

                 if(buColor != null && !buColor.equals(getBulletFontColor())){

                     setBulletFontColor(buColor);

                 }

-                double buSize = p.getBulletFontSize();

-                if(buSize != getBulletFontSize()){

+                Double buSize = other.getBulletFontSize();

+                if(!doubleEquals(buSize, getBulletFontSize())){

                     setBulletFontSize(buSize);

                 }

             }

         }

 

-        double leftMargin = p.getLeftMargin();

-        if(leftMargin != getLeftMargin()){

+        Double leftMargin = other.getLeftMargin();

+        if (!doubleEquals(leftMargin, getLeftMargin())){

             setLeftMargin(leftMargin);

         }

 

-        double indent = p.getIndent();

-        if(indent != getIndent()){

+        Double indent = other.getIndent();

+        if (!doubleEquals(indent, getIndent())) {

             setIndent(indent);

         }

 

-        double spaceAfter = p.getSpaceAfter();

-        if(spaceAfter != getSpaceAfter()){

+        Double spaceAfter = other.getSpaceAfter();

+        if (!doubleEquals(spaceAfter, getSpaceAfter())) {

             setSpaceAfter(spaceAfter);

         }

-        double spaceBefore = p.getSpaceBefore();

-        if(spaceBefore != getSpaceBefore()){

+        

+        Double spaceBefore = other.getSpaceBefore();

+        if (!doubleEquals(spaceBefore, getSpaceBefore())) {

             setSpaceBefore(spaceBefore);

         }

-        double lineSpacing = p.getLineSpacing();

-        if(lineSpacing != getLineSpacing()){

+        

+        Double lineSpacing = other.getLineSpacing();

+        if (!doubleEquals(lineSpacing, getLineSpacing())) {

             setLineSpacing(lineSpacing);

         }

-

-        List<XSLFTextRun> srcR = p.getTextRuns();

-        List<XSLFTextRun> tgtR = getTextRuns();

-        for(int i = 0; i < srcR.size(); i++){

-            XSLFTextRun r1 = srcR.get(i);

-            XSLFTextRun r2 = tgtR.get(i);

-            r2.copy(r1);

-        }

     }

 

+    private static boolean doubleEquals(Double d1, Double d2) {

+        return (d1 == d2 || (d1 != null && d1.equals(d2)));

+    }

+    

+    @Override

+    public Double getDefaultFontSize() {

+        CTTextCharacterProperties endPr = _p.getEndParaRPr();

+        return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100.);

+    }

+

+    @Override

+    public String getDefaultFontFamily() {

+        return (_runs.isEmpty() ? "Arial" : _runs.get(0).getFontFamily());

+    }

+

+    @Override

+    public BulletStyle getBulletStyle() {

+        if (!isBullet()) return null;

+        return new BulletStyle(){

+            @Override

+            public String getBulletCharacter() {

+                return XSLFTextParagraph.this.getBulletCharacter();

+            }

+

+            @Override

+            public String getBulletFont() {

+                return XSLFTextParagraph.this.getBulletFont();

+            }

+

+            @Override

+            public Double getBulletFontSize() {

+                return XSLFTextParagraph.this.getBulletFontSize();

+            }

+

+            @Override

+            public Color getBulletFontColor() {

+                return XSLFTextParagraph.this.getBulletFontColor();

+            }

+            

+            @Override

+            public AutoNumberingScheme getAutoNumberingScheme() {

+                return XSLFTextParagraph.this.getAutoNumberingScheme();

+            }

+

+            @Override

+            public Integer getAutoNumberingStartAt() {

+                return XSLFTextParagraph.this.getAutoNumberingStartAt();

+            }

+

+        };

+    }

 }

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
index 16d0e80..7a5c78b 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
@@ -17,25 +17,11 @@
 package org.apache.poi.xslf.usermodel;

 

 import java.awt.Color;

-import java.awt.font.FontRenderContext;

-import java.awt.font.TextAttribute;

-import java.awt.font.TextLayout;

-import java.text.AttributedString;

 

+import org.apache.poi.sl.usermodel.TextRun;

 import org.apache.poi.util.Beta;

 import org.apache.poi.xslf.model.CharacterPropertyFetcher;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeStyle;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNormalAutofit;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.STSchemeColorVal;

-import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType;

-import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

 import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;

 

 /**

@@ -45,7 +31,7 @@
  * @author Yegor Kozlov

  */

 @Beta

-public class XSLFTextRun {

+public class XSLFTextRun implements TextRun {

     private final CTRegularTextRun _r;

     private final XSLFTextParagraph _p;

 

@@ -58,7 +44,7 @@
         return _p;

     }

 

-    public String getText(){

+    public String getRawText(){

         return _r.getT();

     }

 

@@ -88,28 +74,6 @@
         return buf.toString();

     }

 

-    /**

-     * Replace a tab with the effective number of white spaces.

-     */

-    private String tab2space(){

-        AttributedString string = new AttributedString(" ");

-        // user can pass an object to convert fonts via a rendering hint

-        string.addAttribute(TextAttribute.FAMILY, getFontFamily());

-

-        string.addAttribute(TextAttribute.SIZE, (float)getFontSize());

-        TextLayout l = new TextLayout(string.getIterator(), new FontRenderContext(null, true, true));

-        double wspace = l.getAdvance();

-

-        double tabSz = _p.getDefaultTabSize();

-

-        int numSpaces = (int)Math.ceil(tabSz / wspace);

-        StringBuffer buf = new StringBuffer();

-        for(int i = 0; i < numSpaces; i++) {

-            buf.append(' ');

-        }

-        return buf.toString();

-    }

-    

     public void setText(String text){

         _r.setT(text);

     }

@@ -118,7 +82,8 @@
         return _r;

     }

 

-    public void setFontColor(Color color){

+    @Override

+    public void setFontColor(Color color) {

         CTTextCharacterProperties rPr = getRPr();

         CTSolidColorFillProperties fill = rPr.isSetSolidFill() ? rPr.getSolidFill() : rPr.addNewSolidFill();

         CTSRgbColor clr = fill.isSetSrgbClr() ? fill.getSrgbClr() : fill.addNewSrgbClr();

@@ -132,12 +97,13 @@
 

     }

 

+    @Override

     public Color getFontColor(){

         final XSLFTheme theme = _p.getParentShape().getSheet().getTheme();

         CTShapeStyle style = _p.getParentShape().getSpStyle();

         final CTSchemeColor phClr = style == null ? null : style.getFontRef().getSchemeClr();

 

-        CharacterPropertyFetcher<Color> fetcher = new CharacterPropertyFetcher<Color>(_p.getLevel()){

+        CharacterPropertyFetcher<Color> fetcher = new CharacterPropertyFetcher<Color>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 CTSolidColorFillProperties solidFill = props.getSolidFill();

                 if(solidFill != null) {

@@ -155,17 +121,13 @@
         return fetcher.getValue();

     }

 

-    /**

-     *

-     * @param fontSize  font size in points.

-     * The value of <code>-1</code> unsets the Sz attribyte from the underlying xml bean

-     */

-    public void setFontSize(double fontSize){

+    @Override

+    public void setFontSize(Double fontSize){

         CTTextCharacterProperties rPr = getRPr();

-        if(fontSize == -1.0) {

-            if(rPr.isSetSz()) rPr.unsetSz();

+        if(fontSize == null) {

+            if (rPr.isSetSz()) rPr.unsetSz();

         } else {

-            if(fontSize < 1.0) {

+            if (fontSize < 1.0) {

                 throw new IllegalArgumentException("Minimum font size is 1pt but was " + fontSize);

             }

 

@@ -173,15 +135,13 @@
         }

     }

 

-    /**

-     * @return font size in points or -1 if font size is not set.

-     */

-    public double getFontSize(){

+    @Override

+    public Double getFontSize(){

         double scale = 1;

         CTTextNormalAutofit afit = getParentParagraph().getParentShape().getTextBodyPr().getNormAutofit();

         if(afit != null) scale = (double)afit.getFontScale() / 100000;

 

-        CharacterPropertyFetcher<Double> fetcher = new CharacterPropertyFetcher<Double>(_p.getLevel()){

+        CharacterPropertyFetcher<Double> fetcher = new CharacterPropertyFetcher<Double>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetSz()){

                     setValue(props.getSz()*0.01);

@@ -191,7 +151,7 @@
             }

         };

         fetchCharacterProperty(fetcher);

-        return fetcher.getValue() == null ? -1 : fetcher.getValue()*scale;

+        return fetcher.getValue() == null ? null : fetcher.getValue()*scale;

     }

 

     /**

@@ -201,7 +161,7 @@
      */

     public double getCharacterSpacing(){

 

-        CharacterPropertyFetcher<Double> fetcher = new CharacterPropertyFetcher<Double>(_p.getLevel()){

+        CharacterPropertyFetcher<Double> fetcher = new CharacterPropertyFetcher<Double>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetSpc()){

                     setValue(props.getSpc()*0.01);

@@ -268,7 +228,7 @@
     public String getFontFamily(){

         final XSLFTheme theme = _p.getParentShape().getSheet().getTheme();

 

-        CharacterPropertyFetcher<String> visitor = new CharacterPropertyFetcher<String>(_p.getLevel()){

+        CharacterPropertyFetcher<String> visitor = new CharacterPropertyFetcher<String>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 CTTextFont font = props.getLatin();

                 if(font != null){

@@ -292,7 +252,7 @@
     public byte getPitchAndFamily(){

         final XSLFTheme theme = _p.getParentShape().getSheet().getTheme();

 

-        CharacterPropertyFetcher<Byte> visitor = new CharacterPropertyFetcher<Byte>(_p.getLevel()){

+        CharacterPropertyFetcher<Byte> visitor = new CharacterPropertyFetcher<Byte>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 CTTextFont font = props.getLatin();

                 if(font != null){

@@ -320,7 +280,7 @@
      * @return whether a run of text will be formatted as strikethrough text. Default is false.

      */

     public boolean isStrikethrough() {

-        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getLevel()){

+        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetStrike()){

                     setValue(props.getStrike() != STTextStrikeType.NO_STRIKE);

@@ -337,7 +297,7 @@
      * @return whether a run of text will be formatted as a superscript text. Default is false.

      */

     public boolean isSuperscript() {

-        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getLevel()){

+        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetBaseline()){

                     setValue(props.getBaseline() > 0);

@@ -387,7 +347,7 @@
      * @return whether a run of text will be formatted as a superscript text. Default is false.

      */

     public boolean isSubscript() {

-        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getLevel()){

+        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetBaseline()){

                     setValue(props.getBaseline() < 0);

@@ -404,7 +364,7 @@
      * @return whether a run of text will be formatted as a superscript text. Default is false.

      */

     public TextCap getTextCap() {

-        CharacterPropertyFetcher<TextCap> fetcher = new CharacterPropertyFetcher<TextCap>(_p.getLevel()){

+        CharacterPropertyFetcher<TextCap> fetcher = new CharacterPropertyFetcher<TextCap>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetCap()){

                     int idx = props.getCap().intValue() - 1;

@@ -431,7 +391,7 @@
      * @return whether this run of text is formatted as bold text

      */

     public boolean isBold(){

-        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getLevel()){

+        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetB()){

                     setValue(props.getB());

@@ -455,7 +415,7 @@
      * @return whether this run of text is formatted as italic text

      */

     public boolean isItalic(){

-        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getLevel()){

+        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetI()){

                     setValue(props.getI());

@@ -478,8 +438,8 @@
     /**

      * @return whether this run of text is formatted as underlined text

      */

-    public boolean isUnderline(){

-        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getLevel()){

+    public boolean isUnderlined(){

+        CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){

             public boolean fetch(CTTextCharacterProperties props){

                 if(props.isSetU()){

                     setValue(props.getU() != STTextUnderlineType.NONE);

@@ -498,7 +458,7 @@
 

     @Override

     public String toString(){

-        return "[" + getClass() + "]" + getText();

+        return "[" + getClass() + "]" + getRawText();

     }

 

     public XSLFHyperlink createHyperlink(){

@@ -513,7 +473,7 @@
         return new XSLFHyperlink(_r.getRPr().getHlinkClick(), this);

     }

 

-    private boolean fetchCharacterProperty(CharacterPropertyFetcher fetcher){

+    private boolean fetchCharacterProperty(CharacterPropertyFetcher<?> fetcher){

         boolean ok = false;

 

         if(_r.isSetRPr()) ok = fetcher.fetch(getRPr());

@@ -526,7 +486,7 @@
                 if(ph == null){

                     // if it is a plain text box then take defaults from presentation.xml

                     XMLSlideShow ppt = shape.getSheet().getSlideShow();

-                    CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(_p.getLevel());

+                    CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(_p.getIndentLevel());

                     if(themeProps != null) {

                         fetcher.isFetchingFromMaster = true;

                         ok = fetcher.fetch(themeProps);

@@ -567,8 +527,8 @@
         boolean italic = r.isItalic();

         if(italic != isItalic()) setItalic(italic);

 

-        boolean underline = r.isUnderline();

-        if(underline != isUnderline()) setUnderline(underline);

+        boolean underline = r.isUnderlined();

+        if(underline != isUnderlined()) setUnderline(underline);

 

         boolean strike = r.isStrikethrough();

         if(strike != isStrikethrough()) setStrikethrough(strike);

diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
index d5ae1a2..d1eb19e 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
@@ -19,45 +19,28 @@
 
 package org.apache.poi.xslf.usermodel;
 
-import java.awt.Graphics2D;
-import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 import org.apache.poi.POIXMLException;
+import org.apache.poi.sl.draw.DrawFactory;
+import org.apache.poi.sl.draw.DrawTextShape;
+import org.apache.poi.sl.usermodel.*;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Units;
 import org.apache.poi.xslf.model.PropertyFetcher;
 import org.apache.poi.xslf.model.TextBodyPropertyFetcher;
 import org.apache.xmlbeans.XmlObject;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
-import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType;
-import org.openxmlformats.schemas.drawingml.x2006.main.STTextVerticalType;
-import org.openxmlformats.schemas.drawingml.x2006.main.STTextWrappingType;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
-import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
+import org.openxmlformats.schemas.drawingml.x2006.main.*;
+import org.openxmlformats.schemas.presentationml.x2006.main.*;
 
 /**
  * Represents a shape that can hold text.
- *
- * @author Yegor Kozlov
  */
 @Beta
-public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<XSLFTextParagraph>{
+public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape<XSLFTextParagraph> {
     private final List<XSLFTextParagraph> _paragraphs;
 
-    /**
-     * whether the text was broken into lines.
-     */
-    private boolean _isTextBroken;
-
     @SuppressWarnings("deprecation")
     /*package*/ XSLFTextShape(XmlObject shape, XSLFSheet sheet) {
         super(shape, sheet);
@@ -72,7 +55,7 @@
     }
 
     public Iterator<XSLFTextParagraph> iterator(){
-        return _paragraphs.iterator();
+        return getTextParagraphs().iterator();
     }
 
     /**
@@ -129,7 +112,7 @@
      * Sets the type of vertical alignment for the text.
      *
      * @param anchor - the type of alignment.
-     * A <code>null</code> values unsets this property.
+     * A {@code null} values unsets this property.
      */
     public void setVerticalAlignment(VerticalAlignment anchor){
         CTTextBodyProperties bodyPr = getTextBodyPr();
@@ -163,6 +146,40 @@
     }
 
     /**
+     * Sets if the paragraphs are horizontal centered
+     *
+     * @param isCentered true, if the paragraphs are horizontal centered
+     * A {@code null} values unsets this property.
+     * 
+     * @see TextShape#isHorizontalCentered()
+     */
+    public void setHorizontalCentered(Boolean isCentered){
+        CTTextBodyProperties bodyPr = getTextBodyPr();
+        if (bodyPr != null) {
+             if (isCentered == null) {
+                if (bodyPr.isSetAnchorCtr()) bodyPr.unsetAnchorCtr();
+            } else {
+                bodyPr.setAnchorCtr(isCentered);
+            }
+        }
+    }
+
+    @Override
+    public boolean isHorizontalCentered(){
+        PropertyFetcher<Boolean> fetcher = new TextBodyPropertyFetcher<Boolean>(){
+            public boolean fetch(CTTextBodyProperties props){
+                if(props.isSetAnchorCtr()){
+                    setValue(props.getAnchorCtr());
+                    return true;
+                }
+                return false;
+            }
+        };
+        fetchShapeProperty(fetcher);
+        return fetcher.getValue() == null ? false : fetcher.getValue();
+    }
+    
+    /**
      *
      * @param orientation vertical orientation of the text
      */
@@ -283,7 +300,7 @@
     }
 
     /**
-     * Sets the botom margin.
+     * Sets the bottom margin.
      * @see #getBottomInset()
      *
      * @param margin    the bottom margin
@@ -338,7 +355,13 @@
         }
     }
 
-
+    @Override
+    public Insets2D getInsets() {
+        Insets2D insets = new Insets2D(getTopInset(), getLeftInset(), getBottomInset(), getRightInset());
+        return insets;
+    }
+    
+    
     /**
      * @return whether to wrap words within the bounding rectangle
      */
@@ -408,53 +431,26 @@
         return textBody == null ? null : textBody.getBodyPr();
     }
 
-
     protected abstract CTTextBody getTextBody(boolean create);
 
+    @Override
+    public void setPlaceholder(Placeholder placeholder) {
+        super.setPlaceholder(placeholder);
+    }
 
     public Placeholder getTextType(){
-        CTPlaceholder ph;
-        XmlObject[] obj = getXmlObject().selectPath(
-                "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph");
-        if(obj.length == 1){
-            ph = (CTPlaceholder)obj[0];
-            int val = ph.getType().intValue();
-            return Placeholder.values()[val - 1];
-        }
-        else {
-            return null;
-        }
+        CTPlaceholder ph = getCTPlaceholder();
+        if (ph == null) return null;
+
+        int val = ph.getType().intValue();
+        return Placeholder.values()[val - 1];
     }
 
-
-    /**
-     * Specifies that the corresponding shape should be represented by the generating application
-     * as a placeholder. When a shape is considered a placeholder by the generating application
-     * it can have special properties to alert the user that they may enter content into the shape.
-     * Different types of placeholders are allowed and can be specified by using the placeholder
-     * type attribute for this element
-     *
-     * @param placeholder
-     */
-    public void setPlaceholder(Placeholder placeholder){
-        CTShape sh =  (CTShape)getXmlObject();
-        CTApplicationNonVisualDrawingProps nv = sh.getNvSpPr().getNvPr();
-        if(placeholder == null) {
-            if(nv.isSetPh()) nv.unsetPh();
-        } else {
-            nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1));
-        }
-    }
-
-    /**
-     * Compute the cumulative height occupied by the text
-     */
+    @Override
     public double getTextHeight(){
-        // dry-run in a 1x1 image and return the vertical advance
-        BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
-        Graphics2D graphics = img.createGraphics();
-        breakText(graphics);
-        return drawParagraphs(graphics, 0, 0);
+        DrawFactory drawFact = DrawFactory.getInstance(null);
+        DrawTextShape<XSLFTextShape> dts = drawFact.getDrawable(this);
+        return dts.getTextHeight();
     }
 
     /**
@@ -475,162 +471,57 @@
         return anchor;
     }   
     
-    /**
-     * break the contained text into lines
-    */
-    private void breakText(Graphics2D graphics){
-        if(!_isTextBroken) {
-            for(XSLFTextParagraph p : _paragraphs) p.breakText(graphics);
-
-            _isTextBroken = true;
-        }
-    }
 
     @Override
-    public void drawContent(Graphics2D graphics) {
-        breakText(graphics);
+    void copy(XSLFShape other){
+        super.copy(other);
 
-        RenderableShape rShape = new RenderableShape(this);
-        Rectangle2D anchor = rShape.getAnchor(graphics);
-        double x = anchor.getX() + getLeftInset();
-        double y = anchor.getY();
-
-        // remember the initial transform
-        AffineTransform tx = graphics.getTransform();
-
-        // Transform of text in flipped shapes is special.
-        // At this point the flip and rotation transform is already applied
-        // (see XSLFShape#applyTransform ), but we need to restore it to avoid painting "upside down".
-        // See Bugzilla 54210.
-
-        if(getFlipVertical()){
-            graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
-            graphics.scale(1, -1);
-            graphics.translate(-anchor.getX(), -anchor.getY());
-
-            // text in vertically flipped shapes is rotated by 180 degrees
-            double centerX = anchor.getX() + anchor.getWidth()/2;
-            double centerY = anchor.getY() + anchor.getHeight()/2;
-            graphics.translate(centerX, centerY);
-            graphics.rotate(Math.toRadians(180));
-            graphics.translate(-centerX, -centerY);
+        XSLFTextShape otherTS = (XSLFTextShape)other;
+        CTTextBody otherTB = otherTS.getTextBody(false);
+        CTTextBody thisTB = getTextBody(true);
+        if (otherTB == null) {
+            return;
         }
+        
+        thisTB.setBodyPr((CTTextBodyProperties)otherTB.getBodyPr().copy());
 
-        // Horizontal flipping applies only to shape outline and not to the text in the shape.
-        // Applying flip second time restores the original not-flipped transform
-        if(getFlipHorizontal()){
-            graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
-            graphics.scale(-1, 1);
-            graphics.translate(-anchor.getX() , -anchor.getY());
+        if (thisTB.isSetLstStyle()) thisTB.unsetLstStyle();
+        if (otherTB.isSetLstStyle()) {
+            thisTB.setLstStyle((CTTextListStyle)otherTB.getLstStyle().copy());
         }
-
-
-        // first dry-run to calculate the total height of the text
-        double textHeight = getTextHeight();
-
-        switch (getVerticalAlignment()){
-            case TOP:
-                y += getTopInset();
-                break;
-            case BOTTOM:
-                y += anchor.getHeight() - textHeight - getBottomInset();
-                break;
-            default:
-            case MIDDLE:
-                double delta = anchor.getHeight() - textHeight -
-                        getTopInset() - getBottomInset();
-                y += getTopInset()  + delta/2;
-                break;
-        }
-
-        drawParagraphs(graphics, x, y);
-
-        // restore the transform
-        graphics.setTransform(tx);
-    }
-
-
-    /**
-     * paint the paragraphs starting from top left (x,y)
-     *
-     * @return  the vertical advance, i.e. the cumulative space occupied by the text
-     */
-    private double drawParagraphs(Graphics2D graphics,  double x, double y) {
-        double y0 = y;
-        for(int i = 0; i < _paragraphs.size(); i++){
-            XSLFTextParagraph p = _paragraphs.get(i);
-            List<TextFragment> lines = p.getTextLines();
-
-            if(i > 0 && lines.size() > 0) {
-                // the amount of vertical white space before the paragraph
-                double spaceBefore = p.getSpaceBefore();
-                if(spaceBefore > 0) {
-                    // positive value means percentage spacing of the height of the first line, e.g.
-                    // the higher the first line, the bigger the space before the paragraph
-                    y += spaceBefore*0.01*lines.get(0).getHeight();
-                } else {
-                    // negative value means the absolute spacing in points
-                    y += -spaceBefore;
-                }
-            }
-
-            y += p.draw(graphics, x, y);
-
-            if(i < _paragraphs.size() - 1) {
-                double spaceAfter = p.getSpaceAfter();
-                if(spaceAfter > 0) {
-                    // positive value means percentage spacing of the height of the last line, e.g.
-                    // the higher the last line, the bigger the space after the paragraph
-                    y += spaceAfter*0.01*lines.get(lines.size() - 1).getHeight();
-                } else {
-                    // negative value means the absolute spacing in points
-                    y += -spaceAfter;
-                }
-            }
-        }
-        return y - y0;
-    }
-
-    @Override
-    void copy(XSLFShape sh){
-        super.copy(sh);
-
-        XSLFTextShape tsh = (XSLFTextShape)sh;
-
-        boolean srcWordWrap = tsh.getWordWrap();
+        
+        boolean srcWordWrap = otherTS.getWordWrap();
         if(srcWordWrap != getWordWrap()){
             setWordWrap(srcWordWrap);
         }
 
-        double leftInset = tsh.getLeftInset();
+        double leftInset = otherTS.getLeftInset();
         if(leftInset != getLeftInset()) {
             setLeftInset(leftInset);
         }
-        double rightInset = tsh.getRightInset();
+        double rightInset = otherTS.getRightInset();
         if(rightInset != getRightInset()) {
             setRightInset(rightInset);
         }
-        double topInset = tsh.getTopInset();
+        double topInset = otherTS.getTopInset();
         if(topInset != getTopInset()) {
             setTopInset(topInset);
         }
-        double bottomInset = tsh.getBottomInset();
+        double bottomInset = otherTS.getBottomInset();
         if(bottomInset != getBottomInset()) {
             setBottomInset(bottomInset);
         }
 
-        VerticalAlignment vAlign = tsh.getVerticalAlignment();
+        VerticalAlignment vAlign = otherTS.getVerticalAlignment();
         if(vAlign != getVerticalAlignment()) {
             setVerticalAlignment(vAlign);
         }
 
-        List<XSLFTextParagraph> srcP = tsh.getTextParagraphs();
-        List<XSLFTextParagraph> tgtP = getTextParagraphs();
-        for(int i = 0; i < srcP.size(); i++){
-            XSLFTextParagraph p1 = srcP.get(i);
-            XSLFTextParagraph p2 = tgtP.get(i);
-            p2.copy(p1);
+        clearText();
+        
+        for (XSLFTextParagraph srcP : otherTS.getTextParagraphs()) {
+            XSLFTextParagraph tgtP = addNewTextParagraph();
+            tgtP.copy(srcP);
         }
-
     }
 }
\ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java b/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java
index 76bb085..400c637 100644
--- a/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java
+++ b/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java
@@ -24,12 +24,14 @@
 import org.apache.poi.xslf.usermodel.XSLFSlide;

 

 import javax.imageio.ImageIO;

+

 import java.awt.Color;

 import java.awt.Dimension;

 import java.awt.Graphics2D;

 import java.awt.RenderingHints;

 import java.awt.image.BufferedImage;

 import java.io.FileOutputStream;

+import java.util.List;

 

 /**

  * An utulity to convert slides of a .pptx slide show to a PNG image

@@ -79,11 +81,11 @@
         int width = (int) (pgsize.width * scale);

         int height = (int) (pgsize.height * scale);

 

-        XSLFSlide[] slide = ppt.getSlides();

-        for (int i = 0; i < slide.length; i++) {

+        List<XSLFSlide> slide = ppt.getSlides();

+        for (int i = 0; i < slide.size(); i++) {

             if (slidenum != -1 && slidenum != (i + 1)) continue;

 

-            String title = slide[i].getTitle();

+            String title = slide.get(i).getTitle();

             System.out.println("Rendering slide " + (i + 1) + (title == null ? "" : ": " + title));

 

             BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

@@ -101,7 +103,7 @@
             graphics.scale(scale, scale);

 

             // draw stuff

-            slide[i].draw(graphics);

+            slide.get(i).draw(graphics);

 

             // save the result

             int sep = file.lastIndexOf(".");

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
index 8cf3aca..35f30a3 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
@@ -55,8 +55,8 @@
     public void bug51187() throws Exception {
        XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("51187.pptx");
        
-       assertEquals(1, ss.getSlides().length);
-       XSLFSlide slide = ss.getSlides()[0];
+       assertEquals(1, ss.getSlides().size());
+       XSLFSlide slide = ss.getSlides().get(0);
        
        // Check the relations on it
        // Note - rId3 is a self reference
@@ -71,7 +71,7 @@
        
        // Save and re-load
        ss = XSLFTestDataSamples.writeOutAndReadBack(ss);
-       assertEquals(1, ss.getSlides().length);
+       assertEquals(1, ss.getSlides().size());
        
        slidePart = ss._getXSLFSlideShow().getSlidePart(
              ss._getXSLFSlideShow().getSlideReferences().getSldIdArray(0)
@@ -92,8 +92,8 @@
        XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("with_japanese.pptx");
        
        // Should have one slide
-       assertEquals(1, ss.getSlides().length);
-       XSLFSlide slide = ss.getSlides()[0];
+       assertEquals(1, ss.getSlides().size());
+       XSLFSlide slide = ss.getSlides().get(0);
        
        // Check the relations from this
        List<POIXMLDocumentPart> rels = slide.getRelations();
@@ -142,20 +142,20 @@
         XSLFSlide slide; 
         
         // Should find 4 slides
-        assertEquals(4, ss.getSlides().length);
+        assertEquals(4, ss.getSlides().size());
         
         // Check the text, to see we got them in order
-        slide = ss.getSlides()[0];
+        slide = ss.getSlides().get(0);
         assertContains("POI cannot read this", getSlideText(slide));
         
-        slide = ss.getSlides()[1];
+        slide = ss.getSlides().get(1);
         assertContains("POI can read this", getSlideText(slide));
         assertContains("Has a relationship to another slide", getSlideText(slide));
         
-        slide = ss.getSlides()[2];
+        slide = ss.getSlides().get(2);
         assertContains("POI can read this", getSlideText(slide));
         
-        slide = ss.getSlides()[3];
+        slide = ss.getSlides().get(3);
         assertContains("POI can read this", getSlideText(slide));
     }
     
@@ -202,7 +202,7 @@
         
         Dimension pgsize = ss.getPageSize();
         
-        XSLFSlide slide = ss.getSlides()[0];
+        XSLFSlide slide = ss.getSlides().get(0);
         
         // render it
         double zoom = 1;
@@ -272,9 +272,9 @@
         }
         
         // Slide starts with just layout relation
-        XSLFSlide slide = ss.getSlides()[0];
+        XSLFSlide slide = ss.getSlides().get(0);
         assertEquals(0, ss.getAllPictures().size());
-        assertEquals(1, slide.getShapes().length);
+        assertEquals(1, slide.getShapes().size());
         
         assertEquals(1, slide.getRelations().size());
         assertRelationEquals(XSLFRelation.SLIDE_LAYOUT, slide.getRelations().get(0));
@@ -296,11 +296,11 @@
             XSLFPictureShape shape = slide.createPicture(idx);
             assertNotNull(shape.getPictureData());
             assertArrayEquals(pics[i], shape.getPictureData().getData());
-            assertEquals(i+2, slide.getShapes().length);
+            assertEquals(i+2, slide.getShapes().size());
         }
         // Re-fetch the pictures and check
         for (int i=0; i<10; i++) {
-            XSLFPictureShape shape = (XSLFPictureShape)slide.getShapes()[i+1];
+            XSLFPictureShape shape = (XSLFPictureShape)slide.getShapes().get(i+1);
             assertNotNull(shape.getPictureData());
             assertArrayEquals(pics[i], shape.getPictureData().getData());
         }
@@ -314,11 +314,11 @@
             XSLFPictureShape shape = slide.createPicture(idx);
             assertNotNull(shape.getPictureData());
             assertArrayEquals(pics[i], shape.getPictureData().getData());
-            assertEquals(i+2, slide.getShapes().length);
+            assertEquals(i+2, slide.getShapes().size());
         }
         // Check all pictures
         for (int i=0; i<15; i++) {
-            XSLFPictureShape shape = (XSLFPictureShape)slide.getShapes()[i+1];
+            XSLFPictureShape shape = (XSLFPictureShape)slide.getShapes().get(i+1);
             assertNotNull(shape.getPictureData());
             assertArrayEquals(pics[i], shape.getPictureData().getData());
         }
@@ -331,22 +331,22 @@
         XSLFPictureShape shape = slide.createPicture(idx);
         assertNotNull(shape.getPictureData());
         assertArrayEquals(pics[3], shape.getPictureData().getData());
-        assertEquals(17, slide.getShapes().length);
+        assertEquals(17, slide.getShapes().size());
         
         
         // Save and re-load
         ss = XSLFTestDataSamples.writeOutAndReadBack(ss);
-        slide = ss.getSlides()[0];
+        slide = ss.getSlides().get(0);
         
         // Check the 15 individual ones added
         for (int i=0; i<15; i++) {
-            shape = (XSLFPictureShape)slide.getShapes()[i+1];
+            shape = (XSLFPictureShape)slide.getShapes().get(i+1);
             assertNotNull(shape.getPictureData());
             assertArrayEquals(pics[i], shape.getPictureData().getData());
         }
         
         // Check the duplicate
-        shape = (XSLFPictureShape)slide.getShapes()[16];
+        shape = (XSLFPictureShape)slide.getShapes().get(16);
         assertNotNull(shape.getPictureData());
         assertArrayEquals(pics[3], shape.getPictureData().getData());
         
@@ -358,7 +358,7 @@
         shape = slide.createPicture(idx);
         assertNotNull(shape.getPictureData());
         assertArrayEquals(pics[5], shape.getPictureData().getData());
-        assertEquals(18, slide.getShapes().length);
+        assertEquals(18, slide.getShapes().size());
     }
 
     private void validateSlides(XMLSlideShow ss, boolean saveAndReload, String... slideTexts) {
@@ -366,10 +366,10 @@
             ss = XSLFTestDataSamples.writeOutAndReadBack(ss);
         }
 
-        assertEquals(slideTexts.length, ss.getSlides().length);
+        assertEquals(slideTexts.length, ss.getSlides().size());
 
         for (int i = 0; i < slideTexts.length; i++) {
-            XSLFSlide slide = ss.getSlides()[i];
+            XSLFSlide slide = ss.getSlides().get(i);
             assertContains(getSlideText(slide), slideTexts[i]);
         }
     }
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java b/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java
index 47d2277..36d4247 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/geom/TestFormulaParser.java
@@ -18,19 +18,19 @@
  */
 package org.apache.poi.xslf.geom;
 
-import junit.framework.TestCase;
-import org.apache.poi.xslf.model.geom.Context;
-import org.apache.poi.xslf.model.geom.CustomGeometry;
-import org.apache.poi.xslf.model.geom.Formula;
-import org.apache.poi.xslf.model.geom.Guide;
-import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.poi.sl.draw.binding.CTCustomGeometry2D;
+import org.apache.poi.sl.draw.geom.*;
+import org.junit.Test;
 
 /**
  * Date: 10/24/11
  *
  * @author Yegor Kozlov
  */
-public class TestFormulaParser extends TestCase {
+public class TestFormulaParser {
+    @Test
     public void testParse(){
 
         Formula[] ops = {
@@ -44,18 +44,18 @@
             new Guide("a5", "abs -2"),
         };
 
-        CustomGeometry geom = new CustomGeometry(CTCustomGeometry2D.Factory.newInstance());
+        CustomGeometry geom = new CustomGeometry(new CTCustomGeometry2D());
         Context ctx = new Context(geom, null, null);
         for(Formula fmla : ops) {
             ctx.evaluate(fmla);
         }
 
-        assertEquals(100.0, ctx.getValue("adj1"));
-        assertEquals(200.0, ctx.getValue("adj2"));
-        assertEquals(1.0, ctx.getValue("a1"));
-        assertEquals(101.0, ctx.getValue("a2"));
-        assertEquals(1.5, ctx.getValue("a3"));
-        assertEquals(200.0, ctx.getValue("a4"));
-        assertEquals(2.0, ctx.getValue("a5"));
+        assertEquals(100.0, ctx.getValue("adj1"), 0.0);
+        assertEquals(200.0, ctx.getValue("adj2"), 0.0);
+        assertEquals(1.0, ctx.getValue("a1"), 0.0);
+        assertEquals(101.0, ctx.getValue("a2"), 0.0);
+        assertEquals(1.5, ctx.getValue("a3"), 0.0);
+        assertEquals(200.0, ctx.getValue("a4"), 0.0);
+        assertEquals(2.0, ctx.getValue("a5"), 0.0);
     }
 }
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java b/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java
index 50a6666..5001dc8 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/geom/TestPresetGeometries.java
@@ -18,24 +18,23 @@
  */
 package org.apache.poi.xslf.geom;
 
-import junit.framework.TestCase;
-import org.apache.poi.xslf.model.geom.Context;
-import org.apache.poi.xslf.model.geom.CustomGeometry;
-import org.apache.poi.xslf.model.geom.Guide;
-import org.apache.poi.xslf.model.geom.IAdjustableShape;
-import org.apache.poi.xslf.model.geom.Path;
-import org.apache.poi.xslf.model.geom.PresetGeometries;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 import java.awt.geom.GeneralPath;
 import java.awt.geom.Rectangle2D;
 import java.util.Map;
 
+import org.apache.poi.sl.draw.geom.*;
+import org.junit.Test;
+
 /**
  * Date: 10/24/11
  *
  * @author Yegor Kozlov
  */
-public class TestPresetGeometries extends TestCase {
+public class TestPresetGeometries {
+    @Test
     public void testRead(){
 
         Map<String, CustomGeometry> shapes = PresetGeometries.getInstance();
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java
index 7908999..4b08322 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java
@@ -22,10 +22,13 @@
 import java.awt.Dimension;

 import java.awt.Graphics2D;

 import java.awt.image.BufferedImage;

+import java.io.File;

 import java.util.HashMap;

 import java.util.Map;

 

-import org.apache.poi.sl.usermodel.TextPainter;

+import javax.imageio.ImageIO;

+

+import org.apache.poi.sl.draw.Drawable;

 import org.apache.poi.util.JvmBugs;

 import org.apache.poi.xslf.XSLFTestDataSamples;

 import org.junit.Test;

@@ -37,18 +40,19 @@
  */

 public class TestPPTX2PNG {

     @Test

-    public void render(){

-        String[] testFiles = {"layouts.pptx", "sample.pptx", "shapes.pptx",

-                "themes.pptx", "backgrounds.pptx"};

+    public void render() throws Exception {

+        String[] testFiles = {"backgrounds.pptx","layouts.pptx", "sample.pptx", "shapes.pptx", "themes.pptx",};

         for(String sampleFile : testFiles){

             XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument(sampleFile);

             Dimension pg = pptx.getPageSize();

+            int slideNo=1;

             for(XSLFSlide slide : pptx.getSlides()){

-                BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB);

+                BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_ARGB);

                 Graphics2D graphics = img.createGraphics();

                 fixFonts(graphics);

                 slide.draw(graphics);

-

+                // ImageIO.write(img, "PNG", new File("build/tmp/"+sampleFile.replaceFirst(".pptx?", "-")+slideNo+".png"));

+                slideNo++;

             }

         }

     }

@@ -56,10 +60,10 @@
     @SuppressWarnings("unchecked")

     private void fixFonts(Graphics2D graphics) {

         if (!JvmBugs.hasLineBreakMeasurerBug()) return;

-        Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(TextPainter.KEY_FONTMAP);

+        Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(Drawable.FONT_MAP);

         if (fontMap == null) fontMap = new HashMap<String,String>();

         fontMap.put("Calibri", "Lucida Sans");

         fontMap.put("Cambria", "Lucida Bright");

-        graphics.setRenderingHint(TextPainter.KEY_FONTMAP, fontMap);        

+        graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);        

     }

 }

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java
index 604f68f..5b615ee 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXMLSlideShow.java
@@ -16,23 +16,25 @@
 ==================================================================== */
 package org.apache.poi.xslf.usermodel;
 
-import junit.framework.TestCase;
+import static org.junit.Assert.*;
 
 import org.apache.poi.POIDataSamples;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackagePart;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesMasterIdListEntry;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry;
-import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideMasterIdListEntry;
+import org.junit.Before;
+import org.junit.Test;
+import org.openxmlformats.schemas.presentationml.x2006.main.*;
 
-public class TestXMLSlideShow extends TestCase {
+public class TestXMLSlideShow {
    private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
    private OPCPackage pack;
 
-   protected void setUp() throws Exception {
+   @Before
+   public void setUp() throws Exception {
       pack = OPCPackage.open(slTests.openResourceAsStream("sample.pptx"));
    }
 
+   @Test
    public void testContainsMainContentType() throws Exception {
       boolean found = false;
       for(PackagePart part : pack.getParts()) {
@@ -43,6 +45,7 @@
       assertTrue(found);
    }
 
+   @Test
    public void testOpen() throws Exception {
       XMLSlideShow xml;
 
@@ -52,22 +55,20 @@
       assertNotNull(xml.getCTPresentation());
 
       // Check it has some slides
-      assertNotNull(xml.getSlides().length);
-      assertTrue(xml.getSlides().length > 0);
-
-      assertNotNull(xml.getSlideMasters().length);
-      assertTrue(xml.getSlideMasters().length > 0);
+      assertFalse(xml.getSlides().isEmpty());
+      assertFalse(xml.getSlideMasters().isEmpty());
    }
 
+   @Test
    @SuppressWarnings("deprecation")
    public void testSlideBasics() throws Exception {
       XMLSlideShow xml = new XMLSlideShow(pack);
 
       // Should have 1 master
-      assertEquals(1, xml.getSlideMasters().length);
+      assertEquals(1, xml.getSlideMasters().size());
 
       // Should have two sheets
-      assertEquals(2, xml.getSlides().length);
+      assertEquals(2, xml.getSlides().size());
 
       // Check they're as expected
       CTSlideIdListEntry[] slides = xml.getCTPresentation().getSldIdLst().getSldIdArray();
@@ -78,19 +79,19 @@
       assertEquals("rId3", slides[1].getId2());
 
       // Now get those objects
-      assertNotNull(xml.getSlides()[0]);
-      assertNotNull(xml.getSlides()[1]);
+      assertNotNull(xml.getSlides().get(0));
+      assertNotNull(xml.getSlides().get(1));
 
       // And check they have notes as expected
-      assertNotNull(xml.getSlides()[0].getNotes());
-      assertNotNull(xml.getSlides()[1].getNotes());
+      assertNotNull(xml.getSlides().get(0).getNotes());
+      assertNotNull(xml.getSlides().get(1).getNotes());
 
       // Next up look for the slide master
       CTSlideMasterIdListEntry[] masters = xml.getCTPresentation().getSldMasterIdLst().getSldMasterIdArray();
 
       assertEquals(2147483648l, masters[0].getId());
       assertEquals("rId1", masters[0].getId2());
-      assertNotNull(xml.getSlideMasters()[0]);
+      assertNotNull(xml.getSlideMasters().get(0));
 
       // Finally look for the notes master
       CTNotesMasterIdListEntry notesMaster =
@@ -100,6 +101,7 @@
       assertNotNull(xml.getNotesMaster());
    }
 	
+   @Test
    public void testMetadataBasics() throws Exception {
       XMLSlideShow xml = new XMLSlideShow(pack);
 
@@ -114,6 +116,7 @@
       assertEquals(null, xml.getProperties().getCoreProperties().getUnderlyingProperties().getSubjectProperty().getValue());
    }
    
+   @Test
    public void testComments() throws Exception {
       // Default sample file has none
       XMLSlideShow xml = new XMLSlideShow(pack);
@@ -134,8 +137,9 @@
       assertEquals("XPVMWARE01", xmlComments.getCommentAuthors().getAuthorById(0).getName());
       
       // First two slides have comments
-      for (int i=0; i<xmlComments.getSlides().length; i++) {
-         XSLFSlide slide = xmlComments.getSlides()[i];
+      int i = -1;
+      for (XSLFSlide slide : xmlComments.getSlides()) {
+         i++;
          
          if(i == 0) {
             assertNotNull(slide.getComments());
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java
index 922d25f..7accdfd 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java
@@ -16,15 +16,22 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.*;

+

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;

+import org.apache.poi.sl.usermodel.TextShape.TextAutofit;

+import org.apache.poi.sl.usermodel.TextShape.TextDirection;

 import org.apache.poi.util.Units;

+import org.junit.Test;

 import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType;

 import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;

 

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFAutoShape extends TestCase {

+public class TestXSLFAutoShape {

+    @Test

     public void testTextBodyProperies() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -33,38 +40,38 @@
         shape.addNewTextParagraph().addNewTextRun().setText("POI");

 

         // default margins from slide master

-        assertEquals(3.6, shape.getBottomInset());

-        assertEquals(3.6, shape.getTopInset());

-        assertEquals(7.2, shape.getLeftInset());

-        assertEquals(7.2, shape.getRightInset());

+        assertEquals(3.6, shape.getBottomInset(), 0);

+        assertEquals(3.6, shape.getTopInset(), 0);

+        assertEquals(7.2, shape.getLeftInset(), 0);

+        assertEquals(7.2, shape.getRightInset(), 0);

 

         shape.setBottomInset(1.0);

-        assertEquals(1.0, shape.getBottomInset());

+        assertEquals(1.0, shape.getBottomInset(), 0);

         shape.setTopInset(2.0);

-        assertEquals(2.0, shape.getTopInset());

+        assertEquals(2.0, shape.getTopInset(), 0);

         shape.setLeftInset(3.0);

-        assertEquals(3.0, shape.getLeftInset());

+        assertEquals(3.0, shape.getLeftInset(), 0);

         shape.setRightInset(4.0);

-        assertEquals(4.0, shape.getRightInset());

+        assertEquals(4.0, shape.getRightInset(), 0);

 

         shape.setBottomInset(0.0);

-        assertEquals(0.0, shape.getBottomInset());

+        assertEquals(0.0, shape.getBottomInset(), 0);

         shape.setTopInset(0.0);

-        assertEquals(0.0, shape.getTopInset());

+        assertEquals(0.0, shape.getTopInset(), 0);

         shape.setLeftInset(0.0);

-        assertEquals(0.0, shape.getLeftInset());

+        assertEquals(0.0, shape.getLeftInset(), 0);

         shape.setRightInset(0.0);

-        assertEquals(0.0, shape.getRightInset());

+        assertEquals(0.0, shape.getRightInset(), 0);

 

         // unset to defauls

         shape.setBottomInset(-1);

-        assertEquals(3.6, shape.getBottomInset());

+        assertEquals(3.6, shape.getBottomInset(), 0);

         shape.setTopInset(-1);

-        assertEquals(3.6, shape.getTopInset());

+        assertEquals(3.6, shape.getTopInset(), 0);

         shape.setLeftInset(-1);

-        assertEquals(7.2, shape.getLeftInset());

+        assertEquals(7.2, shape.getLeftInset(), 0);

         shape.setRightInset(-1);

-        assertEquals(7.2, shape.getRightInset());

+        assertEquals(7.2, shape.getRightInset(), 0);

 

         // shape

         assertTrue(shape.getWordWrap());

@@ -97,88 +104,89 @@
         assertEquals(TextDirection.HORIZONTAL, shape.getTextDirection());

     }

 

+    @Test

     public void testTextParagraph() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

-        assertEquals(0, slide.getShapes().length);

+        assertTrue(slide.getShapes().isEmpty());

 

         XSLFAutoShape shape = slide.createAutoShape();

         assertEquals(0, shape.getTextParagraphs().size());

         XSLFTextParagraph p = shape.addNewTextParagraph();

         assertEquals(1, shape.getTextParagraphs().size());

 

-        assertEquals(0., p.getIndent());

-        assertEquals(0., p.getLeftMargin());

-        assertEquals(100., p.getLineSpacing());

-        assertEquals(0., p.getSpaceAfter());

-        assertEquals(0., p.getSpaceBefore());

-        assertEquals(0, p.getLevel());

+        assertNull(p.getIndent());

+        assertEquals(0, p.getLeftMargin(), 0);

+        assertNull(p.getLineSpacing());

+        assertNull(p.getSpaceAfter());

+        assertNull(p.getSpaceBefore());

+        assertEquals(0, p.getIndentLevel());

 

         p.setIndent(2.0);

-        assertEquals(2.0, p.getIndent());

+        assertEquals(2.0, p.getIndent(), 0);

         assertTrue(p.getXmlObject().getPPr().isSetIndent());

-        p.setIndent(-1);

-        assertEquals(0.0, p.getIndent());

+        p.setIndent(null);

+        assertNull(p.getIndent());

         assertFalse(p.getXmlObject().getPPr().isSetIndent());

         p.setIndent(10.0);

-        assertEquals(10., p.getIndent());

+        assertEquals(10., p.getIndent(), 0);

         assertTrue(p.getXmlObject().getPPr().isSetIndent());

 

 

         assertFalse(p.getXmlObject().getPPr().isSetLvl());

-        p.setLevel(1);

-        assertEquals(1, p.getLevel());

+        p.setIndentLevel(1);

+        assertEquals(1, p.getIndentLevel());

         assertTrue(p.getXmlObject().getPPr().isSetLvl());

-        p.setLevel(2);

-        assertEquals(2, p.getLevel());

+        p.setIndentLevel(2);

+        assertEquals(2, p.getIndentLevel());

 

         p.setLeftMargin(2.0);

-        assertEquals(2.0, p.getLeftMargin());

+        assertEquals(2.0, p.getLeftMargin(), 0);

         assertTrue(p.getXmlObject().getPPr().isSetMarL());

         p.setLeftMargin(10.0);

-        assertEquals(10., p.getLeftMargin());

+        assertEquals(10., p.getLeftMargin(), 0);

         assertEquals(Units.toEMU(10), p.getXmlObject().getPPr().getMarL());

 

 

         assertFalse(p.getXmlObject().getPPr().isSetSpcAft());

-        p.setSpaceAfter(200);

+        p.setSpaceAfter(200d);

         assertEquals(200000, p.getXmlObject().getPPr().getSpcAft().getSpcPct().getVal());

         assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPts());

-        p.setSpaceAfter(100);

+        p.setSpaceAfter(100d);

         assertEquals(100000, p.getXmlObject().getPPr().getSpcAft().getSpcPct().getVal());

         assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPts());

-        p.setSpaceAfter(-20);

+        p.setSpaceAfter(-20d);

         assertEquals(2000, p.getXmlObject().getPPr().getSpcAft().getSpcPts().getVal());

         assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPct());

-        p.setSpaceAfter(-10);

+        p.setSpaceAfter(-10d);

         assertEquals(1000, p.getXmlObject().getPPr().getSpcAft().getSpcPts().getVal());

         assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPct());

 

         assertFalse(p.getXmlObject().getPPr().isSetSpcBef());

-        p.setSpaceBefore(200);

+        p.setSpaceBefore(200d);

         assertEquals(200000, p.getXmlObject().getPPr().getSpcBef().getSpcPct().getVal());

         assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPts());

-        p.setSpaceBefore(100);

+        p.setSpaceBefore(100d);

         assertEquals(100000, p.getXmlObject().getPPr().getSpcBef().getSpcPct().getVal());

         assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPts());

-        p.setSpaceBefore(-20);

+        p.setSpaceBefore(-20d);

         assertEquals(2000, p.getXmlObject().getPPr().getSpcBef().getSpcPts().getVal());

         assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPct());

-        p.setSpaceBefore(-10);

+        p.setSpaceBefore(-10d);

         assertEquals(1000, p.getXmlObject().getPPr().getSpcBef().getSpcPts().getVal());

         assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPct());

 

         assertFalse(p.getXmlObject().getPPr().isSetLnSpc());

-        p.setLineSpacing(200);

+        p.setLineSpacing(200d);

         assertEquals(200000, p.getXmlObject().getPPr().getLnSpc().getSpcPct().getVal());

         assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPts());

-        p.setLineSpacing(100);

+        p.setLineSpacing(100d);

         assertEquals(100000, p.getXmlObject().getPPr().getLnSpc().getSpcPct().getVal());

         assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPts());

-        p.setLineSpacing(-20);

+        p.setLineSpacing(-20d);

         assertEquals(2000, p.getXmlObject().getPPr().getLnSpc().getSpcPts().getVal());

         assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPct());

-        p.setLineSpacing(-10);

+        p.setLineSpacing(-10d);

         assertEquals(1000, p.getXmlObject().getPPr().getLnSpc().getSpcPts().getVal());

         assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPct());

 

@@ -196,6 +204,7 @@
         assertFalse(p.getXmlObject().getPPr().isSetAlgn());

     }

 

+    @Test

     public void testTextRun() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -209,14 +218,14 @@
         assertEquals(1, p.getTextRuns().size());

         assertSame(r, p.getTextRuns().get(0));

 

-        assertEquals(18.0, r.getFontSize()); // default font size for text boxes

+        assertEquals(18.0, r.getFontSize(), 0); // default font size for text boxes

         assertFalse(r.getXmlObject().getRPr().isSetSz());

         r.setFontSize(10.0);

         assertTrue(r.getXmlObject().isSetRPr());

         assertEquals(1000, r.getXmlObject().getRPr().getSz());

         r.setFontSize(12.5);

         assertEquals(1250, r.getXmlObject().getRPr().getSz());

-        r.setFontSize(-1);

+        r.setFontSize(null);

         assertFalse(r.getXmlObject().getRPr().isSetSz());

 

         assertFalse(r.getXmlObject().getRPr().isSetLatin());

@@ -251,31 +260,33 @@
         assertTrue(r.isItalic());

         assertEquals(true, r.getXmlObject().getRPr().getI());

 

-        assertFalse(r.isUnderline());

+        assertFalse(r.isUnderlined());

         assertFalse(r.getXmlObject().getRPr().isSetU());

         r.setUnderline(true);

-        assertTrue(r.isUnderline());

+        assertTrue(r.isUnderlined());

         assertEquals(STTextUnderlineType.SNG, r.getXmlObject().getRPr().getU());

 

         r.setText("Apache");

-        assertEquals("Apache", r.getText());

+        assertEquals("Apache", r.getRawText());

         r.setText("POI");

-        assertEquals("POI", r.getText());

+        assertEquals("POI", r.getRawText());

         r.setText(null);

-        assertNull(r.getText());

+        assertNull(r.getRawText());

     }

 

+    @Test

     public void testShapeType() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

 

         XSLFAutoShape shape = slide.createAutoShape();

-        assertEquals(XSLFShapeType.RECT, shape.getShapeType());

+        assertEquals(ShapeType.RECT, shape.getShapeType());

 

-        shape.setShapeType(XSLFShapeType.TRIANGLE);

-        assertEquals(XSLFShapeType.TRIANGLE, shape.getShapeType());

+        shape.setShapeType(ShapeType.TRIANGLE);

+        assertEquals(ShapeType.TRIANGLE, shape.getShapeType());

 

-        for(XSLFShapeType tp : XSLFShapeType.values()) {

+        for(ShapeType tp : ShapeType.values()) {

+            if (tp.ooxmlId == -1 || tp == ShapeType.SEAL) continue;

             shape.setShapeType(tp);

             assertEquals(tp, shape.getShapeType());

         }

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFChart.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFChart.java
index 941c44b..02fa668 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFChart.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFChart.java
@@ -46,7 +46,7 @@
         String chartTitle = "Apache POI";  // first line is chart title

 

         XMLSlideShow pptx = XSLFTestDataSamples.openSampleDocument("pie-chart.pptx");

-        XSLFSlide slide = pptx.getSlides()[0];

+        XSLFSlide slide = pptx.getSlides().get(0);

 

         // find chart in the slide

         XSLFChart chart = null;

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java
index 98240b0..beed207 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java
@@ -16,108 +16,117 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertFalse;

+

+import java.awt.Color;

+import java.awt.Rectangle;

+

+import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape;

+import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;

+import org.apache.poi.sl.usermodel.*;

+import org.junit.Test;

 import org.openxmlformats.schemas.drawingml.x2006.main.*;

 import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;

 

-import java.awt.*;

-

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFConnectorShape extends TestCase {

+public class TestXSLFConnectorShape {

 

+    @Test

     public void testLineDecorations() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

 

         XSLFConnectorShape shape = slide.createConnector();

-        assertEquals(1, slide.getShapes().length);

+        assertEquals(1, slide.getShapes().size());

 

         assertFalse(shape.getSpPr().getLn().isSetHeadEnd());

         assertFalse(shape.getSpPr().getLn().isSetTailEnd());

 

         // line decorations

-        assertEquals(LineDecoration.NONE, shape.getLineHeadDecoration());

-        assertEquals(LineDecoration.NONE, shape.getLineTailDecoration());

+        assertEquals(DecorationShape.NONE, shape.getLineHeadDecoration());

+        assertEquals(DecorationShape.NONE, shape.getLineTailDecoration());

         shape.setLineHeadDecoration(null);

         shape.setLineTailDecoration(null);

-        assertEquals(LineDecoration.NONE, shape.getLineHeadDecoration());

-        assertEquals(LineDecoration.NONE, shape.getLineTailDecoration());

+        assertEquals(DecorationShape.NONE, shape.getLineHeadDecoration());

+        assertEquals(DecorationShape.NONE, shape.getLineTailDecoration());

         assertFalse(shape.getSpPr().getLn().getHeadEnd().isSetType());

         assertFalse(shape.getSpPr().getLn().getTailEnd().isSetType());

 

-        shape.setLineHeadDecoration(LineDecoration.ARROW);

-        shape.setLineTailDecoration(LineDecoration.DIAMOND);

-        assertEquals(LineDecoration.ARROW, shape.getLineHeadDecoration());

-        assertEquals(LineDecoration.DIAMOND, shape.getLineTailDecoration());

+        shape.setLineHeadDecoration(DecorationShape.ARROW);

+        shape.setLineTailDecoration(DecorationShape.DIAMOND);

+        assertEquals(DecorationShape.ARROW, shape.getLineHeadDecoration());

+        assertEquals(DecorationShape.DIAMOND, shape.getLineTailDecoration());

         assertEquals(STLineEndType.ARROW, shape.getSpPr().getLn().getHeadEnd().getType());

         assertEquals(STLineEndType.DIAMOND, shape.getSpPr().getLn().getTailEnd().getType());

 

-        shape.setLineHeadDecoration(LineDecoration.DIAMOND);

-        shape.setLineTailDecoration(LineDecoration.ARROW);

-        assertEquals(LineDecoration.DIAMOND, shape.getLineHeadDecoration());

-        assertEquals(LineDecoration.ARROW, shape.getLineTailDecoration());

+        shape.setLineHeadDecoration(DecorationShape.DIAMOND);

+        shape.setLineTailDecoration(DecorationShape.ARROW);

+        assertEquals(DecorationShape.DIAMOND, shape.getLineHeadDecoration());

+        assertEquals(DecorationShape.ARROW, shape.getLineTailDecoration());

         assertEquals(STLineEndType.DIAMOND, shape.getSpPr().getLn().getHeadEnd().getType());

         assertEquals(STLineEndType.ARROW, shape.getSpPr().getLn().getTailEnd().getType());

 

         // line end width

-        assertEquals(LineEndWidth.MEDIUM, shape.getLineHeadWidth());

-        assertEquals(LineEndWidth.MEDIUM, shape.getLineTailWidth());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineHeadWidth());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineTailWidth());

         shape.setLineHeadWidth(null);

         shape.setLineHeadWidth(null);

-        assertEquals(LineEndWidth.MEDIUM, shape.getLineHeadWidth());

-        assertEquals(LineEndWidth.MEDIUM, shape.getLineTailWidth());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineHeadWidth());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineTailWidth());

         assertFalse(shape.getSpPr().getLn().getHeadEnd().isSetW());

         assertFalse(shape.getSpPr().getLn().getTailEnd().isSetW());

-        shape.setLineHeadWidth(LineEndWidth.LARGE);

-        shape.setLineTailWidth(LineEndWidth.MEDIUM);

-        assertEquals(LineEndWidth.LARGE, shape.getLineHeadWidth());

-        assertEquals(LineEndWidth.MEDIUM, shape.getLineTailWidth());

+        shape.setLineHeadWidth(DecorationSize.LARGE);

+        shape.setLineTailWidth(DecorationSize.MEDIUM);

+        assertEquals(DecorationSize.LARGE, shape.getLineHeadWidth());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineTailWidth());

         assertEquals(STLineEndWidth.LG, shape.getSpPr().getLn().getHeadEnd().getW());

         assertEquals(STLineEndWidth.MED, shape.getSpPr().getLn().getTailEnd().getW());

-        shape.setLineHeadWidth(LineEndWidth.MEDIUM);

-        shape.setLineTailWidth(LineEndWidth.LARGE);

-        assertEquals(LineEndWidth.MEDIUM, shape.getLineHeadWidth());

-        assertEquals(LineEndWidth.LARGE, shape.getLineTailWidth());

+        shape.setLineHeadWidth(DecorationSize.MEDIUM);

+        shape.setLineTailWidth(DecorationSize.LARGE);

+        assertEquals(DecorationSize.MEDIUM, shape.getLineHeadWidth());

+        assertEquals(DecorationSize.LARGE, shape.getLineTailWidth());

         assertEquals(STLineEndWidth.MED, shape.getSpPr().getLn().getHeadEnd().getW());

         assertEquals(STLineEndWidth.LG, shape.getSpPr().getLn().getTailEnd().getW());

 

         // line end length

-        assertEquals(LineEndLength.MEDIUM, shape.getLineHeadLength());

-        assertEquals(LineEndLength.MEDIUM, shape.getLineTailLength());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineHeadLength());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineTailLength());

         shape.setLineHeadLength(null);

         shape.setLineTailLength(null);

-        assertEquals(LineEndLength.MEDIUM, shape.getLineHeadLength());

-        assertEquals(LineEndLength.MEDIUM, shape.getLineTailLength());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineHeadLength());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineTailLength());

         assertFalse(shape.getSpPr().getLn().getHeadEnd().isSetLen());

         assertFalse(shape.getSpPr().getLn().getTailEnd().isSetLen());

-        shape.setLineHeadLength(LineEndLength.LARGE);

-        shape.setLineTailLength(LineEndLength.MEDIUM);

-        assertEquals(LineEndLength.LARGE, shape.getLineHeadLength());

-        assertEquals(LineEndLength.MEDIUM, shape.getLineTailLength());

+        shape.setLineHeadLength(DecorationSize.LARGE);

+        shape.setLineTailLength(DecorationSize.MEDIUM);

+        assertEquals(DecorationSize.LARGE, shape.getLineHeadLength());

+        assertEquals(DecorationSize.MEDIUM, shape.getLineTailLength());

         assertEquals(STLineEndLength.LG, shape.getSpPr().getLn().getHeadEnd().getLen());

         assertEquals(STLineEndLength.MED, shape.getSpPr().getLn().getTailEnd().getLen());

-        shape.setLineHeadLength(LineEndLength.MEDIUM);

-        shape.setLineTailLength(LineEndLength.LARGE);

-        assertEquals(LineEndLength.MEDIUM, shape.getLineHeadLength());

-        assertEquals(LineEndLength.LARGE, shape.getLineTailLength());

+        shape.setLineHeadLength(DecorationSize.MEDIUM);

+        shape.setLineTailLength(DecorationSize.LARGE);

+        assertEquals(DecorationSize.MEDIUM, shape.getLineHeadLength());

+        assertEquals(DecorationSize.LARGE, shape.getLineTailLength());

         assertEquals(STLineEndLength.MED, shape.getSpPr().getLn().getHeadEnd().getLen());

         assertEquals(STLineEndLength.LG, shape.getSpPr().getLn().getTailEnd().getLen());

 

     }

 

+    @Test

     public void testAddConnector(){

         XMLSlideShow pptx = new XMLSlideShow();

         XSLFSlide slide = pptx.createSlide();

 

         XSLFAutoShape rect1 = slide.createAutoShape();

-        rect1.setShapeType(XSLFShapeType.RECT);

+        rect1.setShapeType(ShapeType.RECT);

         rect1.setAnchor(new Rectangle(100, 100, 100, 100));

         rect1.setFillColor(Color.blue);

 

         XSLFAutoShape rect2 = slide.createAutoShape();

-        rect2.setShapeType(XSLFShapeType.RECT);

+        rect2.setShapeType(ShapeType.RECT);

         rect2.setAnchor(new Rectangle(300, 300, 100, 100));

         rect2.setFillColor(Color.red);

 

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFFreeformShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFFreeformShape.java
index f212abe..92eb9a7 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFFreeformShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFFreeformShape.java
@@ -16,17 +16,20 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.*;

 

 import java.awt.Rectangle;

 import java.awt.geom.Ellipse2D;

 import java.awt.geom.GeneralPath;

 

+import org.junit.Test;

+

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFFreeformShape extends TestCase {

+public class TestXSLFFreeformShape {

 

+    @Test

     public void testSetPath() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFGroupShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFGroupShape.java
index 7f11ecc..4a6e0ff 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFGroupShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFGroupShape.java
@@ -16,16 +16,19 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.*;

 

 import java.awt.Dimension;

 import java.awt.geom.Rectangle2D;

 

+import org.junit.Test;

+

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFGroupShape extends TestCase {

+public class TestXSLFGroupShape {

 

+    @Test

     public void testCreateShapes() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -33,7 +36,7 @@
         ppt.setPageSize(new Dimension(792, 612));

         

         XSLFGroupShape group = slide.createGroup();

-        assertEquals(1, slide.getShapes().length);

+        assertEquals(1, slide.getShapes().size());

 

         Rectangle2D interior = new Rectangle2D.Double(-10, -10, 20, 20);

         group.setInteriorAnchor(interior);

@@ -43,45 +46,46 @@
         group.setAnchor(anchor);

         assertEquals(anchor, group.getAnchor());

 

-        assertEquals(0, group.getShapes().length);

+        assertTrue(group.getShapes().isEmpty());

 

         XSLFTextBox shape1 = group.createTextBox();

-        assertEquals(1, group.getShapes().length);

-        assertSame(shape1, group.getShapes()[0]);

+        assertEquals(1, group.getShapes().size());

+        assertSame(shape1, group.getShapes().get(0));

         assertEquals(3, shape1.getShapeId());

 

         XSLFAutoShape shape2 = group.createAutoShape();

-        assertEquals(2, group.getShapes().length);

-        assertSame(shape1, group.getShapes()[0]);

-        assertSame(shape2, group.getShapes()[1]);

+        assertEquals(2, group.getShapes().size());

+        assertSame(shape1, group.getShapes().get(0));

+        assertSame(shape2, group.getShapes().get(1));

         assertEquals(4, shape2.getShapeId());

 

         XSLFConnectorShape shape3 = group.createConnector();

-        assertEquals(3, group.getShapes().length);

-        assertSame(shape3, group.getShapes()[2]);

+        assertEquals(3, group.getShapes().size());

+        assertSame(shape3, group.getShapes().get(2));

         assertEquals(5, shape3.getShapeId());

 

         XSLFGroupShape shape4 = group.createGroup();

-        assertEquals(4, group.getShapes().length);

-        assertSame(shape4, group.getShapes()[3]);

+        assertEquals(4, group.getShapes().size());

+        assertSame(shape4, group.getShapes().get(3));

         assertEquals(6, shape4.getShapeId());

 

         group.removeShape(shape2);

-        assertEquals(3, group.getShapes().length);

-        assertSame(shape1, group.getShapes()[0]);

-        assertSame(shape3, group.getShapes()[1]);

-        assertSame(shape4, group.getShapes()[2]);

+        assertEquals(3, group.getShapes().size());

+        assertSame(shape1, group.getShapes().get(0));

+        assertSame(shape3, group.getShapes().get(1));

+        assertSame(shape4, group.getShapes().get(2));

 

         group.removeShape(shape3);

-        assertEquals(2, group.getShapes().length);

-        assertSame(shape1, group.getShapes()[0]);

-        assertSame(shape4, group.getShapes()[1]);

+        assertEquals(2, group.getShapes().size());

+        assertSame(shape1, group.getShapes().get(0));

+        assertSame(shape4, group.getShapes().get(1));

 

         group.removeShape(shape1);

         group.removeShape(shape4);

-        assertEquals(0, group.getShapes().length);

+        assertTrue(group.getShapes().isEmpty());

     }

 

+    @Test

     public void testRemoveShapes() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFHyperlink.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFHyperlink.java
index 33cf322..b919eab 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFHyperlink.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFHyperlink.java
@@ -16,24 +16,29 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertNotNull;

+

+import java.net.URI;

+import java.util.List;

+

 import org.apache.poi.openxml4j.opc.PackageRelationship;

 import org.apache.poi.openxml4j.opc.TargetMode;

 import org.apache.poi.xslf.XSLFTestDataSamples;

-

-import java.net.URI;

+import org.junit.Test;

 

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFHyperlink extends TestCase {

+public class TestXSLFHyperlink {

 

+    @Test

     public void testRead(){

         XMLSlideShow  ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");

 

-        XSLFSlide slide = ppt.getSlides()[4];

-        XSLFShape[] shapes = slide.getShapes();

-        XSLFTable tbl = (XSLFTable)shapes[0];

+        XSLFSlide slide = ppt.getSlides().get(4);

+        List<XSLFShape> shapes = slide.getShapes();

+        XSLFTable tbl = (XSLFTable)shapes.get(0);

         XSLFTableCell cell1 = tbl.getRows().get(1).getCells().get(0);

         assertEquals("Web Page", cell1.getText());

         XSLFHyperlink link1 = cell1.getTextParagraphs().get(0).getTextRuns().get(0).getHyperlink();

@@ -53,6 +58,7 @@
         assertEquals(URI.create("mailto:dev@poi.apache.org?subject=Hi%20There"), link3.getTargetURI());

     }

 

+    @Test

     public void testCreate() throws Exception  {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide1 = ppt.createSlide();

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java
index 955b273..0ec9b97 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java
@@ -16,22 +16,20 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import static org.junit.Assert.assertArrayEquals;

+import static org.junit.Assert.*;

 

-import java.util.HashMap;

-import java.util.List;

-import java.util.Map;

-

-import junit.framework.TestCase;

+import java.util.*;

 

 import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Test;

 import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;

 

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFPictureShape extends TestCase {

+public class TestXSLFPictureShape {

 

+    @Test

     public void testCreate() {

         XMLSlideShow ppt = new XMLSlideShow();

         assertEquals(0, ppt.getAllPictures().size());

@@ -61,11 +59,12 @@
         assertArrayEquals(data1, pics.get(0).getData());

         assertArrayEquals(data2, pics.get(1).getData());

 

-        XSLFShape[] shapes = ppt.getSlides()[0].getShapes();

-        assertArrayEquals(data1, ((XSLFPictureShape) shapes[0]).getPictureData().getData());

-        assertArrayEquals(data2, ((XSLFPictureShape) shapes[1]).getPictureData().getData());

+        List<XSLFShape> shapes = ppt.getSlides().get(0).getShapes();

+        assertArrayEquals(data1, ((XSLFPictureShape) shapes.get(0)).getPictureData().getData());

+        assertArrayEquals(data2, ((XSLFPictureShape) shapes.get(1)).getPictureData().getData());

     }

 

+    @Test

     public void testCreateMultiplePictures() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide1 = ppt.createSlide();

@@ -118,6 +117,7 @@
         }

     }

 

+    @Test

     public void testImageCaching() {

         XMLSlideShow ppt = new XMLSlideShow();

         byte[] img1 = new byte[]{1,2,3};

@@ -137,6 +137,7 @@
 

     }

 

+    @Test

     public void testMerge() {

         XMLSlideShow ppt1 = new XMLSlideShow();

         byte[] data1 = new byte[100];

@@ -150,7 +151,7 @@
         XMLSlideShow ppt2 = new XMLSlideShow();

 

         XSLFSlide slide2 = ppt2.createSlide().importContent(slide1);

-        XSLFPictureShape shape2 = (XSLFPictureShape)slide2.getShapes()[0];

+        XSLFPictureShape shape2 = (XSLFPictureShape)slide2.getShapes().get(0);

 

         assertArrayEquals(data1, shape2.getPictureData().getData());

 

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java
index e6c4728..3983d0b 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java
@@ -16,8 +16,10 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.*;

+

 import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Test;

 import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;

 

 import java.util.List;

@@ -25,17 +27,18 @@
 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFShape extends TestCase {

+public class TestXSLFShape {

 

+    @Test

     public void testReadTextShapes() {

         XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");

-        XSLFSlide[] slides = ppt.getSlides();

+        List<XSLFSlide> slides = ppt.getSlides();

 

-        XSLFSlide slide1 = slides[0];

-        XSLFShape[] shapes1 = slide1.getShapes();

-        assertEquals(7, shapes1.length);

-        assertEquals("TextBox 3", shapes1[0].getShapeName());

-        XSLFAutoShape sh0 = (XSLFAutoShape) shapes1[0];

+        XSLFSlide slide1 = slides.get(0);

+        List<XSLFShape> shapes1 = slide1.getShapes();

+        assertEquals(7, shapes1.size());

+        assertEquals("TextBox 3", shapes1.get(0).getShapeName());

+        XSLFAutoShape sh0 = (XSLFAutoShape) shapes1.get(0);

         assertEquals("Learning PPTX", sh0.getText());

         List<XSLFTextParagraph> paragraphs0 = sh0.getTextParagraphs();

         assertEquals(1, paragraphs0.size());

@@ -43,28 +46,28 @@
         assertEquals("Learning PPTX", p0.getText());

         assertEquals(1, p0.getTextRuns().size());

         XSLFTextRun r0 = p0.getTextRuns().get(0);

-        assertEquals("Learning PPTX", r0.getText());

+        assertEquals("Learning PPTX", r0.getRawText());

 

-        XSLFSlide slide2 = slides[1];

-        XSLFShape[] shapes2 = slide2.getShapes();

-        assertTrue(shapes2[0] instanceof XSLFAutoShape);

-        assertEquals("PPTX Title", ((XSLFAutoShape) shapes2[0]).getText());

-        XSLFAutoShape sh1 = (XSLFAutoShape) shapes2[0];

+        XSLFSlide slide2 = slides.get(1);

+        List<XSLFShape> shapes2 = slide2.getShapes();

+        assertTrue(shapes2.get(0) instanceof XSLFAutoShape);

+        assertEquals("PPTX Title", ((XSLFAutoShape) shapes2.get(0)).getText());

+        XSLFAutoShape sh1 = (XSLFAutoShape) shapes2.get(0);

         List<XSLFTextParagraph> paragraphs1 = sh1.getTextParagraphs();

         assertEquals(1, paragraphs1.size());

         XSLFTextParagraph p1 = paragraphs1.get(0);

         assertEquals("PPTX Title", p1.getText());

         List<XSLFTextRun> r2 = paragraphs1.get(0).getTextRuns();

         assertEquals(2, r2.size());

-        assertEquals("PPTX ", r2.get(0).getText());

-        assertEquals("Title", r2.get(1).getText());

+        assertEquals("PPTX ", r2.get(0).getRawText());

+        assertEquals("Title", r2.get(1).getRawText());

         // Title is underlined

         assertEquals(STTextUnderlineType.SNG, r2.get(1).getXmlObject().getRPr().getU());

 

 

-        assertTrue(shapes2[1] instanceof XSLFAutoShape);

-        assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape) shapes2[1]).getText());

-        XSLFAutoShape sh2 = (XSLFAutoShape) shapes2[1];

+        assertTrue(shapes2.get(1) instanceof XSLFAutoShape);

+        assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape) shapes2.get(1)).getText());

+        XSLFAutoShape sh2 = (XSLFAutoShape) shapes2.get(1);

         List<XSLFTextParagraph> paragraphs2 = sh2.getTextParagraphs();

         assertEquals(2, paragraphs2.size());

         assertEquals("Subtitle", paragraphs2.get(0).getText());

@@ -73,20 +76,20 @@
         assertEquals(1, paragraphs2.get(0).getTextRuns().size());

         assertEquals(1, paragraphs2.get(1).getTextRuns().size());

 

-        assertEquals("Subtitle", paragraphs2.get(0).getTextRuns().get(0).getText());

+        assertEquals("Subtitle", paragraphs2.get(0).getTextRuns().get(0).getRawText());

         assertTrue(paragraphs2.get(0).getTextRuns().get(0).getXmlObject().getRPr().getB());

-        assertEquals("And second line", paragraphs2.get(1).getTextRuns().get(0).getText());

+        assertEquals("And second line", paragraphs2.get(1).getTextRuns().get(0).getRawText());

     }

 

     public void testCreateShapes() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

-        assertEquals(0, slide.getShapes().length);

+        assertTrue(slide.getShapes().isEmpty());

 

         XSLFTextBox textBox = slide.createTextBox();

 

-        assertEquals(1, slide.getShapes().length);

-        assertSame(textBox, slide.getShapes()[0]);

+        assertEquals(1, slide.getShapes().size());

+        assertSame(textBox, slide.getShapes().get(0));

 

         assertEquals("", textBox.getText());

         assertEquals(0, textBox.getTextParagraphs().size());

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java
index 8f8e46d..22bab7c 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShapeContainer.java
@@ -18,35 +18,39 @@
  */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.*;

+

+import org.junit.Test;

 

 /**

  * test common operations on containers of shapes (sheets and groups of shapes)

  *

  * @author Yegor Kozlov

  */

-public class TestXSLFShapeContainer extends TestCase {

+public class TestXSLFShapeContainer {

 

+    @SuppressWarnings("unused")

     public void verifyContainer(XSLFShapeContainer container) {

         container.clear();

-        assertEquals(0, container.getShapes().length);

+        assertEquals(0, container.getShapes().size());

 

         XSLFGroupShape shape1 = container.createGroup();

-        assertEquals(1, container.getShapes().length);

+        assertEquals(1, container.getShapes().size());

 

         XSLFTextBox shape2 = container.createTextBox();

-        assertEquals(2, container.getShapes().length);

+        assertEquals(2, container.getShapes().size());

 

         XSLFAutoShape shape3 = container.createAutoShape();

-        assertEquals(3, container.getShapes().length);

+        assertEquals(3, container.getShapes().size());

 

         XSLFConnectorShape shape4 = container.createConnector();

-        assertEquals(4, container.getShapes().length);

+        assertEquals(4, container.getShapes().size());

 

         container.clear();

-        assertEquals(0, container.getShapes().length);

+        assertEquals(0, container.getShapes().size());

     }

 

+    @Test

     public void testSheet() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSheet sheet = ppt.createSlide();

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSheet.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSheet.java
index d605a05..92c30b6 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSheet.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSheet.java
@@ -16,50 +16,56 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.*;

+

+import java.util.List;

+

 import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Test;

 

 /**

  * test common properties for sheets (slides, masters, layouts, etc.)

  *

  * @author Yegor Kozlov

  */

-public class TestXSLFSheet extends TestCase {

+public class TestXSLFSheet {

+    

+    @Test

     public void testCreateShapes(){

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

-        assertEquals(0, slide.getShapes().length);

+        assertTrue(slide.getShapes().isEmpty());

 

         XSLFSimpleShape shape1 = slide.createAutoShape();

-        assertEquals(1, slide.getShapes().length);

-        assertSame(shape1, slide.getShapes()[0]);

+        assertEquals(1, slide.getShapes().size());

+        assertSame(shape1, slide.getShapes().get(0));

 

         XSLFTextBox shape2 = slide.createTextBox();

-        assertEquals(2, slide.getShapes().length);

-        assertSame(shape1, slide.getShapes()[0]);

-        assertSame(shape2, slide.getShapes()[1]);

+        assertEquals(2, slide.getShapes().size());

+        assertSame(shape1, slide.getShapes().get(0));

+        assertSame(shape2, slide.getShapes().get(1));

 

         XSLFConnectorShape shape3 = slide.createConnector();

-        assertEquals(3, slide.getShapes().length);

-        assertSame(shape1, slide.getShapes()[0]);

-        assertSame(shape2, slide.getShapes()[1]);

-        assertSame(shape3, slide.getShapes()[2]);

+        assertEquals(3, slide.getShapes().size());

+        assertSame(shape1, slide.getShapes().get(0));

+        assertSame(shape2, slide.getShapes().get(1));

+        assertSame(shape3, slide.getShapes().get(2));

 

         XSLFGroupShape shape4 = slide.createGroup();

-        assertEquals(4, slide.getShapes().length);

-        assertSame(shape1, slide.getShapes()[0]);

-        assertSame(shape2, slide.getShapes()[1]);

-        assertSame(shape3, slide.getShapes()[2]);

-        assertSame(shape4, slide.getShapes()[3]);

+        assertEquals(4, slide.getShapes().size());

+        assertSame(shape1, slide.getShapes().get(0));

+        assertSame(shape2, slide.getShapes().get(1));

+        assertSame(shape3, slide.getShapes().get(2));

+        assertSame(shape4, slide.getShapes().get(3));

 

         ppt = XSLFTestDataSamples.writeOutAndReadBack(ppt);

-        slide = ppt.getSlides()[0];

-        XSLFShape[] shapes = slide.getShapes();

-        assertEquals(4, shapes.length);

+        slide = ppt.getSlides().get(0);

+        List<XSLFShape> shapes = slide.getShapes();

+        assertEquals(4, shapes.size());

 

-        assertTrue(shapes[0] instanceof XSLFAutoShape);

-        assertTrue(shapes[1] instanceof XSLFTextBox);

-        assertTrue(shapes[2] instanceof XSLFConnectorShape);

-        assertTrue(shapes[3] instanceof XSLFGroupShape);

+        assertTrue(shapes.get(0) instanceof XSLFAutoShape);

+        assertTrue(shapes.get(1) instanceof XSLFTextBox);

+        assertTrue(shapes.get(2) instanceof XSLFConnectorShape);

+        assertTrue(shapes.get(3) instanceof XSLFGroupShape);

     }

 }
\ No newline at end of file
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java
index 838db81..f4cc037 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java
@@ -16,34 +16,34 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

+import static org.junit.Assert.*;

+

 import java.awt.Color;

+import java.util.List;

 

-import junit.framework.TestCase;

-

+import org.apache.poi.sl.usermodel.StrokeStyle.LineCap;

+import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;

 import org.apache.poi.util.Units;

 import org.apache.poi.xslf.XSLFTestDataSamples;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleItem;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleList;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrix;

-import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap;

-import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal;

+import org.junit.Test;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

 

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFSimpleShape extends TestCase {

+public class TestXSLFSimpleShape {

+    

+    @Test

     public void testLineStyles() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

 

         XSLFSimpleShape shape = slide.createAutoShape();

-        assertEquals(1, slide.getShapes().length);

+        assertEquals(1, slide.getShapes().size());

         // line properties are not set by default

         assertFalse(shape.getSpPr().isSetLn());

 

-        assertEquals(0., shape.getLineWidth());

+        assertEquals(0., shape.getLineWidth(), 0);

         assertEquals(null, shape.getLineColor());

         assertEquals(null, shape.getLineDash());

         assertEquals(null, shape.getLineCap());

@@ -58,10 +58,10 @@
 

         // line width

         shape.setLineWidth(1.0);

-        assertEquals(1.0, shape.getLineWidth());

+        assertEquals(1.0, shape.getLineWidth(), 0);

         assertEquals(Units.EMU_PER_POINT, shape.getSpPr().getLn().getW());

         shape.setLineWidth(5.5);

-        assertEquals(5.5, shape.getLineWidth());

+        assertEquals(5.5, shape.getLineWidth(), 0);

         assertEquals(Units.toEMU(5.5), shape.getSpPr().getLn().getW());

         shape.setLineWidth(0.0);

         // setting line width to zero unsets the W attribute

@@ -112,17 +112,18 @@
         ln2.setLineDash(LineDash.DOT);

         assertEquals(LineDash.DOT, ln2.getLineDash());

         ln2.setLineWidth(0.);

-        assertEquals(0., ln2.getLineWidth());

+        assertEquals(0., ln2.getLineWidth(), 0);

 

         XSLFSimpleShape ln3 = slide.createAutoShape();

         ln3.setLineWidth(1.);

-        assertEquals(1., ln3.getLineWidth());

+        assertEquals(1., ln3.getLineWidth(), 0);

         ln3.setLineDash(null);

         assertEquals(null, ln3.getLineDash());

         ln3.setLineCap(null);

         assertEquals(null, ln3.getLineDash());

     }

 

+    @Test

     public void testFill() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -147,97 +148,96 @@
         assertFalse(shape.getSpPr().isSetSolidFill());

     }

 

+    @Test

     public void testDefaultProperties() {

         XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");

 

-        XSLFSlide slide6 = ppt.getSlides()[5];

-        XSLFShape[] shapes = slide6.getShapes();

-        for(int i = 1; i < shapes.length; i++){

-            XSLFSimpleShape s = (XSLFSimpleShape) shapes[i];

+        XSLFSlide slide6 = ppt.getSlides().get(5);

+        List<XSLFShape> shapes = slide6.getShapes();

+        for(XSLFShape xs : shapes){

+            XSLFSimpleShape s = (XSLFSimpleShape)xs;

             // all shapes have a theme color="accent1"

             assertEquals("accent1", s.getSpStyle().getFillRef().getSchemeClr().getVal().toString());

-            assertEquals(2.0, s.getLineWidth());

+            assertEquals(2.0, s.getLineWidth(), 0);

             assertEquals(LineCap.FLAT, s.getLineCap());

-            // YK: calculated color is slightly different from PowerPoint

-            assertEquals(new Color(39, 64, 94), s.getLineColor());

+            assertEquals(new Color(79,129,189), s.getLineColor());

         }

 

-        XSLFSimpleShape s0 = (XSLFSimpleShape) shapes[0];

+        XSLFSimpleShape s0 = (XSLFSimpleShape) shapes.get(0);

         // fill is not set

         assertNull(s0.getSpPr().getSolidFill());

         //assertEquals(slide6.getTheme().getColor("accent1").getColor(), s0.getFillColor());

         assertEquals(new Color(79, 129, 189), s0.getFillColor());

 

         // lighter 80%

-        XSLFSimpleShape s1 = (XSLFSimpleShape)shapes[1];

+        XSLFSimpleShape s1 = (XSLFSimpleShape)shapes.get(1);

         CTSchemeColor ref1 = s1.getSpPr().getSolidFill().getSchemeClr();

         assertEquals(1, ref1.sizeOfLumModArray());

         assertEquals(1, ref1.sizeOfLumOffArray());

         assertEquals(20000, ref1.getLumModArray(0).getVal());

         assertEquals(80000, ref1.getLumOffArray(0).getVal());

         assertEquals("accent1", ref1.getVal().toString());

-        assertEquals(new Color(220, 230, 242), s1.getFillColor());

+        assertEquals(new Color(79, 129, 189), s1.getFillColor());

 

         // lighter 60%

-        XSLFSimpleShape s2 = (XSLFSimpleShape)shapes[2];

+        XSLFSimpleShape s2 = (XSLFSimpleShape)shapes.get(2);

         CTSchemeColor ref2 = s2.getSpPr().getSolidFill().getSchemeClr();

         assertEquals(1, ref2.sizeOfLumModArray());

         assertEquals(1, ref2.sizeOfLumOffArray());

         assertEquals(40000, ref2.getLumModArray(0).getVal());

         assertEquals(60000, ref2.getLumOffArray(0).getVal());

         assertEquals("accent1", ref2.getVal().toString());

-        assertEquals(new Color(185, 205, 229), s2.getFillColor());

+        assertEquals(new Color(79, 129, 189), s2.getFillColor());

 

         // lighter 40%

-        XSLFSimpleShape s3 = (XSLFSimpleShape)shapes[3];

+        XSLFSimpleShape s3 = (XSLFSimpleShape)shapes.get(3);

         CTSchemeColor ref3 = s3.getSpPr().getSolidFill().getSchemeClr();

         assertEquals(1, ref3.sizeOfLumModArray());

         assertEquals(1, ref3.sizeOfLumOffArray());

         assertEquals(60000, ref3.getLumModArray(0).getVal());

         assertEquals(40000, ref3.getLumOffArray(0).getVal());

         assertEquals("accent1", ref3.getVal().toString());

-        assertEquals(new Color(149, 179, 215), s3.getFillColor());

+        assertEquals(new Color(79, 129, 189), s3.getFillColor());

 

         // darker 25%

-        XSLFSimpleShape s4 = (XSLFSimpleShape)shapes[4];

+        XSLFSimpleShape s4 = (XSLFSimpleShape)shapes.get(4);

         CTSchemeColor ref4 = s4.getSpPr().getSolidFill().getSchemeClr();

         assertEquals(1, ref4.sizeOfLumModArray());

         assertEquals(0, ref4.sizeOfLumOffArray());

         assertEquals(75000, ref4.getLumModArray(0).getVal());

         assertEquals("accent1", ref3.getVal().toString());

-        // YK: calculated color is slightly different from PowerPoint

-        assertEquals(new Color(59, 97, 142), s4.getFillColor());

+        assertEquals(new Color(79, 129, 189), s4.getFillColor());

 

-        XSLFSimpleShape s5 = (XSLFSimpleShape)shapes[5];

+        XSLFSimpleShape s5 = (XSLFSimpleShape)shapes.get(5);

         CTSchemeColor ref5 = s5.getSpPr().getSolidFill().getSchemeClr();

         assertEquals(1, ref5.sizeOfLumModArray());

         assertEquals(0, ref5.sizeOfLumOffArray());

         assertEquals(50000, ref5.getLumModArray(0).getVal());

         assertEquals("accent1", ref5.getVal().toString());

-        // YK: calculated color is slightly different from PowerPoint

-        assertEquals(new Color(40, 65, 95), s5.getFillColor());

+        assertEquals(new Color(79, 129, 189), s5.getFillColor());

     }

 

+    @Test

     public void testAnchor(){

         XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");

-        XSLFSlide[] slide = ppt.getSlides();

+        List<XSLFSlide> slide = ppt.getSlides();

 

-        XSLFSlide slide2 = slide[1];

+        XSLFSlide slide2 = slide.get(1);

         XSLFSlideLayout layout2 = slide2.getSlideLayout();

-        XSLFShape[] shapes2 = slide2.getShapes();

-        XSLFTextShape sh1 = (XSLFTextShape)shapes2[0];

+        List<XSLFShape> shapes2 = slide2.getShapes();

+        XSLFTextShape sh1 = (XSLFTextShape)shapes2.get(0);

         assertEquals(Placeholder.CENTERED_TITLE, sh1.getTextType());

         assertEquals("PPTX Title", sh1.getText());

         assertNull(sh1.getSpPr().getXfrm()); // xfrm is not set, the query is delegated to the slide layout

         assertEquals(sh1.getAnchor(), layout2.getTextShapeByType(Placeholder.CENTERED_TITLE).getAnchor());

 

-        XSLFTextShape sh2 = (XSLFTextShape)shapes2[1];

+        XSLFTextShape sh2 = (XSLFTextShape)shapes2.get(1);

         assertEquals("Subtitle\nAnd second line", sh2.getText());

         assertEquals(Placeholder.SUBTITLE, sh2.getTextType());

         assertNull(sh2.getSpPr().getXfrm()); // xfrm is not set, the query is delegated to the slide layout

         assertEquals(sh2.getAnchor(), layout2.getTextShapeByType(Placeholder.SUBTITLE).getAnchor());

 

-        XSLFSlide slide5 = slide[4];

+        XSLFSlide slide5 = slide.get(4);

         XSLFSlideLayout layout5 = slide5.getSlideLayout();

         XSLFTextShape shTitle = slide5.getTextShapeByType(Placeholder.TITLE);

         assertEquals("Hyperlinks", shTitle.getText());

@@ -251,6 +251,7 @@
     }

 

     @SuppressWarnings({ "deprecation", "unused" })

+    @Test

     public void testShadowEffects(){

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java
index ecfd70e..3314855 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java
@@ -16,88 +16,91 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import static org.junit.Assert.assertArrayEquals;

+import static org.junit.Assert.*;

 

 import java.awt.Color;

-

-import junit.framework.TestCase;

+import java.util.List;

 

 import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Test;

 

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFSlide extends TestCase {

+public class TestXSLFSlide {

+    

+    @Test

     public void testReadShapes(){

         XMLSlideShow  ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");

-        XSLFSlide[] slides = ppt.getSlides();

+        List<XSLFSlide> slides = ppt.getSlides();

 

-        XSLFSlide slide1 = slides[0];

-        XSLFShape[] shapes1 = slide1.getShapes();

-        assertEquals(7, shapes1.length);

-        assertEquals("TextBox 3", shapes1[0].getShapeName());

-        assertTrue(shapes1[0] instanceof XSLFTextBox);

-        XSLFAutoShape sh0 = (XSLFAutoShape)shapes1[0];

+        XSLFSlide slide1 = slides.get(0);

+        List<XSLFShape> shapes1 = slide1.getShapes();

+        assertEquals(7, shapes1.size());

+        assertEquals("TextBox 3", shapes1.get(0).getShapeName());

+        assertTrue(shapes1.get(0) instanceof XSLFTextBox);

+        XSLFAutoShape sh0 = (XSLFAutoShape)shapes1.get(0);

         assertEquals("Learning PPTX", sh0.getText());

 

 

-        assertEquals("Straight Connector 5", shapes1[1].getShapeName());

-        assertTrue(shapes1[1] instanceof XSLFConnectorShape);

+        assertEquals("Straight Connector 5", shapes1.get(1).getShapeName());

+        assertTrue(shapes1.get(1) instanceof XSLFConnectorShape);

 

-        assertEquals("Freeform 6", shapes1[2].getShapeName());

-        assertTrue(shapes1[2] instanceof XSLFFreeformShape);

-        XSLFAutoShape sh2 = (XSLFAutoShape)shapes1[2];

+        assertEquals("Freeform 6", shapes1.get(2).getShapeName());

+        assertTrue(shapes1.get(2) instanceof XSLFFreeformShape);

+        XSLFAutoShape sh2 = (XSLFAutoShape)shapes1.get(2);

         assertEquals("Cloud", sh2.getText());

 

-        assertEquals("Picture 1", shapes1[3].getShapeName());

-        assertTrue(shapes1[3] instanceof XSLFPictureShape);

+        assertEquals("Picture 1", shapes1.get(3).getShapeName());

+        assertTrue(shapes1.get(3) instanceof XSLFPictureShape);

 

-        assertEquals("Table 2", shapes1[4].getShapeName());

-        assertTrue(shapes1[4] instanceof XSLFGraphicFrame);

+        assertEquals("Table 2", shapes1.get(4).getShapeName());

+        assertTrue(shapes1.get(4) instanceof XSLFGraphicFrame);

 

-        assertEquals("Straight Arrow Connector 7", shapes1[5].getShapeName());

-        assertTrue(shapes1[5] instanceof XSLFConnectorShape);

+        assertEquals("Straight Arrow Connector 7", shapes1.get(5).getShapeName());

+        assertTrue(shapes1.get(5) instanceof XSLFConnectorShape);

 

-        assertEquals("Elbow Connector 9", shapes1[6].getShapeName());

-        assertTrue(shapes1[6] instanceof XSLFConnectorShape);

+        assertEquals("Elbow Connector 9", shapes1.get(6).getShapeName());

+        assertTrue(shapes1.get(6) instanceof XSLFConnectorShape);

 

         // titles on slide2

-        XSLFSlide slide2 = slides[1];

-        XSLFShape[] shapes2 = slide2.getShapes();

-        assertEquals(2, shapes2.length);

-        assertTrue(shapes2[0] instanceof XSLFAutoShape);

-        assertEquals("PPTX Title", ((XSLFAutoShape)shapes2[0]).getText());

-        assertTrue(shapes2[1] instanceof XSLFAutoShape);

-        assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape)shapes2[1]).getText());

+        XSLFSlide slide2 = slides.get(1);

+        List<XSLFShape> shapes2 = slide2.getShapes();

+        assertEquals(2, shapes2.size());

+        assertTrue(shapes2.get(0) instanceof XSLFAutoShape);

+        assertEquals("PPTX Title", ((XSLFAutoShape)shapes2.get(0)).getText());

+        assertTrue(shapes2.get(1) instanceof XSLFAutoShape);

+        assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape)shapes2.get(1)).getText());

 

         //  group shape on slide3

-        XSLFSlide slide3 = slides[2];

-        XSLFShape[] shapes3 = slide3.getShapes();

-        assertEquals(1, shapes3.length);

-        assertTrue(shapes3[0] instanceof XSLFGroupShape);

-        XSLFShape[] groupShapes = ((XSLFGroupShape)shapes3[0]).getShapes();

-        assertEquals(3, groupShapes.length);

-        assertTrue(groupShapes[0] instanceof XSLFAutoShape);

-        assertEquals("Rectangle 1", groupShapes[0].getShapeName());

+        XSLFSlide slide3 = slides.get(2);

+        List<XSLFShape> shapes3 = slide3.getShapes();

+        assertEquals(1, shapes3.size());

+        assertTrue(shapes3.get(0) instanceof XSLFGroupShape);

+        List<XSLFShape> groupShapes = ((XSLFGroupShape)shapes3.get(0)).getShapes();

+        assertEquals(3, groupShapes.size());

+        assertTrue(groupShapes.get(0) instanceof XSLFAutoShape);

+        assertEquals("Rectangle 1", groupShapes.get(0).getShapeName());

 

-        assertTrue(groupShapes[1] instanceof XSLFAutoShape);

-        assertEquals("Oval 2", groupShapes[1].getShapeName());

+        assertTrue(groupShapes.get(1) instanceof XSLFAutoShape);

+        assertEquals("Oval 2", groupShapes.get(1).getShapeName());

 

-        assertTrue(groupShapes[2] instanceof XSLFAutoShape);

-        assertEquals("Right Arrow 3", groupShapes[2].getShapeName());

+        assertTrue(groupShapes.get(2) instanceof XSLFAutoShape);

+        assertEquals("Right Arrow 3", groupShapes.get(2).getShapeName());

 

-        XSLFSlide slide4 = slides[3];

-        XSLFShape[] shapes4 = slide4.getShapes();

-        assertEquals(1, shapes4.length);

-        assertTrue(shapes4[0] instanceof XSLFTable);

-        XSLFTable tbl = (XSLFTable)shapes4[0];

+        XSLFSlide slide4 = slides.get(3);

+        List<XSLFShape> shapes4 = slide4.getShapes();

+        assertEquals(1, shapes4.size());

+        assertTrue(shapes4.get(0) instanceof XSLFTable);

+        XSLFTable tbl = (XSLFTable)shapes4.get(0);

         assertEquals(3, tbl.getNumberOfColumns());

         assertEquals(6, tbl.getNumberOfRows());

     }

 

+    @Test

     public void testCreateSlide(){

         XMLSlideShow  ppt = new XMLSlideShow();

-        assertEquals(0, ppt.getSlides().length);

+        assertEquals(0, ppt.getSlides().size());

 

         XSLFSlide slide = ppt.createSlide();

         assertTrue(slide.getFollowMasterGraphics());

@@ -107,46 +110,47 @@
         assertTrue(slide.getFollowMasterGraphics());

     }

 

+    @Test

     public void testImportContent(){

         XMLSlideShow ppt = new XMLSlideShow();

 

         XMLSlideShow  src = XSLFTestDataSamples.openSampleDocument("themes.pptx");

 

         // create a blank slide and import content from the 4th slide of themes.pptx

-        XSLFSlide slide1 = ppt.createSlide().importContent(src.getSlides()[3]);

-        XSLFShape[] shapes1 = slide1.getShapes();

-        assertEquals(2, shapes1.length);

+        XSLFSlide slide1 = ppt.createSlide().importContent(src.getSlides().get(3));

+        List<XSLFShape> shapes1 = slide1.getShapes();

+        assertEquals(2, shapes1.size());

 

-        XSLFTextShape sh1 = (XSLFTextShape)shapes1[0];

+        XSLFTextShape sh1 = (XSLFTextShape)shapes1.get(0);

         assertEquals("Austin Theme", sh1.getText());

         XSLFTextRun r1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals("Century Gothic", r1.getFontFamily());

-        assertEquals(40.0, r1.getFontSize());

+        assertEquals(40.0, r1.getFontSize(), 0);

         assertTrue(r1.isBold());

         assertTrue(r1.isItalic());

         assertEquals(new Color(148, 198, 0), r1.getFontColor());

         assertNull(sh1.getFillColor());

         assertNull(sh1.getLineColor());

 

-        XSLFTextShape sh2 = (XSLFTextShape)shapes1[1];

+        XSLFTextShape sh2 = (XSLFTextShape)shapes1.get(1);

         assertEquals(

                 "Text in a autoshape is white\n" +

                 "Fill: RGB(148, 198,0)", sh2.getText());

         XSLFTextRun r2 = sh2.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals("Century Gothic", r2.getFontFamily());

-        assertEquals(18.0, r2.getFontSize());

+        assertEquals(18.0, r2.getFontSize(), 0);

         assertFalse(r2.isBold());

         assertFalse(r2.isItalic());

         assertEquals(Color.white, r2.getFontColor());

         assertEquals(new Color(148, 198, 0), sh2.getFillColor());

-        assertEquals(new Color(74, 99, 0), sh2.getLineColor()); // slightly different from PowerPoint!

+        assertEquals(new Color(148, 198, 0), sh2.getLineColor()); // slightly different from PowerPoint!

 

         // the 5th slide has a picture and a texture fill

-        XSLFSlide slide2 = ppt.createSlide().importContent(src.getSlides()[4]);

-        XSLFShape[] shapes2 = slide2.getShapes();

-        assertEquals(2, shapes2.length);

+        XSLFSlide slide2 = ppt.createSlide().importContent(src.getSlides().get(4));

+        List<XSLFShape> shapes2 = slide2.getShapes();

+        assertEquals(2, shapes2.size());

 

-        XSLFTextShape sh3 = (XSLFTextShape)shapes2[0];

+        XSLFTextShape sh3 = (XSLFTextShape)shapes2.get(0);

         assertEquals("This slide overrides master background with a texture fill", sh3.getText());

         XSLFTextRun r3 = sh3.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals("Century Gothic", r3.getFontFamily());

@@ -157,11 +161,12 @@
         assertNull(sh3.getFillColor());

         assertNull(sh3.getLineColor());

 

-        XSLFPictureShape sh4 = (XSLFPictureShape)shapes2[1];

-        XSLFPictureShape srcPic = (XSLFPictureShape)src.getSlides()[4].getShapes()[1];

+        XSLFPictureShape sh4 = (XSLFPictureShape)shapes2.get(1);

+        XSLFPictureShape srcPic = (XSLFPictureShape)src.getSlides().get(4).getShapes().get(1);

         assertArrayEquals(sh4.getPictureData().getData(), srcPic.getPictureData().getData());

     }

 

+    @Test

     public void testMergeSlides(){

         XMLSlideShow ppt = new XMLSlideShow();

         String[] pptx = {"shapes.pptx", "themes.pptx", "layouts.pptx", "backgrounds.pptx"};

@@ -173,6 +178,6 @@
                 ppt.createSlide().importContent(srcSlide);

             }

         }

-        assertEquals(30, ppt.getSlides().length);

+        assertEquals(30, ppt.getSlides().size());

     }    

 }
\ No newline at end of file
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java
index c3057d5..3d20be8 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlideShow.java
@@ -16,63 +16,68 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

-import org.apache.poi.POIXMLDocumentPart;

-import org.apache.poi.xslf.XSLFTestDataSamples;

+import static org.junit.Assert.*;

 

 import java.awt.Dimension;

 import java.util.List;

 

+import org.apache.poi.POIXMLDocumentPart;

+import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Test;

+

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFSlideShow extends TestCase {

+public class TestXSLFSlideShow {

+    @Test

     public void testCreateSlide(){

         XMLSlideShow  ppt = new XMLSlideShow();

-        assertEquals(0, ppt.getSlides().length);

+        assertEquals(0, ppt.getSlides().size());

 

         XSLFSlide slide1 = ppt.createSlide();

-        assertEquals(1, ppt.getSlides().length);

-        assertSame(slide1, ppt.getSlides()[0]);

+        assertEquals(1, ppt.getSlides().size());

+        assertSame(slide1, ppt.getSlides().get(0));

 

         List<POIXMLDocumentPart> rels =  slide1.getRelations();

         assertEquals(1, rels.size());

         assertEquals(slide1.getSlideMaster().getLayout(SlideLayout.BLANK), rels.get(0));

 

         XSLFSlide slide2 = ppt.createSlide();

-        assertEquals(2, ppt.getSlides().length);

-        assertSame(slide2, ppt.getSlides()[1]);

+        assertEquals(2, ppt.getSlides().size());

+        assertSame(slide2, ppt.getSlides().get(1));

 

         ppt.setSlideOrder(slide2, 0);

-        assertSame(slide2, ppt.getSlides()[0]);

-        assertSame(slide1, ppt.getSlides()[1]);

+        assertSame(slide2, ppt.getSlides().get(0));

+        assertSame(slide1, ppt.getSlides().get(1));

 

         ppt = XSLFTestDataSamples.writeOutAndReadBack(ppt);

-        assertEquals(2, ppt.getSlides().length);

-        rels =  ppt.getSlides()[0].getRelations();

+        assertEquals(2, ppt.getSlides().size());

+        rels =  ppt.getSlides().get(0).getRelations();

     }

 

+    @Test

     public void testRemoveSlide(){

         XMLSlideShow  ppt = new XMLSlideShow();

-        assertEquals(0, ppt.getSlides().length);

+        assertEquals(0, ppt.getSlides().size());

 

         XSLFSlide slide1 = ppt.createSlide();

         XSLFSlide slide2 = ppt.createSlide();

 

-        assertEquals(2, ppt.getSlides().length);

-        assertSame(slide1, ppt.getSlides()[0]);

-        assertSame(slide2, ppt.getSlides()[1]);

+        assertEquals(2, ppt.getSlides().size());

+        assertSame(slide1, ppt.getSlides().get(0));

+        assertSame(slide2, ppt.getSlides().get(1));

 

         XSLFSlide removedSlide = ppt.removeSlide(0);

         assertSame(slide1, removedSlide);

 

-        assertEquals(1, ppt.getSlides().length);

-        assertSame(slide2, ppt.getSlides()[0]);

+        assertEquals(1, ppt.getSlides().size());

+        assertSame(slide2, ppt.getSlides().get(0));

 

         ppt = XSLFTestDataSamples.writeOutAndReadBack(ppt);

-        assertEquals(1, ppt.getSlides().length);

+        assertEquals(1, ppt.getSlides().size());

     }

 

+    @Test

     public void testDimension(){

         XMLSlideShow  ppt = new XMLSlideShow();

         Dimension sz = ppt.getPageSize();

@@ -84,24 +89,26 @@
         assertEquals(612, sz.height);

     }

 

+    @Test

     public void testSlideMasters(){

         XMLSlideShow  ppt = new XMLSlideShow();

-        XSLFSlideMaster[] masters = ppt.getSlideMasters();

-        assertEquals(1, masters.length);

+        List<XSLFSlideMaster> masters = ppt.getSlideMasters();

+        assertEquals(1, masters.size());

 

         XSLFSlide slide = ppt.createSlide();

-        assertSame(masters[0], slide.getSlideMaster());

+        assertSame(masters.get(0), slide.getSlideMaster());

     }

 

+    @Test

     public void testSlideLayout(){

         XMLSlideShow  ppt = new XMLSlideShow();

-        XSLFSlideMaster[] masters = ppt.getSlideMasters();

-        assertEquals(1, masters.length);

+        List<XSLFSlideMaster> masters = ppt.getSlideMasters();

+        assertEquals(1, masters.size());

 

         XSLFSlide slide = ppt.createSlide();

         XSLFSlideLayout layout = slide.getSlideLayout();

         assertNotNull(layout);

 

-        assertSame(masters[0], layout.getSlideMaster());

+        assertSame(masters.get(0), layout.getSlideMaster());

     }

 }

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java
index 0ded02a..3b7c5cb 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java
@@ -16,8 +16,12 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.*;

+

+import org.apache.poi.sl.usermodel.VerticalAlignment;

 import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Test;

+import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;

 import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;

 

 import java.awt.Color;

@@ -26,16 +30,16 @@
 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFTable extends TestCase {

-

+public class TestXSLFTable {

+    @Test

     public void testRead(){

         XMLSlideShow  ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");

 

-        XSLFSlide slide = ppt.getSlides()[3];

-        XSLFShape[] shapes = slide.getShapes();

-        assertEquals(1, shapes.length);

-        assertTrue(shapes[0] instanceof XSLFTable);

-        XSLFTable tbl = (XSLFTable)shapes[0];

+        XSLFSlide slide = ppt.getSlides().get(3);

+        List<XSLFShape> shapes = slide.getShapes();

+        assertEquals(1, shapes.size());

+        assertTrue(shapes.get(0) instanceof XSLFTable);

+        XSLFTable tbl = (XSLFTable)shapes.get(0);

         assertEquals(3, tbl.getNumberOfColumns());

         assertEquals(6, tbl.getNumberOfRows());

         assertNotNull(tbl.getCTTable());

@@ -43,13 +47,13 @@
         List<XSLFTableRow> rows = tbl.getRows();

         assertEquals(6, rows.size());

 

-        assertEquals(90.0, tbl.getColumnWidth(0));

-        assertEquals(240.0, tbl.getColumnWidth(1));

-        assertEquals(150.0, tbl.getColumnWidth(2));

+        assertEquals(90.0, tbl.getColumnWidth(0), 0);

+        assertEquals(240.0, tbl.getColumnWidth(1), 0);

+        assertEquals(150.0, tbl.getColumnWidth(2), 0);

 

         for(XSLFTableRow row : tbl){

             // all rows have the same height

-            assertEquals(29.2, row.getHeight());

+            assertEquals(29.2, row.getHeight(), 0);

         }

 

         XSLFTableRow row0 = rows.get(0);

@@ -67,6 +71,7 @@
         assertEquals("C1", cells1.get(2).getText());

     }

 

+    @Test

     public void testCreate() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -89,56 +94,57 @@
         assertNotNull(row0.getXmlObject());

         assertEquals(1, tbl.getNumberOfRows());

         assertSame(row0, tbl.getRows().get(0));

-        assertEquals(20.0, row0.getHeight());

+        assertEquals(20.0, row0.getHeight(), 0);

         row0.setHeight(30.0);

-        assertEquals(30.0, row0.getHeight());

+        assertEquals(30.0, row0.getHeight(), 0);

 

         assertEquals(0, row0.getCells().size());

         XSLFTableCell cell0 = row0.addCell();

         assertNotNull(cell0.getXmlObject());

         // by default table cell has no borders

-        assertTrue(cell0.getXmlObject().getTcPr().getLnB().isSetNoFill());

-        assertTrue(cell0.getXmlObject().getTcPr().getLnT().isSetNoFill());

-        assertTrue(cell0.getXmlObject().getTcPr().getLnL().isSetNoFill());

-        assertTrue(cell0.getXmlObject().getTcPr().getLnR().isSetNoFill());

+        CTTableCell tc = (CTTableCell)cell0.getXmlObject();

+        assertTrue(tc.getTcPr().getLnB().isSetNoFill());

+        assertTrue(tc.getTcPr().getLnT().isSetNoFill());

+        assertTrue(tc.getTcPr().getLnL().isSetNoFill());

+        assertTrue(tc.getTcPr().getLnR().isSetNoFill());

 

         assertSame(cell0, row0.getCells().get(0));

         assertEquals(1, tbl.getNumberOfColumns());

-        assertEquals(100.0, tbl.getColumnWidth(0));

+        assertEquals(100.0, tbl.getColumnWidth(0), 0);

         cell0.addNewTextParagraph().addNewTextRun().setText("POI");

         assertEquals("POI", cell0.getText());

 

         XSLFTableCell cell1 = row0.addCell();

         assertSame(cell1, row0.getCells().get(1));

         assertEquals(2, tbl.getNumberOfColumns());

-        assertEquals(100.0, tbl.getColumnWidth(1));

+        assertEquals(100.0, tbl.getColumnWidth(1), 0);

         cell1.addNewTextParagraph().addNewTextRun().setText("Apache");

         assertEquals("Apache", cell1.getText());

 

-        assertEquals(1.0, cell1.getBorderBottom());

+        assertEquals(1.0, cell1.getBorderBottom(), 0);

         cell1.setBorderBottom(2.0);

-        assertEquals(2.0, cell1.getBorderBottom());

+        assertEquals(2.0, cell1.getBorderBottom(), 0);

         assertNull(cell1.getBorderBottomColor());

         cell1.setBorderBottomColor(Color.yellow);

         assertEquals(Color.yellow, cell1.getBorderBottomColor());

 

-        assertEquals(1.0, cell1.getBorderTop());

+        assertEquals(1.0, cell1.getBorderTop(), 0);

         cell1.setBorderTop(2.0);

-        assertEquals(2.0, cell1.getBorderTop());

+        assertEquals(2.0, cell1.getBorderTop(), 0);

         assertNull(cell1.getBorderTopColor());

         cell1.setBorderTopColor(Color.yellow);

         assertEquals(Color.yellow, cell1.getBorderTopColor());

 

-        assertEquals(1.0, cell1.getBorderLeft());

+        assertEquals(1.0, cell1.getBorderLeft(), 0);

         cell1.setBorderLeft(2.0);

-        assertEquals(2.0, cell1.getBorderLeft());

+        assertEquals(2.0, cell1.getBorderLeft(), 0);

         assertNull(cell1.getBorderLeftColor());

         cell1.setBorderLeftColor(Color.yellow);

         assertEquals(Color.yellow, cell1.getBorderLeftColor());

 

-        assertEquals(1.0, cell1.getBorderRight());

+        assertEquals(1.0, cell1.getBorderRight(), 0);

         cell1.setBorderRight(2.0);

-        assertEquals(2.0, cell1.getBorderRight());

+        assertEquals(2.0, cell1.getBorderRight(), 0);

         assertNull(cell1.getBorderRightColor());

         cell1.setBorderRightColor(Color.yellow);

         assertEquals(Color.yellow, cell1.getBorderRightColor());

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableStyles.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableStyles.java
index 3ce6c3b..49b5fd4 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableStyles.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTableStyles.java
@@ -16,14 +16,18 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertNotNull;

+

+import org.junit.Test;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTTableStyle;

 

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFTableStyles extends TestCase {

+public class TestXSLFTableStyles {

 

+    @Test

     public void testRead(){

         XMLSlideShow  ppt = new XMLSlideShow();

         XSLFTableStyles tblStyles = ppt.getTableStyles();

@@ -32,6 +36,8 @@
         assertEquals(0, tblStyles.getStyles().size());

     }

 

+    @SuppressWarnings("unused")

+    @Test

     public void testStyle(){

         CTTableStyle obj = CTTableStyle.Factory.newInstance();

         XSLFTableStyle style = new XSLFTableStyle(obj);

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java
index 2176a1b..59b0dca 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java
@@ -16,14 +16,18 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

+import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertNull;

+

+import org.junit.Test;

 import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;

 

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFTextBox extends TestCase {

+public class TestXSLFTextBox {

 

+    @Test

     public void testPlaceholder() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -40,6 +44,7 @@
     /**

      * text box inherits default text proeprties from presentation.xml

      */

+    @Test

     public void testDefaultTextStyle() {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -55,12 +60,12 @@
         XSLFTextRun r = shape.getTextParagraphs().get(0).getTextRuns().get(0);

 

         assertEquals(1800, pPr.getSz());

-        assertEquals(18.0, r.getFontSize());

+        assertEquals(18.0, r.getFontSize(), 0);

         assertEquals("Calibri", r.getFontFamily());

 

         pPr.setSz(900);

         pPr.getLatin().setTypeface("Arial");

-        assertEquals(9.0, r.getFontSize());

+        assertEquals(9.0, r.getFontSize(), 0);

         assertEquals("Arial", r.getFontFamily());

 

         // unset font size in presentation.xml. The value should be taken from master slide

@@ -68,12 +73,11 @@
         ppt.getCTPresentation().getDefaultTextStyle().getLvl1PPr().getDefRPr().unsetSz();

         pPr = slide.getSlideMaster().getXmlObject().getTxStyles().getOtherStyle().getLvl1PPr().getDefRPr();

         assertEquals(1800, pPr.getSz());

-        assertEquals(18.0, r.getFontSize());

+        assertEquals(18.0, r.getFontSize(), 0);

         pPr.setSz(2000);

-        assertEquals(20.0, r.getFontSize());

+        assertEquals(20.0, r.getFontSize(), 0);

 

         pPr.unsetSz();  // Should never be

-        assertEquals(-1.0, r.getFontSize());

-

+        assertNull(r.getFontSize());

     }

 }
\ No newline at end of file
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java
index 00b4cbd..e71cf24 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java
@@ -16,22 +16,48 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

-import org.apache.poi.util.POILogFactory;

-import org.apache.poi.util.POILogger;

-import org.apache.poi.xslf.XSLFTestDataSamples;

+import static org.junit.Assert.*;

 

 import java.awt.*;

 import java.awt.geom.Rectangle2D;

 import java.awt.image.BufferedImage;

 import java.util.List;

 

+import org.apache.poi.sl.draw.DrawTextFragment;

+import org.apache.poi.sl.draw.DrawTextParagraph;

+import org.apache.poi.sl.usermodel.AutoNumberingScheme;

+import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;

+import org.apache.poi.util.POILogFactory;

+import org.apache.poi.util.POILogger;

+import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Assume;

+import org.junit.Test;

+

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFTextParagraph extends TestCase {

+public class TestXSLFTextParagraph {

     private static POILogger _logger = POILogFactory.getLogger(XSLFTextParagraph.class);

 

+    static class DrawTextParagraphProxy extends DrawTextParagraph<XSLFTextRun> {

+        DrawTextParagraphProxy(XSLFTextParagraph p) {

+            super(p);

+        }

+        

+        public void breakText(Graphics2D graphics) {

+            super.breakText(graphics);

+        }

+        

+        public double getWrappingWidth(boolean firstLine, Graphics2D graphics) {

+            return super.getWrappingWidth(firstLine, graphics);

+        }

+        

+        public List<DrawTextFragment> getLines() {

+            return lines;

+        }

+    }

+    

+    @Test

     public void testWrappingWidth() throws Exception {

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -46,45 +72,47 @@
 

         Rectangle2D anchor = new Rectangle(50, 50, 300, 200);

         sh.setAnchor(anchor);

+        

+        DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p);

 

-        double leftInset = sh.getLeftInset();

-        double rightInset = sh.getRightInset();

-        assertEquals(7.2, leftInset);

-        assertEquals(7.2, rightInset);

+        Double leftInset = sh.getLeftInset();

+        Double rightInset = sh.getRightInset();

+        assertEquals(7.2, leftInset, 0);

+        assertEquals(7.2, rightInset, 0);

 

-        double leftMargin = p.getLeftMargin();

-        assertEquals(0.0, leftMargin);

+        Double leftMargin = p.getLeftMargin();

+        assertEquals(0.0, leftMargin, 0);

 

-        double indent = p.getIndent();

-        assertEquals(0.0, indent); // default

+        Double indent = p.getIndent();

+        assertNull(indent); // default

 

         double expectedWidth;

 

         // Case 1: bullet=false, leftMargin=0, indent=0.

         expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;

-        assertEquals(285.6, expectedWidth); // 300 - 7.2 - 7.2 - 0

-        assertEquals(expectedWidth, p.getWrappingWidth(true, null));

-        assertEquals(expectedWidth, p.getWrappingWidth(false, null));

+        assertEquals(285.6, expectedWidth, 0); // 300 - 7.2 - 7.2 - 0

+        assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0);

+        assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0);

 

-        p.setLeftMargin(36); // 0.5"

+        p.setLeftMargin(36d); // 0.5"

         leftMargin = p.getLeftMargin();

-        assertEquals(36.0, leftMargin);

+        assertEquals(36.0, leftMargin, 0);

         expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;

         assertEquals(249.6, expectedWidth, 1E-5); // 300 - 7.2 - 7.2 - 36

-        assertEquals(expectedWidth, p.getWrappingWidth(true, null));

-        assertEquals(expectedWidth, p.getWrappingWidth(false, null));

+        assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0);

+        assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0);

 

         // increase insets, the wrapping width should get smaller

         sh.setLeftInset(10);

         sh.setRightInset(10);

         leftInset = sh.getLeftInset();

         rightInset = sh.getRightInset();

-        assertEquals(10.0, leftInset);

-        assertEquals(10.0, rightInset);

+        assertEquals(10.0, leftInset, 0);

+        assertEquals(10.0, rightInset, 0);

         expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;

-        assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36

-        assertEquals(expectedWidth, p.getWrappingWidth(true, null));

-        assertEquals(expectedWidth, p.getWrappingWidth(false, null));

+        assertEquals(244.0, expectedWidth, 0); // 300 - 10 - 10 - 36

+        assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0);

+        assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0);

 

         // set a positive indent of a 0.5 inch. This means "First Line" indentation:

         // |<---  indent -->|Here goes first line of the text

@@ -92,40 +120,38 @@
 

         p.setIndent(36.0);  // 0.5"

         indent = p.getIndent();

-        assertEquals(36.0, indent);

+        assertEquals(36.0, indent, 0);

         expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin - indent;

-        assertEquals(208.0, expectedWidth); // 300 - 10 - 10 - 36 - 6.4

-        assertEquals(expectedWidth, p.getWrappingWidth(true, null)); // first line is indented

+        assertEquals(208.0, expectedWidth, 0); // 300 - 10 - 10 - 36 - 6.4

+        assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); // first line is indented

         // other lines are not indented

         expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;

-        assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36

-        assertEquals(expectedWidth, p.getWrappingWidth(false, null));

+        assertEquals(244.0, expectedWidth, 0); // 300 - 10 - 10 - 36

+        assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0);

 

         // set a negative indent of a 1 inch. This means "Hanging" indentation:

         // Here goes first line of the text

         // |<---  indent -->|Here go other lines (second and subsequent)

         p.setIndent(-72.0);  // 1"

         indent = p.getIndent();

-        assertEquals(-72.0, indent);

+        assertEquals(-72.0, indent, 0);

         expectedWidth = anchor.getWidth() - leftInset - rightInset;

-        assertEquals(280.0, expectedWidth); // 300 - 10 - 10 

-        assertEquals(expectedWidth, p.getWrappingWidth(true, null)); // first line is NOT indented

+        assertEquals(280.0, expectedWidth, 0); // 300 - 10 - 10 

+        assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); // first line is NOT indented

         // other lines are indented by leftMargin (the value of indent is not used)

         expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;

-        assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36 

-        assertEquals(expectedWidth, p.getWrappingWidth(false, null));

+        assertEquals(244.0, expectedWidth, 0); // 300 - 10 - 10 - 36 

+        assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0);

      }

 

     /**

      * test breaking test into lines.

      * This test requires that the Arial font is available and will run only on windows

      */

+    @Test

     public void testBreakLines(){

         String os = System.getProperty("os.name");

-        if(os == null || !os.contains("Windows")) {

-            _logger.log(POILogger.WARN, "Skipping testBreakLines(), it is executed only on Windows machines");

-            return;

-        }

+        Assume.assumeTrue("Skipping testBreakLines(), it is executed only on Windows machines", (os != null && os.contains("Windows")));

 

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -134,51 +160,59 @@
         XSLFTextParagraph p = sh.addNewTextParagraph();

         XSLFTextRun r = p.addNewTextRun();

         r.setFontFamily("Arial"); // this should always be available

-        r.setFontSize(12);

+        r.setFontSize(12d);

         r.setText(

                 "Paragraph formatting allows for more granular control " +

                 "of text within a shape. Properties here apply to all text " +

                 "residing within the corresponding paragraph.");

 

         sh.setAnchor(new Rectangle(50, 50, 300, 200));

+        DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p);

 

         BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);

         Graphics2D graphics = img.createGraphics();

 

-        List<TextFragment> lines;

-        lines = p.breakText(graphics);

+        List<DrawTextFragment> lines;

+        dtp.breakText(graphics);

+        lines = dtp.getLines();

         assertEquals(4, lines.size());

 

-        // descrease the shape width from 300 pt to 100 pt

+        // decrease the shape width from 300 pt to 100 pt

         sh.setAnchor(new Rectangle(50, 50, 100, 200));

-        lines = p.breakText(graphics);

+        dtp.breakText(graphics);

+        lines = dtp.getLines();

         assertEquals(12, lines.size());

 

-        // descrease the shape width from 300 pt to 100 pt

+        // decrease the shape width from 300 pt to 100 pt

         sh.setAnchor(new Rectangle(50, 50, 600, 200));

-        lines = p.breakText(graphics);

+        dtp.breakText(graphics);

+        lines = dtp.getLines();

         assertEquals(2, lines.size());

 

         // set left and right margins to 200pt. This leaves 200pt for wrapping text

         sh.setLeftInset(200);

         sh.setRightInset(200);

-        lines = p.breakText(graphics);

+        dtp.breakText(graphics);

+        lines = dtp.getLines();

         assertEquals(5, lines.size());

 

         r.setText("Apache POI");

-        lines = p.breakText(graphics);

+        dtp.breakText(graphics);

+        lines = dtp.getLines();

         assertEquals(1, lines.size());

         assertEquals("Apache POI", lines.get(0).getString());

 

         r.setText("Apache\nPOI");

-        lines = p.breakText(graphics);

+        dtp.breakText(graphics);

+        lines = dtp.getLines();

         assertEquals(2, lines.size());

         assertEquals("Apache", lines.get(0).getString());

         assertEquals("POI", lines.get(1).getString());

 

         // trailing newlines are ignored

         r.setText("Apache\nPOI\n");

-        lines = p.breakText(graphics);

+        dtp.breakText(graphics);

+        lines = dtp.getLines();

         assertEquals(2, lines.size());

         assertEquals("Apache", lines.get(0).getString());

         assertEquals("POI", lines.get(1).getString());

@@ -188,13 +222,15 @@
         XSLFTextParagraph p2 = sh2.addNewTextParagraph();

         XSLFTextRun r2 = p2.addNewTextRun();

         r2.setFontFamily("serif"); // this should always be available

-        r2.setFontSize(30);

+        r2.setFontSize(30d);

         r2.setText("Apache\n");

         XSLFTextRun r3 = p2.addNewTextRun();

         r3.setFontFamily("serif"); // this should always be available

-        r3.setFontSize(10);

+        r3.setFontSize(10d);

         r3.setText("POI");

-        lines = p2.breakText(graphics);

+        dtp = new DrawTextParagraphProxy(p2);

+        dtp.breakText(graphics);

+        lines = dtp.getLines();

         assertEquals(2, lines.size());

         assertEquals("Apache", lines.get(0).getString());

         assertEquals("POI", lines.get(1).getString());

@@ -203,20 +239,22 @@
 

     }

 

+    @Test

     public void testThemeInheritance(){

         XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("prProps.pptx");

-        XSLFShape[] shapes = ppt.getSlides()[0].getShapes();

-        XSLFTextShape sh1 = (XSLFTextShape)shapes[0];

+        List<XSLFShape> shapes = ppt.getSlides().get(0).getShapes();

+        XSLFTextShape sh1 = (XSLFTextShape)shapes.get(0);

         assertEquals("Apache", sh1.getText());

         assertEquals(TextAlign.CENTER, sh1.getTextParagraphs().get(0).getTextAlign());

-        XSLFTextShape sh2 = (XSLFTextShape)shapes[1];

+        XSLFTextShape sh2 = (XSLFTextShape)shapes.get(1);

         assertEquals("Software", sh2.getText());

         assertEquals(TextAlign.CENTER, sh2.getTextParagraphs().get(0).getTextAlign());

-        XSLFTextShape sh3 = (XSLFTextShape)shapes[2];

+        XSLFTextShape sh3 = (XSLFTextShape)shapes.get(2);

         assertEquals("Foundation", sh3.getText());

         assertEquals(TextAlign.CENTER, sh3.getTextParagraphs().get(0).getTextAlign());

     }

 

+    @Test

     public void testParagraphProperties(){

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -239,49 +277,53 @@
         p.setBulletFontColor(Color.red);

         assertEquals(Color.red, p.getBulletFontColor());

 

-        assertEquals(100.0, p.getBulletFontSize());

+        assertNull(p.getBulletFontSize());

         p.setBulletFontSize(200.);

-        assertEquals(200., p.getBulletFontSize());

+        assertEquals(200., p.getBulletFontSize(), 0);

         p.setBulletFontSize(-20.);

-        assertEquals(-20.0, p.getBulletFontSize());

+        assertEquals(-20.0, p.getBulletFontSize(), 0);

 

-        assertEquals(72.0, p.getDefaultTabSize());

+        assertEquals(72.0, p.getDefaultTabSize(), 0);

         

-        assertEquals(0.0, p.getIndent());

+        assertNull(p.getIndent());

         p.setIndent(72.0);

-        assertEquals(72.0, p.getIndent());

-        p.setIndent(-1.0); // the value of -1.0 resets to the defaults

-        assertEquals(0.0, p.getIndent());

+        assertEquals(72.0, p.getIndent(), 0);

+        p.setIndent(-1d); // the value of -1.0 resets to the defaults (not any more ...)

+        assertEquals(-1d, p.getIndent(), 0);

+        p.setIndent(null); 

+        assertNull(p.getIndent());

 

-        assertEquals(0.0, p.getLeftMargin());

+        assertEquals(0.0, p.getLeftMargin(), 0);

         p.setLeftMargin(72.0);

-        assertEquals(72.0, p.getLeftMargin());

+        assertEquals(72.0, p.getLeftMargin(), 0);

         p.setLeftMargin(-1.0); // the value of -1.0 resets to the defaults

-        assertEquals(0.0, p.getLeftMargin());

+        assertEquals(-1.0, p.getLeftMargin(), 0);

+        p.setLeftMargin(null);

+        assertEquals(0d, p.getLeftMargin(), 0); // default will be taken from master

 

-        assertEquals(0, p.getLevel());

-        p.setLevel(1);

-        assertEquals(1, p.getLevel());

-        p.setLevel(2);

-        assertEquals(2, p.getLevel());

+        assertEquals(0, p.getIndentLevel());

+        p.setIndentLevel(1);

+        assertEquals(1, p.getIndentLevel());

+        p.setIndentLevel(2);

+        assertEquals(2, p.getIndentLevel());

 

-        assertEquals(100., p.getLineSpacing());

+        assertNull(p.getLineSpacing());

         p.setLineSpacing(200.);

-        assertEquals(200.0, p.getLineSpacing());

+        assertEquals(200.0, p.getLineSpacing(), 0);

         p.setLineSpacing(-15.);

-        assertEquals(-15.0, p.getLineSpacing());

+        assertEquals(-15.0, p.getLineSpacing(), 0);

 

-        assertEquals(0., p.getSpaceAfter());

+        assertNull(p.getSpaceAfter());

         p.setSpaceAfter(200.);

-        assertEquals(200.0, p.getSpaceAfter());

+        assertEquals(200.0, p.getSpaceAfter(), 0);

         p.setSpaceAfter(-15.);

-        assertEquals(-15.0, p.getSpaceAfter());

+        assertEquals(-15.0, p.getSpaceAfter(), 0);

 

-        assertEquals(0., p.getSpaceBefore());

+        assertNull(p.getSpaceBefore());

         p.setSpaceBefore(200.);

-        assertEquals(200.0, p.getSpaceBefore());

+        assertEquals(200.0, p.getSpaceBefore(), 0);

         p.setSpaceBefore(-15.);

-        assertEquals(-15.0, p.getSpaceBefore());

+        assertEquals(-15.0, p.getSpaceBefore(), 0);

 

         assertEquals(TextAlign.LEFT, p.getTextAlign());

         p.setTextAlign(TextAlign.RIGHT);

@@ -290,18 +332,19 @@
         p.setBullet(false);

         assertFalse(p.isBullet());

 

-        p.setBulletAutoNumber(ListAutoNumber.ALPHA_LC_PARENT_BOTH, 1);

+        p.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenBoth, 1);

 

         double tabStop = p.getTabStop(0);

-        assertEquals(0.0, tabStop);

+        assertEquals(0.0, tabStop, 0);

 

         p.addTabStop(100.);

-        assertEquals(100., p.getTabStop(0));

+        assertEquals(100., p.getTabStop(0), 0);

 

-        assertEquals(72.0, p.getDefaultTabSize());

+        assertEquals(72.0, p.getDefaultTabSize(), 0);

 

     }

 

+    @Test

     public void testLineBreak(){

         XMLSlideShow ppt = new XMLSlideShow();

         XSLFSlide slide = ppt.createSlide();

@@ -311,14 +354,14 @@
         XSLFTextRun r1 = p.addNewTextRun();

         r1.setText("Hello,");

         XSLFTextRun r2 = p.addLineBreak();

-        assertEquals("\n", r2.getText());

+        assertEquals("\n", r2.getRawText());

         r2.setFontSize(10.0);

-        assertEquals(10.0, r2.getFontSize());

+        assertEquals(10.0, r2.getFontSize(), 0);

         XSLFTextRun r3 = p.addNewTextRun();

         r3.setText("World!");

         r3.setFontSize(20.0);

         XSLFTextRun r4 = p.addLineBreak();

-        assertEquals(20.0, r4.getFontSize());

+        assertEquals(20.0, r4.getFontSize(), 0);

 

         assertEquals("Hello,\nWorld!\n",sh.getText());

 

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java
index 79063a3..de0d1a3 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java
@@ -16,42 +16,45 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

-import org.apache.poi.xslf.XSLFTestDataSamples;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;

-import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType;

-import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;

-import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;

+import static org.junit.Assert.*;

 

 import java.awt.Color;

+import java.util.List;

+

+import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;

+import org.apache.poi.sl.usermodel.VerticalAlignment;

+import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Test;

+import org.openxmlformats.schemas.drawingml.x2006.main.*;

+import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;

+import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;

 

 /**

  * @author Yegor Kozlov

  */

-public class TestXSLFTextShape extends TestCase {

+public class TestXSLFTextShape {

 

+    @Test

     public void testLayouts(){

         XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("layouts.pptx");

 

-        XSLFSlide[] slide = ppt.getSlides();

+        List<XSLFSlide> slide = ppt.getSlides();

 

-        verifySlide1(slide[0]);

-        verifySlide2(slide[1]);

-        verifySlide3(slide[2]);

-        verifySlide4(slide[3]);

-        verifySlide7(slide[6]);

-        verifySlide8(slide[7]);

-        verifySlide10(slide[9]);

+        verifySlide1(slide.get(0));

+        verifySlide2(slide.get(1));

+        verifySlide3(slide.get(2));

+        verifySlide4(slide.get(3));

+        verifySlide7(slide.get(6));

+        verifySlide8(slide.get(7));

+        verifySlide10(slide.get(9));

     }

 

     void verifySlide1(XSLFSlide slide){

         XSLFSlideLayout layout = slide.getSlideLayout();

-        XSLFShape[] shapes = slide.getShapes();

+        List<XSLFShape> shapes = slide.getShapes();

         assertEquals("Title Slide",layout.getName());

 

-        XSLFTextShape shape1 = (XSLFTextShape)shapes[0];

+        XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0);

         CTPlaceholder ph1 = shape1.getCTPlaceholder();

         assertEquals(STPlaceholderType.CTR_TITLE, ph1.getType());

         // anchor is not defined in the shape

@@ -68,20 +71,20 @@
                 !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() &&

                 !bodyPr1.isSetAnchor()

         );

-        assertEquals(7.2, shape1.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape1.getRightInset()); // 0.1"

-        assertEquals(3.6, shape1.getTopInset());  // 0.05"

-        assertEquals(3.6, shape1.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape1.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape1.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape1.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.MIDDLE, shape1.getVerticalAlignment());

 

         // now check text properties

         assertEquals("Centered Title", shape1.getText());

         XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals("Calibri", r1.getFontFamily());

-        assertEquals(44.0, r1.getFontSize());

+        assertEquals(44.0, r1.getFontSize(), 0);

         assertEquals(Color.black, r1.getFontColor());

 

-        XSLFTextShape shape2 = (XSLFTextShape)shapes[1];

+        XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1);

         CTPlaceholder ph2 = shape2.getCTPlaceholder();

         assertEquals(STPlaceholderType.SUB_TITLE, ph2.getType());

         // anchor is not defined in the shape

@@ -98,26 +101,26 @@
                 !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() &&

                 !bodyPr2.isSetAnchor()

         );

-        assertEquals(7.2, shape2.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape2.getRightInset()); // 0.1"

-        assertEquals(3.6, shape2.getTopInset());  // 0.05"

-        assertEquals(3.6, shape2.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape2.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape2.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape2.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment());

 

         assertEquals("subtitle", shape2.getText());

         XSLFTextRun r2 = shape2.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals("Calibri", r2.getFontFamily());

-        assertEquals(32.0, r2.getFontSize());

+        assertEquals(32.0, r2.getFontSize(), 0);

         // TODO fix calculation of tint

         //assertEquals(new Color(137, 137, 137), r2.getFontColor());

     }

 

     void verifySlide2(XSLFSlide slide){

         XSLFSlideLayout layout = slide.getSlideLayout();

-        XSLFShape[] shapes = slide.getShapes();

+        List<XSLFShape> shapes = slide.getShapes();

         assertEquals("Title and Content",layout.getName());

 

-        XSLFTextShape shape1 = (XSLFTextShape)shapes[0];

+        XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0);

         CTPlaceholder ph1 = shape1.getCTPlaceholder();

         assertEquals(STPlaceholderType.TITLE, ph1.getType());

         // anchor is not defined in the shape

@@ -137,20 +140,20 @@
                 !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() &&

                 !bodyPr1.isSetAnchor()

         );

-        assertEquals(7.2, shape1.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape1.getRightInset()); // 0.1"

-        assertEquals(3.6, shape1.getTopInset());  // 0.05"

-        assertEquals(3.6, shape1.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape1.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape1.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape1.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.MIDDLE, shape1.getVerticalAlignment());

 

         // now check text properties

         assertEquals("Title", shape1.getText());

         XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals("Calibri", r1.getFontFamily());

-        assertEquals(44.0, r1.getFontSize());

+        assertEquals(44.0, r1.getFontSize(), 0);

         assertEquals(Color.black, r1.getFontColor());

 

-        XSLFTextShape shape2 = (XSLFTextShape)shapes[1];

+        XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1);

         CTPlaceholder ph2 = shape2.getCTPlaceholder();

         assertFalse(ph2.isSetType()); // <p:ph idx="1"/>

         assertTrue(ph2.isSetIdx());

@@ -172,54 +175,54 @@
                 !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() &&

                 !bodyPr2.isSetAnchor()

         );

-        assertEquals(7.2, shape2.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape2.getRightInset()); // 0.1"

-        assertEquals(3.6, shape2.getTopInset());  // 0.05"

-        assertEquals(3.6, shape2.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape2.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape2.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape2.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment());

 

         XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0);

-        assertEquals(0, pr1.getParentParagraph().getLevel());

-        assertEquals("Content", pr1.getText());

+        assertEquals(0, pr1.getParentParagraph().getIndentLevel());

+        assertEquals("Content", pr1.getRawText());

         assertEquals("Calibri", pr1.getFontFamily());

-        assertEquals(32.0, pr1.getFontSize());

-        assertEquals(27.0, pr1.getParentParagraph().getLeftMargin()); 

+        assertEquals(32.0, pr1.getFontSize(), 0);

+        assertEquals(27.0, pr1.getParentParagraph().getLeftMargin(), 0); 

         assertEquals("\u2022", pr1.getParentParagraph().getBulletCharacter()); 

         assertEquals("Arial", pr1.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr2 = shape2.getTextParagraphs().get(1).getTextRuns().get(0);

-        assertEquals(1, pr2.getParentParagraph().getLevel());

-        assertEquals("Level 2", pr2.getText());

+        assertEquals(1, pr2.getParentParagraph().getIndentLevel());

+        assertEquals("Level 2", pr2.getRawText());

         assertEquals("Calibri", pr2.getFontFamily());

-        assertEquals(28.0, pr2.getFontSize());

-        assertEquals(58.5, pr2.getParentParagraph().getLeftMargin());

+        assertEquals(28.0, pr2.getFontSize(), 0);

+        assertEquals(58.5, pr2.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2013", pr2.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr2.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr3 = shape2.getTextParagraphs().get(2).getTextRuns().get(0);

-        assertEquals(2, pr3.getParentParagraph().getLevel());

-        assertEquals("Level 3", pr3.getText());

+        assertEquals(2, pr3.getParentParagraph().getIndentLevel());

+        assertEquals("Level 3", pr3.getRawText());

         assertEquals("Calibri", pr3.getFontFamily());

-        assertEquals(24.0, pr3.getFontSize());

-        assertEquals(90.0, pr3.getParentParagraph().getLeftMargin());

+        assertEquals(24.0, pr3.getFontSize(), 0);

+        assertEquals(90.0, pr3.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2022", pr3.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr3.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr4 = shape2.getTextParagraphs().get(3).getTextRuns().get(0);

-        assertEquals(3, pr4.getParentParagraph().getLevel());

-        assertEquals("Level 4", pr4.getText());

+        assertEquals(3, pr4.getParentParagraph().getIndentLevel());

+        assertEquals("Level 4", pr4.getRawText());

         assertEquals("Calibri", pr4.getFontFamily());

-        assertEquals(20.0, pr4.getFontSize());

-        assertEquals(126.0, pr4.getParentParagraph().getLeftMargin());

+        assertEquals(20.0, pr4.getFontSize(), 0);

+        assertEquals(126.0, pr4.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2013", pr4.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr4.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr5 = shape2.getTextParagraphs().get(4).getTextRuns().get(0);

-        assertEquals(4, pr5.getParentParagraph().getLevel());

-        assertEquals("Level 5", pr5.getText());

+        assertEquals(4, pr5.getParentParagraph().getIndentLevel());

+        assertEquals("Level 5", pr5.getRawText());

         assertEquals("Calibri", pr5.getFontFamily());

-        assertEquals(20.0, pr5.getFontSize());

-        assertEquals(162.0, pr5.getParentParagraph().getLeftMargin());

+        assertEquals(20.0, pr5.getFontSize(), 0);

+        assertEquals(162.0, pr5.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u00bb", pr5.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr5.getParentParagraph().getBulletFont());

 

@@ -227,10 +230,10 @@
 

     void verifySlide3(XSLFSlide slide){

         XSLFSlideLayout layout = slide.getSlideLayout();

-        XSLFShape[] shapes = slide.getShapes();

+        List<XSLFShape> shapes = slide.getShapes();

         assertEquals("Section Header",layout.getName());

 

-        XSLFTextShape shape1 = (XSLFTextShape)shapes[0];

+        XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0);

         CTPlaceholder ph1 = shape1.getCTPlaceholder();

         assertEquals(STPlaceholderType.TITLE, ph1.getType());

         // anchor is not defined in the shape

@@ -247,10 +250,10 @@
                 !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() &&

                 !bodyPr1.isSetAnchor()

         );

-        assertEquals(7.2, shape1.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape1.getRightInset()); // 0.1"

-        assertEquals(3.6, shape1.getTopInset());  // 0.05"

-        assertEquals(3.6, shape1.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape1.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape1.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape1.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.TOP, shape1.getVerticalAlignment());

 

         // now check text properties

@@ -258,13 +261,13 @@
         XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(TextAlign.LEFT, r1.getParentParagraph().getTextAlign());

         assertEquals("Calibri", r1.getFontFamily());

-        assertEquals(40.0, r1.getFontSize());

+        assertEquals(40.0, r1.getFontSize(), 0);

         assertEquals(Color.black, r1.getFontColor());

         assertTrue(r1.isBold());

         assertFalse(r1.isItalic());

-        assertFalse(r1.isUnderline());

+        assertFalse(r1.isUnderlined());

 

-        XSLFTextShape shape2 = (XSLFTextShape)shapes[1];

+        XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1);

         CTPlaceholder ph2 = shape2.getCTPlaceholder();

         assertEquals(STPlaceholderType.BODY, ph2.getType());

         // anchor is not defined in the shape

@@ -281,27 +284,27 @@
                 !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() &&

                 !bodyPr2.isSetAnchor()

         );

-        assertEquals(7.2, shape2.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape2.getRightInset()); // 0.1"

-        assertEquals(3.6, shape2.getTopInset());  // 0.05"

-        assertEquals(3.6, shape2.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape2.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape2.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape2.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.BOTTOM, shape2.getVerticalAlignment());

 

         assertEquals("Section Header", shape2.getText());

         XSLFTextRun r2 = shape2.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(TextAlign.LEFT, r2.getParentParagraph().getTextAlign());

         assertEquals("Calibri", r2.getFontFamily());

-        assertEquals(20.0, r2.getFontSize());

+        assertEquals(20.0, r2.getFontSize(), 0);

         // TODO fix calculation of tint

         //assertEquals(new Color(137, 137, 137), r2.getFontColor());

     }

 

     void verifySlide4(XSLFSlide slide){

         XSLFSlideLayout layout = slide.getSlideLayout();

-        XSLFShape[] shapes = slide.getShapes();

+        List<XSLFShape> shapes = slide.getShapes();

         assertEquals("Two Content",layout.getName());

 

-        XSLFTextShape shape1 = (XSLFTextShape)shapes[0];

+        XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0);

         CTPlaceholder ph1 = shape1.getCTPlaceholder();

         assertEquals(STPlaceholderType.TITLE, ph1.getType());

         // anchor is not defined in the shape

@@ -321,10 +324,10 @@
                 !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() &&

                 !bodyPr1.isSetAnchor()

         );

-        assertEquals(7.2, shape1.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape1.getRightInset()); // 0.1"

-        assertEquals(3.6, shape1.getTopInset());  // 0.05"

-        assertEquals(3.6, shape1.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape1.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape1.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape1.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.MIDDLE, shape1.getVerticalAlignment());

 

         // now check text properties

@@ -332,10 +335,10 @@
         XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(TextAlign.CENTER, r1.getParentParagraph().getTextAlign());

         assertEquals("Calibri", r1.getFontFamily());

-        assertEquals(44.0, r1.getFontSize());

+        assertEquals(44.0, r1.getFontSize(), 0);

         assertEquals(Color.black, r1.getFontColor());

 

-        XSLFTextShape shape2 = (XSLFTextShape)shapes[1];

+        XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1);

         CTPlaceholder ph2 = shape2.getCTPlaceholder();

         assertFalse(ph2.isSetType());

         assertTrue(ph2.isSetIdx());

@@ -354,68 +357,69 @@
                 !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() &&

                 !bodyPr2.isSetAnchor()

         );

-        assertEquals(7.2, shape2.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape2.getRightInset()); // 0.1"

-        assertEquals(3.6, shape2.getTopInset());  // 0.05"

-        assertEquals(3.6, shape2.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape2.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape2.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape2.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment());

 

         XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0);

-        assertEquals(0, pr1.getParentParagraph().getLevel());

-        assertEquals("Left", pr1.getText());

+        assertEquals(0, pr1.getParentParagraph().getIndentLevel());

+        assertEquals("Left", pr1.getRawText());

         assertEquals("Calibri", pr1.getFontFamily());

-        assertEquals(28.0, pr1.getFontSize());

-        assertEquals(27.0, pr1.getParentParagraph().getLeftMargin());

+        assertEquals(28.0, pr1.getFontSize(), 0);

+        assertEquals(27.0, pr1.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2022", pr1.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr1.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr2 = shape2.getTextParagraphs().get(1).getTextRuns().get(0);

-        assertEquals(1, pr2.getParentParagraph().getLevel());

+        assertEquals(1, pr2.getParentParagraph().getIndentLevel());

         assertEquals("Level 2", pr2.getParentParagraph().getText());

         assertEquals("Calibri", pr2.getFontFamily());

-        assertEquals(24.0, pr2.getFontSize());

-        assertEquals(58.5, pr2.getParentParagraph().getLeftMargin());

+        assertEquals(24.0, pr2.getFontSize(), 0);

+        assertEquals(58.5, pr2.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2013", pr2.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr2.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr3 = shape2.getTextParagraphs().get(2).getTextRuns().get(0);

-        assertEquals(2, pr3.getParentParagraph().getLevel());

+        assertEquals(2, pr3.getParentParagraph().getIndentLevel());

         assertEquals("Level 3", pr3.getParentParagraph().getText());

         assertEquals("Calibri", pr3.getFontFamily());

-        assertEquals(20.0, pr3.getFontSize());

-        assertEquals(90.0, pr3.getParentParagraph().getLeftMargin());

+        assertEquals(20.0, pr3.getFontSize(), 0);

+        assertEquals(90.0, pr3.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2022", pr3.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr3.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr4 = shape2.getTextParagraphs().get(3).getTextRuns().get(0);

-        assertEquals(3, pr4.getParentParagraph().getLevel());

+        assertEquals(3, pr4.getParentParagraph().getIndentLevel());

         assertEquals("Level 4", pr4.getParentParagraph().getText());

         assertEquals("Calibri", pr4.getFontFamily());

-        assertEquals(18.0, pr4.getFontSize());

-        assertEquals(126.0, pr4.getParentParagraph().getLeftMargin());

+        assertEquals(18.0, pr4.getFontSize(), 0);

+        assertEquals(126.0, pr4.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2013", pr4.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr4.getParentParagraph().getBulletFont());

 

-        XSLFTextShape shape3 = (XSLFTextShape)shapes[2];

+        XSLFTextShape shape3 = (XSLFTextShape)shapes.get(2);

         XSLFTextRun pr5 = shape3.getTextParagraphs().get(0).getTextRuns().get(0);

-        assertEquals(0, pr5.getParentParagraph().getLevel());

-        assertEquals("Right", pr5.getText());

+        assertEquals(0, pr5.getParentParagraph().getIndentLevel());

+        assertEquals("Right", pr5.getRawText());

         assertEquals("Calibri", pr5.getFontFamily());

         assertEquals(Color.black, pr5.getFontColor());

     }

 

+    @SuppressWarnings("unused")

     void verifySlide5(XSLFSlide slide){

         XSLFSlideLayout layout = slide.getSlideLayout();

-        XSLFShape[] shapes = slide.getShapes();

+        List<XSLFShape> shapes = slide.getShapes();

         // TODO

     }    

 

     void verifySlide7(XSLFSlide slide){

         XSLFSlideLayout layout = slide.getSlideLayout();

-        XSLFShape[] shapes = slide.getShapes();

+        List<XSLFShape> shapes = slide.getShapes();

         assertEquals("Blank",layout.getName());

 

-        XSLFTextShape shape1 = (XSLFTextShape)shapes[0];

+        XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0);

         CTPlaceholder ph1 = shape1.getCTPlaceholder();

         assertEquals(STPlaceholderType.TITLE, ph1.getType());

         // anchor is not defined in the shape

@@ -428,10 +432,10 @@
                 !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() &&

                 !bodyPr1.isSetAnchor()

         );

-        assertEquals(7.2, shape1.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape1.getRightInset()); // 0.1"

-        assertEquals(3.6, shape1.getTopInset());  // 0.05"

-        assertEquals(3.6, shape1.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape1.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape1.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape1.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.MIDDLE, shape1.getVerticalAlignment());

 

         // now check text properties

@@ -439,11 +443,11 @@
         XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(TextAlign.CENTER, r1.getParentParagraph().getTextAlign());

         assertEquals("Calibri", r1.getFontFamily());

-        assertEquals(44.0, r1.getFontSize());

+        assertEquals(44.0, r1.getFontSize(), 0);

         assertEquals(Color.black, r1.getFontColor());

         assertFalse(r1.isBold());

 

-        XSLFTextShape shape2 = (XSLFTextShape)shapes[1];

+        XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1);

 

         CTTextBodyProperties bodyPr2 = shape2.getTextBodyPr();

         // none of the following properties are set in the shapes and fetched from the master shape

@@ -452,19 +456,19 @@
                 !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() &&

                 !bodyPr2.isSetAnchor()

         );

-        assertEquals(7.2, shape2.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape2.getRightInset()); // 0.1"

-        assertEquals(3.6, shape2.getTopInset());  // 0.05"

-        assertEquals(3.6, shape2.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape2.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape2.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape2.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment());

 

         XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0);

-        assertEquals(0, pr1.getParentParagraph().getLevel());

-        assertEquals("Default Text", pr1.getText());

+        assertEquals(0, pr1.getParentParagraph().getIndentLevel());

+        assertEquals("Default Text", pr1.getRawText());

         assertEquals("Calibri", pr1.getFontFamily());

-        assertEquals(18.0, pr1.getFontSize());

+        assertEquals(18.0, pr1.getFontSize(), 0);

 

-        XSLFTextShape shape3 = (XSLFTextShape)shapes[2];

+        XSLFTextShape shape3 = (XSLFTextShape)shapes.get(2);

         assertEquals("Default", shape3.getTextParagraphs().get(0).getText());

         assertEquals("Text with levels", shape3.getTextParagraphs().get(1).getText());

         assertEquals("Level 1", shape3.getTextParagraphs().get(2).getText());

@@ -474,16 +478,16 @@
         for(int p = 0; p < 5; p++) {

             XSLFTextParagraph pr = shape3.getTextParagraphs().get(p);

             assertEquals("Calibri", pr.getTextRuns().get(0).getFontFamily());

-            assertEquals(18.0, pr.getTextRuns().get(0).getFontSize());

+            assertEquals(18.0, pr.getTextRuns().get(0).getFontSize(), 0);

         }

     }

 

     void verifySlide8(XSLFSlide slide){

         XSLFSlideLayout layout = slide.getSlideLayout();

-        XSLFShape[] shapes = slide.getShapes();

+        List<XSLFShape> shapes = slide.getShapes();

         assertEquals("Content with Caption",layout.getName());

 

-        XSLFTextShape shape1 = (XSLFTextShape)shapes[0];

+        XSLFTextShape shape1 = (XSLFTextShape)shapes.get(0);

         CTPlaceholder ph1 = shape1.getCTPlaceholder();

         assertEquals(STPlaceholderType.TITLE, ph1.getType());

         // anchor is not defined in the shape

@@ -501,10 +505,10 @@
                 !bodyPr1.isSetBIns() && !bodyPr1.isSetTIns() &&

                 !bodyPr1.isSetAnchor()

         );

-        assertEquals(7.2, shape1.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape1.getRightInset()); // 0.1"

-        assertEquals(3.6, shape1.getTopInset());  // 0.05"

-        assertEquals(3.6, shape1.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape1.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape1.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape1.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape1.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.BOTTOM, shape1.getVerticalAlignment());

 

         // now check text properties

@@ -512,11 +516,11 @@
         XSLFTextRun r1 = shape1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(TextAlign.LEFT, r1.getParentParagraph().getTextAlign());

         assertEquals("Calibri", r1.getFontFamily());

-        assertEquals(20.0, r1.getFontSize());

+        assertEquals(20.0, r1.getFontSize(), 0);

         assertEquals(Color.black, r1.getFontColor());

         assertTrue(r1.isBold());

 

-        XSLFTextShape shape2 = (XSLFTextShape)shapes[1];

+        XSLFTextShape shape2 = (XSLFTextShape)shapes.get(1);

         CTPlaceholder ph2 = shape2.getCTPlaceholder();

         assertFalse(ph2.isSetType());

         assertTrue(ph2.isSetIdx());

@@ -535,57 +539,57 @@
                 !bodyPr2.isSetBIns() && !bodyPr2.isSetTIns() &&

                 !bodyPr2.isSetAnchor()

         );

-        assertEquals(7.2, shape2.getLeftInset());  // 0.1"

-        assertEquals(7.2, shape2.getRightInset()); // 0.1"

-        assertEquals(3.6, shape2.getTopInset());  // 0.05"

-        assertEquals(3.6, shape2.getBottomInset()); // 0.05"

+        assertEquals(7.2, shape2.getLeftInset(), 0);  // 0.1"

+        assertEquals(7.2, shape2.getRightInset(), 0); // 0.1"

+        assertEquals(3.6, shape2.getTopInset(), 0);  // 0.05"

+        assertEquals(3.6, shape2.getBottomInset(), 0); // 0.05"

         assertEquals(VerticalAlignment.TOP, shape2.getVerticalAlignment());

 

         XSLFTextRun pr1 = shape2.getTextParagraphs().get(0).getTextRuns().get(0);

-        assertEquals(0, pr1.getParentParagraph().getLevel());

-        assertEquals("Level 1", pr1.getText());

+        assertEquals(0, pr1.getParentParagraph().getIndentLevel());

+        assertEquals("Level 1", pr1.getRawText());

         assertEquals("Calibri", pr1.getFontFamily());

-        assertEquals(32.0, pr1.getFontSize());

-        assertEquals(27.0, pr1.getParentParagraph().getLeftMargin());

+        assertEquals(32.0, pr1.getFontSize(), 0);

+        assertEquals(27.0, pr1.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2022", pr1.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr1.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr2 = shape2.getTextParagraphs().get(1).getTextRuns().get(0);

-        assertEquals(1, pr2.getParentParagraph().getLevel());

+        assertEquals(1, pr2.getParentParagraph().getIndentLevel());

         assertEquals("Level 2", pr2.getParentParagraph().getText());

         assertEquals("Calibri", pr2.getFontFamily());

-        assertEquals(28.0, pr2.getFontSize());

-        assertEquals(58.5, pr2.getParentParagraph().getLeftMargin());

+        assertEquals(28.0, pr2.getFontSize(), 0);

+        assertEquals(58.5, pr2.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2013", pr2.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr2.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr3 = shape2.getTextParagraphs().get(2).getTextRuns().get(0);

-        assertEquals(2, pr3.getParentParagraph().getLevel());

+        assertEquals(2, pr3.getParentParagraph().getIndentLevel());

         assertEquals("Level 3", pr3.getParentParagraph().getText());

         assertEquals("Calibri", pr3.getFontFamily());

-        assertEquals(24.0, pr3.getFontSize());

-        assertEquals(90.0, pr3.getParentParagraph().getLeftMargin());

+        assertEquals(24.0, pr3.getFontSize(), 0);

+        assertEquals(90.0, pr3.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2022", pr3.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr3.getParentParagraph().getBulletFont());

 

         XSLFTextRun pr4 = shape2.getTextParagraphs().get(3).getTextRuns().get(0);

-        assertEquals(3, pr4.getParentParagraph().getLevel());

+        assertEquals(3, pr4.getParentParagraph().getIndentLevel());

         assertEquals("Level 4", pr4.getParentParagraph().getText());

         assertEquals("Calibri", pr4.getFontFamily());

-        assertEquals(20.0, pr4.getFontSize());

-        assertEquals(126.0, pr4.getParentParagraph().getLeftMargin());

+        assertEquals(20.0, pr4.getFontSize(), 0);

+        assertEquals(126.0, pr4.getParentParagraph().getLeftMargin(), 0);

         assertEquals("\u2013", pr4.getParentParagraph().getBulletCharacter());

         assertEquals("Arial", pr4.getParentParagraph().getBulletFont());

 

-        XSLFTextShape shape3 = (XSLFTextShape)shapes[2];

+        XSLFTextShape shape3 = (XSLFTextShape)shapes.get(2);

         assertEquals(VerticalAlignment.TOP, shape3.getVerticalAlignment());

         assertEquals("Content with caption", shape3.getText());

 

         pr1 = shape3.getTextParagraphs().get(0).getTextRuns().get(0);

-        assertEquals(0, pr1.getParentParagraph().getLevel());

-        assertEquals("Content with caption", pr1.getText());

+        assertEquals(0, pr1.getParentParagraph().getIndentLevel());

+        assertEquals("Content with caption", pr1.getRawText());

         assertEquals("Calibri", pr1.getFontFamily());

-        assertEquals(14.0, pr1.getFontSize());

+        assertEquals(14.0, pr1.getFontSize(), 0);

 

     }

 

@@ -599,7 +603,7 @@
         XSLFTextRun r1 = footer.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(TextAlign.CENTER, r1.getParentParagraph().getTextAlign());

         assertEquals("Calibri", r1.getFontFamily());

-        assertEquals(12.0, r1.getFontSize());

+        assertEquals(12.0, r1.getFontSize(), 0);

         // TODO calculation of tint is incorrect

         assertEquals(new Color(64,64,64), r1.getFontColor());

 

@@ -610,18 +614,18 @@
         assertEquals("10", sldNum.getText());

     }

 

-

+    @Test

     public void testTitleStyles(){

         XMLSlideShow ppt = new XMLSlideShow();

 

-        XSLFSlideMaster master = ppt.getSlideMasters()[0];

+        XSLFSlideMaster master = ppt.getSlideMasters().get(0);

         XSLFTheme theme = master.getTheme();

         XSLFSlideLayout layout = master.getLayout(SlideLayout.TITLE);

         XSLFSlide slide = ppt.createSlide(layout) ;

         assertSame(layout, slide.getSlideLayout());

         assertSame(master, slide.getSlideMaster());

 

-        XSLFTextShape titleShape = (XSLFTextShape)slide.getPlaceholder(0);

+        XSLFTextShape titleShape = slide.getPlaceholder(0);

         titleShape.setText("Apache POI");

         XSLFTextParagraph paragraph = titleShape.getTextParagraphs().get(0);

         XSLFTextRun textRun = paragraph.getTextRuns().get(0);

@@ -631,12 +635,12 @@
         CTTextParagraphProperties lv1PPr = master.getXmlObject().getTxStyles().getTitleStyle().getLvl1PPr();

         CTTextCharacterProperties lv1CPr = lv1PPr.getDefRPr();

         assertEquals(4400, lv1CPr.getSz());

-        assertEquals(44.0, textRun.getFontSize());

+        assertEquals(44.0, textRun.getFontSize(), 0);

         assertEquals("+mj-lt", lv1CPr.getLatin().getTypeface());

         assertEquals("Calibri", theme.getMajorFont());

         assertEquals("Calibri", textRun.getFontFamily());

         lv1CPr.setSz(3200);

-        assertEquals(32.0, textRun.getFontSize());

+        assertEquals(32.0, textRun.getFontSize(), 0);

         lv1CPr.getLatin().setTypeface("Arial");

         assertEquals("Arial", textRun.getFontFamily());

         assertEquals(STTextAlignType.CTR, lv1PPr.getAlgn());

@@ -650,7 +654,7 @@
         CTTextParagraphProperties lv2PPr = tx2.getTextBody(true).getLstStyle().addNewLvl1PPr();

         CTTextCharacterProperties lv2CPr = lv2PPr.addNewDefRPr();

         lv2CPr.setSz(3300);

-        assertEquals(33.0, textRun.getFontSize());

+        assertEquals(33.0, textRun.getFontSize(), 0);

         lv2CPr.addNewLatin().setTypeface("Times");

         assertEquals("Times", textRun.getFontFamily());

         lv2PPr.setAlgn(STTextAlignType.R);

@@ -663,7 +667,7 @@
         CTTextParagraphProperties lv3PPr = tx3.getTextBody(true).getLstStyle().addNewLvl1PPr();

         CTTextCharacterProperties lv3CPr = lv3PPr.addNewDefRPr();

         lv3CPr.setSz(3400);

-        assertEquals(34.0, textRun.getFontSize());

+        assertEquals(34.0, textRun.getFontSize(), 0);

         lv3CPr.addNewLatin().setTypeface("Courier New");

         assertEquals("Courier New", textRun.getFontFamily());

         lv3PPr.setAlgn(STTextAlignType.CTR);

@@ -674,7 +678,7 @@
         CTTextParagraphProperties lv4PPr = titleShape.getTextBody(true).getLstStyle().addNewLvl1PPr();

         CTTextCharacterProperties lv4CPr = lv4PPr.addNewDefRPr();

         lv4CPr.setSz(3500);

-        assertEquals(35.0, textRun.getFontSize());

+        assertEquals(35.0, textRun.getFontSize(), 0);

         lv4CPr.addNewLatin().setTypeface("Arial");

         assertEquals("Arial", textRun.getFontFamily());

         lv4PPr.setAlgn(STTextAlignType.L);

@@ -684,40 +688,41 @@
         CTTextParagraphProperties lv5PPr = paragraph.getXmlObject().addNewPPr();

         CTTextCharacterProperties lv5CPr = textRun.getXmlObject().getRPr();

         lv5CPr.setSz(3600);

-        assertEquals(36.0, textRun.getFontSize());

+        assertEquals(36.0, textRun.getFontSize(), 0);

         lv5CPr.addNewLatin().setTypeface("Calibri");

         assertEquals("Calibri", textRun.getFontFamily());

         lv5PPr.setAlgn(STTextAlignType.CTR);

         assertEquals(TextAlign.CENTER, paragraph.getTextAlign());

     }

 

+    @Test

     public void testBodyStyles(){

         XMLSlideShow ppt = new XMLSlideShow();

 

-        XSLFSlideMaster master = ppt.getSlideMasters()[0];

+        XSLFSlideMaster master = ppt.getSlideMasters().get(0);

         XSLFTheme theme = master.getTheme();

         XSLFSlideLayout layout = master.getLayout(SlideLayout.TITLE_AND_CONTENT);

         XSLFSlide slide = ppt.createSlide(layout) ;

         assertSame(layout, slide.getSlideLayout());

         assertSame(master, slide.getSlideMaster());

 

-        XSLFTextShape tx1 = (XSLFTextShape)slide.getPlaceholder(1);

+        XSLFTextShape tx1 = slide.getPlaceholder(1);

         tx1.clearText();

 

         XSLFTextParagraph p1 = tx1.addNewTextParagraph();

-        assertEquals(0, p1.getLevel());

+        assertEquals(0, p1.getIndentLevel());

         XSLFTextRun r1 = p1.addNewTextRun();

         r1.setText("Apache POI");

 

         XSLFTextParagraph p2 = tx1.addNewTextParagraph();

-        p2.setLevel(1);

-        assertEquals(1, p2.getLevel());

+        p2.setIndentLevel(1);

+        assertEquals(1, p2.getIndentLevel());

         XSLFTextRun r2 = p2.addNewTextRun();

         r2.setText("HSLF");

 

         XSLFTextParagraph p3 = tx1.addNewTextParagraph();

-        p3.setLevel(2);

-        assertEquals(2, p3.getLevel());

+        p3.setIndentLevel(2);

+        assertEquals(2, p3.getIndentLevel());

         XSLFTextRun r3 = p3.addNewTextRun();

         r3.setText("XSLF");

 

@@ -731,12 +736,12 @@
         CTTextCharacterProperties lv3CPr = lv3PPr.getDefRPr();

         // lv1

         assertEquals(3200, lv1CPr.getSz());

-        assertEquals(32.0, r1.getFontSize());

+        assertEquals(32.0, r1.getFontSize(), 0);

         assertEquals("+mn-lt", lv1CPr.getLatin().getTypeface());

         assertEquals("Calibri", theme.getMinorFont());

         assertEquals("Calibri", r1.getFontFamily());

         lv1CPr.setSz(3300);

-        assertEquals(33.0, r1.getFontSize());

+        assertEquals(33.0, r1.getFontSize(), 0);

         lv1CPr.getLatin().setTypeface("Arial");

         assertEquals("Arial", r1.getFontFamily());

         assertEquals(STTextAlignType.L, lv1PPr.getAlgn());

@@ -745,9 +750,9 @@
         assertEquals(TextAlign.RIGHT, p1.getTextAlign());

         //lv2

         assertEquals(2800, lv2CPr.getSz());

-        assertEquals(28.0, r2.getFontSize());

+        assertEquals(28.0, r2.getFontSize(), 0);

         lv2CPr.setSz(3300);

-        assertEquals(33.0, r2.getFontSize());

+        assertEquals(33.0, r2.getFontSize(), 0);

         lv2CPr.getLatin().setTypeface("Times");

         assertEquals("Times", r2.getFontFamily());

         assertEquals(STTextAlignType.L, lv2PPr.getAlgn());

@@ -756,9 +761,9 @@
         assertEquals(TextAlign.RIGHT, p2.getTextAlign());

         //lv3

         assertEquals(2400, lv3CPr.getSz());

-        assertEquals(24.0, r3.getFontSize());

+        assertEquals(24.0, r3.getFontSize(), 0);

         lv3CPr.setSz(2500);

-        assertEquals(25.0, r3.getFontSize());

+        assertEquals(25.0, r3.getFontSize(), 0);

         lv3CPr.getLatin().setTypeface("Courier New");

         assertEquals("Courier New", r3.getFontFamily());

         assertEquals(STTextAlignType.L, lv3PPr.getAlgn());

@@ -780,21 +785,21 @@
         lv3CPr = lv3PPr.addNewDefRPr();

 

         lv1CPr.setSz(3300);

-        assertEquals(33.0, r1.getFontSize());

+        assertEquals(33.0, r1.getFontSize(), 0);

         lv1CPr.addNewLatin().setTypeface("Times");

         assertEquals("Times", r1.getFontFamily());

         lv1PPr.setAlgn(STTextAlignType.L);

         assertEquals(TextAlign.LEFT, p1.getTextAlign());

 

         lv2CPr.setSz(3300);

-        assertEquals(33.0, r2.getFontSize());

+        assertEquals(33.0, r2.getFontSize(), 0);

         lv2CPr.addNewLatin().setTypeface("Times");

         assertEquals("Times", r2.getFontFamily());

         lv2PPr.setAlgn(STTextAlignType.L);

         assertEquals(TextAlign.LEFT, p2.getTextAlign());

 

         lv3CPr.setSz(3300);

-        assertEquals(33.0, r3.getFontSize());

+        assertEquals(33.0, r3.getFontSize(), 0);

         lv3CPr.addNewLatin().setTypeface("Times");

         assertEquals("Times", r3.getFontFamily());

         lv3PPr.setAlgn(STTextAlignType.L);

@@ -812,21 +817,21 @@
         lv3CPr = lv3PPr.addNewDefRPr();

 

         lv1CPr.setSz(3400);

-        assertEquals(34.0, r1.getFontSize());

+        assertEquals(34.0, r1.getFontSize(), 0);

         lv1CPr.addNewLatin().setTypeface("Courier New");

         assertEquals("Courier New", r1.getFontFamily());

         lv1PPr.setAlgn(STTextAlignType.CTR);

         assertEquals(TextAlign.CENTER, p1.getTextAlign());

 

         lv2CPr.setSz(3400);

-        assertEquals(34.0, r2.getFontSize());

+        assertEquals(34.0, r2.getFontSize(), 0);

         lv2CPr.addNewLatin().setTypeface("Courier New");

         assertEquals("Courier New", r2.getFontFamily());

         lv2PPr.setAlgn(STTextAlignType.CTR);

         assertEquals(TextAlign.CENTER, p2.getTextAlign());

 

         lv3CPr.setSz(3400);

-        assertEquals(34.0, r3.getFontSize());

+        assertEquals(34.0, r3.getFontSize(), 0);

         lv3CPr.addNewLatin().setTypeface("Courier New");

         assertEquals("Courier New", r3.getFontFamily());

         lv3PPr.setAlgn(STTextAlignType.CTR);

@@ -842,21 +847,21 @@
         lv3CPr = lv3PPr.addNewDefRPr();

 

         lv1CPr.setSz(3500);

-        assertEquals(35.0, r1.getFontSize());

+        assertEquals(35.0, r1.getFontSize(), 0);

         lv1CPr.addNewLatin().setTypeface("Arial");

         assertEquals("Arial", r1.getFontFamily());

         lv1PPr.setAlgn(STTextAlignType.L);

         assertEquals(TextAlign.LEFT, p1.getTextAlign());

 

         lv2CPr.setSz(3500);

-        assertEquals(35.0, r2.getFontSize());

+        assertEquals(35.0, r2.getFontSize(), 0);

         lv2CPr.addNewLatin().setTypeface("Arial");

         assertEquals("Arial", r2.getFontFamily());

         lv2PPr.setAlgn(STTextAlignType.L);

         assertEquals(TextAlign.LEFT, p2.getTextAlign());

 

         lv3CPr.setSz(3500);

-        assertEquals(35.0, r3.getFontSize());

+        assertEquals(35.0, r3.getFontSize(), 0);

         lv3CPr.addNewLatin().setTypeface("Arial");

         assertEquals("Arial", r3.getFontFamily());

         lv3PPr.setAlgn(STTextAlignType.L);

@@ -871,21 +876,21 @@
         lv3CPr = r3.getXmlObject().getRPr();

 

         lv1CPr.setSz(3600);

-        assertEquals(36.0, r1.getFontSize());

+        assertEquals(36.0, r1.getFontSize(), 0);

         lv1CPr.addNewLatin().setTypeface("Calibri");

         assertEquals("Calibri", r1.getFontFamily());

         lv1PPr.setAlgn(STTextAlignType.CTR);

         assertEquals(TextAlign.CENTER, p1.getTextAlign());

 

         lv2CPr.setSz(3600);

-        assertEquals(36.0, r2.getFontSize());

+        assertEquals(36.0, r2.getFontSize(), 0);

         lv2CPr.addNewLatin().setTypeface("Calibri");

         assertEquals("Calibri", r2.getFontFamily());

         lv2PPr.setAlgn(STTextAlignType.CTR);

         assertEquals(TextAlign.CENTER, p2.getTextAlign());

 

         lv3CPr.setSz(3600);

-        assertEquals(36.0, r3.getFontSize());

+        assertEquals(36.0, r3.getFontSize(), 0);

         lv3CPr.addNewLatin().setTypeface("Calibri");

         assertEquals("Calibri", r3.getFontFamily());

         lv3PPr.setAlgn(STTextAlignType.CTR);

diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java
index 650bfcd..f928124 100644
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTheme.java
@@ -16,32 +16,39 @@
 ==================================================================== */

 package org.apache.poi.xslf.usermodel;

 

-import junit.framework.TestCase;

-import org.apache.poi.xslf.XSLFTestDataSamples;

+import static org.junit.Assert.*;

 

 import java.awt.Color;

-import java.awt.TexturePaint;

+import java.util.List;

+

+import org.apache.poi.sl.usermodel.*;

+import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint;

+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;

+import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint;

+import org.apache.poi.xslf.XSLFTestDataSamples;

+import org.junit.Test;

 

 /**

  * test reading properties from a multi-theme and multi-master document

  *

  * @author Yegor Kozlov

  */

-public class TestXSLFTheme extends TestCase {

+public class TestXSLFTheme {

+    @Test

     public void testRead(){

         XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("themes.pptx");

-        XSLFSlide[] slides = ppt.getSlides();

+        List<XSLFSlide> slides = ppt.getSlides();

 

-        slide1(slides[0]);

-        slide2(slides[1]);

-        slide3(slides[2]);

-        slide4(slides[3]);

-        slide5(slides[4]);

-        slide6(slides[5]);

-        slide7(slides[6]);

-        slide8(slides[7]);

-        slide9(slides[8]);

-        slide10(slides[9]);

+        slide1(slides.get(0));

+        slide2(slides.get(1));

+        slide3(slides.get(2));

+        slide4(slides.get(3));

+        slide5(slides.get(4));

+        slide6(slides.get(5));

+        slide7(slides.get(6));

+        slide8(slides.get(7));

+        slide9(slides.get(8));

+        slide10(slides.get(9));

     }

 

     private XSLFShape getShape(XSLFSheet sheet, String name){

@@ -52,41 +59,39 @@
     }

 

     void slide1(XSLFSlide slide){

-        assertEquals(Color.white, slide.getBackground().getFillColor());

+        assertEquals(Color.WHITE, slide.getBackground().getFillColor());

 

         XSLFTheme theme = slide.getTheme();

         assertEquals("Office Theme", theme.getName());

 

         XSLFTextShape sh1 = (XSLFTextShape)getShape(slide, "Rectangle 3");

-        RenderableShape rsh1 = new RenderableShape(sh1);

         XSLFTextRun run1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(Color.white, run1.getFontColor());

         assertEquals(new Color(79, 129, 189), sh1.getFillColor());

-        assertTrue(rsh1.getFillPaint(null) instanceof Color) ;   // solid fill

+        assertTrue(sh1.getFillStyle().getPaint() instanceof SolidPaint) ;   // solid fill

 

     }

 

     void slide2(XSLFSlide slide){

         // Background 2, darker 10%

         // YK: PPT shows slightly different color: new Color(221, 217, 195)

-        assertEquals(new Color(214, 212, 203), slide.getBackground().getFillColor());

+        assertEquals(new Color(221, 217, 195), slide.getBackground().getFillColor());

     }

 

     void slide3(XSLFSlide slide){

-        assertNull(slide.getBackground().getFillColor());

-        assertTrue(slide.getBackground().getPaint(null).getClass().getName().indexOf("Gradient") > 0);

+        PaintStyle fs = slide.getBackground().getFillStyle().getPaint();

+        assertTrue(fs instanceof GradientPaint);

     }

 

     void slide4(XSLFSlide slide){

-        assertNull(slide.getBackground().getFillColor());

-        assertTrue(slide.getBackground().getPaint(null).getClass().getName().indexOf("Gradient") > 0);

+        PaintStyle fs = slide.getBackground().getFillStyle().getPaint();

+        assertTrue(fs instanceof GradientPaint);

 

         XSLFTextShape sh1 = (XSLFTextShape)getShape(slide, "Rectangle 4");

-        RenderableShape rsh1 = new RenderableShape(sh1);

         XSLFTextRun run1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(Color.white, run1.getFontColor());

         assertEquals(new Color(148, 198, 0), sh1.getFillColor());

-        assertTrue(rsh1.getFillPaint(null) instanceof Color) ;   // solid fill

+        assertTrue(sh1.getFillStyle().getPaint() instanceof SolidPaint) ;   // solid fill

 

         XSLFTextShape sh2 = (XSLFTextShape)getShape(slide, "Title 3");

         XSLFTextRun run2 = sh2.getTextParagraphs().get(0).getTextRuns().get(0);

@@ -97,14 +102,15 @@
     }

 

     void slide5(XSLFSlide slide){

-        assertTrue(slide.getBackground().getPaint(null) instanceof TexturePaint);

+        PaintStyle fs = slide.getBackground().getFillStyle().getPaint();

+        assertTrue(fs instanceof TexturePaint);

 

         XSLFTextShape sh2 = (XSLFTextShape)getShape(slide, "Title 1");

         XSLFTextRun run2 = sh2.getTextParagraphs().get(0).getTextRuns().get(0);

         assertEquals(new Color(148, 198, 0), run2.getFontColor());

         assertNull(sh2.getFillColor());  // no fill

         // font size is 40pt and scale factor is 90%

-        assertEquals(36.0, run2.getFontSize());

+        assertEquals(36.0, run2.getFontSize(), 0);

 

         assertTrue(slide.getSlideLayout().getFollowMasterGraphics());

     }

@@ -127,21 +133,24 @@
     void slide7(XSLFSlide slide){

 

         //YK: PPT reports a slightly different color: r=189,g=239,b=87

-        assertEquals(new Color(182, 218, 108), slide.getBackground().getFillColor());

+        assertEquals(new Color(189, 239, 87), slide.getBackground().getFillColor());

 

         assertFalse(slide.getFollowMasterGraphics());

     }

 

     void slide8(XSLFSlide slide){

-        assertTrue(slide.getBackground().getPaint(null) instanceof TexturePaint);

+        PaintStyle fs = slide.getBackground().getFillStyle().getPaint();

+        assertTrue(fs instanceof TexturePaint);

     }

 

     void slide9(XSLFSlide slide){

-        assertTrue(slide.getBackground().getPaint(null) instanceof TexturePaint);

+        PaintStyle fs = slide.getBackground().getFillStyle().getPaint();

+        assertTrue(fs instanceof TexturePaint);

     }

 

     void slide10(XSLFSlide slide){

-        assertTrue(slide.getBackground().getPaint(null).getClass().getName().indexOf("Gradient") > 0);

+        PaintStyle fs = slide.getBackground().getFillStyle().getPaint();

+        assertTrue(fs instanceof GradientPaint);

 

         XSLFTextShape sh1 = (XSLFTextShape)getShape(slide, "Title 3");

         XSLFTextRun run1 = sh1.getTextParagraphs().get(0).getTextRuns().get(0);

diff --git a/src/resources/scratchpad/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml b/src/resources/scratchpad/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml
new file mode 100644
index 0000000..4a3a070
--- /dev/null
+++ b/src/resources/scratchpad/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml
@@ -0,0 +1,19906 @@
+<?xml version="1.0" encoding="utf-8"?>

+<presetShapeDefinitons>

+  <accentBorderCallout1>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 112500" />

+

+      <gd name="adj4" fmla="val -38333" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <close />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </accentBorderCallout1>

+  <accentBorderCallout2>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 18750" />

+

+      <gd name="adj4" fmla="val -16667" />

+

+      <gd name="adj5" fmla="val 112500" />

+

+      <gd name="adj6" fmla="val -46667" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+      <gd name="y3" fmla="*/ h adj5 100000" />

+      <gd name="x3" fmla="*/ w adj6 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <close />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </accentBorderCallout2>

+  <accentBorderCallout3>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 18750" />

+

+      <gd name="adj4" fmla="val -16667" />

+

+      <gd name="adj5" fmla="val 100000" />

+

+      <gd name="adj6" fmla="val -16667" />

+

+      <gd name="adj7" fmla="val 112963" />

+

+      <gd name="adj8" fmla="val -8333" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+      <gd name="y3" fmla="*/ h adj5 100000" />

+      <gd name="x3" fmla="*/ w adj6 100000" />

+      <gd name="y4" fmla="*/ h adj7 100000" />

+      <gd name="x4" fmla="*/ w adj8 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+      <ahXY gdRefX="adj8" minX="-2147483647" maxX="2147483647" gdRefY="adj7" minY="-2147483647" maxY="2147483647">

+        <pos x="x4" y="y4" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <close />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </accentBorderCallout3>

+  <accentCallout1>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 112500" />

+

+      <gd name="adj4" fmla="val -38333" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <close />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </accentCallout1>

+  <accentCallout2>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 18750" />

+

+      <gd name="adj4" fmla="val -16667" />

+

+      <gd name="adj5" fmla="val 112500" />

+

+      <gd name="adj6" fmla="val -46667" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+      <gd name="y3" fmla="*/ h adj5 100000" />

+      <gd name="x3" fmla="*/ w adj6 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <close />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </accentCallout2>

+  <accentCallout3>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 18750" />

+

+      <gd name="adj4" fmla="val -16667" />

+

+      <gd name="adj5" fmla="val 100000" />

+

+      <gd name="adj6" fmla="val -16667" />

+

+      <gd name="adj7" fmla="val 112963" />

+

+      <gd name="adj8" fmla="val -8333" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+      <gd name="y3" fmla="*/ h adj5 100000" />

+      <gd name="x3" fmla="*/ w adj6 100000" />

+      <gd name="y4" fmla="*/ h adj7 100000" />

+      <gd name="x4" fmla="*/ w adj8 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+      <ahXY gdRefX="adj8" minX="-2147483647" maxX="2147483647" gdRefY="adj7" minY="-2147483647" maxY="2147483647">

+        <pos x="x4" y="y4" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <close />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </accentCallout3>

+  <actionButtonBackPrevious>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g12" fmla="+- hc dx2 0" />

+    </gdLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g11" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g11" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g11" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </actionButtonBackPrevious>

+  <actionButtonBeginning>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g12" fmla="+- hc dx2 0" />

+      <gd name="g13" fmla="*/ ss 3 4" />

+      <gd name="g14" fmla="*/ g13 1 8" />

+      <gd name="g15" fmla="*/ g13 1 4" />

+      <gd name="g16" fmla="+- g11 g14 0" />

+      <gd name="g17" fmla="+- g11 g15 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g17" y="vc" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g16" y="g9" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g16" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g17" y="vc" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g16" y="g9" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g16" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g17" y="vc" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g16" y="g9" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g16" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonBeginning>

+  <actionButtonBlank>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonBlank>

+  <actionButtonDocument>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="dx1" fmla="*/ ss 9 32" />

+      <gd name="g11" fmla="+- hc 0 dx1" />

+      <gd name="g12" fmla="+- hc dx1 0" />

+      <gd name="g13" fmla="*/ ss 3 16" />

+      <gd name="g14" fmla="+- g12 0 g13" />

+      <gd name="g15" fmla="+- g9 g13 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g11" y="g9" />

+        </moveTo>

+        <lnTo>

+          <pt x="g14" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g15" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darkenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="g11" y="g9" />

+        </moveTo>

+        <lnTo>

+          <pt x="g14" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g14" y="g15" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g15" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g14" y="g9" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g14" y="g15" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g15" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g11" y="g9" />

+        </moveTo>

+        <lnTo>

+          <pt x="g14" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g15" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g12" y="g15" />

+        </moveTo>

+        <lnTo>

+          <pt x="g14" y="g15" />

+        </lnTo>

+        <lnTo>

+          <pt x="g14" y="g9" />

+        </lnTo>

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonDocument>

+  <actionButtonEnd>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g12" fmla="+- hc dx2 0" />

+      <gd name="g13" fmla="*/ ss 3 4" />

+      <gd name="g14" fmla="*/ g13 3 4" />

+      <gd name="g15" fmla="*/ g13 7 8" />

+      <gd name="g16" fmla="+- g11 g14 0" />

+      <gd name="g17" fmla="+- g11 g15 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g16" y="vc" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g17" y="g9" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g17" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g16" y="vc" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g17" y="g9" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g17" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g16" y="vc" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g17" y="g9" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g12" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g17" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonEnd>

+  <actionButtonForwardNext>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g12" fmla="+- hc dx2 0" />

+    </gdLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g12" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g12" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g12" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="g11" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g9" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </actionButtonForwardNext>

+  <actionButtonHelp>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g13" fmla="*/ ss 3 4" />

+      <gd name="g14" fmla="*/ g13 1 7" />

+      <gd name="g15" fmla="*/ g13 3 14" />

+      <gd name="g16" fmla="*/ g13 2 7" />

+      <gd name="g19" fmla="*/ g13 3 7" />

+      <gd name="g20" fmla="*/ g13 4 7" />

+      <gd name="g21" fmla="*/ g13 17 28" />

+      <gd name="g23" fmla="*/ g13 21 28" />

+      <gd name="g24" fmla="*/ g13 11 14" />

+      <gd name="g27" fmla="+- g9 g16 0" />

+      <gd name="g29" fmla="+- g9 g21 0" />

+      <gd name="g30" fmla="+- g9 g23 0" />

+      <gd name="g31" fmla="+- g9 g24 0" />

+      <gd name="g33" fmla="+- g11 g15 0" />

+      <gd name="g36" fmla="+- g11 g19 0" />

+      <gd name="g37" fmla="+- g11 g20 0" />

+      <gd name="g41" fmla="*/ g13 1 14" />

+      <gd name="g42" fmla="*/ g13 3 28" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g33" y="g27" />

+        </moveTo>

+

+        <arcTo wR="g16" hR="g16" stAng="cd2" swAng="cd2" />

+        <arcTo wR="g14" hR="g15" stAng="0" swAng="cd4" />

+        <arcTo wR="g41" hR="g42" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="g37" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g29" />

+        </lnTo>

+        <arcTo wR="g14" hR="g15" stAng="cd2" swAng="cd4" />

+        <arcTo wR="g41" hR="g42" stAng="cd4" swAng="-5400000" />

+        <arcTo wR="g14" hR="g14" stAng="0" swAng="-10800000" />

+        <close />

+        <moveTo>

+          <pt x="hc" y="g31" />

+        </moveTo>

+

+        <arcTo wR="g42" hR="g42" stAng="3cd4" swAng="21600000" />

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g33" y="g27" />

+        </moveTo>

+

+        <arcTo wR="g16" hR="g16" stAng="cd2" swAng="cd2" />

+        <arcTo wR="g14" hR="g15" stAng="0" swAng="cd4" />

+        <arcTo wR="g41" hR="g42" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="g37" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g29" />

+        </lnTo>

+        <arcTo wR="g14" hR="g15" stAng="cd2" swAng="cd4" />

+        <arcTo wR="g41" hR="g42" stAng="cd4" swAng="-5400000" />

+        <arcTo wR="g14" hR="g14" stAng="0" swAng="-10800000" />

+        <close />

+        <moveTo>

+          <pt x="hc" y="g31" />

+        </moveTo>

+

+        <arcTo wR="g42" hR="g42" stAng="3cd4" swAng="21600000" />

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g33" y="g27" />

+        </moveTo>

+

+        <arcTo wR="g16" hR="g16" stAng="cd2" swAng="cd2" />

+        <arcTo wR="g14" hR="g15" stAng="0" swAng="cd4" />

+        <arcTo wR="g41" hR="g42" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="g37" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g29" />

+        </lnTo>

+        <arcTo wR="g14" hR="g15" stAng="cd2" swAng="cd4" />

+        <arcTo wR="g41" hR="g42" stAng="cd4" swAng="-5400000" />

+        <arcTo wR="g14" hR="g14" stAng="0" swAng="-10800000" />

+        <close />

+        <moveTo>

+          <pt x="hc" y="g31" />

+        </moveTo>

+

+        <arcTo wR="g42" hR="g42" stAng="3cd4" swAng="21600000" />

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonHelp>

+  <actionButtonHome>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g12" fmla="+- hc dx2 0" />

+      <gd name="g13" fmla="*/ ss 3 4" />

+      <gd name="g14" fmla="*/ g13 1 16" />

+      <gd name="g15" fmla="*/ g13 1 8" />

+      <gd name="g16" fmla="*/ g13 3 16" />

+      <gd name="g17" fmla="*/ g13 5 16" />

+      <gd name="g18" fmla="*/ g13 7 16" />

+      <gd name="g19" fmla="*/ g13 9 16" />

+      <gd name="g20" fmla="*/ g13 11 16" />

+      <gd name="g21" fmla="*/ g13 3 4" />

+      <gd name="g22" fmla="*/ g13 13 16" />

+      <gd name="g23" fmla="*/ g13 7 8" />

+      <gd name="g24" fmla="+- g9 g14 0" />

+      <gd name="g25" fmla="+- g9 g16 0" />

+      <gd name="g26" fmla="+- g9 g17 0" />

+      <gd name="g27" fmla="+- g9 g21 0" />

+      <gd name="g28" fmla="+- g11 g15 0" />

+      <gd name="g29" fmla="+- g11 g18 0" />

+      <gd name="g30" fmla="+- g11 g19 0" />

+      <gd name="g31" fmla="+- g11 g20 0" />

+      <gd name="g32" fmla="+- g11 g22 0" />

+      <gd name="g33" fmla="+- g11 g23 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="hc" y="g9" />

+        </moveTo>

+        <lnTo>

+          <pt x="g11" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="g28" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="g28" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g26" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g24" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g24" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g25" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darkenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="g32" y="g26" />

+        </moveTo>

+        <lnTo>

+          <pt x="g32" y="g24" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g24" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g25" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g28" y="vc" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g28" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g29" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g29" y="g27" />

+        </lnTo>

+        <lnTo>

+          <pt x="g30" y="g27" />

+        </lnTo>

+        <lnTo>

+          <pt x="g30" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="vc" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="hc" y="g9" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="vc" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g29" y="g27" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g30" y="g27" />

+        </lnTo>

+        <lnTo>

+          <pt x="g30" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g29" y="g10" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="hc" y="g9" />

+        </moveTo>

+        <lnTo>

+          <pt x="g31" y="g25" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g24" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g24" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g26" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g28" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g28" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="vc" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g31" y="g25" />

+        </moveTo>

+        <lnTo>

+          <pt x="g32" y="g26" />

+        </lnTo>

+

+        <moveTo>

+          <pt x="g33" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="g28" y="vc" />

+        </lnTo>

+

+        <moveTo>

+          <pt x="g29" y="g10" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g29" y="g27" />

+        </lnTo>

+        <lnTo>

+          <pt x="g30" y="g27" />

+        </lnTo>

+        <lnTo>

+          <pt x="g30" y="g10" />

+        </lnTo>

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonHome>

+  <actionButtonInformation>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g13" fmla="*/ ss 3 4" />

+      <gd name="g14" fmla="*/ g13 1 32" />

+      <gd name="g17" fmla="*/ g13 5 16" />

+      <gd name="g18" fmla="*/ g13 3 8" />

+      <gd name="g19" fmla="*/ g13 13 32" />

+      <gd name="g20" fmla="*/ g13 19 32" />

+      <gd name="g22" fmla="*/ g13 11 16" />

+      <gd name="g23" fmla="*/ g13 13 16" />

+      <gd name="g24" fmla="*/ g13 7 8" />

+      <gd name="g25" fmla="+- g9 g14 0" />

+      <gd name="g28" fmla="+- g9 g17 0" />

+      <gd name="g29" fmla="+- g9 g18 0" />

+      <gd name="g30" fmla="+- g9 g23 0" />

+      <gd name="g31" fmla="+- g9 g24 0" />

+      <gd name="g32" fmla="+- g11 g17 0" />

+      <gd name="g34" fmla="+- g11 g19 0" />

+      <gd name="g35" fmla="+- g11 g20 0" />

+      <gd name="g37" fmla="+- g11 g22 0" />

+      <gd name="g38" fmla="*/ g13 3 32" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="hc" y="g9" />

+        </moveTo>

+

+        <arcTo wR="dx2" hR="dx2" stAng="3cd4" swAng="21600000" />

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="hc" y="g9" />

+        </moveTo>

+

+        <arcTo wR="dx2" hR="dx2" stAng="3cd4" swAng="21600000" />

+        <close />

+        <moveTo>

+          <pt x="hc" y="g25" />

+        </moveTo>

+

+        <arcTo wR="g38" hR="g38" stAng="3cd4" swAng="21600000" />

+        <moveTo>

+          <pt x="g32" y="g28" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g32" y="g29" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g29" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g31" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g31" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g28" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="lighten" extrusionOk="false">

+        <moveTo>

+          <pt x="hc" y="g25" />

+        </moveTo>

+

+        <arcTo wR="g38" hR="g38" stAng="3cd4" swAng="21600000" />

+        <moveTo>

+          <pt x="g32" y="g28" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g35" y="g28" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g31" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g31" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g29" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g29" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="hc" y="g9" />

+        </moveTo>

+

+        <arcTo wR="dx2" hR="dx2" stAng="3cd4" swAng="21600000" />

+        <close />

+        <moveTo>

+          <pt x="hc" y="g25" />

+        </moveTo>

+

+        <arcTo wR="g38" hR="g38" stAng="3cd4" swAng="21600000" />

+        <moveTo>

+          <pt x="g32" y="g28" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g35" y="g28" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g31" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g31" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g30" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g29" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g29" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonInformation>

+  <actionButtonMovie>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g12" fmla="+- hc dx2 0" />

+      <gd name="g13" fmla="*/ ss 3 4" />

+      <gd name="g14" fmla="*/ g13 1455 21600" />

+      <gd name="g15" fmla="*/ g13 1905 21600" />

+      <gd name="g16" fmla="*/ g13 2325 21600" />

+      <gd name="g17" fmla="*/ g13 16155 21600" />

+      <gd name="g18" fmla="*/ g13 17010 21600" />

+      <gd name="g19" fmla="*/ g13 19335 21600" />

+      <gd name="g20" fmla="*/ g13 19725 21600" />

+      <gd name="g21" fmla="*/ g13 20595 21600" />

+      <gd name="g22" fmla="*/ g13 5280 21600" />

+      <gd name="g23" fmla="*/ g13 5730 21600" />

+      <gd name="g24" fmla="*/ g13 6630 21600" />

+      <gd name="g25" fmla="*/ g13 7492 21600" />

+      <gd name="g26" fmla="*/ g13 9067 21600" />

+      <gd name="g27" fmla="*/ g13 9555 21600" />

+      <gd name="g28" fmla="*/ g13 13342 21600" />

+      <gd name="g29" fmla="*/ g13 14580 21600" />

+      <gd name="g30" fmla="*/ g13 15592 21600" />

+      <gd name="g31" fmla="+- g11 g14 0" />

+      <gd name="g32" fmla="+- g11 g15 0" />

+      <gd name="g33" fmla="+- g11 g16 0" />

+      <gd name="g34" fmla="+- g11 g17 0" />

+      <gd name="g35" fmla="+- g11 g18 0" />

+      <gd name="g36" fmla="+- g11 g19 0" />

+      <gd name="g37" fmla="+- g11 g20 0" />

+      <gd name="g38" fmla="+- g11 g21 0" />

+      <gd name="g39" fmla="+- g9 g22 0" />

+      <gd name="g40" fmla="+- g9 g23 0" />

+      <gd name="g41" fmla="+- g9 g24 0" />

+      <gd name="g42" fmla="+- g9 g25 0" />

+      <gd name="g43" fmla="+- g9 g26 0" />

+      <gd name="g44" fmla="+- g9 g27 0" />

+      <gd name="g45" fmla="+- g9 g28 0" />

+      <gd name="g46" fmla="+- g9 g29 0" />

+      <gd name="g47" fmla="+- g9 g30 0" />

+      <gd name="g48" fmla="+- g9 g31 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g11" y="g39" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g44" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g44" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g43" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g43" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g47" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g47" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g45" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g45" />

+        </lnTo>

+        <lnTo>

+          <pt x="g38" y="g46" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g46" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g38" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g42" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g42" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g40" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g40" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g39" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g11" y="g39" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g44" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g44" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g43" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g43" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g47" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g47" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g45" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g45" />

+        </lnTo>

+        <lnTo>

+          <pt x="g38" y="g46" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g46" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g38" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g42" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g42" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g40" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g40" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g39" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g11" y="g39" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g31" y="g39" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g40" />

+        </lnTo>

+        <lnTo>

+          <pt x="g34" y="g40" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g42" />

+        </lnTo>

+        <lnTo>

+          <pt x="g37" y="g42" />

+        </lnTo>

+        <lnTo>

+          <pt x="g38" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g41" />

+        </lnTo>

+        <lnTo>

+          <pt x="g12" y="g46" />

+        </lnTo>

+        <lnTo>

+          <pt x="g38" y="g46" />

+        </lnTo>

+        <lnTo>

+          <pt x="g36" y="g45" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g45" />

+        </lnTo>

+        <lnTo>

+          <pt x="g35" y="g47" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g47" />

+        </lnTo>

+        <lnTo>

+          <pt x="g33" y="g43" />

+        </lnTo>

+        <lnTo>

+          <pt x="g32" y="g43" />

+        </lnTo>

+        <lnTo>

+          <pt x="g31" y="g44" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g44" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonMovie>

+  <actionButtonReturn>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g12" fmla="+- hc dx2 0" />

+      <gd name="g13" fmla="*/ ss 3 4" />

+      <gd name="g14" fmla="*/ g13 7 8" />

+      <gd name="g15" fmla="*/ g13 3 4" />

+      <gd name="g16" fmla="*/ g13 5 8" />

+      <gd name="g17" fmla="*/ g13 3 8" />

+      <gd name="g18" fmla="*/ g13 1 4" />

+      <gd name="g19" fmla="+- g9 g15 0" />

+      <gd name="g20" fmla="+- g9 g16 0" />

+      <gd name="g21" fmla="+- g9 g18 0" />

+      <gd name="g22" fmla="+- g11 g14 0" />

+      <gd name="g23" fmla="+- g11 g15 0" />

+      <gd name="g24" fmla="+- g11 g16 0" />

+      <gd name="g25" fmla="+- g11 g17 0" />

+      <gd name="g26" fmla="+- g11 g18 0" />

+      <gd name="g27" fmla="*/ g13 1 8" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g12" y="g21" />

+        </moveTo>

+        <lnTo>

+          <pt x="g23" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g20" />

+        </lnTo>

+        <arcTo wR="g27" hR="g27" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="g25" y="g19" />

+        </lnTo>

+        <arcTo wR="g27" hR="g27" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="g26" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g20" />

+        </lnTo>

+        <arcTo wR="g17" hR="g17" stAng="cd2" swAng="-5400000" />

+        <lnTo>

+          <pt x="hc" y="g10" />

+        </lnTo>

+        <arcTo wR="g17" hR="g17" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="g22" y="g21" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g12" y="g21" />

+        </moveTo>

+        <lnTo>

+          <pt x="g23" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g20" />

+        </lnTo>

+        <arcTo wR="g27" hR="g27" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="g25" y="g19" />

+        </lnTo>

+        <arcTo wR="g27" hR="g27" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="g26" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g20" />

+        </lnTo>

+        <arcTo wR="g17" hR="g17" stAng="cd2" swAng="-5400000" />

+        <lnTo>

+          <pt x="hc" y="g10" />

+        </lnTo>

+        <arcTo wR="g17" hR="g17" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="g22" y="g21" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g12" y="g21" />

+        </moveTo>

+        <lnTo>

+          <pt x="g22" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g22" y="g20" />

+        </lnTo>

+        <arcTo wR="g17" hR="g17" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="g25" y="g10" />

+        </lnTo>

+        <arcTo wR="g17" hR="g17" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="g11" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g26" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g26" y="g20" />

+        </lnTo>

+        <arcTo wR="g27" hR="g27" stAng="cd2" swAng="-5400000" />

+        <lnTo>

+          <pt x="hc" y="g19" />

+        </lnTo>

+        <arcTo wR="g27" hR="g27" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="g24" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g23" y="g9" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonReturn>

+  <actionButtonSound>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx2" fmla="*/ ss 3 8" />

+      <gd name="g9" fmla="+- vc 0 dx2" />

+      <gd name="g10" fmla="+- vc dx2 0" />

+      <gd name="g11" fmla="+- hc 0 dx2" />

+      <gd name="g12" fmla="+- hc dx2 0" />

+      <gd name="g13" fmla="*/ ss 3 4" />

+      <gd name="g14" fmla="*/ g13 1 8" />

+      <gd name="g15" fmla="*/ g13 5 16" />

+      <gd name="g16" fmla="*/ g13 5 8" />

+      <gd name="g17" fmla="*/ g13 11 16" />

+      <gd name="g18" fmla="*/ g13 3 4" />

+      <gd name="g19" fmla="*/ g13 7 8" />

+      <gd name="g20" fmla="+- g9 g14 0" />

+      <gd name="g21" fmla="+- g9 g15 0" />

+      <gd name="g22" fmla="+- g9 g17 0" />

+      <gd name="g23" fmla="+- g9 g19 0" />

+      <gd name="g24" fmla="+- g11 g15 0" />

+      <gd name="g25" fmla="+- g11 g16 0" />

+      <gd name="g26" fmla="+- g11 g18 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g11" y="g21" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g22" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g22" />

+        </lnTo>

+        <lnTo>

+          <pt x="g25" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g25" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g21" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+        <moveTo>

+          <pt x="g11" y="g21" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g11" y="g22" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g22" />

+        </lnTo>

+        <lnTo>

+          <pt x="g25" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g25" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g21" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="g11" y="g21" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="g24" y="g21" />

+        </lnTo>

+        <lnTo>

+          <pt x="g25" y="g9" />

+        </lnTo>

+        <lnTo>

+          <pt x="g25" y="g10" />

+        </lnTo>

+        <lnTo>

+          <pt x="g24" y="g22" />

+        </lnTo>

+        <lnTo>

+          <pt x="g11" y="g22" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="g26" y="g21" />

+        </moveTo>

+        <lnTo>

+          <pt x="g12" y="g20" />

+        </lnTo>

+        <moveTo>

+          <pt x="g26" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="g12" y="vc" />

+        </lnTo>

+        <moveTo>

+          <pt x="g26" y="g22" />

+        </moveTo>

+        <lnTo>

+          <pt x="g12" y="g23" />

+        </lnTo>

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </actionButtonSound>

+  <arc>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 16200000" />

+      <gd name="adj2" fmla="val 0" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="stAng" fmla="pin 0 adj1 21599999" />

+      <gd name="enAng" fmla="pin 0 adj2 21599999" />

+      <gd name="sw11" fmla="+- enAng 0 stAng" />

+      <gd name="sw12" fmla="+- sw11 21600000 0" />

+      <gd name="swAng" fmla="?: sw11 sw11 sw12" />

+      <gd name="wt1" fmla="sin wd2 stAng" />

+      <gd name="ht1" fmla="cos hd2 stAng" />

+      <gd name="dx1" fmla="cat2 wd2 ht1 wt1" />

+      <gd name="dy1" fmla="sat2 hd2 ht1 wt1" />

+      <gd name="wt2" fmla="sin wd2 enAng" />

+      <gd name="ht2" fmla="cos hd2 enAng" />

+      <gd name="dx2" fmla="cat2 wd2 ht2 wt2" />

+      <gd name="dy2" fmla="sat2 hd2 ht2 wt2" />

+      <gd name="x1" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc dy1 0" />

+      <gd name="x2" fmla="+- hc dx2 0" />

+      <gd name="y2" fmla="+- vc dy2 0" />

+      <gd name="sw0" fmla="+- 21600000 0 stAng" />

+      <gd name="da1" fmla="+- swAng 0 sw0" />

+      <gd name="g1" fmla="max x1 x2" />

+      <gd name="ir" fmla="?: da1 r g1" />

+      <gd name="sw1" fmla="+- cd4 0 stAng" />

+      <gd name="sw2" fmla="+- 27000000 0 stAng" />

+      <gd name="sw3" fmla="?: sw1 sw1 sw2" />

+      <gd name="da2" fmla="+- swAng 0 sw3" />

+      <gd name="g5" fmla="max y1 y2" />

+      <gd name="ib" fmla="?: da2 b g5" />

+      <gd name="sw4" fmla="+- cd2 0 stAng" />

+      <gd name="sw5" fmla="+- 32400000 0 stAng" />

+      <gd name="sw6" fmla="?: sw4 sw4 sw5" />

+      <gd name="da3" fmla="+- swAng 0 sw6" />

+      <gd name="g9" fmla="min x1 x2" />

+      <gd name="il" fmla="?: da3 l g9" />

+      <gd name="sw7" fmla="+- 3cd4 0 stAng" />

+      <gd name="sw8" fmla="+- 37800000 0 stAng" />

+      <gd name="sw9" fmla="?: sw7 sw7 sw8" />

+      <gd name="da4" fmla="+- swAng 0 sw9" />

+      <gd name="g13" fmla="min y1 y2" />

+      <gd name="it" fmla="?: da4 t g13" />

+      <gd name="cang1" fmla="+- stAng 0 cd4" />

+      <gd name="cang2" fmla="+- enAng cd4 0" />

+      <gd name="cang3" fmla="+/ cang1 cang2 2" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefAng="adj1" minAng="0" maxAng="21599999">

+        <pos x="x1" y="y1" />

+      </ahPolar>

+      <ahPolar gdRefAng="adj2" minAng="0" maxAng="21599999">

+        <pos x="x2" y="y2" />

+      </ahPolar>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cang1">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="cang3">

+        <pos x="hc" y="vc" />

+      </cxn>

+      <cxn ang="cang2">

+        <pos x="x2" y="y2" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />

+        <lnTo>

+          <pt x="hc" y="vc" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />

+      </path>

+    </pathLst>

+  </arc>

+  <bentArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+      <gd name="adj4" fmla="val 43750" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="a3" fmla="pin 0 adj3 50000" />

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="aw2" fmla="*/ ss a2 100000" />

+

+      <gd name="th2" fmla="*/ th 1 2" />

+      <gd name="dh2" fmla="+- aw2 0 th2" />

+

+      <gd name="ah" fmla="*/ ss a3 100000" />

+

+      <gd name="bw" fmla="+- r 0 ah" />

+

+      <gd name="bh" fmla="+- b 0 dh2" />

+

+      <gd name="bs" fmla="min bw bh" />

+

+      <gd name="maxAdj4" fmla="*/ 100000 bs ss" />

+      <gd name="a4" fmla="pin 0 adj4 maxAdj4" />

+

+      <gd name="bd" fmla="*/ ss a4 100000" />

+

+

+      <gd name="bd3" fmla="+- bd 0 th" />

+      <gd name="bd2" fmla="max bd3 0" />

+      <gd name="x3" fmla="+- th bd2 0" />

+      <gd name="x4" fmla="+- r 0 ah" />

+

+

+      <gd name="y3" fmla="+- dh2 th 0" />

+      <gd name="y4" fmla="+- y3 dh2 0" />

+      <gd name="y5" fmla="+- dh2 bd 0" />

+      <gd name="y6" fmla="+- y3 bd2 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">

+        <pos x="th" y="b" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="50000">

+        <pos x="r" y="y4" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="0" maxX="50000">

+        <pos x="x4" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">

+        <pos x="bd" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x4" y="t" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x4" y="y4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="th2" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="aw2" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="l" y="y5" />

+        </lnTo>

+        <arcTo wR="bd" hR="bd" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x4" y="dh2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="aw2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <arcTo wR="bd2" hR="bd2" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="th" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </bentArrow>

+  <bentConnector2>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+      </path>

+    </pathLst>

+  </bentConnector2>

+  <bentConnector3>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x1" fmla="*/ w adj1 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">

+        <pos x="x1" y="vc" />

+      </ahXY>

+    </ahLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+      </path>

+    </pathLst>

+  </bentConnector3>

+  <bentConnector4>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x1" fmla="*/ w adj1 100000" />

+      <gd name="x2" fmla="+/ x1 r 2" />

+      <gd name="y2" fmla="*/ h adj2 100000" />

+      <gd name="y1" fmla="+/ t y2 2" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+    </ahLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+      </path>

+    </pathLst>

+  </bentConnector4>

+  <bentConnector5>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 50000" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x1" fmla="*/ w adj1 100000" />

+

+      <gd name="x3" fmla="*/ w adj3 100000" />

+

+      <gd name="x2" fmla="+/ x1 x3 2" />

+

+      <gd name="y2" fmla="*/ h adj2 100000" />

+

+      <gd name="y1" fmla="+/ t y2 2" />

+

+      <gd name="y3" fmla="+/ b y2 2" />

+

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="-2147483647" maxX="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+    </ahLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </bentConnector5>

+  <bentUpArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 50000" />

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="a3" fmla="pin 0 adj3 50000" />

+      <gd name="y1" fmla="*/ ss a3 100000" />

+      <gd name="dx1" fmla="*/ ss a2 50000" />

+

+      <gd name="x1" fmla="+- r 0 dx1" />

+      <gd name="dx3" fmla="*/ ss a2 100000" />

+

+      <gd name="x3" fmla="+- r 0 dx3" />

+      <gd name="dx2" fmla="*/ ss a1 200000" />

+

+      <gd name="x2" fmla="+- x3 0 dx2" />

+      <gd name="x4" fmla="+- x3 dx2 0" />

+      <gd name="dy2" fmla="*/ ss a1 100000" />

+

+      <gd name="y2" fmla="+- b 0 dy2" />

+      <gd name="x0" fmla="*/ x4 1 2" />

+      <gd name="y3" fmla="+/ y2 b 2" />

+      <gd name="y15" fmla="+/ y1 b 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="50000">

+        <pos x="l" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="50000">

+        <pos x="x2" y="y1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x3" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x0" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="y15" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="y2" r="x4" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </bentUpArrow>

+  <bevel>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 12500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+

+

+

+      <gd name="x2" fmla="+- r 0 x1" />

+

+      <gd name="y2" fmla="+- b 0 x1" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="x1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="x1" r="x2" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="x1" y="x1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="lightenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="x1" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darkenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="lighten" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darken" extrusionOk="false">

+

+        <moveTo>

+          <pt x="r" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x1" y="x1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="x1" />

+        </lnTo>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <moveTo>

+          <pt x="r" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <moveTo>

+          <pt x="r" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </bevel>

+  <blockArc>

+

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 10800000" />

+

+      <gd name="adj2" fmla="val 0" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="stAng" fmla="pin 0 adj1 21599999" />

+      <gd name="istAng" fmla="pin 0 adj2 21599999" />

+      <gd name="a3" fmla="pin 0 adj3 50000" />

+      <gd name="sw11" fmla="+- istAng 0 stAng" />

+

+      <gd name="sw12" fmla="+- sw11 21600000 0" />

+

+      <gd name="swAng" fmla="?: sw11 sw11 sw12" />

+

+      <gd name="iswAng" fmla="+- 0 0 swAng" />

+

+

+      <gd name="wt1" fmla="sin wd2 stAng" />

+      <gd name="ht1" fmla="cos hd2 stAng" />

+      <gd name="wt3" fmla="sin wd2 istAng" />

+      <gd name="ht3" fmla="cos hd2 istAng" />

+      <gd name="dx1" fmla="cat2 wd2 ht1 wt1" />

+      <gd name="dy1" fmla="sat2 hd2 ht1 wt1" />

+      <gd name="dx3" fmla="cat2 wd2 ht3 wt3" />

+      <gd name="dy3" fmla="sat2 hd2 ht3 wt3" />

+      <gd name="x1" fmla="+- hc dx1 0" />

+

+      <gd name="y1" fmla="+- vc dy1 0" />

+

+      <gd name="x3" fmla="+- hc dx3 0" />

+

+      <gd name="y3" fmla="+- vc dy3 0" />

+

+

+      <gd name="dr" fmla="*/ ss a3 100000" />

+      <gd name="iwd2" fmla="+- wd2 0 dr" />

+      <gd name="ihd2" fmla="+- hd2 0 dr" />

+      <gd name="wt2" fmla="sin iwd2 istAng" />

+      <gd name="ht2" fmla="cos ihd2 istAng" />

+      <gd name="wt4" fmla="sin iwd2 stAng" />

+      <gd name="ht4" fmla="cos ihd2 stAng" />

+      <gd name="dx2" fmla="cat2 iwd2 ht2 wt2" />

+      <gd name="dy2" fmla="sat2 ihd2 ht2 wt2" />

+      <gd name="dx4" fmla="cat2 iwd2 ht4 wt4" />

+      <gd name="dy4" fmla="sat2 ihd2 ht4 wt4" />

+      <gd name="x2" fmla="+- hc dx2 0" />

+

+      <gd name="y2" fmla="+- vc dy2 0" />

+

+      <gd name="x4" fmla="+- hc dx4 0" />

+

+      <gd name="y4" fmla="+- vc dy4 0" />

+

+

+      <gd name="sw0" fmla="+- 21600000 0 stAng" />

+      <gd name="da1" fmla="+- swAng 0 sw0" />

+      <gd name="g1" fmla="max x1 x2" />

+      <gd name="g2" fmla="max x3 x4" />

+      <gd name="g3" fmla="max g1 g2" />

+      <gd name="ir" fmla="?: da1 r g3" />

+

+      <gd name="sw1" fmla="+- cd4 0 stAng" />

+      <gd name="sw2" fmla="+- 27000000 0 stAng" />

+      <gd name="sw3" fmla="?: sw1 sw1 sw2" />

+      <gd name="da2" fmla="+- swAng 0 sw3" />

+      <gd name="g5" fmla="max y1 y2" />

+      <gd name="g6" fmla="max y3 y4" />

+      <gd name="g7" fmla="max g5 g6" />

+      <gd name="ib" fmla="?: da2 b g7" />

+

+      <gd name="sw4" fmla="+- cd2 0 stAng" />

+      <gd name="sw5" fmla="+- 32400000 0 stAng" />

+      <gd name="sw6" fmla="?: sw4 sw4 sw5" />

+      <gd name="da3" fmla="+- swAng 0 sw6" />

+      <gd name="g9" fmla="min x1 x2" />

+      <gd name="g10" fmla="min x3 x4" />

+      <gd name="g11" fmla="min g9 g10" />

+      <gd name="il" fmla="?: da3 l g11" />

+

+      <gd name="sw7" fmla="+- 3cd4 0 stAng" />

+      <gd name="sw8" fmla="+- 37800000 0 stAng" />

+      <gd name="sw9" fmla="?: sw7 sw7 sw8" />

+      <gd name="da4" fmla="+- swAng 0 sw9" />

+      <gd name="g13" fmla="min y1 y2" />

+      <gd name="g14" fmla="min y3 y4" />

+      <gd name="g15" fmla="min g13 g14" />

+      <gd name="it" fmla="?: da4 t g15" />

+

+      <gd name="x5" fmla="+/ x1 x4 2" />

+

+      <gd name="y5" fmla="+/ y1 y4 2" />

+

+      <gd name="x6" fmla="+/ x3 x2 2" />

+

+      <gd name="y6" fmla="+/ y3 y2 2" />

+

+      <gd name="cang1" fmla="+- stAng 0 cd4" />

+      <gd name="cang2" fmla="+- istAng cd4 0" />

+      <gd name="cang3" fmla="+/ cang1 cang2 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefAng="adj1" minAng="0" maxAng="21599999">

+        <pos x="x1" y="y1" />

+      </ahPolar>

+      <ahPolar gdRefR="adj3" minR="0" maxR="50000" gdRefAng="adj2" minAng="0" maxAng="21599999">

+        <pos x="x2" y="y2" />

+      </ahPolar>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cang1">

+        <pos x="x5" y="y5" />

+      </cxn>

+      <cxn ang="cang2">

+        <pos x="x6" y="y6" />

+      </cxn>

+      <cxn ang="cang3">

+        <pos x="hc" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <arcTo wR="iwd2" hR="ihd2" stAng="istAng" swAng="iswAng" />

+        <close />

+      </path>

+    </pathLst>

+

+  </blockArc>

+  <borderCallout1>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 112500" />

+

+      <gd name="adj4" fmla="val -38333" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </borderCallout1>

+  <borderCallout2>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 18750" />

+

+      <gd name="adj4" fmla="val -16667" />

+

+      <gd name="adj5" fmla="val 112500" />

+

+      <gd name="adj6" fmla="val -46667" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+      <gd name="y3" fmla="*/ h adj5 100000" />

+      <gd name="x3" fmla="*/ w adj6 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </borderCallout2>

+  <borderCallout3>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 18750" />

+

+      <gd name="adj4" fmla="val -16667" />

+

+      <gd name="adj5" fmla="val 100000" />

+

+      <gd name="adj6" fmla="val -16667" />

+

+      <gd name="adj7" fmla="val 112963" />

+

+      <gd name="adj8" fmla="val -8333" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+      <gd name="y3" fmla="*/ h adj5 100000" />

+      <gd name="x3" fmla="*/ w adj6 100000" />

+      <gd name="y4" fmla="*/ h adj7 100000" />

+      <gd name="x4" fmla="*/ w adj8 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+      <ahXY gdRefX="adj8" minX="-2147483647" maxX="2147483647" gdRefY="adj7" minY="-2147483647" maxY="2147483647">

+        <pos x="x4" y="y4" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </borderCallout3>

+  <bracePair>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 8333" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 25000" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+      <gd name="x2" fmla="*/ ss a 50000" />

+      <gd name="x3" fmla="+- r 0 x2" />

+      <gd name="x4" fmla="+- r 0 x1" />

+

+      <gd name="y2" fmla="+- vc 0 x1" />

+      <gd name="y3" fmla="+- vc x1 0" />

+      <gd name="y4" fmla="+- b 0 x1" />

+      <gd name="it" fmla="*/ x1 29289 100000" />

+

+      <gd name="il" fmla="+- x1 it 0" />

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 it" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="25000">

+        <pos x="l" y="x1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="x2" y="b" />

+        </moveTo>

+        <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="-5400000" />

+        <arcTo wR="x1" hR="x1" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="x1" y="x1" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="-5400000" />

+        <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="x2" y="b" />

+        </moveTo>

+        <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="-5400000" />

+        <arcTo wR="x1" hR="x1" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="x1" y="x1" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />

+        <moveTo>

+          <pt x="x3" y="t" />

+        </moveTo>

+        <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="-5400000" />

+        <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />

+      </path>

+    </pathLst>

+

+  </bracePair>

+  <bracketPair>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 16667" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+      <gd name="x2" fmla="+- r 0 x1" />

+

+      <gd name="y2" fmla="+- b 0 x1" />

+      <gd name="il" fmla="*/ x1 29289 100000" />

+

+

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 il" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="l" y="x1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="x1" />

+        </moveTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="x1" y="b" />

+        </moveTo>

+        <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="l" y="x1" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />

+        <moveTo>

+          <pt x="x2" y="t" />

+        </moveTo>

+        <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />

+      </path>

+    </pathLst>

+

+  </bracketPair>

+  <callout1>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 112500" />

+

+      <gd name="adj4" fmla="val -38333" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </callout1>

+  <callout2>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 18750" />

+

+      <gd name="adj4" fmla="val -16667" />

+

+      <gd name="adj5" fmla="val 112500" />

+

+      <gd name="adj6" fmla="val -46667" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+      <gd name="y3" fmla="*/ h adj5 100000" />

+      <gd name="x3" fmla="*/ w adj6 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </callout2>

+  <callout3>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="adj1" fmla="val 18750" />

+

+      <gd name="adj2" fmla="val -8333" />

+

+      <gd name="adj3" fmla="val 18750" />

+

+      <gd name="adj4" fmla="val -16667" />

+

+      <gd name="adj5" fmla="val 100000" />

+

+      <gd name="adj6" fmla="val -16667" />

+

+      <gd name="adj7" fmla="val 112963" />

+

+      <gd name="adj8" fmla="val -8333" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h adj1 100000" />

+      <gd name="x1" fmla="*/ w adj2 100000" />

+      <gd name="y2" fmla="*/ h adj3 100000" />

+      <gd name="x2" fmla="*/ w adj4 100000" />

+      <gd name="y3" fmla="*/ h adj5 100000" />

+      <gd name="x3" fmla="*/ w adj6 100000" />

+      <gd name="y4" fmla="*/ h adj7 100000" />

+      <gd name="x4" fmla="*/ w adj8 100000" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj2" minX="-2147483647" maxX="2147483647" gdRefY="adj1" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="-2147483647" maxX="2147483647" gdRefY="adj3" minY="-2147483647" maxY="2147483647">

+        <pos x="x2" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj6" minX="-2147483647" maxX="2147483647" gdRefY="adj5" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y3" />

+      </ahXY>

+      <ahXY gdRefX="adj8" minX="-2147483647" maxX="2147483647" gdRefY="adj7" minY="-2147483647" maxY="2147483647">

+        <pos x="x4" y="y4" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </callout3>

+  <can>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 50000 h ss" />

+      <gd name="a" fmla="pin 0 adj maxAdj" />

+      <gd name="y1" fmla="*/ ss a 200000" />

+      <gd name="y2" fmla="+- y1 y1 0" />

+      <gd name="y3" fmla="+- b 0 y1" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="maxAdj">

+        <pos x="hc" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="y2" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="y2" r="r" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="-10800000" />

+        <lnTo>

+          <pt x="r" y="y3" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd2" />

+        <close />

+      </path>

+      <path stroke="false" fill="lighten" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="cd2" />

+        <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd2" />

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="r" y="y1" />

+        </moveTo>

+        <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd2" />

+        <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="cd2" />

+        <lnTo>

+          <pt x="r" y="y3" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd2" />

+        <lnTo>

+          <pt x="l" y="y1" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </can>

+  <chartPlus>

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="10" h="10" fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="5" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="5" y="10" />

+        </lnTo>

+        <moveTo>

+          <pt x="0" y="5" />

+        </moveTo>

+        <lnTo>

+          <pt x="10" y="5" />

+        </lnTo>

+      </path>

+      <path w="10" h="10" stroke="false">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="0" y="10" />

+        </lnTo>

+        <lnTo>

+          <pt x="10" y="10" />

+        </lnTo>

+        <lnTo>

+          <pt x="10" y="0" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </chartPlus>

+  <chartStar>

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="10" h="10" fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="10" y="10" />

+        </lnTo>

+        <moveTo>

+          <pt x="0" y="10" />

+        </moveTo>

+        <lnTo>

+          <pt x="10" y="0" />

+        </lnTo>

+        <moveTo>

+          <pt x="5" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="5" y="10" />

+        </lnTo>

+      </path>

+      <path w="10" h="10" stroke="false">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="0" y="10" />

+        </lnTo>

+        <lnTo>

+          <pt x="10" y="10" />

+        </lnTo>

+        <lnTo>

+          <pt x="10" y="0" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </chartStar>

+  <chartX>

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="10" h="10" fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="10" y="10" />

+        </lnTo>

+        <moveTo>

+          <pt x="0" y="10" />

+        </moveTo>

+        <lnTo>

+          <pt x="10" y="0" />

+        </lnTo>

+      </path>

+      <path w="10" h="10" stroke="false">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="0" y="10" />

+        </lnTo>

+        <lnTo>

+          <pt x="10" y="10" />

+        </lnTo>

+        <lnTo>

+          <pt x="10" y="0" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </chartX>

+  <chevron>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 100000 w ss" />

+      <gd name="a" fmla="pin 0 adj maxAdj" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+      <gd name="x2" fmla="+- r 0 x1" />

+      <gd name="x3" fmla="*/ x2 1 2" />

+      <gd name="dx" fmla="+- x2 0 x1" />

+      <gd name="il" fmla="?: dx x1 l" />

+      <gd name="ir" fmla="?: dx x2 r" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="maxAdj">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x3" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="t" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="vc" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </chevron>

+  <chord>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 2700000" />

+

+      <gd name="adj2" fmla="val 16200000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="stAng" fmla="pin 0 adj1 21599999" />

+      <gd name="enAng" fmla="pin 0 adj2 21599999" />

+      <gd name="sw1" fmla="+- enAng 0 stAng" />

+

+      <gd name="sw2" fmla="+- sw1 21600000 0" />

+

+      <gd name="swAng" fmla="?: sw1 sw1 sw2" />

+

+      <gd name="wt1" fmla="sin wd2 stAng" />

+      <gd name="ht1" fmla="cos hd2 stAng" />

+      <gd name="dx1" fmla="cat2 wd2 ht1 wt1" />

+      <gd name="dy1" fmla="sat2 hd2 ht1 wt1" />

+      <gd name="wt2" fmla="sin wd2 enAng" />

+      <gd name="ht2" fmla="cos hd2 enAng" />

+      <gd name="dx2" fmla="cat2 wd2 ht2 wt2" />

+      <gd name="dy2" fmla="sat2 hd2 ht2 wt2" />

+      <gd name="x1" fmla="+- hc dx1 0" />

+

+      <gd name="y1" fmla="+- vc dy1 0" />

+

+      <gd name="x2" fmla="+- hc dx2 0" />

+

+      <gd name="y2" fmla="+- vc dy2 0" />

+

+      <gd name="x3" fmla="+/ x1 x2 2" />

+      <gd name="y3" fmla="+/ y1 y2 2" />

+      <gd name="midAng0" fmla="*/ swAng 1 2" />

+      <gd name="midAng" fmla="+- stAng midAng0 cd2" />

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefAng="adj1" minAng="0" maxAng="21599999">

+        <pos x="x1" y="y1" />

+      </ahPolar>

+      <ahPolar gdRefAng="adj2" minAng="0" maxAng="21599999">

+        <pos x="x2" y="y2" />

+      </ahPolar>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="stAng">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="enAng">

+        <pos x="x2" y="y2" />

+      </cxn>

+      <cxn ang="midAng">

+        <pos x="x3" y="y3" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />

+        <close />

+      </path>

+    </pathLst>

+

+  </chord>

+  <circularArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 12500" />

+

+      <gd name="adj2" fmla="val 1142319" />

+

+      <gd name="adj3" fmla="val 20457681" />

+

+      <gd name="adj4" fmla="val 10800000" />

+

+      <gd name="adj5" fmla="val 12500" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a5" fmla="pin 0 adj5 25000" />

+

+      <gd name="maxAdj1" fmla="*/ a5 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="enAng" fmla="pin 1 adj3 21599999" />

+      <gd name="stAng" fmla="pin 0 adj4 21599999" />

+

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="thh" fmla="*/ ss a5 100000" />

+

+      <gd name="th2" fmla="*/ th 1 2" />

+

+

+      <gd name="rw1" fmla="+- wd2 th2 thh" />

+

+      <gd name="rh1" fmla="+- hd2 th2 thh" />

+

+      <gd name="rw2" fmla="+- rw1 0 th" />

+

+      <gd name="rh2" fmla="+- rh1 0 th" />

+

+      <gd name="rw3" fmla="+- rw2 th2 0" />

+

+      <gd name="rh3" fmla="+- rh2 th2 0" />

+

+

+      <gd name="wtH" fmla="sin rw3 enAng" />

+      <gd name="htH" fmla="cos rh3 enAng" />

+      <gd name="dxH" fmla="cat2 rw3 htH wtH" />

+      <gd name="dyH" fmla="sat2 rh3 htH wtH" />

+      <gd name="xH" fmla="+- hc dxH 0" />

+

+      <gd name="yH" fmla="+- vc dyH 0" />

+

+

+      <gd name="rI" fmla="min rw2 rh2" />

+

+      <gd name="u1" fmla="*/ dxH dxH 1" />

+      <gd name="u2" fmla="*/ dyH dyH 1" />

+      <gd name="u3" fmla="*/ rI rI 1" />

+      <gd name="u4" fmla="+- u1 0 u3" />

+      <gd name="u5" fmla="+- u2 0 u3" />

+      <gd name="u6" fmla="*/ u4 u5 u1" />

+      <gd name="u7" fmla="*/ u6 1 u2" />

+      <gd name="u8" fmla="+- 1 0 u7" />

+      <gd name="u9" fmla="sqrt u8" />

+      <gd name="u10" fmla="*/ u4 1 dxH" />

+      <gd name="u11" fmla="*/ u10 1 dyH" />

+      <gd name="u12" fmla="+/ 1 u9 u11" />

+      <gd name="u13" fmla="at2 1 u12" />

+      <gd name="u14" fmla="+- u13 21600000 0" />

+      <gd name="u15" fmla="?: u13 u13 u14" />

+      <gd name="u16" fmla="+- u15 0 enAng" />

+

+      <gd name="u17" fmla="+- u16 21600000 0" />

+      <gd name="u18" fmla="?: u16 u16 u17" />

+      <gd name="u19" fmla="+- u18 0 cd2" />

+      <gd name="u20" fmla="+- u18 0 21600000" />

+      <gd name="u21" fmla="?: u19 u20 u18" />

+      <gd name="maxAng" fmla="abs u21" />

+      <gd name="aAng" fmla="pin 0 adj2 maxAng" />

+

+      <gd name="ptAng" fmla="+- enAng aAng 0" />

+

+

+      <gd name="wtA" fmla="sin rw3 ptAng" />

+      <gd name="htA" fmla="cos rh3 ptAng" />

+      <gd name="dxA" fmla="cat2 rw3 htA wtA" />

+      <gd name="dyA" fmla="sat2 rh3 htA wtA" />

+      <gd name="xA" fmla="+- hc dxA 0" />

+

+      <gd name="yA" fmla="+- vc dyA 0" />

+

+

+      <gd name="wtE" fmla="sin rw1 stAng" />

+      <gd name="htE" fmla="cos rh1 stAng" />

+      <gd name="dxE" fmla="cat2 rw1 htE wtE" />

+      <gd name="dyE" fmla="sat2 rh1 htE wtE" />

+      <gd name="xE" fmla="+- hc dxE 0" />

+

+      <gd name="yE" fmla="+- vc dyE 0" />

+

+

+      <gd name="dxG" fmla="cos thh ptAng" />

+      <gd name="dyG" fmla="sin thh ptAng" />

+      <gd name="xG" fmla="+- xH dxG 0" />

+

+      <gd name="yG" fmla="+- yH dyG 0" />

+

+

+      <gd name="dxB" fmla="cos thh ptAng" />

+      <gd name="dyB" fmla="sin thh ptAng" />

+      <gd name="xB" fmla="+- xH 0 dxB 0" />

+

+      <gd name="yB" fmla="+- yH 0 dyB 0" />

+

+

+      <gd name="sx1" fmla="+- xB 0 hc" />

+

+      <gd name="sy1" fmla="+- yB 0 vc" />

+

+      <gd name="sx2" fmla="+- xG 0 hc" />

+

+      <gd name="sy2" fmla="+- yG 0 vc" />

+

+

+      <gd name="rO" fmla="min rw1 rh1" />

+

+      <gd name="x1O" fmla="*/ sx1 rO rw1" />

+

+      <gd name="y1O" fmla="*/ sy1 rO rh1" />

+

+      <gd name="x2O" fmla="*/ sx2 rO rw1" />

+

+      <gd name="y2O" fmla="*/ sy2 rO rh1" />

+

+

+      <gd name="dxO" fmla="+- x2O 0 x1O" />

+      <gd name="dyO" fmla="+- y2O 0 y1O" />

+      <gd name="dO" fmla="mod dxO dyO 0" />

+

+      <gd name="q1" fmla="*/ x1O y2O 1" />

+      <gd name="q2" fmla="*/ x2O y1O 1" />

+      <gd name="DO" fmla="+- q1 0 q2" />

+

+

+      <gd name="q3" fmla="*/ rO rO 1" />

+

+      <gd name="q4" fmla="*/ dO dO 1" />

+

+      <gd name="q5" fmla="*/ q3 q4 1" />

+

+      <gd name="q6" fmla="*/ DO DO 1" />

+

+      <gd name="q7" fmla="+- q5 0 q6" />

+

+      <gd name="q8" fmla="max q7 0" />

+

+      <gd name="sdelO" fmla="sqrt q8" />

+

+      <gd name="ndyO" fmla="*/ dyO -1 1" />

+      <gd name="sdyO" fmla="?: ndyO -1 1" />

+

+      <gd name="q9" fmla="*/ sdyO dxO 1" />

+

+      <gd name="q10" fmla="*/ q9 sdelO 1" />

+

+      <gd name="q11" fmla="*/ DO dyO 1" />

+

+      <gd name="dxF1" fmla="+/ q11 q10 q4" />

+

+      <gd name="q12" fmla="+- q11 0 q10" />

+      <gd name="dxF2" fmla="*/ q12 1 q4" />

+

+

+      <gd name="adyO" fmla="abs dyO" />

+      <gd name="q13" fmla="*/ adyO sdelO 1" />

+

+      <gd name="q14" fmla="*/ DO dxO -1" />

+

+      <gd name="dyF1" fmla="+/ q14 q13 q4" />

+

+      <gd name="q15" fmla="+- q14 0 q13" />

+      <gd name="dyF2" fmla="*/ q15 1 q4" />

+

+

+

+      <gd name="q16" fmla="+- x2O 0 dxF1" />

+      <gd name="q17" fmla="+- x2O 0 dxF2" />

+      <gd name="q18" fmla="+- y2O 0 dyF1" />

+      <gd name="q19" fmla="+- y2O 0 dyF2" />

+      <gd name="q20" fmla="mod q16 q18 0" />

+

+      <gd name="q21" fmla="mod q17 q19 0" />

+

+      <gd name="q22" fmla="+- q21 0 q20" />

+      <gd name="dxF" fmla="?: q22 dxF1 dxF2" />

+

+      <gd name="dyF" fmla="?: q22 dyF1 dyF2" />

+

+      <gd name="sdxF" fmla="*/ dxF rw1 rO" />

+

+      <gd name="sdyF" fmla="*/ dyF rh1 rO" />

+

+      <gd name="xF" fmla="+- hc sdxF 0" />

+

+      <gd name="yF" fmla="+- vc sdyF 0" />

+

+

+

+

+      <gd name="x1I" fmla="*/ sx1 rI rw2" />

+

+      <gd name="y1I" fmla="*/ sy1 rI rh2" />

+

+      <gd name="x2I" fmla="*/ sx2 rI rw2" />

+

+      <gd name="y2I" fmla="*/ sy2 rI rh2" />

+

+

+      <gd name="dxI" fmla="+- x2I 0 x1I" />

+      <gd name="dyI" fmla="+- y2I 0 y1I" />

+      <gd name="dI" fmla="mod dxI dyI 0" />

+      <gd name="v1" fmla="*/ x1I y2I 1" />

+      <gd name="v2" fmla="*/ x2I y1I 1" />

+      <gd name="DI" fmla="+- v1 0 v2" />

+

+      <gd name="v3" fmla="*/ rI rI 1" />

+      <gd name="v4" fmla="*/ dI dI 1" />

+      <gd name="v5" fmla="*/ v3 v4 1" />

+      <gd name="v6" fmla="*/ DI DI 1" />

+      <gd name="v7" fmla="+- v5 0 v6" />

+      <gd name="v8" fmla="max v7 0" />

+      <gd name="sdelI" fmla="sqrt v8" />

+      <gd name="v9" fmla="*/ sdyO dxI 1" />

+      <gd name="v10" fmla="*/ v9 sdelI 1" />

+      <gd name="v11" fmla="*/ DI dyI 1" />

+      <gd name="dxC1" fmla="+/ v11 v10 v4" />

+      <gd name="v12" fmla="+- v11 0 v10" />

+      <gd name="dxC2" fmla="*/ v12 1 v4" />

+

+      <gd name="adyI" fmla="abs dyI" />

+      <gd name="v13" fmla="*/ adyI sdelI 1" />

+      <gd name="v14" fmla="*/ DI dxI -1" />

+      <gd name="dyC1" fmla="+/ v14 v13 v4" />

+      <gd name="v15" fmla="+- v14 0 v13" />

+      <gd name="dyC2" fmla="*/ v15 1 v4" />

+

+      <gd name="v16" fmla="+- x1I 0 dxC1" />

+      <gd name="v17" fmla="+- x1I 0 dxC2" />

+      <gd name="v18" fmla="+- y1I 0 dyC1" />

+      <gd name="v19" fmla="+- y1I 0 dyC2" />

+      <gd name="v20" fmla="mod v16 v18 0" />

+      <gd name="v21" fmla="mod v17 v19 0" />

+      <gd name="v22" fmla="+- v21 0 v20" />

+      <gd name="dxC" fmla="?: v22 dxC1 dxC2" />

+      <gd name="dyC" fmla="?: v22 dyC1 dyC2" />

+      <gd name="sdxC" fmla="*/ dxC rw2 rI" />

+      <gd name="sdyC" fmla="*/ dyC rh2 rI" />

+      <gd name="xC" fmla="+- hc sdxC 0" />

+

+      <gd name="yC" fmla="+- vc sdyC 0" />

+

+

+      <gd name="ist0" fmla="at2 sdxC sdyC" />

+      <gd name="ist1" fmla="+- ist0 21600000 0" />

+      <gd name="istAng" fmla="?: ist0 ist0 ist1" />

+      <gd name="isw1" fmla="+- stAng 0 istAng" />

+      <gd name="isw2" fmla="+- isw1 0 21600000" />

+      <gd name="iswAng" fmla="?: isw1 isw2 isw1" />

+

+

+      <gd name="p1" fmla="+- xF 0 xC" />

+      <gd name="p2" fmla="+- yF 0 yC" />

+      <gd name="p3" fmla="mod p1 p2 0" />

+      <gd name="p4" fmla="*/ p3 1 2" />

+      <gd name="p5" fmla="+- p4 0 thh" />

+      <gd name="xGp" fmla="?: p5 xF xG" />

+      <gd name="yGp" fmla="?: p5 yF yG" />

+      <gd name="xBp" fmla="?: p5 xC xB" />

+      <gd name="yBp" fmla="?: p5 yC yB" />

+

+      <gd name="en0" fmla="at2 sdxF sdyF" />

+      <gd name="en1" fmla="+- en0 21600000 0" />

+      <gd name="en2" fmla="?: en0 en0 en1" />

+      <gd name="sw0" fmla="+- en2 0 stAng" />

+      <gd name="sw1" fmla="+- sw0 21600000 0" />

+      <gd name="swAng" fmla="?: sw0 sw0 sw1" />

+

+      <gd name="wtI" fmla="sin rw3 stAng" />

+      <gd name="htI" fmla="cos rh3 stAng" />

+      <gd name="dxI" fmla="cat2 rw3 htI wtI" />

+      <gd name="dyI" fmla="sat2 rh3 htI wtI" />

+      <gd name="xI" fmla="+- hc dxI 0" />

+

+      <gd name="yI" fmla="+- vc dyI 0" />

+

+

+      <gd name="aI" fmla="+- stAng 0 cd4" />

+      <gd name="aA" fmla="+- ptAng cd4 0" />

+      <gd name="aB" fmla="+- ptAng cd2 0" />

+

+      <gd name="idx" fmla="cos rw1 2700000" />

+      <gd name="idy" fmla="sin rh1 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefAng="adj2" minAng="0" maxAng="maxAng">

+        <pos x="xA" y="yA" />

+      </ahPolar>

+      <ahPolar gdRefAng="adj4" minAng="0" maxAng="21599999">

+        <pos x="xE" y="yE" />

+      </ahPolar>

+      <ahPolar gdRefR="adj1" minR="0" maxR="maxAdj1" gdRefAng="adj3" minAng="0" maxAng="21599999">

+        <pos x="xF" y="yF" />

+      </ahPolar>

+      <ahPolar gdRefR="adj5" minR="0" maxR="25000">

+        <pos x="xB" y="yB" />

+      </ahPolar>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="aI">

+        <pos x="xI" y="yI" />

+      </cxn>

+      <cxn ang="ptAng">

+        <pos x="xGp" y="yGp" />

+      </cxn>

+      <cxn ang="aA">

+        <pos x="xA" y="yA" />

+      </cxn>

+      <cxn ang="aB">

+        <pos x="xBp" y="yBp" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="xE" y="yE" />

+        </moveTo>

+        <arcTo wR="rw1" hR="rh1" stAng="stAng" swAng="swAng" />

+        <lnTo>

+          <pt x="xGp" y="yGp" />

+        </lnTo>

+        <lnTo>

+          <pt x="xA" y="yA" />

+        </lnTo>

+        <lnTo>

+          <pt x="xBp" y="yBp" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC" y="yC" />

+        </lnTo>

+        <arcTo wR="rw2" hR="rh2" stAng="istAng" swAng="iswAng" />

+        <close />

+      </path>

+    </pathLst>

+

+  </circularArrow>

+  <cloud>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="il" fmla="*/ w 2977 21600" />

+      <gd name="it" fmla="*/ h 3262 21600" />

+      <gd name="ir" fmla="*/ w 17087 21600" />

+      <gd name="ib" fmla="*/ h 17337 21600" />

+      <gd name="g27" fmla="*/ w 67 21600" />

+      <gd name="g28" fmla="*/ h 21577 21600" />

+      <gd name="g29" fmla="*/ w 21582 21600" />

+      <gd name="g30" fmla="*/ h 1235 21600" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="g29" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="g28" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="g27" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="g30" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="43200" h="43200">

+        <moveTo>

+          <pt x="3900" y="14370" />

+        </moveTo>

+        <arcTo wR="6753" hR="9190" stAng="-11429249" swAng="7426832" />

+        <arcTo wR="5333" hR="7267" stAng="-8646143" swAng="5396714" />

+        <arcTo wR="4365" hR="5945" stAng="-8748475" swAng="5983381" />

+        <arcTo wR="4857" hR="6595" stAng="-7859164" swAng="7034504" />

+        <arcTo wR="5333" hR="7273" stAng="-4722533" swAng="6541615" />

+        <arcTo wR="6775" hR="9220" stAng="-2776035" swAng="7816140" />

+        <arcTo wR="5785" hR="7867" stAng="37501" swAng="6842000" />

+        <arcTo wR="6752" hR="9215" stAng="1347096" swAng="6910353" />

+        <arcTo wR="7720" hR="10543" stAng="3974558" swAng="4542661" />

+        <arcTo wR="4360" hR="5918" stAng="-16496525" swAng="8804134" />

+        <arcTo wR="4345" hR="5945" stAng="-14809710" swAng="9151131" />

+        <close />

+      </path>

+      <path w="43200" h="43200" fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="4693" y="26177" />

+        </moveTo>

+        <arcTo wR="4345" hR="5945" stAng="5204520" swAng="1585770" />

+        <moveTo>

+          <pt x="6928" y="34899" />

+        </moveTo>

+        <arcTo wR="4360" hR="5918" stAng="4416628" swAng="686848" />

+        <moveTo>

+          <pt x="16478" y="39090" />

+        </moveTo>

+        <arcTo wR="6752" hR="9215" stAng="8257449" swAng="844866" />

+        <moveTo>

+          <pt x="28827" y="34751" />

+        </moveTo>

+        <arcTo wR="6752" hR="9215" stAng="387196" swAng="959901" />

+        <moveTo>

+          <pt x="34129" y="22954" />

+        </moveTo>

+        <arcTo wR="5785" hR="7867" stAng="-4217541" swAng="4255042" />

+        <moveTo>

+          <pt x="41798" y="15354" />

+        </moveTo>

+        <arcTo wR="5333" hR="7273" stAng="1819082" swAng="1665090" />

+        <moveTo>

+          <pt x="38324" y="5426" />

+        </moveTo>

+        <arcTo wR="4857" hR="6595" stAng="-824660" swAng="891534" />

+        <moveTo>

+          <pt x="29078" y="3952" />

+        </moveTo>

+        <arcTo wR="4857" hR="6595" stAng="-8950887" swAng="1091722" />

+        <moveTo>

+          <pt x="22141" y="4720" />

+        </moveTo>

+        <arcTo wR="4365" hR="5945" stAng="-9809656" swAng="1061181" />

+        <moveTo>

+          <pt x="14000" y="5192" />

+        </moveTo>

+        <arcTo wR="6753" hR="9190" stAng="-4002417" swAng="739161" />

+        <moveTo>

+          <pt x="4127" y="15789" />

+        </moveTo>

+        <arcTo wR="6753" hR="9190" stAng="9459261" swAng="711490" />

+      </path>

+    </pathLst>

+

+  </cloud>

+  <cloudCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val -20833" />

+

+      <gd name="adj2" fmla="val 62500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dxPos" fmla="*/ w adj1 100000" />

+      <gd name="dyPos" fmla="*/ h adj2 100000" />

+      <gd name="xPos" fmla="+- hc dxPos 0" />

+      <gd name="yPos" fmla="+- vc dyPos 0" />

+      <gd name="ht" fmla="cat2 hd2 dxPos dyPos" />

+      <gd name="wt" fmla="sat2 wd2 dxPos dyPos" />

+      <gd name="g2" fmla="cat2 wd2 ht wt" />

+      <gd name="g3" fmla="sat2 hd2 ht wt" />

+      <gd name="g4" fmla="+- hc g2 0" />

+

+      <gd name="g5" fmla="+- vc g3 0" />

+

+      <gd name="g6" fmla="+- g4 0 xPos" />

+

+      <gd name="g7" fmla="+- g5 0 yPos" />

+

+      <gd name="g8" fmla="mod g6 g7 0" />

+

+      <gd name="g9" fmla="*/ ss 6600 21600" />

+

+      <gd name="g10" fmla="+- g8 0 g9" />

+

+      <gd name="g11" fmla="*/ g10 1 3" />

+

+      <gd name="g12" fmla="*/ ss 1800 21600" />

+

+      <gd name="g13" fmla="+- g11 g12 0" />

+

+      <gd name="g14" fmla="*/ g13 g6 g8" />

+

+      <gd name="g15" fmla="*/ g13 g7 g8" />

+

+      <gd name="g16" fmla="+- g14 xPos 0" />

+

+      <gd name="g17" fmla="+- g15 yPos 0" />

+

+      <gd name="g18" fmla="*/ ss 4800 21600" />

+

+      <gd name="g19" fmla="*/ g11 2 1" />

+

+      <gd name="g20" fmla="+- g18 g19 0" />

+

+      <gd name="g21" fmla="*/ g20 g6 g8" />

+      <gd name="g22" fmla="*/ g20 g7 g8" />

+      <gd name="g23" fmla="+- g21 xPos 0" />

+      <gd name="g24" fmla="+- g22 yPos 0" />

+      <gd name="g25" fmla="*/ ss 1200 21600" />

+      <gd name="g26" fmla="*/ ss 600 21600" />

+

+      <gd name="x23" fmla="+- xPos g26 0" />

+      <gd name="x24" fmla="+- g16 g25 0" />

+      <gd name="x25" fmla="+- g23 g12 0" />

+      <gd name="il" fmla="*/ w 2977 21600" />

+      <gd name="it" fmla="*/ h 3262 21600" />

+      <gd name="ir" fmla="*/ w 17087 21600" />

+      <gd name="ib" fmla="*/ h 17337 21600" />

+

+      <gd name="g27" fmla="*/ w 67 21600" />

+      <gd name="g28" fmla="*/ h 21577 21600" />

+      <gd name="g29" fmla="*/ w 21582 21600" />

+      <gd name="g30" fmla="*/ h 1235 21600" />

+      <gd name="pang" fmla="at2 dxPos dyPos" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647" gdRefY="adj2" minY="-2147483647" maxY="2147483647">

+        <pos x="xPos" y="yPos" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd2">

+        <pos x="g27" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="g28" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="g29" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="g30" />

+      </cxn>

+      <cxn ang="pang">

+        <pos x="xPos" y="yPos" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="43200" h="43200">

+        <moveTo>

+          <pt x="3900" y="14370" />

+        </moveTo>

+        <arcTo wR="6753" hR="9190" stAng="-11429249" swAng="7426832" />

+        <arcTo wR="5333" hR="7267" stAng="-8646143" swAng="5396714" />

+        <arcTo wR="4365" hR="5945" stAng="-8748475" swAng="5983381" />

+        <arcTo wR="4857" hR="6595" stAng="-7859164" swAng="7034504" />

+        <arcTo wR="5333" hR="7273" stAng="-4722533" swAng="6541615" />

+        <arcTo wR="6775" hR="9220" stAng="-2776035" swAng="7816140" />

+        <arcTo wR="5785" hR="7867" stAng="37501" swAng="6842000" />

+        <arcTo wR="6752" hR="9215" stAng="1347096" swAng="6910353" />

+        <arcTo wR="7720" hR="10543" stAng="3974558" swAng="4542661" />

+        <arcTo wR="4360" hR="5918" stAng="-16496525" swAng="8804134" />

+        <arcTo wR="4345" hR="5945" stAng="-14809710" swAng="9151131" />

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="x23" y="yPos" />

+        </moveTo>

+        <arcTo wR="g26" hR="g26" stAng="0" swAng="21600000" />

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="x24" y="g17" />

+        </moveTo>

+        <arcTo wR="g25" hR="g25" stAng="0" swAng="21600000" />

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="x25" y="g24" />

+        </moveTo>

+        <arcTo wR="g12" hR="g12" stAng="0" swAng="21600000" />

+        <close />

+      </path>

+      <path w="43200" h="43200" fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="4693" y="26177" />

+        </moveTo>

+        <arcTo wR="4345" hR="5945" stAng="5204520" swAng="1585770" />

+        <moveTo>

+          <pt x="6928" y="34899" />

+        </moveTo>

+        <arcTo wR="4360" hR="5918" stAng="4416628" swAng="686848" />

+        <moveTo>

+          <pt x="16478" y="39090" />

+        </moveTo>

+        <arcTo wR="6752" hR="9215" stAng="8257449" swAng="844866" />

+        <moveTo>

+          <pt x="28827" y="34751" />

+        </moveTo>

+        <arcTo wR="6752" hR="9215" stAng="387196" swAng="959901" />

+        <moveTo>

+          <pt x="34129" y="22954" />

+        </moveTo>

+        <arcTo wR="5785" hR="7867" stAng="-4217541" swAng="4255042" />

+        <moveTo>

+          <pt x="41798" y="15354" />

+        </moveTo>

+        <arcTo wR="5333" hR="7273" stAng="1819082" swAng="1665090" />

+        <moveTo>

+          <pt x="38324" y="5426" />

+        </moveTo>

+        <arcTo wR="4857" hR="6595" stAng="-824660" swAng="891534" />

+        <moveTo>

+          <pt x="29078" y="3952" />

+        </moveTo>

+        <arcTo wR="4857" hR="6595" stAng="-8950887" swAng="1091722" />

+        <moveTo>

+          <pt x="22141" y="4720" />

+        </moveTo>

+        <arcTo wR="4365" hR="5945" stAng="-9809656" swAng="1061181" />

+        <moveTo>

+          <pt x="14000" y="5192" />

+        </moveTo>

+        <arcTo wR="6753" hR="9190" stAng="-4002417" swAng="739161" />

+        <moveTo>

+          <pt x="4127" y="15789" />

+        </moveTo>

+        <arcTo wR="6753" hR="9190" stAng="9459261" swAng="711490" />

+      </path>

+    </pathLst>

+

+  </cloudCallout>

+  <corner>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj1" fmla="*/ 100000 h ss" />

+      <gd name="maxAdj2" fmla="*/ 100000 w ss" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="x1" fmla="*/ ss a2 100000" />

+      <gd name="dy1" fmla="*/ ss a1 100000" />

+      <gd name="y1" fmla="+- b 0 dy1" />

+      <gd name="cx1" fmla="*/ x1 1 2" />

+      <gd name="cy1" fmla="+/ y1 b 2" />

+      <gd name="d" fmla="+- w 0 h" />

+      <gd name="it" fmla="?: d y1 t" />

+      <gd name="ir" fmla="?: d r x1" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="cy1" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="cx1" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="it" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </corner>

+  <cornerTabs>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="md" fmla="mod w h 0" />

+      <gd name="dx" fmla="*/ 1 md 20" />

+

+      <gd name="y1" fmla="+- 0 b dx" />

+

+      <gd name="x1" fmla="+- 0 r dx" />

+

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd2">

+        <pos x="l" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="dx" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="b" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="dx" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="t" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="dx" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="t" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="dx" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="b" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="dx" t="dx" r="x1" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="dx" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="dx" />

+        </lnTo>

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="dx" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="dx" />

+        </lnTo>

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="r" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </cornerTabs>

+  <cube>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 25000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 100000" />

+      <gd name="y1" fmla="*/ ss a 100000" />

+      <gd name="y4" fmla="+- b 0 y1" />

+      <gd name="y2" fmla="*/ y4 1 2" />

+      <gd name="y3" fmla="+/ y1 b 2" />

+      <gd name="x4" fmla="+- r 0 y1" />

+      <gd name="x2" fmla="*/ x4 1 2" />

+      <gd name="x3" fmla="+/ y1 r 2" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="100000">

+        <pos x="l" y="y1" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x3" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x2" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="y3" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y2" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="y1" r="x4" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darkenLess" extrusionOk="false">

+        <moveTo>

+          <pt x="x4" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="lightenLess" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="y1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="y1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <moveTo>

+          <pt x="x4" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="b" />

+        </lnTo>

+      </path>

+    </pathLst>

+  </cube>

+  <curvedConnector2>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="wd2" y="t" />

+          <pt x="r" y="hd2" />

+          <pt x="r" y="b" />

+        </cubicBezTo>

+      </path>

+    </pathLst>

+  </curvedConnector2>

+  <curvedConnector3>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w adj1 100000" />

+      <gd name="x1" fmla="+/ l x2 2" />

+      <gd name="x3" fmla="+/ r x2 2" />

+      <gd name="y3" fmla="*/ h 3 4" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">

+        <pos x="x2" y="vc" />

+      </ahXY>

+    </ahLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="x1" y="t" />

+          <pt x="x2" y="hd4" />

+          <pt x="x2" y="vc" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x2" y="y3" />

+          <pt x="x3" y="b" />

+          <pt x="r" y="b" />

+        </cubicBezTo>

+      </path>

+    </pathLst>

+  </curvedConnector3>

+  <curvedConnector4>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w adj1 100000" />

+      <gd name="x1" fmla="+/ l x2 2" />

+      <gd name="x3" fmla="+/ r x2 2" />

+      <gd name="x4" fmla="+/ x2 x3 2" />

+      <gd name="x5" fmla="+/ x3 r 2" />

+      <gd name="y4" fmla="*/ h adj2 100000" />

+      <gd name="y1" fmla="+/ t y4 2" />

+      <gd name="y2" fmla="+/ t y1 2" />

+      <gd name="y3" fmla="+/ y1 y4 2" />

+      <gd name="y5" fmla="+/ b y4 2" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">

+        <pos x="x2" y="y1" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="-2147483647" maxY="2147483647">

+        <pos x="x3" y="y4" />

+      </ahXY>

+    </ahLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="x1" y="t" />

+          <pt x="x2" y="y2" />

+          <pt x="x2" y="y1" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x2" y="y3" />

+          <pt x="x4" y="y4" />

+          <pt x="x3" y="y4" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x5" y="y4" />

+          <pt x="r" y="y5" />

+          <pt x="r" y="b" />

+        </cubicBezTo>

+      </path>

+    </pathLst>

+  </curvedConnector4>

+  <curvedConnector5>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 50000" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x3" fmla="*/ w adj1 100000" />

+      <gd name="x6" fmla="*/ w adj3 100000" />

+      <gd name="x1" fmla="+/ x3 x6 2" />

+      <gd name="x2" fmla="+/ l x3 2" />

+      <gd name="x4" fmla="+/ x3 x1 2" />

+      <gd name="x5" fmla="+/ x6 x1 2" />

+      <gd name="x7" fmla="+/ x6 r 2" />

+      <gd name="y4" fmla="*/ h adj2 100000" />

+      <gd name="y1" fmla="+/ t y4 2" />

+      <gd name="y2" fmla="+/ t y1 2" />

+      <gd name="y3" fmla="+/ y1 y4 2" />

+      <gd name="y5" fmla="+/ b y4 2" />

+      <gd name="y6" fmla="+/ y5 y4 2" />

+      <gd name="y7" fmla="+/ y5 b 2" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647">

+        <pos x="x3" y="y1" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="-2147483647" maxY="2147483647">

+        <pos x="x1" y="y4" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="-2147483647" maxX="2147483647">

+        <pos x="x6" y="y5" />

+      </ahXY>

+    </ahLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="x2" y="t" />

+          <pt x="x3" y="y2" />

+          <pt x="x3" y="y1" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x3" y="y3" />

+          <pt x="x4" y="y4" />

+          <pt x="x1" y="y4" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x5" y="y4" />

+          <pt x="x6" y="y6" />

+          <pt x="x6" y="y5" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x6" y="y7" />

+          <pt x="x7" y="b" />

+          <pt x="r" y="b" />

+        </cubicBezTo>

+      </path>

+    </pathLst>

+

+  </curvedConnector5>

+  <curvedDownArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 w ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="aw" fmla="*/ ss a2 100000" />

+

+      <gd name="q1" fmla="+/ th aw 4" />

+

+      <gd name="wR" fmla="+- wd2 0 q1" />

+

+      <gd name="q7" fmla="*/ wR 2 1" />

+

+      <gd name="q8" fmla="*/ q7 q7 1" />

+

+      <gd name="q9" fmla="*/ th th 1" />

+

+      <gd name="q10" fmla="+- q8 0 q9" />

+      <gd name="q11" fmla="sqrt q10" />

+      <gd name="idy" fmla="*/ q11 h q7" />

+      <gd name="maxAdj3" fmla="*/ 100000 idy ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="ah" fmla="*/ ss adj3 100000" />

+

+

+

+

+

+      <gd name="x3" fmla="+- wR th 0" />

+

+      <gd name="q2" fmla="*/ h h 1" />

+      <gd name="q3" fmla="*/ ah ah 1" />

+      <gd name="q4" fmla="+- q2 0 q3" />

+      <gd name="q5" fmla="sqrt q4" />

+      <gd name="dx" fmla="*/ q5 wR h" />

+      <gd name="x5" fmla="+- wR dx 0" />

+

+      <gd name="x7" fmla="+- x3 dx 0" />

+

+      <gd name="q6" fmla="+- aw 0 th" />

+      <gd name="dh" fmla="*/ q6 1 2" />

+

+      <gd name="x4" fmla="+- x5 0 dh" />

+

+      <gd name="x8" fmla="+- x7 dh 0" />

+

+      <gd name="aw2" fmla="*/ aw 1 2" />

+      <gd name="x6" fmla="+- r 0 aw2" />

+

+      <gd name="y1" fmla="+- b 0 ah" />

+      <gd name="swAng" fmla="at2 ah dx" />

+

+      <gd name="mswAng" fmla="+- 0 0 swAng" />

+      <gd name="iy" fmla="+- b 0 idy" />

+

+      <gd name="ix" fmla="+/ wR x3 2" />

+

+      <gd name="q12" fmla="*/ th 1 2" />

+      <gd name="dang2" fmla="at2 idy q12" />

+      <gd name="stAng" fmla="+- 3cd4 swAng 0" />

+      <gd name="stAng2" fmla="+- 3cd4 0 dang2" />

+      <gd name="swAng2" fmla="+- dang2 0 cd4" />

+      <gd name="swAng3" fmla="+- cd4 dang2 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="adj2">

+        <pos x="x7" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x4" y="b" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="y1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="ix" y="t" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="q12" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x4" y="y1" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x6" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x8" y="y1" />

+      </cxn>

+    </cxnLst>

+

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="x6" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y1" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="stAng" swAng="mswAng" />

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="3cd4" swAng="swAng" />

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <close />

+      </path>

+

+      <path fill="darkenLess" stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="ix" y="iy" />

+        </moveTo>

+        <arcTo wR="wR" hR="h" stAng="stAng2" swAng="swAng2" />

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="cd2" swAng="swAng3" />

+        <close />

+      </path>

+

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="ix" y="iy" />

+        </moveTo>

+        <arcTo wR="wR" hR="h" stAng="stAng2" swAng="swAng2" />

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="3cd4" swAng="swAng" />

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y1" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="stAng" swAng="mswAng" />

+      </path>

+    </pathLst>

+

+  </curvedDownArrow>

+  <curvedLeftArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 h ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="a1" fmla="pin 0 adj1 a2" />

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="aw" fmla="*/ ss a2 100000" />

+

+      <gd name="q1" fmla="+/ th aw 4" />

+

+      <gd name="hR" fmla="+- hd2 0 q1" />

+

+      <gd name="q7" fmla="*/ hR 2 1" />

+

+      <gd name="q8" fmla="*/ q7 q7 1" />

+

+      <gd name="q9" fmla="*/ th th 1" />

+

+      <gd name="q10" fmla="+- q8 0 q9" />

+      <gd name="q11" fmla="sqrt q10" />

+      <gd name="idx" fmla="*/ q11 w q7" />

+      <gd name="maxAdj3" fmla="*/ 100000 idx ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="ah" fmla="*/ ss a3 100000" />

+

+

+

+

+

+      <gd name="y3" fmla="+- hR th 0" />

+

+      <gd name="q2" fmla="*/ w w 1" />

+      <gd name="q3" fmla="*/ ah ah 1" />

+      <gd name="q4" fmla="+- q2 0 q3" />

+      <gd name="q5" fmla="sqrt q4" />

+      <gd name="dy" fmla="*/ q5 hR w" />

+      <gd name="y5" fmla="+- hR dy 0" />

+

+      <gd name="y7" fmla="+- y3 dy 0" />

+

+      <gd name="q6" fmla="+- aw 0 th" />

+      <gd name="dh" fmla="*/ q6 1 2" />

+

+      <gd name="y4" fmla="+- y5 0 dh" />

+

+      <gd name="y8" fmla="+- y7 dh 0" />

+

+      <gd name="aw2" fmla="*/ aw 1 2" />

+      <gd name="y6" fmla="+- b 0 aw2" />

+

+      <gd name="x1" fmla="+- l ah 0" />

+      <gd name="swAng" fmla="at2 ah dy" />

+

+      <gd name="mswAng" fmla="+- 0 0 swAng" />

+      <gd name="ix" fmla="+- l idx 0" />

+

+      <gd name="iy" fmla="+/ hR y3 2" />

+

+      <gd name="q12" fmla="*/ th 1 2" />

+      <gd name="dang2" fmla="at2 idx q12" />

+      <gd name="swAng2" fmla="+- dang2 0 swAng" />

+      <gd name="swAng3" fmla="+- swAng dang2 0" />

+      <gd name="stAng3" fmla="+- 0 0 dang2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="a2">

+        <pos x="x1" y="y5" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="r" y="y4" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">

+        <pos x="x1" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd2">

+        <pos x="l" y="q12" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y4" />

+      </cxn>

+      <cxn ang="cd3">

+        <pos x="l" y="y6" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="y8" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="iy" />

+      </cxn>

+    </cxnLst>

+

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="y6" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y5" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="swAng" swAng="swAng2" />

+        <arcTo wR="w" hR="hR" stAng="stAng3" swAng="swAng3" />

+        <lnTo>

+          <pt x="x1" y="y8" />

+        </lnTo>

+        <close />

+      </path>

+

+      <path fill="darkenLess" stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="r" y="y3" />

+        </moveTo>

+        <arcTo wR="w" hR="hR" stAng="0" swAng="-5400000" />

+        <lnTo>

+          <pt x="l" y="t" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="3cd4" swAng="cd4" />

+        <close />

+      </path>

+

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="r" y="y3" />

+        </moveTo>

+        <arcTo wR="w" hR="hR" stAng="0" swAng="-5400000" />

+        <lnTo>

+          <pt x="l" y="t" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y3" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="0" swAng="swAng" />

+        <lnTo>

+          <pt x="x1" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y5" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="swAng" swAng="swAng2" />

+      </path>

+    </pathLst>

+

+  </curvedLeftArrow>

+  <curvedRightArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 h ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="a1" fmla="pin 0 adj1 a2" />

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="aw" fmla="*/ ss a2 100000" />

+

+      <gd name="q1" fmla="+/ th aw 4" />

+

+      <gd name="hR" fmla="+- hd2 0 q1" />

+

+      <gd name="q7" fmla="*/ hR 2 1" />

+

+      <gd name="q8" fmla="*/ q7 q7 1" />

+

+      <gd name="q9" fmla="*/ th th 1" />

+

+      <gd name="q10" fmla="+- q8 0 q9" />

+      <gd name="q11" fmla="sqrt q10" />

+      <gd name="idx" fmla="*/ q11 w q7" />

+      <gd name="maxAdj3" fmla="*/ 100000 idx ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="ah" fmla="*/ ss a3 100000" />

+

+

+

+

+

+      <gd name="y3" fmla="+- hR th 0" />

+

+      <gd name="q2" fmla="*/ w w 1" />

+      <gd name="q3" fmla="*/ ah ah 1" />

+      <gd name="q4" fmla="+- q2 0 q3" />

+      <gd name="q5" fmla="sqrt q4" />

+      <gd name="dy" fmla="*/ q5 hR w" />

+      <gd name="y5" fmla="+- hR dy 0" />

+

+      <gd name="y7" fmla="+- y3 dy 0" />

+

+      <gd name="q6" fmla="+- aw 0 th" />

+      <gd name="dh" fmla="*/ q6 1 2" />

+

+      <gd name="y4" fmla="+- y5 0 dh" />

+

+      <gd name="y8" fmla="+- y7 dh 0" />

+

+      <gd name="aw2" fmla="*/ aw 1 2" />

+      <gd name="y6" fmla="+- b 0 aw2" />

+

+      <gd name="x1" fmla="+- r 0 ah" />

+      <gd name="swAng" fmla="at2 ah dy" />

+

+      <gd name="stAng" fmla="+- cd2 0 swAng" />

+      <gd name="mswAng" fmla="+- 0 0 swAng" />

+      <gd name="ix" fmla="+- r 0 idx" />

+

+      <gd name="iy" fmla="+/ hR y3 2" />

+

+      <gd name="q12" fmla="*/ th 1 2" />

+      <gd name="dang2" fmla="at2 idx q12" />

+      <gd name="swAng2" fmla="+- dang2 0 cd4" />

+      <gd name="swAng3" fmla="+- cd4 dang2 0" />

+      <gd name="stAng3" fmla="+- cd2 0 dang2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="a2">

+        <pos x="x1" y="y5" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="r" y="y4" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">

+        <pos x="x1" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd2">

+        <pos x="l" y="iy" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="y8" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y6" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x1" y="y4" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="q12" />

+      </cxn>

+    </cxnLst>

+

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="hR" />

+        </moveTo>

+        <arcTo wR="w" hR="hR" stAng="cd2" swAng="mswAng" />

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y7" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="stAng" swAng="swAng" />

+        <close />

+      </path>

+

+      <path fill="darkenLess" stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="r" y="th" />

+        </moveTo>

+        <arcTo wR="w" hR="hR" stAng="3cd4" swAng="swAng2" />

+        <arcTo wR="w" hR="hR" stAng="stAng3" swAng="swAng3" />

+        <close />

+      </path>

+

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="hR" />

+        </moveTo>

+        <arcTo wR="w" hR="hR" stAng="cd2" swAng="mswAng" />

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y7" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="stAng" swAng="swAng" />

+        <lnTo>

+          <pt x="l" y="hR" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="th" />

+        </lnTo>

+        <arcTo wR="w" hR="hR" stAng="3cd4" swAng="swAng2" />

+      </path>

+    </pathLst>

+

+  </curvedRightArrow>

+  <curvedUpArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 w ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="aw" fmla="*/ ss a2 100000" />

+

+      <gd name="q1" fmla="+/ th aw 4" />

+

+      <gd name="wR" fmla="+- wd2 0 q1" />

+

+      <gd name="q7" fmla="*/ wR 2 1" />

+

+      <gd name="q8" fmla="*/ q7 q7 1" />

+

+      <gd name="q9" fmla="*/ th th 1" />

+

+      <gd name="q10" fmla="+- q8 0 q9" />

+      <gd name="q11" fmla="sqrt q10" />

+      <gd name="idy" fmla="*/ q11 h q7" />

+      <gd name="maxAdj3" fmla="*/ 100000 idy ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="ah" fmla="*/ ss adj3 100000" />

+

+

+

+

+

+      <gd name="x3" fmla="+- wR th 0" />

+

+      <gd name="q2" fmla="*/ h h 1" />

+      <gd name="q3" fmla="*/ ah ah 1" />

+      <gd name="q4" fmla="+- q2 0 q3" />

+      <gd name="q5" fmla="sqrt q4" />

+      <gd name="dx" fmla="*/ q5 wR h" />

+      <gd name="x5" fmla="+- wR dx 0" />

+

+      <gd name="x7" fmla="+- x3 dx 0" />

+

+      <gd name="q6" fmla="+- aw 0 th" />

+      <gd name="dh" fmla="*/ q6 1 2" />

+

+      <gd name="x4" fmla="+- x5 0 dh" />

+

+      <gd name="x8" fmla="+- x7 dh 0" />

+

+      <gd name="aw2" fmla="*/ aw 1 2" />

+      <gd name="x6" fmla="+- r 0 aw2" />

+

+      <gd name="y1" fmla="+- t ah 0" />

+      <gd name="swAng" fmla="at2 ah dx" />

+

+      <gd name="mswAng" fmla="+- 0 0 swAng" />

+      <gd name="iy" fmla="+- t idy 0" />

+

+      <gd name="ix" fmla="+/ wR x3 2" />

+

+      <gd name="q12" fmla="*/ th 1 2" />

+      <gd name="dang2" fmla="at2 idy q12" />

+      <gd name="swAng2" fmla="+- dang2 0 swAng" />

+      <gd name="mswAng2" fmla="+- 0 0 swAng2" />

+      <gd name="stAng3" fmla="+- cd4 0 swAng" />

+      <gd name="swAng3" fmla="+- swAng dang2 0" />

+      <gd name="stAng2" fmla="+- cd4 0 dang2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="a2">

+        <pos x="x7" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x4" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="y1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x6" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x4" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="q12" y="t" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ix" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x8" y="y1" />

+      </cxn>

+    </cxnLst>

+

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="x6" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y1" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="stAng3" swAng="swAng3" />

+        <arcTo wR="wR" hR="h" stAng="stAng2" swAng="swAng2" />

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <close />

+      </path>

+

+      <path fill="darkenLess" stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="wR" y="b" />

+        </moveTo>

+        <arcTo wR="wR" hR="h" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="th" y="t" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="cd2" swAng="-5400000" />

+        <close />

+      </path>

+

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="ix" y="iy" />

+        </moveTo>

+        <arcTo wR="wR" hR="h" stAng="stAng2" swAng="swAng2" />

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y1" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="stAng3" swAng="swAng" />

+        <lnTo>

+          <pt x="wR" y="b" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="th" y="t" />

+        </lnTo>

+        <arcTo wR="wR" hR="h" stAng="cd2" swAng="-5400000" />

+      </path>

+    </pathLst>

+

+  </curvedUpArrow>

+  <decagon>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="vf" fmla="val 105146" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="shd2" fmla="*/ hd2 vf 100000" />

+      <gd name="dx1" fmla="cos wd2 2160000" />

+      <gd name="dx2" fmla="cos wd2 4320000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="dy1" fmla="sin shd2 4320000" />

+      <gd name="dy2" fmla="sin shd2 2160000" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc 0 dy2" />

+      <gd name="y3" fmla="+- vc dy2 0" />

+      <gd name="y4" fmla="+- vc dy1 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x4" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="y4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y3" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y2" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x2" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x3" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="y2" r="x4" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </decagon>

+  <diagStripe>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 50000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 100000" />

+      <gd name="x2" fmla="*/ w a 100000" />

+      <gd name="x1" fmla="*/ x2 1 2" />

+      <gd name="x3" fmla="+/ x2 r 2" />

+      <gd name="y2" fmla="*/ h a 100000" />

+      <gd name="y1" fmla="*/ y2 1 2" />

+      <gd name="y3" fmla="+/ y2 b 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="100000">

+        <pos x="l" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="hc" y="vc" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y3" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x3" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="x3" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </diagStripe>

+  <diamond>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="ir" fmla="*/ w 3 4" />

+      <gd name="ib" fmla="*/ h 3 4" />

+    </gdLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="wd4" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </diamond>

+  <dodecagon>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x1" fmla="*/ w 2894 21600" />

+      <gd name="x2" fmla="*/ w 7906 21600" />

+      <gd name="x3" fmla="*/ w 13694 21600" />

+      <gd name="x4" fmla="*/ w 18706 21600" />

+      <gd name="y1" fmla="*/ h 2894 21600" />

+      <gd name="y2" fmla="*/ h 7906 21600" />

+      <gd name="y3" fmla="*/ h 13694 21600" />

+      <gd name="y4" fmla="*/ h 18706 21600" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x4" y="y1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y3" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="y4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y3" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x2" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x3" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="y1" r="x4" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y3" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </dodecagon>

+  <donut>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 25000" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dr" fmla="*/ ss a 100000" />

+      <gd name="iwd2" fmla="+- wd2 0 dr" />

+      <gd name="ihd2" fmla="+- hd2 0 dr" />

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefR="adj" minR="0" maxR="50000">

+        <pos x="dr" y="vc" />

+      </ahPolar>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="ir" y="it" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+        <moveTo>

+          <pt x="dr" y="vc" />

+        </moveTo>

+        <arcTo wR="iwd2" hR="ihd2" stAng="cd2" swAng="-5400000" />

+        <arcTo wR="iwd2" hR="ihd2" stAng="cd4" swAng="-5400000" />

+        <arcTo wR="iwd2" hR="ihd2" stAng="0" swAng="-5400000" />

+        <arcTo wR="iwd2" hR="ihd2" stAng="3cd4" swAng="-5400000" />

+        <close />

+      </path>

+    </pathLst>

+

+  </donut>

+  <doubleWave>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 6250" />

+

+      <gd name="adj2" fmla="val 0" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 12500" />

+      <gd name="a2" fmla="pin -10000 adj2 10000" />

+      <gd name="y1" fmla="*/ h a1 100000" />

+

+      <gd name="dy2" fmla="*/ y1 10 3" />

+      <gd name="y2" fmla="+- y1 0 dy2" />

+

+      <gd name="y3" fmla="+- y1 dy2 0" />

+

+      <gd name="y4" fmla="+- b 0 y1" />

+

+      <gd name="y5" fmla="+- y4 0 dy2" />

+

+      <gd name="y6" fmla="+- y4 dy2 0" />

+

+      <gd name="dx1" fmla="*/ w a2 100000" />

+

+      <gd name="of2" fmla="*/ w a2 50000" />

+

+      <gd name="x1" fmla="abs dx1" />

+

+      <gd name="dx2" fmla="?: of2 0 of2" />

+      <gd name="x2" fmla="+- l 0 dx2" />

+

+      <gd name="dx8" fmla="?: of2 of2 0" />

+      <gd name="x8" fmla="+- r 0 dx8" />

+

+      <gd name="dx3" fmla="+/ dx2 x8 6" />

+      <gd name="x3" fmla="+- x2 dx3 0" />

+

+      <gd name="dx4" fmla="+/ dx2 x8 3" />

+      <gd name="x4" fmla="+- x2 dx4 0" />

+

+      <gd name="x5" fmla="+/ x2 x8 2" />

+

+      <gd name="x6" fmla="+- x5 dx3 0" />

+

+      <gd name="x7" fmla="+/ x6 x8 2" />

+

+      <gd name="x9" fmla="+- l dx8 0" />

+

+      <gd name="x15" fmla="+- r dx2 0" />

+

+      <gd name="x10" fmla="+- x9 dx3 0" />

+

+      <gd name="x11" fmla="+- x9 dx4 0" />

+

+      <gd name="x12" fmla="+/ x9 x15 2" />

+

+      <gd name="x13" fmla="+- x12 dx3 0" />

+

+      <gd name="x14" fmla="+/ x13 x15 2" />

+

+      <gd name="x16" fmla="+- r 0 x1" />

+

+      <gd name="xAdj" fmla="+- hc dx1 0" />

+      <gd name="il" fmla="max x2 x9" />

+      <gd name="ir" fmla="min x8 x15" />

+      <gd name="it" fmla="*/ h a1 50000" />

+      <gd name="ib" fmla="+- b 0 it" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="12500">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="-10000" maxX="10000">

+        <pos x="xAdj" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="x12" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x5" y="y4" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x16" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x2" y="y1" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="x3" y="y2" />

+          <pt x="x4" y="y3" />

+          <pt x="x5" y="y1" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x6" y="y2" />

+          <pt x="x7" y="y3" />

+          <pt x="x8" y="y1" />

+        </cubicBezTo>

+        <lnTo>

+          <pt x="x15" y="y4" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="x14" y="y6" />

+          <pt x="x13" y="y5" />

+          <pt x="x12" y="y4" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x11" y="y6" />

+          <pt x="x10" y="y5" />

+          <pt x="x9" y="y4" />

+        </cubicBezTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </doubleWave>

+  <downArrow>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 100000 h ss" />

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="dy1" fmla="*/ ss a2 100000" />

+      <gd name="y1" fmla="+- b 0 dy1" />

+      <gd name="dx1" fmla="*/ w a1 200000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc dx1 0" />

+      <gd name="dy2" fmla="*/ x1 dy1 wd2" />

+      <gd name="y2" fmla="+- y1 dy2 0" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="100000">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="l" y="y1" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y1" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y1" />

+      </cxn>

+    </cxnLst>

+    <rect l="x1" t="t" r="x2" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </downArrow>

+  <downArrowCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+      <gd name="adj4" fmla="val 64977" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 w ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="maxAdj3" fmla="*/ 100000 h ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="q2" fmla="*/ a3 ss h" />

+

+      <gd name="maxAdj4" fmla="+- 100000 0 q2" />

+

+      <gd name="a4" fmla="pin 0 adj4 maxAdj4" />

+      <gd name="dx1" fmla="*/ ss a2 100000" />

+

+      <gd name="dx2" fmla="*/ ss a1 200000" />

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="dy3" fmla="*/ ss a3 100000" />

+

+      <gd name="y3" fmla="+- b 0 dy3" />

+      <gd name="y2" fmla="*/ h a4 100000" />

+

+      <gd name="y1" fmla="*/ y2 1 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">

+        <pos x="x2" y="y3" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x1" y="b" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="y3" />

+      </ahXY>

+      <ahXY gdRefY="adj4" minY="0" maxY="maxAdj4">

+        <pos x="l" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y1" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </downArrowCallout>

+  <ellipse>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="ir" y="it" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+  </ellipse>

+  <ellipseRibbon>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 12500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 25000 adj2 75000" />

+      <gd name="q10" fmla="+- 100000 0 a1" />

+      <gd name="q11" fmla="*/ q10 1 2" />

+      <gd name="q12" fmla="+- a1 0 q11" />

+      <gd name="minAdj3" fmla="max 0 q12" />

+      <gd name="a3" fmla="pin minAdj3 adj3 a1" />

+

+

+      <gd name="dx2" fmla="*/ w a2 200000" />

+

+      <gd name="x2" fmla="+- hc 0 dx2" />

+

+      <gd name="x3" fmla="+- x2 wd8 0" />

+

+      <gd name="x4" fmla="+- r 0 x3" />

+

+      <gd name="x5" fmla="+- r 0 x2" />

+

+      <gd name="x6" fmla="+- r 0 wd8" />

+

+      <gd name="dy1" fmla="*/ h a3 100000" />

+

+      <gd name="f1" fmla="*/ 4 dy1 w" />

+

+      <gd name="q1" fmla="*/ x3 x3 w" />

+      <gd name="q2" fmla="+- x3 0 q1" />

+      <gd name="y1" fmla="*/ f1 q2 1" />

+

+      <gd name="cx1" fmla="*/ x3 1 2" />

+

+      <gd name="cy1" fmla="*/ f1 cx1 1" />

+

+      <gd name="cx2" fmla="+- r 0 cx1" />

+

+

+

+      <gd name="q1" fmla="*/ h a1 100000" />

+

+      <gd name="dy3" fmla="+- q1 0 dy1" />

+

+      <gd name="q3" fmla="*/ x2 x2 w" />

+      <gd name="q4" fmla="+- x2 0 q3" />

+      <gd name="q5" fmla="*/ f1 q4 1" />

+      <gd name="y3" fmla="+- q5 dy3 0" />

+

+

+

+      <gd name="q6" fmla="+- dy1 dy3 y3" />

+      <gd name="q7" fmla="+- q6 dy1 0" />

+      <gd name="cy3" fmla="+- q7 dy3 0" />

+

+      <gd name="rh" fmla="+- b 0 q1" />

+

+      <gd name="q8" fmla="*/ dy1 14 16" />

+      <gd name="y2" fmla="+/ q8 rh 2" />

+

+

+      <gd name="y5" fmla="+- q5 rh 0" />

+

+      <gd name="y6" fmla="+- y3 rh 0" />

+

+      <gd name="cx4" fmla="*/ x2 1 2" />

+

+      <gd name="q9" fmla="*/ f1 cx4 1" />

+      <gd name="cy4" fmla="+- q9 rh 0" />

+

+      <gd name="cx5" fmla="+- r 0 cx4" />

+

+

+

+

+

+      <gd name="cy6" fmla="+- cy3 rh 0" />

+

+      <gd name="y7" fmla="+- y1 dy3 0" />

+      <gd name="cy7" fmla="+- q1 q1 y7" />

+      <gd name="y8" fmla="+- b 0 dy1" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="100000">

+        <pos x="hc" y="q1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="25000" maxX="75000">

+        <pos x="x2" y="b" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="minAdj3" maxY="a1">

+        <pos x="l" y="y8" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="q1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd8" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x6" y="y2" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="q1" r="x5" b="y6" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <quadBezTo>

+          <pt x="cx1" y="cy1" />

+          <pt x="x3" y="y1" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy3" />

+          <pt x="x5" y="y3" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx2" y="cy1" />

+          <pt x="r" y="t" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="rh" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx5" y="cy4" />

+          <pt x="x5" y="y5" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x5" y="y6" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy6" />

+          <pt x="x2" y="y6" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x2" y="y5" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx4" y="cy4" />

+          <pt x="l" y="rh" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="wd8" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="darkenLess" stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="x3" y="y7" />

+        </moveTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy3" />

+          <pt x="x5" y="y3" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y7" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy7" />

+          <pt x="x3" y="y7" />

+        </quadBezTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <quadBezTo>

+          <pt x="cx1" y="cy1" />

+          <pt x="x3" y="y1" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy3" />

+          <pt x="x5" y="y3" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx2" y="cy1" />

+          <pt x="r" y="t" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="rh" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx5" y="cy4" />

+          <pt x="x5" y="y5" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x5" y="y6" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy6" />

+          <pt x="x2" y="y6" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x2" y="y5" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx4" y="cy4" />

+          <pt x="l" y="rh" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="wd8" y="y2" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x2" y="y5" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <moveTo>

+          <pt x="x5" y="y3" />

+        </moveTo>

+        <lnTo>

+          <pt x="x5" y="y5" />

+        </lnTo>

+        <moveTo>

+          <pt x="x3" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x3" y="y7" />

+        </lnTo>

+        <moveTo>

+          <pt x="x4" y="y7" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </ellipseRibbon>

+  <ellipseRibbon2>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 12500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 25000 adj2 75000" />

+      <gd name="q10" fmla="+- 100000 0 a1" />

+      <gd name="q11" fmla="*/ q10 1 2" />

+      <gd name="q12" fmla="+- a1 0 q11" />

+      <gd name="minAdj3" fmla="max 0 q12" />

+      <gd name="a3" fmla="pin minAdj3 adj3 a1" />

+      <gd name="dx2" fmla="*/ w a2 200000" />

+

+      <gd name="x2" fmla="+- hc 0 dx2" />

+

+      <gd name="x3" fmla="+- x2 wd8 0" />

+

+      <gd name="x4" fmla="+- r 0 x3" />

+

+      <gd name="x5" fmla="+- r 0 x2" />

+

+      <gd name="x6" fmla="+- r 0 wd8" />

+

+      <gd name="dy1" fmla="*/ h a3 100000" />

+

+      <gd name="f1" fmla="*/ 4 dy1 w" />

+

+      <gd name="q1" fmla="*/ x3 x3 w" />

+      <gd name="q2" fmla="+- x3 0 q1" />

+      <gd name="u1" fmla="*/ f1 q2 1" />

+

+      <gd name="y1" fmla="+- b 0 u1" />

+      <gd name="cx1" fmla="*/ x3 1 2" />

+

+      <gd name="cu1" fmla="*/ f1 cx1 1" />

+

+      <gd name="cy1" fmla="+- b 0 cu1" />

+      <gd name="cx2" fmla="+- r 0 cx1" />

+

+

+

+      <gd name="q1" fmla="*/ h a1 100000" />

+

+      <gd name="dy3" fmla="+- q1 0 dy1" />

+

+      <gd name="q3" fmla="*/ x2 x2 w" />

+      <gd name="q4" fmla="+- x2 0 q3" />

+      <gd name="q5" fmla="*/ f1 q4 1" />

+      <gd name="u3" fmla="+- q5 dy3 0" />

+

+      <gd name="y3" fmla="+- b 0 u3" />

+

+

+      <gd name="q6" fmla="+- dy1 dy3 u3" />

+      <gd name="q7" fmla="+- q6 dy1 0" />

+      <gd name="cu3" fmla="+- q7 dy3 0" />

+

+      <gd name="cy3" fmla="+- b 0 cu3" />

+      <gd name="rh" fmla="+- b 0 q1" />

+

+      <gd name="q8" fmla="*/ dy1 14 16" />

+      <gd name="u2" fmla="+/ q8 rh 2" />

+

+      <gd name="y2" fmla="+- b 0 u2" />

+

+      <gd name="u5" fmla="+- q5 rh 0" />

+

+      <gd name="y5" fmla="+- b 0 u5" />

+      <gd name="u6" fmla="+- u3 rh 0" />

+

+      <gd name="y6" fmla="+- b 0 u6" />

+      <gd name="cx4" fmla="*/ x2 1 2" />

+

+      <gd name="q9" fmla="*/ f1 cx4 1" />

+      <gd name="cu4" fmla="+- q9 rh 0" />

+

+      <gd name="cy4" fmla="+- b 0 cu4" />

+      <gd name="cx5" fmla="+- r 0 cx4" />

+

+

+

+

+

+      <gd name="cu6" fmla="+- cu3 rh 0" />

+

+      <gd name="cy6" fmla="+- b 0 cu6" />

+      <gd name="u7" fmla="+- u1 dy3 0" />

+      <gd name="y7" fmla="+- b 0 u7" />

+      <gd name="cu7" fmla="+- q1 q1 u7" />

+      <gd name="cy7" fmla="+- b 0 cu7" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="100000">

+        <pos x="hc" y="rh" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="25000" maxX="100000">

+        <pos x="x2" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="minAdj3" maxY="a1">

+        <pos x="l" y="dy1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd8" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="rh" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x6" y="y2" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="y6" r="x5" b="rh" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <quadBezTo>

+          <pt x="cx1" y="cy1" />

+          <pt x="x3" y="y1" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy3" />

+          <pt x="x5" y="y3" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx2" y="cy1" />

+          <pt x="r" y="b" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="q1" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx5" y="cy4" />

+          <pt x="x5" y="y5" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x5" y="y6" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy6" />

+          <pt x="x2" y="y6" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x2" y="y5" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx4" y="cy4" />

+          <pt x="l" y="q1" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="wd8" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="darkenLess" stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="x3" y="y7" />

+        </moveTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy3" />

+          <pt x="x5" y="y3" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y7" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy7" />

+          <pt x="x3" y="y7" />

+        </quadBezTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="wd8" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="q1" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx4" y="cy4" />

+          <pt x="x2" y="y5" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x2" y="y6" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy6" />

+          <pt x="x5" y="y6" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x5" y="y5" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx5" y="cy4" />

+          <pt x="r" y="q1" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx2" y="cy1" />

+          <pt x="x4" y="y1" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x5" y="y3" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="hc" y="cy3" />

+          <pt x="x2" y="y3" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="cx1" y="cy1" />

+          <pt x="l" y="b" />

+        </quadBezTo>

+        <close />

+        <moveTo>

+          <pt x="x2" y="y3" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y5" />

+        </lnTo>

+        <moveTo>

+          <pt x="x5" y="y5" />

+        </moveTo>

+        <lnTo>

+          <pt x="x5" y="y3" />

+        </lnTo>

+        <moveTo>

+          <pt x="x3" y="y7" />

+        </moveTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <moveTo>

+          <pt x="x4" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="y7" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </ellipseRibbon2>

+  <flowChartAlternateProcess>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="+- r 0 ssd6" />

+      <gd name="y2" fmla="+- b 0 ssd6" />

+      <gd name="il" fmla="*/ ssd6 29289 100000" />

+

+

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 il" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="ssd6" />

+        </moveTo>

+        <arcTo wR="ssd6" hR="ssd6" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <arcTo wR="ssd6" hR="ssd6" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <arcTo wR="ssd6" hR="ssd6" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="ssd6" y="b" />

+        </lnTo>

+        <arcTo wR="ssd6" hR="ssd6" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartAlternateProcess>

+  <flowChartCollate>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="ir" fmla="*/ w 3 4" />

+      <gd name="ib" fmla="*/ h 3 4" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd4" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="2" h="2">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="2" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="2" y="2" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="2" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartCollate>

+  <flowChartConnector>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="ir" y="it" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartConnector>

+  <flowChartDecision>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="ir" fmla="*/ w 3 4" />

+      <gd name="ib" fmla="*/ h 3 4" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd4" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="2" h="2">

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="2" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartDecision>

+  <flowChartDelay>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartDelay>

+  <flowChartDisplay>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w 5 6" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd6" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="6" h="6">

+        <moveTo>

+          <pt x="0" y="3" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="5" y="0" />

+        </lnTo>

+        <arcTo wR="1" hR="3" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="1" y="6" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartDisplay>

+  <flowChartDocument>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h 17322 21600" />

+      <gd name="y2" fmla="*/ h 20172 21600" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="21600" h="21600">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="21600" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="21600" y="17322" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="10800" y="17322" />

+          <pt x="10800" y="23922" />

+          <pt x="0" y="20172" />

+        </cubicBezTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartDocument>

+  <flowChartExtract>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w 3 4" />

+    </gdLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd4" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd4" t="vc" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="2" h="2">

+        <moveTo>

+          <pt x="0" y="2" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="2" y="2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartExtract>

+  <flowChartInputOutput>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x3" fmla="*/ w 2 5" />

+      <gd name="x4" fmla="*/ w 3 5" />

+      <gd name="x5" fmla="*/ w 4 5" />

+      <gd name="x6" fmla="*/ w 9 10" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x4" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd10" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x6" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd5" t="t" r="x5" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="5" h="5">

+        <moveTo>

+          <pt x="0" y="5" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="5" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="4" y="5" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartInputOutput>

+  <flowChartInternalStorage>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd8" t="hd8" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false" w="1" h="1">

+

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="1" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false" w="8" h="8">

+

+        <moveTo>

+          <pt x="1" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="8" />

+        </lnTo>

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <lnTo>

+          <pt x="8" y="1" />

+        </lnTo>

+      </path>

+      <path fill="none" w="1" h="1">

+

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartInternalStorage>

+  <flowChartMagneticDisk>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y3" fmla="*/ h 5 6" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="hd3" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="hd3" r="r" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false" w="6" h="6">

+

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <arcTo wR="3" hR="1" stAng="cd2" swAng="cd2" />

+        <lnTo>

+          <pt x="6" y="5" />

+        </lnTo>

+        <arcTo wR="3" hR="1" stAng="0" swAng="cd2" />

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false" w="6" h="6">

+

+        <moveTo>

+          <pt x="6" y="1" />

+        </moveTo>

+        <arcTo wR="3" hR="1" stAng="0" swAng="cd2" />

+      </path>

+      <path fill="none" w="6" h="6">

+

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <arcTo wR="3" hR="1" stAng="cd2" swAng="cd2" />

+        <lnTo>

+          <pt x="6" y="5" />

+        </lnTo>

+        <arcTo wR="3" hR="1" stAng="0" swAng="cd2" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartMagneticDisk>

+  <flowChartMagneticDrum>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w 2 3" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="vc" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd6" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false" w="6" h="6">

+

+        <moveTo>

+          <pt x="1" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="5" y="0" />

+        </lnTo>

+        <arcTo wR="1" hR="3" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="1" y="6" />

+        </lnTo>

+        <arcTo wR="1" hR="3" stAng="cd4" swAng="cd2" />

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false" w="6" h="6">

+

+        <moveTo>

+          <pt x="5" y="6" />

+        </moveTo>

+        <arcTo wR="1" hR="3" stAng="cd4" swAng="cd2" />

+      </path>

+      <path fill="none" w="6" h="6">

+

+        <moveTo>

+          <pt x="1" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="5" y="0" />

+        </lnTo>

+        <arcTo wR="1" hR="3" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="1" y="6" />

+        </lnTo>

+        <arcTo wR="1" hR="3" stAng="cd4" swAng="cd2" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartMagneticDrum>

+  <flowChartMagneticTape>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+      <gd name="ang1" fmla="at2 w h" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="hc" y="b" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="ang1" />

+        <lnTo>

+          <pt x="r" y="ib" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartMagneticTape>

+  <flowChartManualInput>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="hd10" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="hd5" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="5" h="5">

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <lnTo>

+          <pt x="5" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="5" y="5" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="5" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartManualInput>

+  <flowChartManualOperation>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x3" fmla="*/ w 4 5" />

+      <gd name="x4" fmla="*/ w 9 10" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd10" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd5" t="t" r="x3" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="5" h="5">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="5" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="4" y="5" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="5" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartManualOperation>

+  <flowChartMerge>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w 3 4" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd4" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd4" t="t" r="x2" b="vc" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="2" h="2">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="2" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartMerge>

+  <flowChartMultidocument>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y2" fmla="*/ h 3675 21600" />

+      <gd name="y8" fmla="*/ h 20782 21600" />

+      <gd name="x3" fmla="*/ w 9298 21600" />

+      <gd name="x4" fmla="*/ w 12286 21600" />

+      <gd name="x5" fmla="*/ w 18595 21600" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x4" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y8" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="y2" r="x5" b="y8" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false" w="21600" h="21600">

+

+        <moveTo>

+          <pt x="0" y="20782" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="9298" y="23542" />

+          <pt x="9298" y="18022" />

+          <pt x="18595" y="18022" />

+        </cubicBezTo>

+        <lnTo>

+          <pt x="18595" y="3675" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="3675" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="1532" y="3675" />

+        </moveTo>

+        <lnTo>

+          <pt x="1532" y="1815" />

+        </lnTo>

+        <lnTo>

+          <pt x="20000" y="1815" />

+        </lnTo>

+        <lnTo>

+          <pt x="20000" y="16252" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="19298" y="16252" />

+          <pt x="18595" y="16352" />

+          <pt x="18595" y="16352" />

+        </cubicBezTo>

+        <lnTo>

+          <pt x="18595" y="3675" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="2972" y="1815" />

+        </moveTo>

+        <lnTo>

+          <pt x="2972" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="21600" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="21600" y="14392" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="20800" y="14392" />

+          <pt x="20000" y="14467" />

+          <pt x="20000" y="14467" />

+        </cubicBezTo>

+        <lnTo>

+          <pt x="20000" y="1815" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false" w="21600" h="21600">

+

+        <moveTo>

+          <pt x="0" y="3675" />

+        </moveTo>

+        <lnTo>

+          <pt x="18595" y="3675" />

+        </lnTo>

+        <lnTo>

+          <pt x="18595" y="18022" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="9298" y="18022" />

+          <pt x="9298" y="23542" />

+          <pt x="0" y="20782" />

+        </cubicBezTo>

+        <close />

+        <moveTo>

+          <pt x="1532" y="3675" />

+        </moveTo>

+        <lnTo>

+          <pt x="1532" y="1815" />

+        </lnTo>

+        <lnTo>

+          <pt x="20000" y="1815" />

+        </lnTo>

+        <lnTo>

+          <pt x="20000" y="16252" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="19298" y="16252" />

+          <pt x="18595" y="16352" />

+          <pt x="18595" y="16352" />

+        </cubicBezTo>

+        <moveTo>

+          <pt x="2972" y="1815" />

+        </moveTo>

+        <lnTo>

+          <pt x="2972" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="21600" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="21600" y="14392" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="20800" y="14392" />

+          <pt x="20000" y="14467" />

+          <pt x="20000" y="14467" />

+        </cubicBezTo>

+      </path>

+      <path stroke="false" fill="none" w="21600" h="21600">

+

+        <moveTo>

+          <pt x="0" y="20782" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="9298" y="23542" />

+          <pt x="9298" y="18022" />

+          <pt x="18595" y="18022" />

+        </cubicBezTo>

+        <lnTo>

+          <pt x="18595" y="16352" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="18595" y="16352" />

+          <pt x="19298" y="16252" />

+          <pt x="20000" y="16252" />

+        </cubicBezTo>

+        <lnTo>

+          <pt x="20000" y="14467" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="20000" y="14467" />

+          <pt x="20800" y="14392" />

+          <pt x="21600" y="14392" />

+        </cubicBezTo>

+        <lnTo>

+          <pt x="21600" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="2972" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="2972" y="1815" />

+        </lnTo>

+        <lnTo>

+          <pt x="1532" y="1815" />

+        </lnTo>

+        <lnTo>

+          <pt x="1532" y="3675" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="3675" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartMultidocument>

+  <flowChartOfflineStorage>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x4" fmla="*/ w 3 4" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x4" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd4" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd4" t="t" r="x4" b="vc" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false" w="2" h="2">

+

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="2" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="2" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false" w="5" h="5">

+

+        <moveTo>

+          <pt x="2" y="4" />

+        </moveTo>

+        <lnTo>

+          <pt x="3" y="4" />

+        </lnTo>

+      </path>

+      <path fill="none" extrusionOk="true" w="2" h="2">

+

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="2" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartOfflineStorage>

+  <flowChartOffpageConnector>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y1" fmla="*/ h 4 5" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="10" h="10">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="10" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="10" y="8" />

+        </lnTo>

+        <lnTo>

+          <pt x="5" y="10" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="8" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartOffpageConnector>

+  <flowChartOnlineStorage>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w 5 6" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd6" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="6" h="6">

+        <moveTo>

+          <pt x="1" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="6" y="0" />

+        </lnTo>

+        <arcTo wR="1" hR="3" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="1" y="6" />

+        </lnTo>

+        <arcTo wR="1" hR="3" stAng="cd4" swAng="cd2" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartOnlineStorage>

+  <flowChartOr>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="ir" y="it" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="hc" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+      </path>

+      <path fill="none">

+

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartOr>

+  <flowChartPredefinedProcess>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w 7 8" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd8" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false" w="1" h="1">

+

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="1" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false" w="8" h="8">

+

+        <moveTo>

+          <pt x="1" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="8" />

+        </lnTo>

+        <moveTo>

+          <pt x="7" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="7" y="8" />

+        </lnTo>

+      </path>

+      <path fill="none" w="1" h="1">

+

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartPredefinedProcess>

+  <flowChartPreparation>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w 4 5" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd5" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="10" h="10">

+        <moveTo>

+          <pt x="0" y="5" />

+        </moveTo>

+        <lnTo>

+          <pt x="2" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="8" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="10" y="5" />

+        </lnTo>

+        <lnTo>

+          <pt x="8" y="10" />

+        </lnTo>

+        <lnTo>

+          <pt x="2" y="10" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartPreparation>

+  <flowChartProcess>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="1" h="1">

+        <moveTo>

+          <pt x="0" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartProcess>

+  <flowChartPunchedCard>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="hd5" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="5" h="5">

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="5" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="5" y="5" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="5" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartPunchedCard>

+  <flowChartPunchedTape>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="y2" fmla="*/ h 9 10" />

+      <gd name="ib" fmla="*/ h 4 5" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="hd10" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="hd5" r="r" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="20" h="20">

+        <moveTo>

+          <pt x="0" y="2" />

+        </moveTo>

+        <arcTo wR="5" hR="2" stAng="cd2" swAng="-10800000" />

+        <arcTo wR="5" hR="2" stAng="cd2" swAng="cd2" />

+        <lnTo>

+          <pt x="20" y="18" />

+        </lnTo>

+        <arcTo wR="5" hR="2" stAng="0" swAng="-10800000" />

+        <arcTo wR="5" hR="2" stAng="0" swAng="cd2" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartPunchedTape>

+  <flowChartSort>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="ir" fmla="*/ w 3 4" />

+      <gd name="ib" fmla="*/ h 3 4" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="wd4" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false" w="2" h="2">

+

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="2" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="2" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false" w="2" h="2">

+

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <lnTo>

+          <pt x="2" y="1" />

+        </lnTo>

+      </path>

+      <path fill="none" w="2" h="2">

+

+        <moveTo>

+          <pt x="0" y="1" />

+        </moveTo>

+        <lnTo>

+          <pt x="1" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="2" y="1" />

+        </lnTo>

+        <lnTo>

+          <pt x="1" y="2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartSort>

+  <flowChartSummingJunction>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="ir" y="it" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="il" y="it" />

+        </moveTo>

+        <lnTo>

+          <pt x="ir" y="ib" />

+        </lnTo>

+        <moveTo>

+          <pt x="ir" y="it" />

+        </moveTo>

+        <lnTo>

+          <pt x="il" y="ib" />

+        </lnTo>

+      </path>

+      <path fill="none">

+

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartSummingJunction>

+  <flowChartTerminator>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="il" fmla="*/ w 1018 21600" />

+      <gd name="ir" fmla="*/ w 20582 21600" />

+      <gd name="it" fmla="*/ h 3163 21600" />

+      <gd name="ib" fmla="*/ h 18437 21600" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="21600" h="21600">

+        <moveTo>

+          <pt x="3475" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="18125" y="0" />

+        </lnTo>

+        <arcTo wR="3475" hR="10800" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="3475" y="21600" />

+        </lnTo>

+        <arcTo wR="3475" hR="10800" stAng="cd4" swAng="cd2" />

+        <close />

+      </path>

+    </pathLst>

+

+  </flowChartTerminator>

+  <foldedCorner>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 16667" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dy2" fmla="*/ ss a 100000" />

+      <gd name="dy1" fmla="*/ dy2 1 5" />

+      <gd name="x1" fmla="+- r 0 dy2" />

+      <gd name="x2" fmla="+- x1 dy1 0" />

+      <gd name="y2" fmla="+- b 0 dy2" />

+      <gd name="y1" fmla="+- y2 dy1 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="50000">

+        <pos x="x1" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darkenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="x1" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+        <moveTo>

+          <pt x="x1" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </foldedCorner>

+  <frame>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 12500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 50000" />

+      <gd name="x1" fmla="*/ ss a1 100000" />

+

+      <gd name="x4" fmla="+- r 0 x1" />

+

+

+

+      <gd name="y4" fmla="+- b 0 x1" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="x1" r="x4" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x1" y="x1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="x1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </frame>

+  <funnel>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="d" fmla="*/ ss 1 20" />

+

+

+      <gd name="rw2" fmla="+- wd2 0 d" />

+

+      <gd name="rh2" fmla="+- hd4 0 d" />

+

+

+

+      <gd name="t1" fmla="cos wd2 480000" />

+

+      <gd name="t2" fmla="sin hd4 480000" />

+

+      <gd name="da" fmla="at2 t1 t2" />

+

+

+      <gd name="2da" fmla="*/ da 2 1" />

+      <gd name="stAng1" fmla="+- cd2 0 da" />

+      <gd name="swAng1" fmla="+- cd2 2da 0" />

+

+

+      <gd name="swAng3" fmla="+- cd2 0 2da" />

+

+

+      <gd name="rw3" fmla="*/ wd2 1 4" />

+      <gd name="rh3" fmla="*/ hd4 1 4" />

+

+

+      <gd name="ct1" fmla="cos hd4 stAng1" />

+      <gd name="st1" fmla="sin wd2 stAng1" />

+      <gd name="m1" fmla="mod ct1 st1 0" />

+      <gd name="n1" fmla="*/ wd2 hd4 m1" />

+      <gd name="dx1" fmla="cos n1 stAng1" />

+      <gd name="dy1" fmla="sin n1 stAng1" />

+      <gd name="x1" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- hd4 dy1 0" />

+

+

+      <gd name="ct3" fmla="cos rh3 da" />

+      <gd name="st3" fmla="sin rw3 da" />

+      <gd name="m3" fmla="mod ct3 st3 0" />

+      <gd name="n3" fmla="*/ rw3 rh3 m3" />

+      <gd name="dx3" fmla="cos n3 da" />

+      <gd name="dy3" fmla="sin n3 da" />

+      <gd name="x3" fmla="+- hc dx3 0" />

+      <gd name="vc3" fmla="+- b 0 rh3" />

+      <gd name="y2" fmla="+- vc3 dy3 0" />

+

+

+      <gd name="x2" fmla="+- wd2 0 rw2" />

+

+      <gd name="cd" fmla="*/ cd2 2 1" />

+    </gdLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <arcTo hR="hd4" wR="wd2" stAng="stAng1" swAng="swAng1" />

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <arcTo hR="rh3" wR="rw3" stAng="da" swAng="swAng3" />

+        <close />

+        <moveTo>

+          <pt x="x2" y="hd4" />

+        </moveTo>

+        <arcTo hR="rh2" wR="rw2" stAng="cd2" swAng="-21600000" />

+        <close />

+      </path>

+    </pathLst>

+

+  </funnel>

+  <gear6>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 15000" />

+

+      <gd name="adj2" fmla="val 3526" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+

+

+

+      <gd name="a1" fmla="pin 0 adj1 20000" />

+      <gd name="a2" fmla="pin 0 adj2 5358" />

+

+

+      <gd name="th" fmla="*/ ss a1 100000" />

+      <gd name="lFD" fmla="*/ ss a2 100000" />

+

+      <gd name="th2" fmla="*/ th 1 2" />

+      <gd name="l2" fmla="*/ lFD 1 2" />

+      <gd name="l3" fmla="+- th2 l2 0" />

+

+

+      <gd name="rh" fmla="+- hd2 0 th" />

+      <gd name="rw" fmla="+- wd2 0 th" />

+

+

+      <gd name="dr" fmla="+- rw 0 rh" />

+      <gd name="maxr" fmla="?: dr rh rw" />

+      <gd name="ha" fmla="at2 maxr l3" />

+

+

+      <gd name="aA1" fmla="+- 19800000 0 ha" />

+      <gd name="aD1" fmla="+- 19800000 ha 0" />

+

+

+      <gd name="ta11" fmla="cos rw aA1" />

+      <gd name="ta12" fmla="sin rh aA1" />

+      <gd name="bA1" fmla="at2 ta11 ta12" />

+

+      <gd name="cta1" fmla="cos rh bA1" />

+      <gd name="sta1" fmla="sin rw bA1" />

+      <gd name="ma1" fmla="mod cta1 sta1 0" />

+      <gd name="na1" fmla="*/ rw rh ma1" />

+      <gd name="dxa1" fmla="cos na1 bA1" />

+      <gd name="dya1" fmla="sin na1 bA1" />

+      <gd name="xA1" fmla="+- hc dxa1 0" />

+      <gd name="yA1" fmla="+- vc dya1 0" />

+

+

+      <gd name="td11" fmla="cos rw aD1" />

+      <gd name="td12" fmla="sin rh aD1" />

+      <gd name="bD1" fmla="at2 td11 td12" />

+

+      <gd name="ctd1" fmla="cos rh bD1" />

+      <gd name="std1" fmla="sin rw bD1" />

+      <gd name="md1" fmla="mod ctd1 std1 0" />

+      <gd name="nd1" fmla="*/ rw rh md1" />

+      <gd name="dxd1" fmla="cos nd1 bD1" />

+      <gd name="dyd1" fmla="sin nd1 bD1" />

+      <gd name="xD1" fmla="+- hc dxd1 0" />

+      <gd name="yD1" fmla="+- vc dyd1 0" />

+

+

+      <gd name="xAD1" fmla="+- xA1 0 xD1" />

+      <gd name="yAD1" fmla="+- yA1 0 yD1" />

+      <gd name="lAD1" fmla="mod xAD1 yAD1 0" />

+      <gd name="a1" fmla="at2 yAD1 xAD1" />

+

+

+      <gd name="dxF1" fmla="sin lFD a1" />

+      <gd name="dyF1" fmla="cos lFD a1" />

+      <gd name="xF1" fmla="+- xD1 dxF1 0" />

+      <gd name="yF1" fmla="+- yD1 dyF1 0" />

+      <gd name="xE1" fmla="+- xA1 0 dxF1" />

+      <gd name="yE1" fmla="+- yA1 0 dyF1" />

+

+

+      <gd name="yC1t" fmla="sin th a1" />

+      <gd name="xC1t" fmla="cos th a1" />

+      <gd name="yC1" fmla="+- yF1 yC1t 0" />

+      <gd name="xC1" fmla="+- xF1 0 xC1t" />

+

+

+      <gd name="yB1" fmla="+- yE1 yC1t 0" />

+      <gd name="xB1" fmla="+- xE1 0 xC1t" />

+

+

+      <gd name="aD6" fmla="+- 3cd4 ha 0" />

+

+

+      <gd name="td61" fmla="cos rw aD6" />

+      <gd name="td62" fmla="sin rh aD6" />

+      <gd name="bD6" fmla="at2 td61 td62" />

+

+      <gd name="ctd6" fmla="cos rh bD6" />

+      <gd name="std6" fmla="sin rw bD6" />

+      <gd name="md6" fmla="mod ctd6 std6 0" />

+      <gd name="nd6" fmla="*/ rw rh md6" />

+      <gd name="dxd6" fmla="cos nd6 bD6" />

+      <gd name="dyd6" fmla="sin nd6 bD6" />

+      <gd name="xD6" fmla="+- hc dxd6 0" />

+      <gd name="yD6" fmla="+- vc dyd6 0" />

+

+

+      <gd name="xA6" fmla="+- hc 0 dxd6" />

+

+

+      <gd name="xF6" fmla="+- xD6 0 lFD" />

+      <gd name="xE6" fmla="+- xA6 lFD 0" />

+

+

+      <gd name="yC6" fmla="+- yD6 0 th" />

+

+      <gd name="swAng1" fmla="+- bA1 0 bD6" />

+

+

+      <gd name="aA2" fmla="+- 1800000 0 ha" />

+      <gd name="aD2" fmla="+- 1800000 ha 0" />

+

+

+      <gd name="ta21" fmla="cos rw aA2" />

+      <gd name="ta22" fmla="sin rh aA2" />

+      <gd name="bA2" fmla="at2 ta21 ta22" />

+

+      <gd name="yA2" fmla="+- h 0 yD1" />

+

+

+      <gd name="td21" fmla="cos rw aD2" />

+      <gd name="td22" fmla="sin rh aD2" />

+      <gd name="bD2" fmla="at2 td21 td22" />

+

+      <gd name="yD2" fmla="+- h 0 yA1" />

+

+

+      <gd name="yC2" fmla="+- h 0 yB1" />

+

+

+      <gd name="yB2" fmla="+- h 0 yC1" />

+      <gd name="xB2" fmla="val xC1" />

+

+      <gd name="swAng2" fmla="+- bA2 0 bD1" />

+

+

+      <gd name="aD3" fmla="+- cd4 ha 0" />

+

+      <gd name="td31" fmla="cos rw aD3" />

+      <gd name="td32" fmla="sin rh aD3" />

+      <gd name="bD3" fmla="at2 td31 td32" />

+

+

+      <gd name="yD3" fmla="+- h 0 yD6" />

+

+

+      <gd name="yB3" fmla="+- h 0 yC6" />

+

+

+      <gd name="aD4" fmla="+- 9000000 ha 0" />

+

+      <gd name="td41" fmla="cos rw aD4" />

+      <gd name="td42" fmla="sin rh aD4" />

+      <gd name="bD4" fmla="at2 td41 td42" />

+

+

+      <gd name="xD4" fmla="+- w 0 xD1" />

+

+

+      <gd name="xC4" fmla="+- w 0 xC1" />

+

+

+      <gd name="xB4" fmla="+- w 0 xB1" />

+

+

+      <gd name="aD5" fmla="+- 12600000 ha 0" />

+

+      <gd name="td51" fmla="cos rw aD5" />

+      <gd name="td52" fmla="sin rh aD5" />

+      <gd name="bD5" fmla="at2 td51 td52" />

+

+

+      <gd name="xD5" fmla="+- w 0 xA1" />

+

+

+      <gd name="xC5" fmla="+- w 0 xB1" />

+

+

+      <gd name="xB5" fmla="+- w 0 xC1" />

+

+

+      <gd name="xCxn1" fmla="+/ xB1 xC1 2" />

+      <gd name="yCxn1" fmla="+/ yB1 yC1 2" />

+      <gd name="yCxn2" fmla="+- b 0 yCxn1" />

+      <gd name="xCxn4" fmla="+/ r 0 xCxn1" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="20000">

+        <pos x="xD6" y="yD6" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="5358">

+        <pos x="xA6" y="yD6" />

+      </ahXY>

+

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="19800000">

+        <pos x="xCxn1" y="yCxn1" />

+      </cxn>

+

+      <cxn ang="1800000">

+        <pos x="xCxn1" y="yCxn2" />

+      </cxn>

+

+      <cxn ang="cd4">

+        <pos x="hc" y="yB3" />

+      </cxn>

+

+      <cxn ang="9000000">

+        <pos x="xCxn4" y="yCxn2" />

+      </cxn>

+

+      <cxn ang="12600000">

+        <pos x="xCxn4" y="yCxn1" />

+      </cxn>

+

+      <cxn ang="3cd4">

+        <pos x="hc" y="yC6" />

+      </cxn>

+

+    </cxnLst>

+

+    <rect l="xD5" t="yA1" r="xA1" b="yD2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="xA1" y="yA1" />

+        </moveTo>

+        <lnTo>

+          <pt x="xB1" y="yB1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC1" y="yC1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD1" y="yD1" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD1" swAng="swAng2" />

+

+        <lnTo>

+          <pt x="xC1" y="yB2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xB1" y="yC2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xA1" y="yD2" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD2" swAng="swAng1" />

+

+        <lnTo>

+          <pt x="xF6" y="yB3" />

+        </lnTo>

+        <lnTo>

+          <pt x="xE6" y="yB3" />

+        </lnTo>

+        <lnTo>

+          <pt x="xA6" y="yD3" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD3" swAng="swAng1" />

+

+        <lnTo>

+          <pt x="xB4" y="yC2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC4" y="yB2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD4" y="yA2" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD4" swAng="swAng2" />

+

+        <lnTo>

+          <pt x="xB5" y="yC1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC5" y="yB1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD5" y="yA1" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD5" swAng="swAng1" />

+

+        <lnTo>

+          <pt x="xE6" y="yC6" />

+        </lnTo>

+        <lnTo>

+          <pt x="xF6" y="yC6" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD6" y="yD6" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD6" swAng="swAng1" />

+        <close />

+      </path>

+    </pathLst>

+

+  </gear6>

+  <gear9>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 10000" />

+

+      <gd name="adj2" fmla="val 1763" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+

+

+

+      <gd name="a1" fmla="pin 0 adj1 20000" />

+      <gd name="a2" fmla="pin 0 adj2 2679" />

+

+

+      <gd name="th" fmla="*/ ss a1 100000" />

+      <gd name="lFD" fmla="*/ ss a2 100000" />

+

+      <gd name="th2" fmla="*/ th 1 2" />

+      <gd name="l2" fmla="*/ lFD 1 2" />

+      <gd name="l3" fmla="+- th2 l2 0" />

+

+

+      <gd name="rh" fmla="+- hd2 0 th" />

+      <gd name="rw" fmla="+- wd2 0 th" />

+

+

+      <gd name="dr" fmla="+- rw 0 rh" />

+      <gd name="maxr" fmla="?: dr rh rw" />

+      <gd name="ha" fmla="at2 maxr l3" />

+

+

+      <gd name="aA1" fmla="+- 18600000 0 ha" />

+      <gd name="aD1" fmla="+- 18600000 ha 0" />

+

+

+      <gd name="ta11" fmla="cos rw aA1" />

+      <gd name="ta12" fmla="sin rh aA1" />

+      <gd name="bA1" fmla="at2 ta11 ta12" />

+

+      <gd name="cta1" fmla="cos rh bA1" />

+      <gd name="sta1" fmla="sin rw bA1" />

+      <gd name="ma1" fmla="mod cta1 sta1 0" />

+      <gd name="na1" fmla="*/ rw rh ma1" />

+      <gd name="dxa1" fmla="cos na1 bA1" />

+      <gd name="dya1" fmla="sin na1 bA1" />

+      <gd name="xA1" fmla="+- hc dxa1 0" />

+      <gd name="yA1" fmla="+- vc dya1 0" />

+

+

+      <gd name="td11" fmla="cos rw aD1" />

+      <gd name="td12" fmla="sin rh aD1" />

+      <gd name="bD1" fmla="at2 td11 td12" />

+

+      <gd name="ctd1" fmla="cos rh bD1" />

+      <gd name="std1" fmla="sin rw bD1" />

+      <gd name="md1" fmla="mod ctd1 std1 0" />

+      <gd name="nd1" fmla="*/ rw rh md1" />

+      <gd name="dxd1" fmla="cos nd1 bD1" />

+      <gd name="dyd1" fmla="sin nd1 bD1" />

+      <gd name="xD1" fmla="+- hc dxd1 0" />

+      <gd name="yD1" fmla="+- vc dyd1 0" />

+

+

+      <gd name="xAD1" fmla="+- xA1 0 xD1" />

+      <gd name="yAD1" fmla="+- yA1 0 yD1" />

+      <gd name="lAD1" fmla="mod xAD1 yAD1 0" />

+      <gd name="a1" fmla="at2 yAD1 xAD1" />

+

+

+      <gd name="dxF1" fmla="sin lFD a1" />

+      <gd name="dyF1" fmla="cos lFD a1" />

+      <gd name="xF1" fmla="+- xD1 dxF1 0" />

+      <gd name="yF1" fmla="+- yD1 dyF1 0" />

+      <gd name="xE1" fmla="+- xA1 0 dxF1" />

+      <gd name="yE1" fmla="+- yA1 0 dyF1" />

+

+

+      <gd name="yC1t" fmla="sin th a1" />

+      <gd name="xC1t" fmla="cos th a1" />

+      <gd name="yC1" fmla="+- yF1 yC1t 0" />

+      <gd name="xC1" fmla="+- xF1 0 xC1t" />

+

+

+      <gd name="yB1" fmla="+- yE1 yC1t 0" />

+      <gd name="xB1" fmla="+- xE1 0 xC1t" />

+

+

+      <gd name="aA2" fmla="+- 21000000 0 ha" />

+      <gd name="aD2" fmla="+- 21000000 ha 0" />

+

+

+      <gd name="ta21" fmla="cos rw aA2" />

+      <gd name="ta22" fmla="sin rh aA2" />

+      <gd name="bA2" fmla="at2 ta21 ta22" />

+

+      <gd name="cta2" fmla="cos rh bA2" />

+      <gd name="sta2" fmla="sin rw bA2" />

+      <gd name="ma2" fmla="mod cta2 sta2 0" />

+      <gd name="na2" fmla="*/ rw rh ma2" />

+      <gd name="dxa2" fmla="cos na2 bA2" />

+      <gd name="dya2" fmla="sin na2 bA2" />

+      <gd name="xA2" fmla="+- hc dxa2 0" />

+      <gd name="yA2" fmla="+- vc dya2 0" />

+

+

+      <gd name="td21" fmla="cos rw aD2" />

+      <gd name="td22" fmla="sin rh aD2" />

+      <gd name="bD2" fmla="at2 td21 td22" />

+

+      <gd name="ctd2" fmla="cos rh bD2" />

+      <gd name="std2" fmla="sin rw bD2" />

+      <gd name="md2" fmla="mod ctd2 std2 0" />

+      <gd name="nd2" fmla="*/ rw rh md2" />

+      <gd name="dxd2" fmla="cos nd2 bD2" />

+      <gd name="dyd2" fmla="sin nd2 bD2" />

+      <gd name="xD2" fmla="+- hc dxd2 0" />

+      <gd name="yD2" fmla="+- vc dyd2 0" />

+

+

+      <gd name="xAD2" fmla="+- xA2 0 xD2" />

+      <gd name="yAD2" fmla="+- yA2 0 yD2" />

+      <gd name="lAD2" fmla="mod xAD2 yAD2 0" />

+      <gd name="a2" fmla="at2 yAD2 xAD2" />

+

+

+      <gd name="dxF2" fmla="sin lFD a2" />

+      <gd name="dyF2" fmla="cos lFD a2" />

+      <gd name="xF2" fmla="+- xD2 dxF2 0" />

+      <gd name="yF2" fmla="+- yD2 dyF2 0" />

+      <gd name="xE2" fmla="+- xA2 0 dxF2" />

+      <gd name="yE2" fmla="+- yA2 0 dyF2" />

+

+

+      <gd name="yC2t" fmla="sin th a2" />

+      <gd name="xC2t" fmla="cos th a2" />

+      <gd name="yC2" fmla="+- yF2 yC2t 0" />

+      <gd name="xC2" fmla="+- xF2 0 xC2t" />

+

+

+      <gd name="yB2" fmla="+- yE2 yC2t 0" />

+      <gd name="xB2" fmla="+- xE2 0 xC2t" />

+

+      <gd name="swAng1" fmla="+- bA2 0 bD1" />

+

+

+      <gd name="aA3" fmla="+- 1800000 0 ha" />

+      <gd name="aD3" fmla="+- 1800000 ha 0" />

+

+

+      <gd name="ta31" fmla="cos rw aA3" />

+      <gd name="ta32" fmla="sin rh aA3" />

+      <gd name="bA3" fmla="at2 ta31 ta32" />

+

+      <gd name="cta3" fmla="cos rh bA3" />

+      <gd name="sta3" fmla="sin rw bA3" />

+      <gd name="ma3" fmla="mod cta3 sta3 0" />

+      <gd name="na3" fmla="*/ rw rh ma3" />

+      <gd name="dxa3" fmla="cos na3 bA3" />

+      <gd name="dya3" fmla="sin na3 bA3" />

+      <gd name="xA3" fmla="+- hc dxa3 0" />

+      <gd name="yA3" fmla="+- vc dya3 0" />

+

+

+      <gd name="td31" fmla="cos rw aD3" />

+      <gd name="td32" fmla="sin rh aD3" />

+      <gd name="bD3" fmla="at2 td31 td32" />

+

+      <gd name="ctd3" fmla="cos rh bD3" />

+      <gd name="std3" fmla="sin rw bD3" />

+      <gd name="md3" fmla="mod ctd3 std3 0" />

+      <gd name="nd3" fmla="*/ rw rh md3" />

+      <gd name="dxd3" fmla="cos nd3 bD3" />

+      <gd name="dyd3" fmla="sin nd3 bD3" />

+      <gd name="xD3" fmla="+- hc dxd3 0" />

+      <gd name="yD3" fmla="+- vc dyd3 0" />

+

+

+      <gd name="xAD3" fmla="+- xA3 0 xD3" />

+      <gd name="yAD3" fmla="+- yA3 0 yD3" />

+      <gd name="lAD3" fmla="mod xAD3 yAD3 0" />

+      <gd name="a3" fmla="at2 yAD3 xAD3" />

+

+

+      <gd name="dxF3" fmla="sin lFD a3" />

+      <gd name="dyF3" fmla="cos lFD a3" />

+      <gd name="xF3" fmla="+- xD3 dxF3 0" />

+      <gd name="yF3" fmla="+- yD3 dyF3 0" />

+      <gd name="xE3" fmla="+- xA3 0 dxF3" />

+      <gd name="yE3" fmla="+- yA3 0 dyF3" />

+

+

+      <gd name="yC3t" fmla="sin th a3" />

+      <gd name="xC3t" fmla="cos th a3" />

+      <gd name="yC3" fmla="+- yF3 yC3t 0" />

+      <gd name="xC3" fmla="+- xF3 0 xC3t" />

+

+

+      <gd name="yB3" fmla="+- yE3 yC3t 0" />

+      <gd name="xB3" fmla="+- xE3 0 xC3t" />

+

+      <gd name="swAng2" fmla="+- bA3 0 bD2" />

+

+

+      <gd name="aA4" fmla="+- 4200000 0 ha" />

+      <gd name="aD4" fmla="+- 4200000 ha 0" />

+

+

+      <gd name="ta41" fmla="cos rw aA4" />

+      <gd name="ta42" fmla="sin rh aA4" />

+      <gd name="bA4" fmla="at2 ta41 ta42" />

+

+      <gd name="cta4" fmla="cos rh bA4" />

+      <gd name="sta4" fmla="sin rw bA4" />

+      <gd name="ma4" fmla="mod cta4 sta4 0" />

+      <gd name="na4" fmla="*/ rw rh ma4" />

+      <gd name="dxa4" fmla="cos na4 bA4" />

+      <gd name="dya4" fmla="sin na4 bA4" />

+      <gd name="xA4" fmla="+- hc dxa4 0" />

+      <gd name="yA4" fmla="+- vc dya4 0" />

+

+

+      <gd name="td41" fmla="cos rw aD4" />

+      <gd name="td42" fmla="sin rh aD4" />

+      <gd name="bD4" fmla="at2 td41 td42" />

+

+      <gd name="ctd4" fmla="cos rh bD4" />

+      <gd name="std4" fmla="sin rw bD4" />

+      <gd name="md4" fmla="mod ctd4 std4 0" />

+      <gd name="nd4" fmla="*/ rw rh md4" />

+      <gd name="dxd4" fmla="cos nd4 bD4" />

+      <gd name="dyd4" fmla="sin nd4 bD4" />

+      <gd name="xD4" fmla="+- hc dxd4 0" />

+      <gd name="yD4" fmla="+- vc dyd4 0" />

+

+

+      <gd name="xAD4" fmla="+- xA4 0 xD4" />

+      <gd name="yAD4" fmla="+- yA4 0 yD4" />

+      <gd name="lAD4" fmla="mod xAD4 yAD4 0" />

+      <gd name="a4" fmla="at2 yAD4 xAD4" />

+

+

+      <gd name="dxF4" fmla="sin lFD a4" />

+      <gd name="dyF4" fmla="cos lFD a4" />

+      <gd name="xF4" fmla="+- xD4 dxF4 0" />

+      <gd name="yF4" fmla="+- yD4 dyF4 0" />

+      <gd name="xE4" fmla="+- xA4 0 dxF4" />

+      <gd name="yE4" fmla="+- yA4 0 dyF4" />

+

+

+      <gd name="yC4t" fmla="sin th a4" />

+      <gd name="xC4t" fmla="cos th a4" />

+      <gd name="yC4" fmla="+- yF4 yC4t 0" />

+      <gd name="xC4" fmla="+- xF4 0 xC4t" />

+

+

+      <gd name="yB4" fmla="+- yE4 yC4t 0" />

+      <gd name="xB4" fmla="+- xE4 0 xC4t" />

+

+      <gd name="swAng3" fmla="+- bA4 0 bD3" />

+

+

+      <gd name="aA5" fmla="+- 6600000 0 ha" />

+      <gd name="aD5" fmla="+- 6600000 ha 0" />

+

+      <gd name="ta51" fmla="cos rw aA5" />

+      <gd name="ta52" fmla="sin rh aA5" />

+      <gd name="bA5" fmla="at2 ta51 ta52" />

+

+      <gd name="td51" fmla="cos rw aD5" />

+      <gd name="td52" fmla="sin rh aD5" />

+      <gd name="bD5" fmla="at2 td51 td52" />

+

+

+      <gd name="xD5" fmla="+- w 0 xA4" />

+

+

+      <gd name="xC5" fmla="+- w 0 xB4" />

+

+

+      <gd name="xB5" fmla="+- w 0 xC4" />

+

+      <gd name="swAng4" fmla="+- bA5 0 bD4" />

+

+

+      <gd name="aD6" fmla="+- 9000000 ha 0" />

+

+      <gd name="td61" fmla="cos rw aD6" />

+      <gd name="td62" fmla="sin rh aD6" />

+      <gd name="bD6" fmla="at2 td61 td62" />

+

+

+      <gd name="xD6" fmla="+- w 0 xA3" />

+

+

+      <gd name="xC6" fmla="+- w 0 xB3" />

+

+

+      <gd name="xB6" fmla="+- w 0 xC3" />

+

+

+      <gd name="aD7" fmla="+- 11400000 ha 0" />

+

+      <gd name="td71" fmla="cos rw aD7" />

+      <gd name="td72" fmla="sin rh aD7" />

+      <gd name="bD7" fmla="at2 td71 td72" />

+

+

+      <gd name="xD7" fmla="+- w 0 xA2" />

+

+

+      <gd name="xC7" fmla="+- w 0 xB2" />

+

+

+      <gd name="xB7" fmla="+- w 0 xC2" />

+

+

+      <gd name="aD8" fmla="+- 13800000 ha 0" />

+

+      <gd name="td81" fmla="cos rw aD8" />

+      <gd name="td82" fmla="sin rh aD8" />

+      <gd name="bD8" fmla="at2 td81 td82" />

+

+

+      <gd name="xA8" fmla="+- w 0 xD1" />

+

+      <gd name="xD8" fmla="+- w 0 xA1" />

+

+

+      <gd name="xC8" fmla="+- w 0 xB1" />

+

+

+      <gd name="xB8" fmla="+- w 0 xC1" />

+

+

+      <gd name="aA9" fmla="+- 3cd4 0 ha" />

+      <gd name="aD9" fmla="+- 3cd4 ha 0" />

+

+

+      <gd name="td91" fmla="cos rw aD9" />

+      <gd name="td92" fmla="sin rh aD9" />

+      <gd name="bD9" fmla="at2 td91 td92" />

+

+      <gd name="ctd9" fmla="cos rh bD9" />

+      <gd name="std9" fmla="sin rw bD9" />

+      <gd name="md9" fmla="mod ctd9 std9 0" />

+      <gd name="nd9" fmla="*/ rw rh md9" />

+      <gd name="dxd9" fmla="cos nd9 bD9" />

+      <gd name="dyd9" fmla="sin nd9 bD9" />

+      <gd name="xD9" fmla="+- hc dxd9 0" />

+      <gd name="yD9" fmla="+- vc dyd9 0" />

+

+

+      <gd name="ta91" fmla="cos rw aA9" />

+      <gd name="ta92" fmla="sin rh aA9" />

+      <gd name="bA9" fmla="at2 ta91 ta92" />

+

+      <gd name="xA9" fmla="+- hc 0 dxd9" />

+

+

+      <gd name="xF9" fmla="+- xD9 0 lFD" />

+      <gd name="xE9" fmla="+- xA9 lFD 0" />

+

+

+      <gd name="yC9" fmla="+- yD9 0 th" />

+

+      <gd name="swAng5" fmla="+- bA9 0 bD8" />

+

+

+      <gd name="xCxn1" fmla="+/ xB1 xC1 2" />

+      <gd name="yCxn1" fmla="+/ yB1 yC1 2" />

+      <gd name="xCxn2" fmla="+/ xB2 xC2 2" />

+      <gd name="yCxn2" fmla="+/ yB2 yC2 2" />

+      <gd name="xCxn3" fmla="+/ xB3 xC3 2" />

+      <gd name="yCxn3" fmla="+/ yB3 yC3 2" />

+      <gd name="xCxn4" fmla="+/ xB4 xC4 2" />

+      <gd name="yCxn4" fmla="+/ yB4 yC4 2" />

+      <gd name="xCxn5" fmla="+/ r 0 xCxn4" />

+      <gd name="xCxn6" fmla="+/ r 0 xCxn3" />

+      <gd name="xCxn7" fmla="+/ r 0 xCxn2" />

+      <gd name="xCxn8" fmla="+/ r 0 xCxn1" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="20000">

+        <pos x="xD9" y="yD9" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="2679">

+        <pos x="xA9" y="yD9" />

+      </ahXY>

+

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="18600000">

+        <pos x="xCxn1" y="yCxn1" />

+      </cxn>

+

+      <cxn ang="21000000">

+        <pos x="xCxn2" y="yCxn2" />

+      </cxn>

+

+      <cxn ang="1800000">

+        <pos x="xCxn3" y="yCxn3" />

+      </cxn>

+

+      <cxn ang="4200000">

+        <pos x="xCxn4" y="yCxn4" />

+      </cxn>

+

+      <cxn ang="6600000">

+        <pos x="xCxn5" y="yCxn4" />

+      </cxn>

+

+      <cxn ang="9000000">

+        <pos x="xCxn6" y="yCxn3" />

+      </cxn>

+

+      <cxn ang="11400000">

+        <pos x="xCxn7" y="yCxn2" />

+      </cxn>

+

+      <cxn ang="13800000">

+        <pos x="xCxn8" y="yCxn1" />

+      </cxn>

+

+      <cxn ang="3cd4">

+        <pos x="hc" y="yC9" />

+      </cxn>

+

+    </cxnLst>

+

+    <rect l="xA8" t="yD1" r="xD1" b="yD3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="xA1" y="yA1" />

+        </moveTo>

+        <lnTo>

+          <pt x="xB1" y="yB1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC1" y="yC1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD1" y="yD1" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD1" swAng="swAng1" />

+

+        <lnTo>

+          <pt x="xB2" y="yB2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC2" y="yC2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD2" y="yD2" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD2" swAng="swAng2" />

+

+        <lnTo>

+          <pt x="xB3" y="yB3" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC3" y="yC3" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD3" y="yD3" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD3" swAng="swAng3" />

+

+        <lnTo>

+          <pt x="xB4" y="yB4" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC4" y="yC4" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD4" y="yD4" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD4" swAng="swAng4" />

+

+        <lnTo>

+          <pt x="xB5" y="yC4" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC5" y="yB4" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD5" y="yA4" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD5" swAng="swAng3" />

+

+        <lnTo>

+          <pt x="xB6" y="yC3" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC6" y="yB3" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD6" y="yA3" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD6" swAng="swAng2" />

+

+        <lnTo>

+          <pt x="xB7" y="yC2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC7" y="yB2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD7" y="yA2" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD7" swAng="swAng1" />

+

+        <lnTo>

+          <pt x="xB8" y="yC1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC8" y="yB1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD8" y="yA1" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD8" swAng="swAng5" />

+

+        <lnTo>

+          <pt x="xE9" y="yC9" />

+        </lnTo>

+        <lnTo>

+          <pt x="xF9" y="yC9" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD9" y="yD9" />

+        </lnTo>

+        <arcTo hR="rh" wR="rw" stAng="bD9" swAng="swAng5" />

+        <close />

+      </path>

+    </pathLst>

+

+  </gear9>

+  <halfFrame>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 33333" />

+

+      <gd name="adj2" fmla="val 33333" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 100000 w ss" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="x1" fmla="*/ ss a2 100000" />

+      <gd name="g1" fmla="*/ h x1 w" />

+      <gd name="g2" fmla="+- h 0 g1" />

+      <gd name="maxAdj1" fmla="*/ 100000 g2 ss" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="y1" fmla="*/ ss a1 100000" />

+      <gd name="dx2" fmla="*/ y1 w h" />

+      <gd name="x2" fmla="+- r 0 dx2" />

+      <gd name="dy2" fmla="*/ x1 h w" />

+      <gd name="y2" fmla="+- b 0 dy2" />

+      <gd name="cx1" fmla="*/ x1 1 2" />

+      <gd name="cy1" fmla="+/ y2 b 2" />

+      <gd name="cx2" fmla="+/ x2 r 2" />

+      <gd name="cy2" fmla="*/ y1 1 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="cx2" y="cy2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="cx1" y="cy1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </halfFrame>

+  <heart>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dx1" fmla="*/ w 49 48" />

+      <gd name="dx2" fmla="*/ w 10 48" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- t 0 hd3" />

+

+

+      <gd name="il" fmla="*/ w 1 6" />

+      <gd name="ir" fmla="*/ w 5 6" />

+      <gd name="ib" fmla="*/ h 2 3" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="hd4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="hd4" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="hc" y="hd4" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="x3" y="y1" />

+          <pt x="x4" y="hd4" />

+          <pt x="hc" y="b" />

+        </cubicBezTo>

+        <cubicBezTo>

+          <pt x="x1" y="hd4" />

+          <pt x="x2" y="y1" />

+          <pt x="hc" y="hd4" />

+        </cubicBezTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </heart>

+  <heptagon>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="hf" fmla="val 102572" />

+      <gd name="vf" fmla="val 105210" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="swd2" fmla="*/ wd2 hf 100000" />

+      <gd name="shd2" fmla="*/ hd2 vf 100000" />

+      <gd name="svc" fmla="*/ vc  vf 100000" />

+      <gd name="dx1" fmla="*/ swd2 97493 100000" />

+      <gd name="dx2" fmla="*/ swd2 78183 100000" />

+      <gd name="dx3" fmla="*/ swd2 43388 100000" />

+      <gd name="dy1" fmla="*/ shd2 62349 100000" />

+      <gd name="dy2" fmla="*/ shd2 22252 100000" />

+      <gd name="dy3" fmla="*/ shd2 90097 100000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc 0 dx3" />

+      <gd name="x4" fmla="+- hc dx3 0" />

+      <gd name="x5" fmla="+- hc dx2 0" />

+      <gd name="x6" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- svc 0 dy1" />

+      <gd name="y2" fmla="+- svc dy2 0" />

+      <gd name="y3" fmla="+- svc dy3 0" />

+      <gd name="ib" fmla="+- b 0 y1" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x5" y="y1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x6" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x4" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y3" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x2" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="y1" r="x5" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </heptagon>

+  <hexagon>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 25000" />

+      <gd name="vf" fmla="val 115470" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 50000 w ss" />

+      <gd name="a" fmla="pin 0 adj maxAdj" />

+      <gd name="shd2" fmla="*/ hd2 vf 100000" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+      <gd name="x2" fmla="+- r 0 x1" />

+      <gd name="dy1" fmla="sin shd2 3600000" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc dy1 0" />

+      <gd name="q1" fmla="*/ maxAdj -1 2" />

+      <gd name="q2" fmla="+- a q1 0" />

+      <gd name="q3" fmla="?: q2 4 2" />

+      <gd name="q4" fmla="?: q2 3 2" />

+      <gd name="q5" fmla="?: q2 q1 0" />

+      <gd name="q6" fmla="+/ a q5 q1" />

+      <gd name="q7" fmla="*/ q6 q4 -1" />

+      <gd name="q8" fmla="+- q3 q7 0" />

+      <gd name="il" fmla="*/ w q8 24" />

+      <gd name="it" fmla="*/ h q8 24" />

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 it" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="maxAdj">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x2" y="y1" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </hexagon>

+  <homePlate>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 100000 w ss" />

+      <gd name="a" fmla="pin 0 adj maxAdj" />

+      <gd name="dx1" fmla="*/ ss a 100000" />

+      <gd name="x1" fmla="+- r 0 dx1" />

+      <gd name="ir" fmla="+/ x1 r 2" />

+      <gd name="x2" fmla="*/ x1 1 2" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="maxAdj">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x2" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </homePlate>

+  <horizontalScroll>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 12500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 25000" />

+      <gd name="ch" fmla="*/ ss a 100000" />

+

+      <gd name="ch2" fmla="*/ ch 1 2" />

+

+      <gd name="ch4" fmla="*/ ch 1 4" />

+

+

+

+

+

+      <gd name="y3" fmla="+- ch ch2 0" />

+

+      <gd name="y4" fmla="+- ch ch 0" />

+

+      <gd name="y6" fmla="+- b 0 ch" />

+

+      <gd name="y7" fmla="+- b 0 ch2" />

+

+      <gd name="y5" fmla="+- y6 0 ch2" />

+

+

+

+

+

+      <gd name="x3" fmla="+- r 0 ch" />

+

+      <gd name="x4" fmla="+- r 0 ch2" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="25000">

+        <pos x="ch" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="hc" y="ch" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="y6" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="ch" t="ch" r="x4" b="y6" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="r" y="ch2" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="x4" y="ch2" />

+        </lnTo>

+        <arcTo wR="ch4" hR="ch4" stAng="0" swAng="cd2" />

+        <lnTo>

+          <pt x="x3" y="ch" />

+        </lnTo>

+        <lnTo>

+          <pt x="ch2" y="ch" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="l" y="y7" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="-10800000" />

+        <lnTo>

+          <pt x="ch" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y6" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />

+        <close />

+        <moveTo>

+          <pt x="ch2" y="y4" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />

+        <arcTo wR="ch4" hR="ch4" stAng="0" swAng="-10800000" />

+        <close />

+      </path>

+      <path fill="darkenLess" stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="ch2" y="y4" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />

+        <arcTo wR="ch4" hR="ch4" stAng="0" swAng="-10800000" />

+        <close />

+        <moveTo>

+          <pt x="x4" y="ch" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-16200000" />

+        <arcTo wR="ch4" hR="ch4" stAng="cd2" swAng="-10800000" />

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="y3" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x3" y="ch" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="ch2" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="cd2" />

+        <lnTo>

+          <pt x="r" y="y5" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="ch" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="ch" y="y7" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd2" />

+        <close />

+        <moveTo>

+          <pt x="x3" y="ch" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="ch" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />

+        <moveTo>

+          <pt x="x4" y="ch" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="ch2" />

+        </lnTo>

+        <arcTo wR="ch4" hR="ch4" stAng="0" swAng="cd2" />

+        <moveTo>

+          <pt x="ch2" y="y4" />

+        </moveTo>

+        <lnTo>

+          <pt x="ch2" y="y3" />

+        </lnTo>

+        <arcTo wR="ch4" hR="ch4" stAng="cd2" swAng="cd2" />

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd2" />

+        <moveTo>

+          <pt x="ch" y="y3" />

+        </moveTo>

+        <lnTo>

+          <pt x="ch" y="y6" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </horizontalScroll>

+  <irregularSeal1>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x5" fmla="*/ w 4627 21600" />

+      <gd name="x12" fmla="*/ w 8485 21600" />

+      <gd name="x21" fmla="*/ w 16702 21600" />

+      <gd name="x24" fmla="*/ w 14522 21600" />

+      <gd name="y3" fmla="*/ h 6320 21600" />

+      <gd name="y6" fmla="*/ h 8615 21600" />

+      <gd name="y9" fmla="*/ h 13937 21600" />

+      <gd name="y18" fmla="*/ h 13290 21600" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x24" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y6" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x12" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y18" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x5" t="y3" r="x21" b="y9" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="21600" h="21600">

+        <moveTo>

+          <pt x="10800" y="5800" />

+        </moveTo>

+        <lnTo>

+          <pt x="14522" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="14155" y="5325" />

+        </lnTo>

+        <lnTo>

+          <pt x="18380" y="4457" />

+        </lnTo>

+        <lnTo>

+          <pt x="16702" y="7315" />

+        </lnTo>

+        <lnTo>

+          <pt x="21097" y="8137" />

+        </lnTo>

+        <lnTo>

+          <pt x="17607" y="10475" />

+        </lnTo>

+        <lnTo>

+          <pt x="21600" y="13290" />

+        </lnTo>

+        <lnTo>

+          <pt x="16837" y="12942" />

+        </lnTo>

+        <lnTo>

+          <pt x="18145" y="18095" />

+        </lnTo>

+        <lnTo>

+          <pt x="14020" y="14457" />

+        </lnTo>

+        <lnTo>

+          <pt x="13247" y="19737" />

+        </lnTo>

+        <lnTo>

+          <pt x="10532" y="14935" />

+        </lnTo>

+        <lnTo>

+          <pt x="8485" y="21600" />

+        </lnTo>

+        <lnTo>

+          <pt x="7715" y="15627" />

+        </lnTo>

+        <lnTo>

+          <pt x="4762" y="17617" />

+        </lnTo>

+        <lnTo>

+          <pt x="5667" y="13937" />

+        </lnTo>

+        <lnTo>

+          <pt x="135" y="14587" />

+        </lnTo>

+        <lnTo>

+          <pt x="3722" y="11775" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="8615" />

+        </lnTo>

+        <lnTo>

+          <pt x="4627" y="7617" />

+        </lnTo>

+        <lnTo>

+          <pt x="370" y="2295" />

+        </lnTo>

+        <lnTo>

+          <pt x="7312" y="6320" />

+        </lnTo>

+        <lnTo>

+          <pt x="8352" y="2295" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </irregularSeal1>

+  <irregularSeal2>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x2" fmla="*/ w 9722 21600" />

+      <gd name="x5" fmla="*/ w 5372 21600" />

+      <gd name="x16" fmla="*/ w 11612 21600" />

+      <gd name="x19" fmla="*/ w 14640 21600" />

+      <gd name="y2" fmla="*/ h 1887 21600" />

+      <gd name="y3" fmla="*/ h 6382 21600" />

+      <gd name="y8" fmla="*/ h 12877 21600" />

+      <gd name="y14" fmla="*/ h 19712 21600" />

+      <gd name="y16" fmla="*/ h 18842 21600" />

+      <gd name="y17" fmla="*/ h 15935 21600" />

+      <gd name="y24" fmla="*/ h 6645 21600" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x2" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y8" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x16" y="y16" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y24" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x5" t="y3" r="x19" b="y17" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="21600" h="21600">

+        <moveTo>

+          <pt x="11462" y="4342" />

+        </moveTo>

+        <lnTo>

+          <pt x="14790" y="0" />

+        </lnTo>

+        <lnTo>

+          <pt x="14525" y="5777" />

+        </lnTo>

+        <lnTo>

+          <pt x="18007" y="3172" />

+        </lnTo>

+        <lnTo>

+          <pt x="16380" y="6532" />

+        </lnTo>

+        <lnTo>

+          <pt x="21600" y="6645" />

+        </lnTo>

+        <lnTo>

+          <pt x="16985" y="9402" />

+        </lnTo>

+        <lnTo>

+          <pt x="18270" y="11290" />

+        </lnTo>

+        <lnTo>

+          <pt x="16380" y="12310" />

+        </lnTo>

+        <lnTo>

+          <pt x="18877" y="15632" />

+        </lnTo>

+        <lnTo>

+          <pt x="14640" y="14350" />

+        </lnTo>

+        <lnTo>

+          <pt x="14942" y="17370" />

+        </lnTo>

+        <lnTo>

+          <pt x="12180" y="15935" />

+        </lnTo>

+        <lnTo>

+          <pt x="11612" y="18842" />

+        </lnTo>

+        <lnTo>

+          <pt x="9872" y="17370" />

+        </lnTo>

+        <lnTo>

+          <pt x="8700" y="19712" />

+        </lnTo>

+        <lnTo>

+          <pt x="7527" y="18125" />

+        </lnTo>

+        <lnTo>

+          <pt x="4917" y="21600" />

+        </lnTo>

+        <lnTo>

+          <pt x="4805" y="18240" />

+        </lnTo>

+        <lnTo>

+          <pt x="1285" y="17825" />

+        </lnTo>

+        <lnTo>

+          <pt x="3330" y="15370" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="12877" />

+        </lnTo>

+        <lnTo>

+          <pt x="3935" y="11592" />

+        </lnTo>

+        <lnTo>

+          <pt x="1172" y="8270" />

+        </lnTo>

+        <lnTo>

+          <pt x="5372" y="7817" />

+        </lnTo>

+        <lnTo>

+          <pt x="4502" y="3625" />

+        </lnTo>

+        <lnTo>

+          <pt x="8550" y="6382" />

+        </lnTo>

+        <lnTo>

+          <pt x="9722" y="1887" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </irregularSeal2>

+  <leftArrow>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 100000 w ss" />

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="dx2" fmla="*/ ss a2 100000" />

+      <gd name="x2" fmla="+- l dx2 0" />

+      <gd name="dy1" fmla="*/ h a1 200000" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc dy1 0" />

+      <gd name="dx1" fmla="*/ y1 dx2 hd2" />

+      <gd name="x1" fmla="+- x2  0 dx1" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="100000">

+        <pos x="r" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x2" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="x1" t="y1" r="r" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </leftArrow>

+  <leftArrowCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+      <gd name="adj4" fmla="val 64977" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 h ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="maxAdj3" fmla="*/ 100000 w ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="q2" fmla="*/ a3 ss w" />

+

+      <gd name="maxAdj4" fmla="+- 100000 0 q2" />

+

+      <gd name="a4" fmla="pin 0 adj4 maxAdj4" />

+      <gd name="dy1" fmla="*/ ss a2 100000" />

+

+      <gd name="dy2" fmla="*/ ss a1 200000" />

+

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc 0 dy2" />

+      <gd name="y3" fmla="+- vc dy2 0" />

+      <gd name="y4" fmla="+- vc dy1 0" />

+      <gd name="x1" fmla="*/ ss a3 100000" />

+

+      <gd name="dx2" fmla="*/ w a4 100000" />

+

+      <gd name="x2" fmla="+- r 0 dx2" />

+      <gd name="x3" fmla="+/ x2 r 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="x1" y="y2" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">

+        <pos x="x2" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x3" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </leftArrowCallout>

+  <leftBrace>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 8333" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a2" fmla="pin 0 adj2 100000" />

+      <gd name="q1" fmla="+- 100000 0 a2" />

+      <gd name="q2" fmla="min q1 a2" />

+      <gd name="q3" fmla="*/ q2 1 2" />

+      <gd name="maxAdj1" fmla="*/ q3 h ss" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="y1" fmla="*/ ss a1 100000" />

+      <gd name="y3" fmla="*/ h a2 100000" />

+      <gd name="y4" fmla="+- y3 y1 0" />

+      <gd name="dx1" fmla="cos wd2 2700000" />

+      <gd name="dy1" fmla="sin y1 2700000" />

+      <gd name="il" fmla="+- r 0 dx1" />

+      <gd name="it" fmla="+- y1 0 dy1" />

+      <gd name="ib" fmla="+- b dy1 y1" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="hc" y="y1" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="100000">

+        <pos x="l" y="y3" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="r" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y3" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="r" y="b" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="r" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="r" y="b" />

+        </moveTo>

+        <arcTo wR="wd2" hR="y1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="hc" y="y4" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="0" swAng="-5400000" />

+        <arcTo wR="wd2" hR="y1" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="hc" y="y1" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="cd4" />

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="r" y="b" />

+        </moveTo>

+        <arcTo wR="wd2" hR="y1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="hc" y="y4" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="0" swAng="-5400000" />

+        <arcTo wR="wd2" hR="y1" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="hc" y="y1" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="cd4" />

+      </path>

+    </pathLst>

+  </leftBrace>

+  <leftBracket>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 8333" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 50000 h ss" />

+

+      <gd name="a" fmla="pin 0 adj maxAdj" />

+      <gd name="y1" fmla="*/ ss a 100000" />

+

+      <gd name="y2" fmla="+- b 0 y1" />

+

+      <gd name="dx1" fmla="cos w 2700000" />

+      <gd name="dy1" fmla="sin y1 2700000" />

+      <gd name="il" fmla="+- r 0 dx1" />

+      <gd name="it" fmla="+- y1 0 dy1" />

+      <gd name="ib" fmla="+- b dy1 y1" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="maxAdj">

+        <pos x="l" y="y1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="r" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="r" y="b" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="r" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="r" y="b" />

+        </moveTo>

+        <arcTo wR="w" hR="y1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="l" y="y1" />

+        </lnTo>

+        <arcTo wR="w" hR="y1" stAng="cd2" swAng="cd4" />

+        <close />

+      </path>

+      <path fill="none">

+

+        <moveTo>

+          <pt x="r" y="b" />

+        </moveTo>

+        <arcTo wR="w" hR="y1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="l" y="y1" />

+        </lnTo>

+        <arcTo wR="w" hR="y1" stAng="cd2" swAng="cd4" />

+      </path>

+    </pathLst>

+

+  </leftBracket>

+  <leftCircularArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 12500" />

+

+      <gd name="adj2" fmla="val -1142319" />

+

+      <gd name="adj3" fmla="val 1142319" />

+

+      <gd name="adj4" fmla="val 10800000" />

+

+      <gd name="adj5" fmla="val 12500" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a5" fmla="pin 0 adj5 25000" />

+

+      <gd name="maxAdj1" fmla="*/ a5 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="enAng" fmla="pin 1 adj3 21599999" />

+      <gd name="stAng" fmla="pin 0 adj4 21599999" />

+

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="thh" fmla="*/ ss a5 100000" />

+

+      <gd name="th2" fmla="*/ th 1 2" />

+

+

+      <gd name="rw1" fmla="+- wd2 th2 thh" />

+

+      <gd name="rh1" fmla="+- hd2 th2 thh" />

+

+      <gd name="rw2" fmla="+- rw1 0 th" />

+

+      <gd name="rh2" fmla="+- rh1 0 th" />

+

+      <gd name="rw3" fmla="+- rw2 th2 0" />

+

+      <gd name="rh3" fmla="+- rh2 th2 0" />

+

+

+      <gd name="wtH" fmla="sin rw3 enAng" />

+      <gd name="htH" fmla="cos rh3 enAng" />

+      <gd name="dxH" fmla="cat2 rw3 htH wtH" />

+      <gd name="dyH" fmla="sat2 rh3 htH wtH" />

+      <gd name="xH" fmla="+- hc dxH 0" />

+

+      <gd name="yH" fmla="+- vc dyH 0" />

+

+

+      <gd name="rI" fmla="min rw2 rh2" />

+

+      <gd name="u1" fmla="*/ dxH dxH 1" />

+      <gd name="u2" fmla="*/ dyH dyH 1" />

+      <gd name="u3" fmla="*/ rI rI 1" />

+      <gd name="u4" fmla="+- u1 0 u3" />

+      <gd name="u5" fmla="+- u2 0 u3" />

+      <gd name="u6" fmla="*/ u4 u5 u1" />

+      <gd name="u7" fmla="*/ u6 1 u2" />

+      <gd name="u8" fmla="+- 1 0 u7" />

+      <gd name="u9" fmla="sqrt u8" />

+      <gd name="u10" fmla="*/ u4 1 dxH" />

+      <gd name="u11" fmla="*/ u10 1 dyH" />

+      <gd name="u12" fmla="+/ 1 u9 u11" />

+      <gd name="u13" fmla="at2 1 u12" />

+      <gd name="u14" fmla="+- u13 21600000 0" />

+      <gd name="u15" fmla="?: u13 u13 u14" />

+      <gd name="u16" fmla="+- u15 0 enAng" />

+

+      <gd name="u17" fmla="+- u16 21600000 0" />

+      <gd name="u18" fmla="?: u16 u16 u17" />

+      <gd name="u19" fmla="+- u18 0 cd2" />

+      <gd name="u20" fmla="+- u18 0 21600000" />

+      <gd name="u21" fmla="?: u19 u20 u18" />

+      <gd name="u22" fmla="abs u21" />

+      <gd name="minAng" fmla="*/ u22 -1 1" />

+      <gd name="u23" fmla="abs adj2" />

+      <gd name="a2" fmla="*/ u23 -1 1" />

+      <gd name="aAng" fmla="pin minAng a2 0" />

+

+      <gd name="ptAng" fmla="+- enAng aAng 0" />

+

+

+      <gd name="wtA" fmla="sin rw3 ptAng" />

+      <gd name="htA" fmla="cos rh3 ptAng" />

+      <gd name="dxA" fmla="cat2 rw3 htA wtA" />

+      <gd name="dyA" fmla="sat2 rh3 htA wtA" />

+      <gd name="xA" fmla="+- hc dxA 0" />

+

+      <gd name="yA" fmla="+- vc dyA 0" />

+

+

+      <gd name="wtE" fmla="sin rw1 stAng" />

+      <gd name="htE" fmla="cos rh1 stAng" />

+      <gd name="dxE" fmla="cat2 rw1 htE wtE" />

+      <gd name="dyE" fmla="sat2 rh1 htE wtE" />

+      <gd name="xE" fmla="+- hc dxE 0" />

+

+      <gd name="yE" fmla="+- vc dyE 0" />

+

+

+      <gd name="wtD" fmla="sin rw2 stAng" />

+      <gd name="htD" fmla="cos rh2 stAng" />

+      <gd name="dxD" fmla="cat2 rw2 htD wtD" />

+      <gd name="dyD" fmla="sat2 rh2 htD wtD" />

+      <gd name="xD" fmla="+- hc dxD 0" />

+

+      <gd name="yD" fmla="+- vc dyD 0" />

+

+

+      <gd name="dxG" fmla="cos thh ptAng" />

+      <gd name="dyG" fmla="sin thh ptAng" />

+      <gd name="xG" fmla="+- xH dxG 0" />

+

+      <gd name="yG" fmla="+- yH dyG 0" />

+

+

+      <gd name="dxB" fmla="cos thh ptAng" />

+      <gd name="dyB" fmla="sin thh ptAng" />

+      <gd name="xB" fmla="+- xH 0 dxB 0" />

+

+      <gd name="yB" fmla="+- yH 0 dyB 0" />

+

+

+      <gd name="sx1" fmla="+- xB 0 hc" />

+

+      <gd name="sy1" fmla="+- yB 0 vc" />

+

+      <gd name="sx2" fmla="+- xG 0 hc" />

+

+      <gd name="sy2" fmla="+- yG 0 vc" />

+

+

+      <gd name="rO" fmla="min rw1 rh1" />

+

+      <gd name="x1O" fmla="*/ sx1 rO rw1" />

+

+      <gd name="y1O" fmla="*/ sy1 rO rh1" />

+

+      <gd name="x2O" fmla="*/ sx2 rO rw1" />

+

+      <gd name="y2O" fmla="*/ sy2 rO rh1" />

+

+

+      <gd name="dxO" fmla="+- x2O 0 x1O" />

+      <gd name="dyO" fmla="+- y2O 0 y1O" />

+      <gd name="dO" fmla="mod dxO dyO 0" />

+

+      <gd name="q1" fmla="*/ x1O y2O 1" />

+      <gd name="q2" fmla="*/ x2O y1O 1" />

+      <gd name="DO" fmla="+- q1 0 q2" />

+

+

+      <gd name="q3" fmla="*/ rO rO 1" />

+

+      <gd name="q4" fmla="*/ dO dO 1" />

+

+      <gd name="q5" fmla="*/ q3 q4 1" />

+

+      <gd name="q6" fmla="*/ DO DO 1" />

+

+      <gd name="q7" fmla="+- q5 0 q6" />

+

+      <gd name="q8" fmla="max q7 0" />

+

+      <gd name="sdelO" fmla="sqrt q8" />

+

+      <gd name="ndyO" fmla="*/ dyO -1 1" />

+      <gd name="sdyO" fmla="?: ndyO -1 1" />

+

+      <gd name="q9" fmla="*/ sdyO dxO 1" />

+

+      <gd name="q10" fmla="*/ q9 sdelO 1" />

+

+      <gd name="q11" fmla="*/ DO dyO 1" />

+

+      <gd name="dxF1" fmla="+/ q11 q10 q4" />

+

+      <gd name="q12" fmla="+- q11 0 q10" />

+      <gd name="dxF2" fmla="*/ q12 1 q4" />

+

+

+      <gd name="adyO" fmla="abs dyO" />

+      <gd name="q13" fmla="*/ adyO sdelO 1" />

+

+      <gd name="q14" fmla="*/ DO dxO -1" />

+

+      <gd name="dyF1" fmla="+/ q14 q13 q4" />

+

+      <gd name="q15" fmla="+- q14 0 q13" />

+      <gd name="dyF2" fmla="*/ q15 1 q4" />

+

+

+

+      <gd name="q16" fmla="+- x2O 0 dxF1" />

+      <gd name="q17" fmla="+- x2O 0 dxF2" />

+      <gd name="q18" fmla="+- y2O 0 dyF1" />

+      <gd name="q19" fmla="+- y2O 0 dyF2" />

+      <gd name="q20" fmla="mod q16 q18 0" />

+

+      <gd name="q21" fmla="mod q17 q19 0" />

+

+      <gd name="q22" fmla="+- q21 0 q20" />

+      <gd name="dxF" fmla="?: q22 dxF1 dxF2" />

+

+      <gd name="dyF" fmla="?: q22 dyF1 dyF2" />

+

+      <gd name="sdxF" fmla="*/ dxF rw1 rO" />

+

+      <gd name="sdyF" fmla="*/ dyF rh1 rO" />

+

+      <gd name="xF" fmla="+- hc sdxF 0" />

+

+      <gd name="yF" fmla="+- vc sdyF 0" />

+

+

+

+

+      <gd name="x1I" fmla="*/ sx1 rI rw2" />

+

+      <gd name="y1I" fmla="*/ sy1 rI rh2" />

+

+      <gd name="x2I" fmla="*/ sx2 rI rw2" />

+

+      <gd name="y2I" fmla="*/ sy2 rI rh2" />

+

+

+      <gd name="dxI" fmla="+- x2I 0 x1I" />

+      <gd name="dyI" fmla="+- y2I 0 y1I" />

+      <gd name="dI" fmla="mod dxI dyI 0" />

+      <gd name="v1" fmla="*/ x1I y2I 1" />

+      <gd name="v2" fmla="*/ x2I y1I 1" />

+      <gd name="DI" fmla="+- v1 0 v2" />

+

+      <gd name="v3" fmla="*/ rI rI 1" />

+      <gd name="v4" fmla="*/ dI dI 1" />

+      <gd name="v5" fmla="*/ v3 v4 1" />

+      <gd name="v6" fmla="*/ DI DI 1" />

+      <gd name="v7" fmla="+- v5 0 v6" />

+      <gd name="v8" fmla="max v7 0" />

+      <gd name="sdelI" fmla="sqrt v8" />

+      <gd name="v9" fmla="*/ sdyO dxI 1" />

+      <gd name="v10" fmla="*/ v9 sdelI 1" />

+      <gd name="v11" fmla="*/ DI dyI 1" />

+      <gd name="dxC1" fmla="+/ v11 v10 v4" />

+      <gd name="v12" fmla="+- v11 0 v10" />

+      <gd name="dxC2" fmla="*/ v12 1 v4" />

+

+      <gd name="adyI" fmla="abs dyI" />

+      <gd name="v13" fmla="*/ adyI sdelI 1" />

+      <gd name="v14" fmla="*/ DI dxI -1" />

+      <gd name="dyC1" fmla="+/ v14 v13 v4" />

+      <gd name="v15" fmla="+- v14 0 v13" />

+      <gd name="dyC2" fmla="*/ v15 1 v4" />

+

+      <gd name="v16" fmla="+- x1I 0 dxC1" />

+      <gd name="v17" fmla="+- x1I 0 dxC2" />

+      <gd name="v18" fmla="+- y1I 0 dyC1" />

+      <gd name="v19" fmla="+- y1I 0 dyC2" />

+      <gd name="v20" fmla="mod v16 v18 0" />

+      <gd name="v21" fmla="mod v17 v19 0" />

+      <gd name="v22" fmla="+- v21 0 v20" />

+      <gd name="dxC" fmla="?: v22 dxC1 dxC2" />

+      <gd name="dyC" fmla="?: v22 dyC1 dyC2" />

+      <gd name="sdxC" fmla="*/ dxC rw2 rI" />

+      <gd name="sdyC" fmla="*/ dyC rh2 rI" />

+      <gd name="xC" fmla="+- hc sdxC 0" />

+

+      <gd name="yC" fmla="+- vc sdyC 0" />

+

+

+      <gd name="ist0" fmla="at2 sdxC sdyC" />

+      <gd name="ist1" fmla="+- ist0 21600000 0" />

+      <gd name="istAng0" fmla="?: ist0 ist0 ist1" />

+      <gd name="isw1" fmla="+- stAng 0 istAng0" />

+      <gd name="isw2" fmla="+- isw1 21600000 0" />

+      <gd name="iswAng0" fmla="?: isw1 isw1 isw2" />

+

+      <gd name="istAng" fmla="+- istAng0 iswAng0 0" />

+      <gd name="iswAng" fmla="+- 0 0 iswAng0" />

+

+      <gd name="p1" fmla="+- xF 0 xC" />

+      <gd name="p2" fmla="+- yF 0 yC" />

+      <gd name="p3" fmla="mod p1 p2 0" />

+      <gd name="p4" fmla="*/ p3 1 2" />

+      <gd name="p5" fmla="+- p4 0 thh" />

+      <gd name="xGp" fmla="?: p5 xF xG" />

+      <gd name="yGp" fmla="?: p5 yF yG" />

+      <gd name="xBp" fmla="?: p5 xC xB" />

+      <gd name="yBp" fmla="?: p5 yC yB" />

+

+      <gd name="en0" fmla="at2 sdxF sdyF" />

+      <gd name="en1" fmla="+- en0 21600000 0" />

+      <gd name="en2" fmla="?: en0 en0 en1" />

+      <gd name="sw0" fmla="+- en2 0 stAng" />

+      <gd name="sw1" fmla="+- sw0 0 21600000" />

+      <gd name="swAng" fmla="?: sw0 sw1 sw0" />

+

+

+      <gd name="stAng0" fmla="+- stAng swAng 0" />

+

+      <gd name="swAng0" fmla="+- 0 0 swAng" />

+

+

+      <gd name="wtI" fmla="sin rw3 stAng" />

+      <gd name="htI" fmla="cos rh3 stAng" />

+      <gd name="dxI" fmla="cat2 rw3 htI wtI" />

+      <gd name="dyI" fmla="sat2 rh3 htI wtI" />

+      <gd name="xI" fmla="+- hc dxI 0" />

+

+      <gd name="yI" fmla="+- vc dyI 0" />

+

+

+      <gd name="aI" fmla="+- stAng cd4 0" />

+      <gd name="aA" fmla="+- ptAng 0 cd4" />

+      <gd name="aB" fmla="+- ptAng cd2 0" />

+

+      <gd name="idx" fmla="cos rw1 2700000" />

+      <gd name="idy" fmla="sin rh1 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefAng="adj2" minAng="minAng" maxAng="0">

+        <pos x="xA" y="yA" />

+      </ahPolar>

+      <ahPolar gdRefAng="adj4" minAng="0" maxAng="21599999">

+        <pos x="xE" y="yE" />

+      </ahPolar>

+      <ahPolar gdRefR="adj1" minR="0" maxR="maxAdj1" gdRefAng="adj3" minAng="0" maxAng="21599999">

+        <pos x="xF" y="yF" />

+      </ahPolar>

+      <ahPolar gdRefR="adj5" minR="0" maxR="25000">

+        <pos x="xB" y="yB" />

+      </ahPolar>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="aI">

+        <pos x="xI" y="yI" />

+      </cxn>

+      <cxn ang="ptAng">

+        <pos x="xGp" y="yGp" />

+      </cxn>

+      <cxn ang="aA">

+        <pos x="xA" y="yA" />

+      </cxn>

+      <cxn ang="aB">

+        <pos x="xBp" y="yBp" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="xE" y="yE" />

+        </moveTo>

+        <lnTo>

+          <pt x="xD" y="yD" />

+        </lnTo>

+        <arcTo wR="rw2" hR="rh2" stAng="istAng" swAng="iswAng" />

+        <lnTo>

+          <pt x="xBp" y="yBp" />

+        </lnTo>

+        <lnTo>

+          <pt x="xA" y="yA" />

+        </lnTo>

+        <lnTo>

+          <pt x="xGp" y="yGp" />

+        </lnTo>

+        <lnTo>

+          <pt x="xF" y="yF" />

+        </lnTo>

+        <arcTo wR="rw1" hR="rh1" stAng="stAng0" swAng="swAng0" />

+        <close />

+      </path>

+    </pathLst>

+

+  </leftCircularArrow>

+  <leftRightArrow>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 w ss" />

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="x2" fmla="*/ ss a2 100000" />

+      <gd name="x3" fmla="+- r 0 x2" />

+      <gd name="dy" fmla="*/ h a1 200000" />

+      <gd name="y1" fmla="+- vc 0 dy" />

+      <gd name="y2" fmla="+- vc dy 0" />

+      <gd name="dx1" fmla="*/ y1 x2 hd2" />

+      <gd name="x1" fmla="+- x2 0 dx1" />

+      <gd name="x4" fmla="+- x3 dx1 0" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="100000">

+        <pos x="x3" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x2" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x3" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="x1" t="y1" r="x4" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </leftRightArrow>

+  <leftRightArrowCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+      <gd name="adj4" fmla="val 48123" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 h ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="maxAdj3" fmla="*/ 50000 w ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="q2" fmla="*/ a3 ss wd2" />

+

+      <gd name="maxAdj4" fmla="+- 100000 0 q2" />

+

+      <gd name="a4" fmla="pin 0 adj4 maxAdj4" />

+      <gd name="dy1" fmla="*/ ss a2 100000" />

+

+      <gd name="dy2" fmla="*/ ss a1 200000" />

+

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc 0 dy2" />

+      <gd name="y3" fmla="+- vc dy2 0" />

+      <gd name="y4" fmla="+- vc dy1 0" />

+      <gd name="x1" fmla="*/ ss a3 100000" />

+

+      <gd name="x4" fmla="+- r 0 x1" />

+

+      <gd name="dx2" fmla="*/ w a4 200000" />

+

+      <gd name="x2" fmla="+- hc 0 dx2" />

+

+      <gd name="x3" fmla="+- hc dx2 0" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="x1" y="y2" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">

+        <pos x="x2" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="t" r="x3" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </leftRightArrowCallout>

+  <leftRightCircularArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 12500" />

+

+      <gd name="adj2" fmla="val 1142319" />

+

+      <gd name="adj3" fmla="val 20457681" />

+

+      <gd name="adj4" fmla="val 11942319" />

+

+      <gd name="adj5" fmla="val 12500" />

+

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a5" fmla="pin 0 adj5 25000" />

+

+      <gd name="maxAdj1" fmla="*/ a5 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="enAng" fmla="pin 1 adj3 21599999" />

+      <gd name="stAng" fmla="pin 0 adj4 21599999" />

+

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="thh" fmla="*/ ss a5 100000" />

+

+      <gd name="th2" fmla="*/ th 1 2" />

+

+

+      <gd name="rw1" fmla="+- wd2 th2 thh" />

+

+      <gd name="rh1" fmla="+- hd2 th2 thh" />

+

+      <gd name="rw2" fmla="+- rw1 0 th" />

+

+      <gd name="rh2" fmla="+- rh1 0 th" />

+

+      <gd name="rw3" fmla="+- rw2 th2 0" />

+

+      <gd name="rh3" fmla="+- rh2 th2 0" />

+

+

+      <gd name="wtH" fmla="sin rw3 enAng" />

+      <gd name="htH" fmla="cos rh3 enAng" />

+      <gd name="dxH" fmla="cat2 rw3 htH wtH" />

+      <gd name="dyH" fmla="sat2 rh3 htH wtH" />

+      <gd name="xH" fmla="+- hc dxH 0" />

+

+      <gd name="yH" fmla="+- vc dyH 0" />

+

+

+      <gd name="rI" fmla="min rw2 rh2" />

+

+      <gd name="u1" fmla="*/ dxH dxH 1" />

+      <gd name="u2" fmla="*/ dyH dyH 1" />

+      <gd name="u3" fmla="*/ rI rI 1" />

+      <gd name="u4" fmla="+- u1 0 u3" />

+      <gd name="u5" fmla="+- u2 0 u3" />

+      <gd name="u6" fmla="*/ u4 u5 u1" />

+      <gd name="u7" fmla="*/ u6 1 u2" />

+      <gd name="u8" fmla="+- 1 0 u7" />

+      <gd name="u9" fmla="sqrt u8" />

+      <gd name="u10" fmla="*/ u4 1 dxH" />

+      <gd name="u11" fmla="*/ u10 1 dyH" />

+      <gd name="u12" fmla="+/ 1 u9 u11" />

+      <gd name="u13" fmla="at2 1 u12" />

+      <gd name="u14" fmla="+- u13 21600000 0" />

+      <gd name="u15" fmla="?: u13 u13 u14" />

+      <gd name="u16" fmla="+- u15 0 enAng" />

+

+      <gd name="u17" fmla="+- u16 21600000 0" />

+      <gd name="u18" fmla="?: u16 u16 u17" />

+      <gd name="u19" fmla="+- u18 0 cd2" />

+      <gd name="u20" fmla="+- u18 0 21600000" />

+      <gd name="u21" fmla="?: u19 u20 u18" />

+      <gd name="maxAng" fmla="abs u21" />

+      <gd name="aAng" fmla="pin 0 adj2 maxAng" />

+

+      <gd name="ptAng" fmla="+- enAng aAng 0" />

+

+

+      <gd name="wtA" fmla="sin rw3 ptAng" />

+      <gd name="htA" fmla="cos rh3 ptAng" />

+      <gd name="dxA" fmla="cat2 rw3 htA wtA" />

+      <gd name="dyA" fmla="sat2 rh3 htA wtA" />

+      <gd name="xA" fmla="+- hc dxA 0" />

+

+      <gd name="yA" fmla="+- vc dyA 0" />

+

+

+      <gd name="dxG" fmla="cos thh ptAng" />

+      <gd name="dyG" fmla="sin thh ptAng" />

+      <gd name="xG" fmla="+- xH dxG 0" />

+

+      <gd name="yG" fmla="+- yH dyG 0" />

+

+

+      <gd name="dxB" fmla="cos thh ptAng" />

+      <gd name="dyB" fmla="sin thh ptAng" />

+      <gd name="xB" fmla="+- xH 0 dxB 0" />

+

+      <gd name="yB" fmla="+- yH 0 dyB 0" />

+

+

+      <gd name="sx1" fmla="+- xB 0 hc" />

+

+      <gd name="sy1" fmla="+- yB 0 vc" />

+

+      <gd name="sx2" fmla="+- xG 0 hc" />

+

+      <gd name="sy2" fmla="+- yG 0 vc" />

+

+

+      <gd name="rO" fmla="min rw1 rh1" />

+

+      <gd name="x1O" fmla="*/ sx1 rO rw1" />

+

+      <gd name="y1O" fmla="*/ sy1 rO rh1" />

+

+      <gd name="x2O" fmla="*/ sx2 rO rw1" />

+

+      <gd name="y2O" fmla="*/ sy2 rO rh1" />

+

+

+      <gd name="dxO" fmla="+- x2O 0 x1O" />

+      <gd name="dyO" fmla="+- y2O 0 y1O" />

+      <gd name="dO" fmla="mod dxO dyO 0" />

+

+      <gd name="q1" fmla="*/ x1O y2O 1" />

+      <gd name="q2" fmla="*/ x2O y1O 1" />

+      <gd name="DO" fmla="+- q1 0 q2" />

+

+

+      <gd name="q3" fmla="*/ rO rO 1" />

+

+      <gd name="q4" fmla="*/ dO dO 1" />

+

+      <gd name="q5" fmla="*/ q3 q4 1" />

+

+      <gd name="q6" fmla="*/ DO DO 1" />

+

+      <gd name="q7" fmla="+- q5 0 q6" />

+

+      <gd name="q8" fmla="max q7 0" />

+

+      <gd name="sdelO" fmla="sqrt q8" />

+

+      <gd name="ndyO" fmla="*/ dyO -1 1" />

+      <gd name="sdyO" fmla="?: ndyO -1 1" />

+

+      <gd name="q9" fmla="*/ sdyO dxO 1" />

+

+      <gd name="q10" fmla="*/ q9 sdelO 1" />

+

+      <gd name="q11" fmla="*/ DO dyO 1" />

+

+      <gd name="dxF1" fmla="+/ q11 q10 q4" />

+

+      <gd name="q12" fmla="+- q11 0 q10" />

+      <gd name="dxF2" fmla="*/ q12 1 q4" />

+

+

+      <gd name="adyO" fmla="abs dyO" />

+      <gd name="q13" fmla="*/ adyO sdelO 1" />

+

+      <gd name="q14" fmla="*/ DO dxO -1" />

+

+      <gd name="dyF1" fmla="+/ q14 q13 q4" />

+

+      <gd name="q15" fmla="+- q14 0 q13" />

+      <gd name="dyF2" fmla="*/ q15 1 q4" />

+

+

+

+      <gd name="q16" fmla="+- x2O 0 dxF1" />

+      <gd name="q17" fmla="+- x2O 0 dxF2" />

+      <gd name="q18" fmla="+- y2O 0 dyF1" />

+      <gd name="q19" fmla="+- y2O 0 dyF2" />

+      <gd name="q20" fmla="mod q16 q18 0" />

+

+      <gd name="q21" fmla="mod q17 q19 0" />

+

+      <gd name="q22" fmla="+- q21 0 q20" />

+      <gd name="dxF" fmla="?: q22 dxF1 dxF2" />

+

+      <gd name="dyF" fmla="?: q22 dyF1 dyF2" />

+

+      <gd name="sdxF" fmla="*/ dxF rw1 rO" />

+

+      <gd name="sdyF" fmla="*/ dyF rh1 rO" />

+

+      <gd name="xF" fmla="+- hc sdxF 0" />

+

+      <gd name="yF" fmla="+- vc sdyF 0" />

+

+

+

+

+      <gd name="x1I" fmla="*/ sx1 rI rw2" />

+

+      <gd name="y1I" fmla="*/ sy1 rI rh2" />

+

+      <gd name="x2I" fmla="*/ sx2 rI rw2" />

+

+      <gd name="y2I" fmla="*/ sy2 rI rh2" />

+

+

+      <gd name="dxI" fmla="+- x2I 0 x1I" />

+      <gd name="dyI" fmla="+- y2I 0 y1I" />

+      <gd name="dI" fmla="mod dxI dyI 0" />

+      <gd name="v1" fmla="*/ x1I y2I 1" />

+      <gd name="v2" fmla="*/ x2I y1I 1" />

+      <gd name="DI" fmla="+- v1 0 v2" />

+

+      <gd name="v3" fmla="*/ rI rI 1" />

+      <gd name="v4" fmla="*/ dI dI 1" />

+      <gd name="v5" fmla="*/ v3 v4 1" />

+      <gd name="v6" fmla="*/ DI DI 1" />

+      <gd name="v7" fmla="+- v5 0 v6" />

+      <gd name="v8" fmla="max v7 0" />

+      <gd name="sdelI" fmla="sqrt v8" />

+      <gd name="v9" fmla="*/ sdyO dxI 1" />

+      <gd name="v10" fmla="*/ v9 sdelI 1" />

+      <gd name="v11" fmla="*/ DI dyI 1" />

+      <gd name="dxC1" fmla="+/ v11 v10 v4" />

+      <gd name="v12" fmla="+- v11 0 v10" />

+      <gd name="dxC2" fmla="*/ v12 1 v4" />

+

+      <gd name="adyI" fmla="abs dyI" />

+      <gd name="v13" fmla="*/ adyI sdelI 1" />

+      <gd name="v14" fmla="*/ DI dxI -1" />

+      <gd name="dyC1" fmla="+/ v14 v13 v4" />

+      <gd name="v15" fmla="+- v14 0 v13" />

+      <gd name="dyC2" fmla="*/ v15 1 v4" />

+

+      <gd name="v16" fmla="+- x1I 0 dxC1" />

+      <gd name="v17" fmla="+- x1I 0 dxC2" />

+      <gd name="v18" fmla="+- y1I 0 dyC1" />

+      <gd name="v19" fmla="+- y1I 0 dyC2" />

+      <gd name="v20" fmla="mod v16 v18 0" />

+      <gd name="v21" fmla="mod v17 v19 0" />

+      <gd name="v22" fmla="+- v21 0 v20" />

+      <gd name="dxC" fmla="?: v22 dxC1 dxC2" />

+      <gd name="dyC" fmla="?: v22 dyC1 dyC2" />

+      <gd name="sdxC" fmla="*/ dxC rw2 rI" />

+      <gd name="sdyC" fmla="*/ dyC rh2 rI" />

+      <gd name="xC" fmla="+- hc sdxC 0" />

+

+      <gd name="yC" fmla="+- vc sdyC 0" />

+

+

+      <gd name="wtI" fmla="sin rw3 stAng" />

+      <gd name="htI" fmla="cos rh3 stAng" />

+      <gd name="dxI" fmla="cat2 rw3 htI wtI" />

+      <gd name="dyI" fmla="sat2 rh3 htI wtI" />

+      <gd name="xI" fmla="+- hc dxI 0" />

+

+      <gd name="yI" fmla="+- vc dyI 0" />

+

+

+      <gd name="lptAng" fmla="+- stAng 0 aAng" />

+

+

+      <gd name="wtL" fmla="sin rw3 lptAng" />

+      <gd name="htL" fmla="cos rh3 lptAng" />

+      <gd name="dxL" fmla="cat2 rw3 htL wtL" />

+      <gd name="dyL" fmla="sat2 rh3 htL wtL" />

+      <gd name="xL" fmla="+- hc dxL 0" />

+

+      <gd name="yL" fmla="+- vc dyL 0" />

+

+

+      <gd name="dxK" fmla="cos thh lptAng" />

+      <gd name="dyK" fmla="sin thh lptAng" />

+      <gd name="xK" fmla="+- xI dxK 0" />

+

+      <gd name="yK" fmla="+- yI dyK 0" />

+

+

+      <gd name="dxJ" fmla="cos thh lptAng" />

+      <gd name="dyJ" fmla="sin thh lptAng" />

+      <gd name="xJ" fmla="+- xI 0 dxJ 0" />

+

+      <gd name="yJ" fmla="+- yI 0 dyJ 0" />

+

+

+      <gd name="p1" fmla="+- xF 0 xC" />

+      <gd name="p2" fmla="+- yF 0 yC" />

+      <gd name="p3" fmla="mod p1 p2 0" />

+      <gd name="p4" fmla="*/ p3 1 2" />

+      <gd name="p5" fmla="+- p4 0 thh" />

+      <gd name="xGp" fmla="?: p5 xF xG" />

+      <gd name="yGp" fmla="?: p5 yF yG" />

+      <gd name="xBp" fmla="?: p5 xC xB" />

+      <gd name="yBp" fmla="?: p5 yC yB" />

+

+      <gd name="en0" fmla="at2 sdxF sdyF" />

+      <gd name="en1" fmla="+- en0 21600000 0" />

+      <gd name="en2" fmla="?: en0 en0 en1" />

+      <gd name="od0" fmla="+- en2 0 enAng" />

+      <gd name="od1" fmla="+- od0 21600000 0" />

+      <gd name="od2" fmla="?: od0 od0 od1" />

+

+      <gd name="st0" fmla="+- stAng 0 od2" />

+      <gd name="st1" fmla="+- st0 21600000 0" />

+      <gd name="st2" fmla="?: st0 st0 st1" />

+

+      <gd name="sw0" fmla="+- en2 0 st2" />

+      <gd name="sw1" fmla="+- sw0 21600000 0" />

+      <gd name="swAng" fmla="?: sw0 sw0 sw1" />

+

+

+      <gd name="ist0" fmla="at2 sdxC sdyC" />

+      <gd name="ist1" fmla="+- ist0 21600000 0" />

+      <gd name="istAng" fmla="?: ist0 ist0 ist1" />

+

+      <gd name="id0" fmla="+- istAng 0 enAng" />

+      <gd name="id1" fmla="+- id0 0 21600000" />

+      <gd name="id2" fmla="?: id0 id1 id0" />

+

+      <gd name="ien0" fmla="+- stAng 0 id2" />

+      <gd name="ien1" fmla="+- ien0 0 21600000" />

+      <gd name="ien2" fmla="?: ien1 ien1 ien0" />

+

+      <gd name="isw1" fmla="+- ien2 0 istAng" />

+      <gd name="isw2" fmla="+- isw1 0 21600000" />

+      <gd name="iswAng" fmla="?: isw1 isw2 isw1" />

+

+

+      <gd name="wtE" fmla="sin rw1 st2" />

+      <gd name="htE" fmla="cos rh1 st2" />

+      <gd name="dxE" fmla="cat2 rw1 htE wtE" />

+      <gd name="dyE" fmla="sat2 rh1 htE wtE" />

+      <gd name="xE" fmla="+- hc dxE 0" />

+

+      <gd name="yE" fmla="+- vc dyE 0" />

+

+

+      <gd name="wtD" fmla="sin rw2 ien2" />

+      <gd name="htD" fmla="cos rh2 ien2" />

+      <gd name="dxD" fmla="cat2 rw2 htD wtD" />

+      <gd name="dyD" fmla="sat2 rh2 htD wtD" />

+      <gd name="xD" fmla="+- hc dxD 0" />

+

+      <gd name="yD" fmla="+- vc dyD 0" />

+

+

+      <gd name="xKp" fmla="?: p5 xE xK" />

+      <gd name="yKp" fmla="?: p5 yE yK" />

+      <gd name="xJp" fmla="?: p5 xD xJ" />

+      <gd name="yJp" fmla="?: p5 yD yJ" />

+

+      <gd name="aL" fmla="+- lptAng 0 cd4" />

+      <gd name="aA" fmla="+- ptAng cd4 0" />

+      <gd name="aB" fmla="+- ptAng cd2 0" />

+      <gd name="aJ" fmla="+- lptAng cd2 0" />

+

+      <gd name="idx" fmla="cos rw1 2700000" />

+      <gd name="idy" fmla="sin rh1 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefAng="adj2" minAng="0" maxAng="maxAng">

+        <pos x="xA" y="yA" />

+      </ahPolar>

+      <ahPolar gdRefAng="adj4" minAng="0" maxAng="21599999">

+        <pos x="xE" y="yE" />

+      </ahPolar>

+      <ahPolar gdRefR="adj1" minR="0" maxR="maxAdj1" gdRefAng="adj3" minAng="0" maxAng="21599999">

+        <pos x="xF" y="yF" />

+      </ahPolar>

+      <ahPolar gdRefR="adj5" minR="0" maxR="25000">

+        <pos x="xB" y="yB" />

+      </ahPolar>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="aL">

+        <pos x="xL" y="yL" />

+      </cxn>

+      <cxn ang="lptAng">

+        <pos x="xKp" y="yKp" />

+      </cxn>

+      <cxn ang="ptAng">

+        <pos x="xGp" y="yGp" />

+      </cxn>

+      <cxn ang="aA">

+        <pos x="xA" y="yA" />

+      </cxn>

+      <cxn ang="aB">

+        <pos x="xBp" y="yBp" />

+      </cxn>

+      <cxn ang="aJ">

+        <pos x="xJp" y="yJp" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="xL" y="yL" />

+        </moveTo>

+        <lnTo>

+          <pt x="xKp" y="yKp" />

+        </lnTo>

+        <lnTo>

+          <pt x="xE" y="yE" />

+        </lnTo>

+        <arcTo wR="rw1" hR="rh1" stAng="st2" swAng="swAng" />

+        <lnTo>

+          <pt x="xGp" y="yGp" />

+        </lnTo>

+        <lnTo>

+          <pt x="xA" y="yA" />

+        </lnTo>

+        <lnTo>

+          <pt x="xBp" y="yBp" />

+        </lnTo>

+        <lnTo>

+          <pt x="xC" y="yC" />

+        </lnTo>

+        <arcTo wR="rw2" hR="rh2" stAng="istAng" swAng="iswAng" />

+        <lnTo>

+          <pt x="xJp" y="yJp" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </leftRightCircularArrow>

+  <leftRightRibbon>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+      <gd name="adj3" fmla="val 16667" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a3" fmla="pin 0 adj3 33333" />

+      <gd name="maxAdj1" fmla="+- 100000 0 a3" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+

+      <gd name="w1" fmla="+- wd2 0 wd32" />

+      <gd name="maxAdj2" fmla="*/ 100000 w1 ss" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+

+      <gd name="x1" fmla="*/ ss a2 100000" />

+

+      <gd name="x4" fmla="+- r 0 x1" />

+

+      <gd name="dy1" fmla="*/ h a1 200000" />

+

+      <gd name="dy2" fmla="*/ h a3 -200000" />

+

+      <gd name="ly1" fmla="+- vc dy2 dy1" />

+

+      <gd name="ry4" fmla="+- vc dy1 dy2" />

+

+      <gd name="ly2" fmla="+- ly1 dy1 0" />

+

+      <gd name="ry3" fmla="+- b 0 ly2" />

+

+      <gd name="ly4" fmla="*/ ly2 2 1" />

+

+      <gd name="ry1" fmla="+- b 0 ly4" />

+

+      <gd name="ly3" fmla="+- ly4 0 ly1" />

+

+      <gd name="ry2" fmla="+- b 0 ly3" />

+

+

+      <gd name="hR" fmla="*/ a3 ss 400000" />

+

+      <gd name="x2" fmla="+- hc 0 wd32" />

+

+      <gd name="x3" fmla="+- hc wd32 0" />

+

+      <gd name="y1" fmla="+- ly1 hR 0" />

+

+      <gd name="y2" fmla="+- ry2 0 hR" />

+

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="x4" y="ry2" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="33333">

+        <pos x="x3" y="ry2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="ry3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x4" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="ly4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="ly2" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x4" y="ry1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="ly1" r="x4" b="ry4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="ly2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="ly1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="ly1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x4" y="ry2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="ry1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="ry3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="ry4" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="ry4" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x2" y="ly3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="ly3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="ly4" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darkenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="x3" y="y1" />

+        </moveTo>

+        <arcTo wR="wd32" hR="hR" stAng="0" swAng="cd4" />

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x3" y="ry2" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="ly2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="ly1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="ly1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x4" y="ry2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="ry1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="ry3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="ry4" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="ry4" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x2" y="ly3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="ly3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="ly4" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x3" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x3" y="ry2" />

+        </lnTo>

+        <moveTo>

+          <pt x="x2" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="ly3" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </leftRightRibbon>

+  <leftRightUpArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="q1" fmla="+- 100000 0 maxAdj1" />

+      <gd name="maxAdj3" fmla="*/ q1 1 2" />

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="x1" fmla="*/ ss a3 100000" />

+      <gd name="dx2" fmla="*/ ss a2 100000" />

+

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x5" fmla="+- hc dx2 0" />

+      <gd name="dx3" fmla="*/ ss a1 200000" />

+

+      <gd name="x3" fmla="+- hc 0 dx3" />

+      <gd name="x4" fmla="+- hc dx3 0" />

+      <gd name="x6" fmla="+- r 0 x1" />

+

+      <gd name="dy2" fmla="*/ ss a2 50000" />

+

+      <gd name="y2" fmla="+- b 0 dy2" />

+      <gd name="y4" fmla="+- b 0 dx2" />

+      <gd name="y3" fmla="+- y4 0 dx3" />

+      <gd name="y5" fmla="+- y4 dx3 0" />

+      <gd name="il" fmla="*/ dx3 x1 dx2" />

+      <gd name="ir" fmla="+- r 0 il" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">

+        <pos x="x3" y="x1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="x2" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="x1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y5" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y4" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="y3" r="ir" b="y5" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y4" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </leftRightUpArrow>

+  <leftUpArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="maxAdj3" fmla="+- 100000 0 maxAdj1" />

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="x1" fmla="*/ ss a3 100000" />

+

+      <gd name="dx2" fmla="*/ ss a2 50000" />

+

+      <gd name="x2" fmla="+- r 0 dx2" />

+      <gd name="y2" fmla="+- b 0 dx2" />

+      <gd name="dx4" fmla="*/ ss a2 100000" />

+

+      <gd name="x4" fmla="+- r 0 dx4" />

+      <gd name="y4" fmla="+- b 0 dx4" />

+      <gd name="dx3" fmla="*/ ss a1 200000" />

+

+      <gd name="x3" fmla="+- x4 0 dx3" />

+      <gd name="x5" fmla="+- x4 dx3 0" />

+      <gd name="y3" fmla="+- y4 0 dx3" />

+      <gd name="y5" fmla="+- y4 dx3 0" />

+      <gd name="il" fmla="*/ dx3 x1 dx4" />

+      <gd name="cx1" fmla="+/ x1 x5 2" />

+      <gd name="cy1" fmla="+/ x1 y5 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="x3" y="y3" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="x2" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="x3" y="x1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x4" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x2" y="x1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="cx1" y="y5" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x5" y="cy1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="x1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="y3" r="x4" b="y5" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y4" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </leftUpArrow>

+  <lightningBolt>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="x1" fmla="*/ w 5022 21600" />

+      <gd name="x3" fmla="*/ w 8472 21600" />

+      <gd name="x4" fmla="*/ w 8757 21600" />

+

+      <gd name="x5" fmla="*/ w 10012 21600" />

+      <gd name="x8" fmla="*/ w 12860 21600" />

+      <gd name="x9" fmla="*/ w 13917 21600" />

+

+      <gd name="x11" fmla="*/ w 16577 21600" />

+      <gd name="y1" fmla="*/ h 3890 21600" />

+      <gd name="y2" fmla="*/ h 6080 21600" />

+      <gd name="y4" fmla="*/ h 7437 21600" />

+

+      <gd name="y6" fmla="*/ h 9705 21600" />

+      <gd name="y7" fmla="*/ h 12007 21600" />

+      <gd name="y10" fmla="*/ h 14277 21600" />

+

+      <gd name="y11" fmla="*/ h 14915 21600" />

+

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x3" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="l" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y6" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x5" y="y11" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="r" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x11" y="y7" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x8" y="y2" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x4" t="y4" r="x9" b="y10" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path w="21600" h="21600">

+        <moveTo>

+          <pt x="8472" y="0" />

+        </moveTo>

+        <lnTo>

+          <pt x="12860" y="6080" />

+        </lnTo>

+        <lnTo>

+          <pt x="11050" y="6797" />

+        </lnTo>

+        <lnTo>

+          <pt x="16577" y="12007" />

+        </lnTo>

+        <lnTo>

+          <pt x="14767" y="12877" />

+        </lnTo>

+        <lnTo>

+          <pt x="21600" y="21600" />

+        </lnTo>

+        <lnTo>

+          <pt x="10012" y="14915" />

+        </lnTo>

+        <lnTo>

+          <pt x="12222" y="13987" />

+        </lnTo>

+        <lnTo>

+          <pt x="5022" y="9705" />

+        </lnTo>

+        <lnTo>

+          <pt x="7602" y="8382" />

+        </lnTo>

+        <lnTo>

+          <pt x="0" y="3890" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </lightningBolt>

+  <line>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="l" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="r" y="b" />

+      </cxn>

+    </cxnLst>

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+      </path>

+    </pathLst>

+  </line>

+  <lineInv>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="l" y="b" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="r" y="t" />

+      </cxn>

+    </cxnLst>

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+      </path>

+    </pathLst>

+  </lineInv>

+  <mathDivide>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 23520" />

+

+      <gd name="adj2" fmla="val 5880" />

+

+      <gd name="adj3" fmla="val 11760" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+      <gd name="a1" fmla="pin 1000 adj1 36745" />

+      <gd name="ma1" fmla="+- 0 0 a1" />

+

+      <gd name="ma3h" fmla="+/ 73490 ma1 4" />

+

+      <gd name="ma3w" fmla="*/ 36745 w h" />

+

+      <gd name="maxAdj3" fmla="min ma3h ma3w" />

+      <gd name="a3" fmla="pin 1000 adj3 maxAdj3" />

+      <gd name="m4a3" fmla="*/ -4 a3 1" />

+

+      <gd name="maxAdj2" fmla="+- 73490 m4a3 a1" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+

+      <gd name="dy1" fmla="*/ h a1 200000" />

+

+      <gd name="yg" fmla="*/ h a2 100000" />

+

+      <gd name="rad" fmla="*/ h a3 100000" />

+

+      <gd name="dx1" fmla="*/ w 73490 200000" />

+

+

+      <gd name="y3" fmla="+- vc 0 dy1" />

+

+      <gd name="y4" fmla="+- vc dy1 0" />

+

+      <gd name="a" fmla="+- yg rad 0" />

+      <gd name="y2" fmla="+- y3 0 a" />

+

+      <gd name="y1" fmla="+- y2 0 rad" />

+

+      <gd name="y5" fmla="+- b 0 y1" />

+

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+

+      <gd name="x3" fmla="+- hc dx1 0" />

+

+      <gd name="x2" fmla="+- hc 0 rad" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="1000" maxY="36745">

+        <pos x="l" y="y3" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="r" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="1000" maxX="maxAdj3">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x3" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y5" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="y3" r="x3" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="hc" y="y1" />

+        </moveTo>

+        <arcTo hR="rad" wR="rad" stAng="3cd4" swAng="21600000" />

+        <close />

+        <moveTo>

+          <pt x="hc" y="y5" />

+        </moveTo>

+        <arcTo hR="rad" wR="rad" stAng="cd4" swAng="21600000" />

+        <close />

+        <moveTo>

+          <pt x="x1" y="y3" />

+        </moveTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </mathDivide>

+  <mathEqual>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 23520" />

+

+      <gd name="adj2" fmla="val 11760" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 36745" />

+

+

+      <gd name="2a1" fmla="*/ a1 2 1" />

+

+      <gd name="mAdj2" fmla="+- 100000 0 2a1" />

+

+      <gd name="a2" fmla="pin 0 adj2 mAdj2" />

+      <gd name="dy1" fmla="*/ h a1 100000" />

+

+      <gd name="dy2" fmla="*/ h a2 200000" />

+

+      <gd name="dx1" fmla="*/ w 73490 200000" />

+

+

+      <gd name="y2" fmla="+- vc 0 dy2" />

+

+      <gd name="y3" fmla="+- vc dy2 0" />

+

+      <gd name="y1" fmla="+- y2 0 dy1" />

+

+      <gd name="y4" fmla="+- y3 dy1 0" />

+

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+

+      <gd name="x2" fmla="+- hc dx1 0" />

+

+

+

+      <gd name="yC1" fmla="+/ y1 y2 2" />

+

+      <gd name="yC2" fmla="+/ y3 y4 2" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="36745">

+        <pos x="l" y="y1" />

+      </ahXY>

+

+      <ahXY gdRefY="adj2" minY="0" maxY="mAdj2">

+        <pos x="r" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x2" y="yC1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="yC2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="yC1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="yC2" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="y1" r="x2" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x1" y="y3" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </mathEqual>

+  <mathMinus>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 23520" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="dy1" fmla="*/ h a1 200000" />

+

+      <gd name="dx1" fmla="*/ w 73490 200000" />

+

+

+      <gd name="y1" fmla="+- vc 0 dy1" />

+

+      <gd name="y2" fmla="+- vc dy1 0" />

+

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+

+      <gd name="x2" fmla="+- hc dx1 0" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="100000">

+        <pos x="l" y="y1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x2" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="y1" r="x2" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </mathMinus>

+  <mathMultiply>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 23520" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+

+

+

+

+      <gd name="a1" fmla="pin 0 adj1 51965" />

+

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+

+      <gd name="a" fmla="at2 w h" />

+

+      <gd name="sa" fmla="sin 1 a" />

+      <gd name="ca" fmla="cos 1 a" />

+      <gd name="ta" fmla="tan 1 a" />

+

+

+      <gd name="dl" fmla="mod w h 0" />

+

+      <gd name="rw" fmla="*/ dl 51965 100000" />

+

+

+

+      <gd name="lM" fmla="+- dl 0 rw" />

+      <gd name="xM" fmla="*/ ca lM 2" />

+      <gd name="yM" fmla="*/ sa lM 2" />

+

+

+      <gd name="dxAM" fmla="*/ sa th 2" />

+      <gd name="dyAM" fmla="*/ ca th 2" />

+      <gd name="xA" fmla="+- xM 0 dxAM" />

+      <gd name="yA" fmla="+- yM dyAM 0" />

+

+

+      <gd name="xB" fmla="+- xM dxAM 0" />

+      <gd name="yB" fmla="+- yM 0 dyAM" />

+

+

+      <gd name="xBC" fmla="+- hc 0 xB" />

+      <gd name="yBC" fmla="*/ xBC ta 1" />

+      <gd name="yC" fmla="+- yBC yB 0" />

+

+

+      <gd name="xD" fmla="+- r 0 xB" />

+      <gd name="xE" fmla="+- r 0 xA" />

+

+      <gd name="yFE" fmla="+- vc 0 yA" />

+      <gd name="xFE" fmla="*/ yFE 1 ta" />

+      <gd name="xF" fmla="+- xE 0 xFE" />

+      <gd name="xL" fmla="+- xA xFE 0" />

+      <gd name="yG" fmla="+- b 0 yA" />

+      <gd name="yH" fmla="+- b 0 yB" />

+      <gd name="yI" fmla="+- b 0 yC" />

+

+

+      <gd name="xC2" fmla="+- r 0 xM" />

+

+      <gd name="yC3" fmla="+- b 0 yM" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="51965">

+        <pos x="l" y="th" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd2">

+        <pos x="xM" y="yM" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="xC2" y="yM" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="xC2" y="yC3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="xM" y="yC3" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="xA" t="yB" r="xE" b="yH" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="xA" y="yA" />

+        </moveTo>

+        <lnTo>

+          <pt x="xB" y="yB" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="yC" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD" y="yB" />

+        </lnTo>

+        <lnTo>

+          <pt x="xE" y="yA" />

+        </lnTo>

+        <lnTo>

+          <pt x="xF" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="xE" y="yG" />

+        </lnTo>

+        <lnTo>

+          <pt x="xD" y="yH" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="yI" />

+        </lnTo>

+        <lnTo>

+          <pt x="xB" y="yH" />

+        </lnTo>

+        <lnTo>

+          <pt x="xA" y="yG" />

+        </lnTo>

+        <lnTo>

+          <pt x="xL" y="vc" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </mathMultiply>

+  <mathNotEqual>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 23520" />

+

+      <gd name="adj2" fmla="val 6600000" />

+

+      <gd name="adj3" fmla="val 11760" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 50000" />

+      <gd name="crAng" fmla="pin 4200000 adj2 6600000" />

+

+

+      <gd name="2a1" fmla="*/ a1 2 1" />

+      <gd name="maxAdj3" fmla="+- 100000 0 2a1" />

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+

+      <gd name="dy1" fmla="*/ h a1 100000" />

+

+      <gd name="dy2" fmla="*/ h a3 200000" />

+

+      <gd name="dx1" fmla="*/ w 73490 200000" />

+

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+

+      <gd name="x8" fmla="+- hc dx1 0" />

+

+

+

+      <gd name="y2" fmla="+- vc 0 dy2" />

+

+      <gd name="y3" fmla="+- vc dy2 0" />

+

+      <gd name="y1" fmla="+- y2 0 dy1" />

+

+      <gd name="y4" fmla="+- y3 dy1 0" />

+

+

+      <gd name="cadj2" fmla="+- crAng 0 cd4" />

+      <gd name="xadj2" fmla="tan hd2 cadj2" />

+

+

+

+      <gd name="len" fmla="mod xadj2 hd2 0" />

+

+

+

+      <gd name="bhw" fmla="*/ len dy1 hd2" />

+

+      <gd name="bhw2" fmla="*/ bhw 1 2" />

+      <gd name="x7" fmla="+- hc xadj2 bhw2" />

+

+      <gd name="dx67" fmla="*/ xadj2 y1 hd2" />

+      <gd name="x6" fmla="+- x7 0 dx67" />

+

+      <gd name="dx57" fmla="*/ xadj2 y2 hd2" />

+      <gd name="x5" fmla="+- x7 0 dx57" />

+

+      <gd name="dx47" fmla="*/ xadj2 y3 hd2" />

+      <gd name="x4" fmla="+- x7 0 dx47" />

+

+      <gd name="dx37" fmla="*/ xadj2 y4 hd2" />

+      <gd name="x3" fmla="+- x7 0 dx37" />

+

+      <gd name="dx27" fmla="*/ xadj2 2 1" />

+      <gd name="x2" fmla="+- x7 0 dx27" />

+

+

+      <gd name="rx7" fmla="+- x7 bhw 0" />

+

+      <gd name="rx6" fmla="+- x6 bhw 0" />

+

+      <gd name="rx5" fmla="+- x5 bhw 0" />

+

+      <gd name="rx4" fmla="+- x4 bhw 0" />

+

+      <gd name="rx3" fmla="+- x3 bhw 0" />

+

+      <gd name="rx2" fmla="+- x2 bhw 0" />

+

+

+

+      <gd name="dx7" fmla="*/ dy1 hd2 len" />

+      <gd name="rxt" fmla="+- x7 dx7 0" />

+

+      <gd name="lxt" fmla="+- rx7 0 dx7" />

+

+      <gd name="rx" fmla="?: cadj2 rxt rx7" />

+

+      <gd name="lx" fmla="?: cadj2 x7 lxt" />

+

+

+      <gd name="dy3" fmla="*/ dy1 xadj2 len" />

+      <gd name="dy4" fmla="+- 0 0 dy3" />

+      <gd name="ry" fmla="?: cadj2 dy3 t" />

+

+      <gd name="ly" fmla="?: cadj2 t dy4" />

+

+

+      <gd name="dlx" fmla="+- w 0 rx" />

+

+      <gd name="drx" fmla="+- w 0 lx" />

+

+

+      <gd name="dly" fmla="+- h 0 ry" />

+

+      <gd name="dry" fmla="+- h 0 ly" />

+

+

+

+      <gd name="xC1" fmla="+/ rx lx 2" />

+

+      <gd name="xC2" fmla="+/ drx dlx 2" />

+

+

+      <gd name="yC1" fmla="+/ ry ly 2" />

+

+      <gd name="yC2" fmla="+/ y1 y2 2" />

+

+      <gd name="yC3" fmla="+/ y3 y4 2" />

+

+      <gd name="yC4" fmla="+/ dry dly 2" />

+

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="50000">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahPolar gdRefAng="adj2" minAng="4200000" maxAng="6600000">

+        <pos x="lx" y="t" />

+      </ahPolar>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x8" y="yC2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x8" y="yC3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="xC2" y="yC4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="yC2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="yC3" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="xC1" y="yC1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="y1" r="x8" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x6" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="lx" y="ly" />

+        </lnTo>

+        <lnTo>

+          <pt x="rx" y="ry" />

+        </lnTo>

+        <lnTo>

+          <pt x="rx6" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="rx5" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="rx4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="rx3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="drx" y="dry" />

+        </lnTo>

+        <lnTo>

+          <pt x="dlx" y="dly" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </mathNotEqual>

+  <mathPlus>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 23520" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 73490" />

+      <gd name="dx1" fmla="*/ w 73490 200000" />

+

+      <gd name="dy1" fmla="*/ h 73490 200000" />

+

+      <gd name="dx2" fmla="*/ ss a1 200000" />

+

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+

+      <gd name="x2" fmla="+- hc 0 dx2" />

+

+      <gd name="x3" fmla="+- hc dx2 0" />

+

+      <gd name="x4" fmla="+- hc dx1 0" />

+

+

+      <gd name="y1" fmla="+- vc 0 dy1" />

+

+      <gd name="y2" fmla="+- vc 0 dx2" />

+

+      <gd name="y3" fmla="+- vc dx2 0" />

+

+      <gd name="y4" fmla="+- vc dy1 0" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="73490">

+        <pos x="l" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x4" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="y2" r="x4" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </mathPlus>

+  <moon>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 50000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 87500" />

+      <gd name="g0" fmla="*/ ss a 100000" />

+      <gd name="g0w" fmla="*/ g0 w ss" />

+      <gd name="g1" fmla="+- ss 0 g0" />

+      <gd name="g2" fmla="*/ g0 g0 g1" />

+      <gd name="g3" fmla="*/ ss ss g1" />

+      <gd name="g4" fmla="*/ g3 2 1" />

+      <gd name="g5" fmla="+- g4 0 g2" />

+      <gd name="g6" fmla="+- g5 0 g0" />

+      <gd name="g6w" fmla="*/ g6 w ss" />

+      <gd name="g7" fmla="*/ g5 1 2" />

+      <gd name="g8" fmla="+- g7 0 g0" />

+      <gd name="dy1" fmla="*/ g8 hd2 ss" />

+

+      <gd name="g10h" fmla="+- vc 0 dy1" />

+      <gd name="g11h" fmla="+- vc dy1 0" />

+      <gd name="g12" fmla="*/ g0 9598 32768" />

+      <gd name="g12w" fmla="*/ g12 w ss" />

+      <gd name="g13" fmla="+- ss 0 g12" />

+      <gd name="q1" fmla="*/ ss ss 1" />

+      <gd name="q2" fmla="*/ g13 g13 1" />

+      <gd name="q3" fmla="+- q1 0 q2" />

+      <gd name="q4" fmla="sqrt q3" />

+      <gd name="dy4" fmla="*/ q4 hd2 ss" />

+      <gd name="g15h" fmla="+- vc 0 dy4" />

+      <gd name="g16h" fmla="+- vc dy4 0" />

+      <gd name="g17w" fmla="+- g6w 0 g0w" />

+      <gd name="g18w" fmla="*/ g17w 1 2" />

+

+

+      <gd name="dx2p" fmla="+- g0w g18w w" />

+      <gd name="dx2" fmla="*/ dx2p -1 1" />

+

+      <gd name="dy2" fmla="*/ hd2 -1 1" />

+

+      <gd name="stAng1" fmla="at2 dx2 dy2" />

+      <gd name="enAngp1" fmla="at2 dx2 hd2" />

+      <gd name="enAng1" fmla="+- enAngp1 0 21600000" />

+      <gd name="swAng1" fmla="+- enAng1 0 stAng1" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="87500">

+        <pos x="g0w" y="vc" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="r" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="r" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="g0w" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="g12w" t="g15h" r="g0w" b="g16h" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="r" y="b" />

+        </moveTo>

+        <arcTo wR="w" hR="hd2" stAng="cd4" swAng="cd2" />

+        <arcTo wR="g18w" hR="dy1" stAng="stAng1" swAng="swAng1" />

+        <close />

+      </path>

+    </pathLst>

+

+  </moon>

+  <nonIsoscelesTrapezoid>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 50000 w ss" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj" />

+      <gd name="x1" fmla="*/ ss a1 200000" />

+

+      <gd name="x2" fmla="*/ ss a1 100000" />

+

+      <gd name="dx3" fmla="*/ ss a2 100000" />

+

+      <gd name="x3" fmla="+- r 0 dx3" />

+      <gd name="x4" fmla="+/ r x3 2" />

+      <gd name="il" fmla="*/ wd3 a1 maxAdj" />

+

+      <gd name="adjm" fmla="max a1 a2" />

+      <gd name="it" fmla="*/ hd3 adjm maxAdj" />

+

+      <gd name="irt" fmla="*/ wd3 a2 maxAdj" />

+      <gd name="ir" fmla="+- r 0 irt" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj">

+        <pos x="x2" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj">

+        <pos x="x3" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x4" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+

+    <rect l="il" t="it" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </nonIsoscelesTrapezoid>

+  <noSmoking>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 18750" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dr" fmla="*/ ss a 100000" />

+      <gd name="iwd2" fmla="+- wd2 0 dr" />

+      <gd name="ihd2" fmla="+- hd2 0 dr" />

+      <gd name="ang" fmla="at2 w h" />

+      <gd name="ct" fmla="cos ihd2 ang" />

+      <gd name="st" fmla="sin iwd2 ang" />

+      <gd name="m" fmla="mod ct st 0" />

+      <gd name="n" fmla="*/ iwd2 ihd2 m" />

+      <gd name="drd2" fmla="*/ dr 1 2" />

+      <gd name="dang" fmla="at2 n drd2" />

+      <gd name="2dang" fmla="*/ dang 2 1" />

+      <gd name="swAng" fmla="+- -10800000 2dang 0" />

+      <gd name="t3" fmla="at2 w h" />

+      <gd name="stAng1" fmla="+- t3 0 dang" />

+      <gd name="stAng2" fmla="+- stAng1 0 cd2" />

+      <gd name="ct1" fmla="cos ihd2 stAng1" />

+      <gd name="st1" fmla="sin iwd2 stAng1" />

+      <gd name="m1" fmla="mod ct1 st1 0" />

+      <gd name="n1" fmla="*/ iwd2 ihd2 m1" />

+      <gd name="dx1" fmla="cos n1 stAng1" />

+      <gd name="dy1" fmla="sin n1 stAng1" />

+      <gd name="x1" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc dy1 0" />

+      <gd name="x2" fmla="+- hc 0 dx1" />

+      <gd name="y2" fmla="+- vc 0 dy1" />

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefR="adj" minR="0" maxR="50000">

+        <pos x="dr" y="vc" />

+      </ahPolar>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="ir" y="it" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="3cd4" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <arcTo wR="iwd2" hR="ihd2" stAng="stAng1" swAng="swAng" />

+        <close />

+        <moveTo>

+          <pt x="x2" y="y2" />

+        </moveTo>

+        <arcTo wR="iwd2" hR="ihd2" stAng="stAng2" swAng="swAng" />

+        <close />

+      </path>

+    </pathLst>

+

+  </noSmoking>

+  <notchedRightArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 100000 w ss" />

+

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="dx2" fmla="*/ ss a2 100000" />

+      <gd name="x2" fmla="+- r 0 dx2" />

+      <gd name="dy1" fmla="*/ h a1 200000" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc dy1 0" />

+      <gd name="x1" fmla="*/ dy1 dx2 hd2" />

+      <gd name="x3" fmla="+- r 0 x1" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="100000">

+        <pos x="r" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x2" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x1" t="y1" r="x3" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="vc" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </notchedRightArrow>

+  <octagon>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 29289" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+      <gd name="x2" fmla="+- r 0 x1" />

+      <gd name="y2" fmla="+- b 0 x1" />

+      <gd name="il" fmla="*/ x1 1 2" />

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 il" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="x1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="x1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x2" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="x1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </octagon>

+  <parallelogram>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 25000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 100000 w ss" />

+      <gd name="a" fmla="pin 0 adj maxAdj" />

+      <gd name="x1" fmla="*/ ss a 200000" />

+      <gd name="x2" fmla="*/ ss a 100000" />

+      <gd name="x6" fmla="+- r 0 x1" />

+      <gd name="x5" fmla="+- r 0 x2" />

+      <gd name="x3" fmla="*/ x5 1 2" />

+      <gd name="x4" fmla="+- r 0 x3" />

+      <gd name="il" fmla="*/ wd2 a maxAdj" />

+      <gd name="q1" fmla="*/ 5 a maxAdj" />

+      <gd name="q2" fmla="+/ 1 q1 12" />

+      <gd name="il" fmla="*/ q2 w 1" />

+      <gd name="it" fmla="*/ q2 h 1" />

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 it" />

+      <gd name="q3" fmla="*/ h hc x2" />

+      <gd name="y1" fmla="pin 0 q3 h" />

+      <gd name="y2" fmla="+- b 0 y1" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="maxAdj">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="y2" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x4" y="t" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x6" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </parallelogram>

+  <pentagon>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="hf" fmla="val 105146" />

+      <gd name="vf" fmla="val 110557" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="swd2" fmla="*/ wd2 hf 100000" />

+      <gd name="shd2" fmla="*/ hd2 vf 100000" />

+      <gd name="svc" fmla="*/ vc  vf 100000" />

+      <gd name="dx1" fmla="cos swd2 1080000" />

+      <gd name="dx2" fmla="cos swd2 18360000" />

+      <gd name="dy1" fmla="sin shd2 1080000" />

+      <gd name="dy2" fmla="sin shd2 18360000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- svc 0 dy1" />

+      <gd name="y2" fmla="+- svc 0 dy2" />

+      <gd name="it" fmla="*/ y1 dx2 dx1" />

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="it" r="x3" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </pentagon>

+  <pie>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 0" />

+      <gd name="adj2" fmla="val 16200000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="stAng" fmla="pin 0 adj1 21599999" />

+      <gd name="enAng" fmla="pin 0 adj2 21599999" />

+      <gd name="sw1" fmla="+- enAng 0 stAng" />

+      <gd name="sw2" fmla="+- sw1 21600000 0" />

+      <gd name="swAng" fmla="?: sw1 sw1 sw2" />

+      <gd name="wt1" fmla="sin wd2 stAng" />

+      <gd name="ht1" fmla="cos hd2 stAng" />

+      <gd name="dx1" fmla="cat2 wd2 ht1 wt1" />

+      <gd name="dy1" fmla="sat2 hd2 ht1 wt1" />

+      <gd name="x1" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc dy1 0" />

+      <gd name="wt2" fmla="sin wd2 enAng" />

+      <gd name="ht2" fmla="cos hd2 enAng" />

+      <gd name="dx2" fmla="cat2 wd2 ht2 wt2" />

+      <gd name="dy2" fmla="sat2 hd2 ht2 wt2" />

+      <gd name="x2" fmla="+- hc dx2 0" />

+      <gd name="y2" fmla="+- vc dy2 0" />

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahPolar gdRefAng="adj1" minAng="0" maxAng="21599999">

+        <pos x="x1" y="y1" />

+      </ahPolar>

+      <ahPolar gdRefAng="adj2" minAng="0" maxAng="21599999">

+        <pos x="x2" y="y2" />

+      </ahPolar>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="ir" r="it" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="stAng" swAng="swAng" />

+        <lnTo>

+          <pt x="hc" y="vc" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </pie>

+  <pieWedge>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="g1" fmla="cos w 13500000" />

+      <gd name="g2" fmla="sin h 13500000" />

+      <gd name="x1" fmla="+- r g1 0" />

+      <gd name="y1" fmla="+- b g2 0" />

+    </gdLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+    </cxnLst>

+    <rect l="x1" t="y1" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <arcTo wR="w" hR="h" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </pieWedge>

+  <plaque>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 16667" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+      <gd name="x2" fmla="+- r 0 x1" />

+

+      <gd name="y2" fmla="+- b 0 x1" />

+      <gd name="il" fmla="*/ x1 70711 100000" />

+

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 il" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="x1" />

+        </moveTo>

+        <arcTo wR="x1" hR="x1" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="-5400000" />

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="-5400000" />

+        <close />

+      </path>

+    </pathLst>

+

+  </plaque>

+  <plaqueTabs>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="md" fmla="mod w h 0" />

+      <gd name="dx" fmla="*/ 1 md 20" />

+

+      <gd name="y1" fmla="+- 0 b dx" />

+

+      <gd name="x1" fmla="+- 0 r dx" />

+

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd2">

+        <pos x="l" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="dx" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="b" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="dx" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="t" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="dx" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="t" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="dx" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="b" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="dx" t="dx" r="x1" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="dx" y="t" />

+        </lnTo>

+        <arcTo wR="dx" hR="dx" stAng="0" swAng="cd4" />

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <arcTo wR="dx" hR="dx" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="r" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="dx" />

+        </lnTo>

+        <arcTo wR="dx" hR="dx" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="x1" y="b" />

+        </moveTo>

+        <arcTo wR="dx" hR="dx" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </plaqueTabs>

+  <plus>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 25000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+      <gd name="x2" fmla="+- r 0 x1" />

+      <gd name="y2" fmla="+- b 0 x1" />

+      <gd name="d" fmla="+- w 0 h" />

+      <gd name="il" fmla="?: d l x1" />

+      <gd name="ir" fmla="?: d r x2" />

+      <gd name="it" fmla="?: d x1 t" />

+      <gd name="ib" fmla="?: d y2 b" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="x1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </plus>

+  <quadArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 22500" />

+

+      <gd name="adj2" fmla="val 22500" />

+

+      <gd name="adj3" fmla="val 22500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="q1" fmla="+- 100000 0 maxAdj1" />

+      <gd name="maxAdj3" fmla="*/ q1 1 2" />

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="x1" fmla="*/ ss a3 100000" />

+      <gd name="dx2" fmla="*/ ss a2 100000" />

+

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x5" fmla="+- hc dx2 0" />

+      <gd name="dx3" fmla="*/ ss a1 200000" />

+

+      <gd name="x3" fmla="+- hc 0 dx3" />

+      <gd name="x4" fmla="+- hc dx3 0" />

+      <gd name="x6" fmla="+- r 0 x1" />

+

+      <gd name="y2" fmla="+- vc 0 dx2" />

+      <gd name="y5" fmla="+- vc dx2 0" />

+      <gd name="y3" fmla="+- vc 0 dx3" />

+      <gd name="y4" fmla="+- vc dx3 0" />

+      <gd name="y6" fmla="+- b 0 x1" />

+      <gd name="il" fmla="*/ dx3 x1 dx2" />

+      <gd name="ir" fmla="+- r 0 il" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">

+        <pos x="x3" y="x1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="x2" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="x1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="y3" r="ir" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="x1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y5" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </quadArrow>

+  <quadArrowCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 18515" />

+

+      <gd name="adj2" fmla="val 18515" />

+

+      <gd name="adj3" fmla="val 18515" />

+

+      <gd name="adj4" fmla="val 48123" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="maxAdj3" fmla="+- 50000 0 a2" />

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="q2" fmla="*/ a3 2 1" />

+

+      <gd name="maxAdj4" fmla="+- 100000 0 q2" />

+

+      <gd name="a4" fmla="pin a1 adj4 maxAdj4" />

+      <gd name="dx2" fmla="*/ ss a2 100000" />

+

+      <gd name="dx3" fmla="*/ ss a1 200000" />

+

+      <gd name="ah" fmla="*/ ss a3 100000" />

+

+      <gd name="dx1" fmla="*/ w a4 200000" />

+

+      <gd name="dy1" fmla="*/ h a4 200000" />

+

+

+      <gd name="x8" fmla="+- r 0 ah" />

+      <gd name="x2" fmla="+- hc 0 dx1" />

+      <gd name="x7" fmla="+- hc dx1 0" />

+      <gd name="x3" fmla="+- hc 0 dx2" />

+      <gd name="x6" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc 0 dx3" />

+      <gd name="x5" fmla="+- hc dx3 0" />

+

+      <gd name="y8" fmla="+- b 0 ah" />

+      <gd name="y2" fmla="+- vc 0 dy1" />

+      <gd name="y7" fmla="+- vc dy1 0" />

+      <gd name="y3" fmla="+- vc 0 dx2" />

+      <gd name="y6" fmla="+- vc dx2 0" />

+      <gd name="y4" fmla="+- vc 0 dx3" />

+      <gd name="y5" fmla="+- vc dx3 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">

+        <pos x="x4" y="ah" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="x3" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="ah" />

+      </ahXY>

+      <ahXY gdRefY="adj4" minY="a1" maxY="maxAdj4">

+        <pos x="l" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="y2" r="x7" b="y7" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="ah" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="ah" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="ah" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="ah" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="ah" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="ah" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="ah" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="ah" y="y6" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </quadArrowCallout>

+  <rect>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </rect>

+  <ribbon>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 16667" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 33333" />

+      <gd name="a2" fmla="pin 25000 adj2 75000" />

+

+

+      <gd name="x10" fmla="+- r 0 wd8" />

+

+      <gd name="dx2" fmla="*/ w a2 200000" />

+

+      <gd name="x2" fmla="+- hc 0 dx2" />

+

+      <gd name="x9" fmla="+- hc dx2 0" />

+

+      <gd name="x3" fmla="+- x2 wd32 0" />

+      <gd name="x8" fmla="+- x9 0 wd32" />

+      <gd name="x5" fmla="+- x2 wd8 0" />

+

+      <gd name="x6" fmla="+- x9 0 wd8" />

+

+      <gd name="x4" fmla="+- x5 0 wd32" />

+      <gd name="x7" fmla="+- x6 wd32 0" />

+      <gd name="y1" fmla="*/ h a1 200000" />

+

+      <gd name="y2" fmla="*/ h a1 100000" />

+

+      <gd name="y4" fmla="+- b 0 y2" />

+

+      <gd name="y3" fmla="*/ y4 1 2" />

+

+      <gd name="hR" fmla="*/ h a1 400000" />

+

+      <gd name="y5" fmla="+- b 0 hR" />

+      <gd name="y6" fmla="+- y2 0 hR" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="33333">

+        <pos x="hc" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="25000" maxX="75000">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd8" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x10" y="y3" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="y2" r="x9" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="t" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x8" y="y2" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x7" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y5" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="x3" y="b" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="wd8" y="y3" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darkenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="x5" y="hR" />

+        </moveTo>

+        <arcTo wR="wd32" hR="hR" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x5" y="y2" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x6" y="hR" />

+        </moveTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd2" swAng="-5400000" />

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="t" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x8" y="y2" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x7" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y5" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="x3" y="b" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="wd8" y="y3" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x5" y="hR" />

+        </moveTo>

+        <lnTo>

+          <pt x="x5" y="y2" />

+        </lnTo>

+        <moveTo>

+          <pt x="x6" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x6" y="hR" />

+        </lnTo>

+        <moveTo>

+          <pt x="x2" y="y4" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y6" />

+        </lnTo>

+        <moveTo>

+          <pt x="x9" y="y6" />

+        </moveTo>

+        <lnTo>

+          <pt x="x9" y="y4" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </ribbon>

+  <ribbon2>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 16667" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 33333" />

+      <gd name="a2" fmla="pin 25000 adj2 75000" />

+

+

+      <gd name="x10" fmla="+- r 0 wd8" />

+

+      <gd name="dx2" fmla="*/ w a2 200000" />

+

+      <gd name="x2" fmla="+- hc 0 dx2" />

+

+      <gd name="x9" fmla="+- hc dx2 0" />

+

+      <gd name="x3" fmla="+- x2 wd32 0" />

+      <gd name="x8" fmla="+- x9 0 wd32" />

+      <gd name="x5" fmla="+- x2 wd8 0" />

+

+      <gd name="x6" fmla="+- x9 0 wd8" />

+

+      <gd name="x4" fmla="+- x5 0 wd32" />

+      <gd name="x7" fmla="+- x6 wd32 0" />

+      <gd name="dy1" fmla="*/ h a1 200000" />

+

+      <gd name="y1" fmla="+- b 0 dy1" />

+      <gd name="dy2" fmla="*/ h a1 100000" />

+

+      <gd name="y2" fmla="+- b 0 dy2" />

+      <gd name="y4" fmla="+- t dy2 0" />

+

+      <gd name="y3" fmla="+/ y4 b 2" />

+

+      <gd name="hR" fmla="*/ h a1 400000" />

+

+

+      <gd name="y6" fmla="+- b 0 hR" />

+      <gd name="y7" fmla="+- y1 0 hR" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="33333">

+        <pos x="hc" y="y2" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="25000" maxX="75000">

+        <pos x="x2" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="wd8" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x10" y="y3" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x2" t="t" r="x9" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x4" y="b" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x8" y="y2" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x7" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="hR" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="0" swAng="-5400000" />

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="wd8" y="y3" />

+        </lnTo>

+        <close />

+      </path>

+      <path stroke="false" fill="darkenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="x5" y="y6" />

+        </moveTo>

+        <arcTo wR="wd32" hR="hR" stAng="0" swAng="-5400000" />

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x5" y="y2" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x6" y="y6" />

+        </moveTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="wd8" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="hR" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x8" y="t" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x9" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="b" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <arcTo wR="wd32" hR="hR" stAng="3cd4" swAng="cd2" />

+        <close />

+        <moveTo>

+          <pt x="x5" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x5" y="y6" />

+        </lnTo>

+        <moveTo>

+          <pt x="x6" y="y6" />

+        </moveTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <moveTo>

+          <pt x="x2" y="y7" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <moveTo>

+          <pt x="x9" y="y4" />

+        </moveTo>

+        <lnTo>

+          <pt x="x9" y="y7" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </ribbon2>

+  <rightArrow>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 100000 w ss" />

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="dx1" fmla="*/ ss a2 100000" />

+      <gd name="x1" fmla="+- r 0 dx1" />

+      <gd name="dy1" fmla="*/ h a1 200000" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc dy1 0" />

+      <gd name="dx2" fmla="*/ y1 dx1 hd2" />

+      <gd name="x2" fmla="+- x1 dx2 0" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="100000">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x1" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="y1" r="x2" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </rightArrow>

+  <rightArrowCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+      <gd name="adj4" fmla="val 64977" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 h ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="maxAdj3" fmla="*/ 100000 w ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="q2" fmla="*/ a3 ss w" />

+

+      <gd name="maxAdj4" fmla="+- 100000 0 q2" />

+

+      <gd name="a4" fmla="pin 0 adj4 maxAdj4" />

+      <gd name="dy1" fmla="*/ ss a2 100000" />

+

+      <gd name="dy2" fmla="*/ ss a1 200000" />

+

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc 0 dy2" />

+      <gd name="y3" fmla="+- vc dy2 0" />

+      <gd name="y4" fmla="+- vc dy1 0" />

+      <gd name="dx3" fmla="*/ ss a3 100000" />

+

+      <gd name="x3" fmla="+- r 0 dx3" />

+      <gd name="x2" fmla="*/ w a4 100000" />

+

+      <gd name="x1" fmla="*/ x2 1 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="x3" y="y2" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="r" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj3" minX="0" maxX="maxAdj3">

+        <pos x="x3" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">

+        <pos x="x2" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x1" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="x2" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </rightArrowCallout>

+  <rightBrace>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 8333" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a2" fmla="pin 0 adj2 100000" />

+      <gd name="q1" fmla="+- 100000 0 a2" />

+      <gd name="q2" fmla="min q1 a2" />

+      <gd name="q3" fmla="*/ q2 1 2" />

+      <gd name="maxAdj1" fmla="*/ q3 h ss" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="y1" fmla="*/ ss a1 100000" />

+      <gd name="y3" fmla="*/ h a2 100000" />

+      <gd name="y2" fmla="+- y3 0 y1" />

+      <gd name="y4" fmla="+- b 0 y1" />

+      <gd name="dx1" fmla="cos wd2 2700000" />

+      <gd name="dy1" fmla="sin y1 2700000" />

+      <gd name="ir" fmla="+- l dx1 0" />

+      <gd name="it" fmla="+- y1 0 dy1" />

+      <gd name="ib" fmla="+- b dy1 y1" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="maxAdj1">

+        <pos x="hc" y="y1" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="100000">

+        <pos x="r" y="y3" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="l" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="r" y="y3" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="l" y="b" />

+      </cxn>

+    </cxnLst>

+    <rect l="l" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <arcTo wR="wd2" hR="y1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="hc" y="y2" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="-5400000" />

+        <arcTo wR="wd2" hR="y1" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="hc" y="y4" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd4" />

+        <close />

+      </path>

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <arcTo wR="wd2" hR="y1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="hc" y="y2" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="cd2" swAng="-5400000" />

+        <arcTo wR="wd2" hR="y1" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="hc" y="y4" />

+        </lnTo>

+        <arcTo wR="wd2" hR="y1" stAng="0" swAng="cd4" />

+      </path>

+    </pathLst>

+  </rightBrace>

+  <rightBracket>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 8333" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 50000 h ss" />

+

+      <gd name="a" fmla="pin 0 adj maxAdj" />

+      <gd name="y1" fmla="*/ ss a 100000" />

+

+      <gd name="y2" fmla="+- b 0 y1" />

+

+      <gd name="dx1" fmla="cos w 2700000" />

+      <gd name="dy1" fmla="sin y1 2700000" />

+      <gd name="ir" fmla="+- l dx1 0" />

+      <gd name="it" fmla="+- y1 0 dy1" />

+      <gd name="ib" fmla="+- b dy1 y1" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="maxAdj">

+        <pos x="r" y="y1" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="l" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="l" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <arcTo wR="w" hR="y1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <arcTo wR="w" hR="y1" stAng="0" swAng="cd4" />

+        <close />

+      </path>

+      <path fill="none">

+

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <arcTo wR="w" hR="y1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <arcTo wR="w" hR="y1" stAng="0" swAng="cd4" />

+      </path>

+    </pathLst>

+

+  </rightBracket>

+  <round1Rect>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 16667" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dx1" fmla="*/ ss a 100000" />

+      <gd name="x1" fmla="+- r 0 dx1" />

+      <gd name="idx" fmla="*/ dx1 29289 100000" />

+      <gd name="ir" fmla="+- r 0 idx" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <arcTo wR="dx1" hR="dx1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </round1Rect>

+  <round2DiagRect>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 16667" />

+      <gd name="adj2" fmla="val 0" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 50000" />

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="x1" fmla="*/ ss a1 100000" />

+      <gd name="y1" fmla="+- b 0 x1" />

+      <gd name="a" fmla="*/ ss a2 100000" />

+      <gd name="x2" fmla="+- r 0 a" />

+      <gd name="y2" fmla="+- b 0 a" />

+      <gd name="dx1" fmla="*/ x1 29289 100000" />

+      <gd name="dx2" fmla="*/ a 29289 100000" />

+      <gd name="d" fmla="+- dx1 0 dx2" />

+      <gd name="dx" fmla="?: d dx1 dx2" />

+      <gd name="ir" fmla="+- r 0 dx" />

+      <gd name="ib" fmla="+- b 0 dx" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="dx" t="dx" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <arcTo wR="a" hR="a" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y1" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="a" y="b" />

+        </lnTo>

+        <arcTo wR="a" hR="a" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="l" y="x1" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+

+  </round2DiagRect>

+  <round2SameRect>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 16667" />

+      <gd name="adj2" fmla="val 0" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 50000" />

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+

+      <gd name="tx1" fmla="*/ ss a1 100000" />

+      <gd name="tx2" fmla="+- r 0 tx1" />

+

+      <gd name="bx1" fmla="*/ ss a2 100000" />

+      <gd name="bx2" fmla="+- r 0 bx1" />

+      <gd name="by1" fmla="+- b 0 bx1" />

+      <gd name="d" fmla="+- tx1 0 bx1" />

+      <gd name="tdx" fmla="*/ tx1 29289 100000" />

+      <gd name="bdx" fmla="*/ bx1 29289 100000" />

+      <gd name="il" fmla="?: d tdx bdx" />

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 bdx" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="50000">

+        <pos x="tx2" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="bx1" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="tdx" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="tx1" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="tx2" y="t" />

+        </lnTo>

+        <arcTo wR="tx1" hR="tx1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="by1" />

+        </lnTo>

+        <arcTo wR="bx1" hR="bx1" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="bx1" y="b" />

+        </lnTo>

+        <arcTo wR="bx1" hR="bx1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="l" y="tx1" />

+        </lnTo>

+        <arcTo wR="tx1" hR="tx1" stAng="cd2" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+

+  </round2SameRect>

+  <roundRect>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 16667" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="x1" fmla="*/ ss a 100000" />

+      <gd name="x2" fmla="+- r 0 x1" />

+      <gd name="y2" fmla="+- b 0 x1" />

+      <gd name="il" fmla="*/ x1 29289 100000" />

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 il" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="x1" />

+        </moveTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+  </roundRect>

+  <rtTriangle>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="it" fmla="*/ h 7 12" />

+      <gd name="ir" fmla="*/ w 7 12" />

+      <gd name="ib" fmla="*/ h 11 12" />

+    </gdLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="l" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="l" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="r" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="hc" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="wd12" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="l" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </rtTriangle>

+  <smileyFace>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 4653" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin -4653 adj 4653" />

+      <gd name="x1" fmla="*/ w 4969 21699" />

+

+      <gd name="x2" fmla="*/ w 6215 21600" />

+

+      <gd name="x3" fmla="*/ w 13135 21600" />

+

+      <gd name="x4" fmla="*/ w 16640 21600" />

+

+      <gd name="y1" fmla="*/ h 7570 21600" />

+

+      <gd name="y3" fmla="*/ h 16515 21600" />

+

+      <gd name="dy2" fmla="*/ h a 100000" />

+

+      <gd name="y2" fmla="+- y3 0 dy2" />

+

+      <gd name="y4" fmla="+- y3 dy2 0" />

+

+      <gd name="dy3" fmla="*/ h a 50000" />

+

+      <gd name="y5" fmla="+- y4 dy3 0" />

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+      <gd name="wR" fmla="*/ w 1125 21600" />

+      <gd name="hR" fmla="*/ h 1125 21600" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="-4653" maxY="4653">

+        <pos x="hc" y="y4" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="ir" y="it" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="21600000" />

+        <close />

+      </path>

+      <path fill="darkenLess" extrusionOk="false">

+

+        <moveTo>

+          <pt x="x2" y="y1" />

+        </moveTo>

+        <arcTo wR="wR" hR="hR" stAng="cd2" swAng="21600000" />

+        <moveTo>

+          <pt x="x3" y="y1" />

+        </moveTo>

+        <arcTo wR="wR" hR="hR" stAng="cd2" swAng="21600000" />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="x1" y="y2" />

+        </moveTo>

+        <quadBezTo>

+          <pt x="hc" y="y5" />

+          <pt x="x4" y="y2" />

+        </quadBezTo>

+      </path>

+      <path fill="none">

+

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="21600000" />

+        <close />

+      </path>

+    </pathLst>

+

+  </smileyFace>

+  <snip1Rect>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 16667" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dx1" fmla="*/ ss a 100000" />

+      <gd name="x1" fmla="+- r 0 dx1" />

+      <gd name="it" fmla="*/ dx1 1 2" />

+      <gd name="ir" fmla="+/ x1 r 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="it" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="dx1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </snip1Rect>

+  <snip2DiagRect>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 0" />

+      <gd name="adj2" fmla="val 16667" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 50000" />

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="lx1" fmla="*/ ss a1 100000" />

+      <gd name="lx2" fmla="+- r 0 lx1" />

+      <gd name="ly1" fmla="+- b 0 lx1" />

+      <gd name="rx1" fmla="*/ ss a2 100000" />

+      <gd name="rx2" fmla="+- r 0 rx1" />

+      <gd name="ry1" fmla="+- b 0 rx1" />

+      <gd name="d" fmla="+- lx1 0 rx1" />

+      <gd name="dx" fmla="?: d lx1 rx1" />

+      <gd name="il" fmla="*/ dx 1 2" />

+

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 il" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="50000">

+        <pos x="lx1" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="rx2" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="lx1" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="rx2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="rx1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="ly1" />

+        </lnTo>

+        <lnTo>

+          <pt x="lx2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="rx1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="ry1" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="lx1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </snip2DiagRect>

+  <snip2SameRect>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 16667" />

+      <gd name="adj2" fmla="val 0" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 50000" />

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="tx1" fmla="*/ ss a1 100000" />

+      <gd name="tx2" fmla="+- r 0 tx1" />

+      <gd name="bx1" fmla="*/ ss a2 100000" />

+      <gd name="bx2" fmla="+- r 0 bx1" />

+      <gd name="by1" fmla="+- b 0 bx1" />

+      <gd name="d" fmla="+- tx1 0 bx1" />

+      <gd name="dx" fmla="?: d tx1 bx1" />

+      <gd name="il" fmla="*/ dx 1 2" />

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="it" fmla="*/ tx1 1 2" />

+      <gd name="ib" fmla="+/ by1 b 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="50000">

+        <pos x="tx2" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="bx1" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="tx1" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="tx2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="tx1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="by1" />

+        </lnTo>

+        <lnTo>

+          <pt x="bx2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="bx1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="by1" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="tx1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </snip2SameRect>

+  <snipRoundRect>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 16667" />

+      <gd name="adj2" fmla="val 16667" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 50000" />

+      <gd name="a2" fmla="pin 0 adj2 50000" />

+      <gd name="x1" fmla="*/ ss a1 100000" />

+      <gd name="dx2" fmla="*/ ss a2 100000" />

+      <gd name="x2" fmla="+- r 0 dx2" />

+      <gd name="il" fmla="*/ x1 29289 100000" />

+

+      <gd name="ir" fmla="+/ x2 r 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="50000">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="50000">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="il" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="dx2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="x1" />

+        </lnTo>

+        <arcTo wR="x1" hR="x1" stAng="cd2" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+

+  </snipRoundRect>

+  <squareTabs>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="md" fmla="mod w h 0" />

+      <gd name="dx" fmla="*/ 1 md 20" />

+

+      <gd name="y1" fmla="+- 0 b dx" />

+

+      <gd name="x1" fmla="+- 0 r dx" />

+

+    </gdLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd2">

+        <pos x="l" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="dx" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="dx" y="dx" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="dx" y="x1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="dx" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="t" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="dx" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="t" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="dx" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x1" y="dx" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x1" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="dx" t="dx" r="x1" b="y1" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="dx" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="dx" y="dx" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="dx" />

+        </lnTo>

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="dx" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="dx" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="x1" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="dx" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="dx" />

+        </lnTo>

+        <close />

+      </path>

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </squareTabs>

+  <star10>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 42533" />

+      <gd name="hf" fmla="val 105146" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="swd2" fmla="*/ wd2 hf 100000" />

+      <gd name="dx1" fmla="*/ swd2 95106 100000" />

+      <gd name="dx2" fmla="*/ swd2 58779 100000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="dy1" fmla="*/ hd2 80902 100000" />

+      <gd name="dy2" fmla="*/ hd2 30902 100000" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc 0 dy2" />

+      <gd name="y3" fmla="+- vc dy2 0" />

+      <gd name="y4" fmla="+- vc dy1 0" />

+      <gd name="iwd2" fmla="*/ swd2 a 50000" />

+      <gd name="ihd2" fmla="*/ hd2 a 50000" />

+      <gd name="sdx1" fmla="*/ iwd2 80902 100000" />

+      <gd name="sdx2" fmla="*/ iwd2 30902 100000" />

+      <gd name="sdy1" fmla="*/ ihd2 95106 100000" />

+      <gd name="sdy2" fmla="*/ ihd2 58779 100000" />

+      <gd name="sx1" fmla="+- hc 0 iwd2" />

+      <gd name="sx2" fmla="+- hc 0 sdx1" />

+      <gd name="sx3" fmla="+- hc 0 sdx2" />

+      <gd name="sx4" fmla="+- hc sdx2 0" />

+      <gd name="sx5" fmla="+- hc sdx1 0" />

+      <gd name="sx6" fmla="+- hc iwd2 0" />

+      <gd name="sy1" fmla="+- vc 0 sdy1" />

+      <gd name="sy2" fmla="+- vc 0 sdy2" />

+      <gd name="sy3" fmla="+- vc sdy2 0" />

+      <gd name="sy4" fmla="+- vc sdy1 0" />

+      <gd name="yAdj" fmla="+- vc 0 ihd2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x4" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="y4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y3" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y2" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x2" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x3" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="sx2" t="sy2" r="sx5" b="sy3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx2" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="vc" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </star10>

+  <star12>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 37500" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dx1" fmla="cos wd2 1800000" />

+

+      <gd name="dy1" fmla="sin hd2 3600000" />

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x3" fmla="*/ w 3 4" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y3" fmla="*/ h 3 4" />

+      <gd name="y4" fmla="+- vc dy1 0" />

+      <gd name="iwd2" fmla="*/ wd2 a 50000" />

+      <gd name="ihd2" fmla="*/ hd2 a 50000" />

+      <gd name="sdx1" fmla="cos iwd2 900000" />

+      <gd name="sdx2" fmla="cos iwd2 2700000" />

+      <gd name="sdx3" fmla="cos iwd2 4500000" />

+      <gd name="sdy1" fmla="sin ihd2 4500000" />

+      <gd name="sdy2" fmla="sin ihd2 2700000" />

+      <gd name="sdy3" fmla="sin ihd2 900000" />

+      <gd name="sx1" fmla="+- hc 0 sdx1" />

+      <gd name="sx2" fmla="+- hc 0 sdx2" />

+      <gd name="sx3" fmla="+- hc 0 sdx3" />

+      <gd name="sx4" fmla="+- hc sdx3 0" />

+      <gd name="sx5" fmla="+- hc sdx2 0" />

+      <gd name="sx6" fmla="+- hc sdx1 0" />

+      <gd name="sy1" fmla="+- vc 0 sdy1" />

+      <gd name="sy2" fmla="+- vc 0 sdy2" />

+      <gd name="sy3" fmla="+- vc 0 sdy3" />

+      <gd name="sy4" fmla="+- vc sdy3 0" />

+      <gd name="sy5" fmla="+- vc sdy2 0" />

+      <gd name="sy6" fmla="+- vc sdy1 0" />

+      <gd name="yAdj" fmla="+- vc 0 ihd2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x4" y="hd4" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="wd4" y="y4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y3" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="hd4" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="wd4" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x3" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="sx2" t="sy2" r="sx5" b="sy5" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx1" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="hd4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="wd4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="hd4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy6" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy6" />

+        </lnTo>

+        <lnTo>

+          <pt x="wd4" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="sy4" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </star12>

+  <star16>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 37500" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dx1" fmla="*/ wd2 92388 100000" />

+      <gd name="dx2" fmla="*/ wd2 70711 100000" />

+      <gd name="dx3" fmla="*/ wd2 38268 100000" />

+      <gd name="dy1" fmla="*/ hd2 92388 100000" />

+      <gd name="dy2" fmla="*/ hd2 70711 100000" />

+      <gd name="dy3" fmla="*/ hd2 38268 100000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc 0 dx3" />

+      <gd name="x4" fmla="+- hc dx3 0" />

+      <gd name="x5" fmla="+- hc dx2 0" />

+      <gd name="x6" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc 0 dy2" />

+      <gd name="y3" fmla="+- vc 0 dy3" />

+      <gd name="y4" fmla="+- vc dy3 0" />

+      <gd name="y5" fmla="+- vc dy2 0" />

+      <gd name="y6" fmla="+- vc dy1 0" />

+      <gd name="iwd2" fmla="*/ wd2 a 50000" />

+      <gd name="ihd2" fmla="*/ hd2 a 50000" />

+      <gd name="sdx1" fmla="*/ iwd2 98079 100000" />

+      <gd name="sdx2" fmla="*/ iwd2 83147 100000" />

+      <gd name="sdx3" fmla="*/ iwd2 55557 100000" />

+      <gd name="sdx4" fmla="*/ iwd2 19509 100000" />

+      <gd name="sdy1" fmla="*/ ihd2 98079 100000" />

+      <gd name="sdy2" fmla="*/ ihd2 83147 100000" />

+      <gd name="sdy3" fmla="*/ ihd2 55557 100000" />

+      <gd name="sdy4" fmla="*/ ihd2 19509 100000" />

+      <gd name="sx1" fmla="+- hc 0 sdx1" />

+      <gd name="sx2" fmla="+- hc 0 sdx2" />

+      <gd name="sx3" fmla="+- hc 0 sdx3" />

+      <gd name="sx4" fmla="+- hc 0 sdx4" />

+      <gd name="sx5" fmla="+- hc sdx4 0" />

+      <gd name="sx6" fmla="+- hc sdx3 0" />

+      <gd name="sx7" fmla="+- hc sdx2 0" />

+      <gd name="sx8" fmla="+- hc sdx1 0" />

+      <gd name="sy1" fmla="+- vc 0 sdy1" />

+      <gd name="sy2" fmla="+- vc 0 sdy2" />

+      <gd name="sy3" fmla="+- vc 0 sdy3" />

+      <gd name="sy4" fmla="+- vc 0 sdy4" />

+      <gd name="sy5" fmla="+- vc sdy4 0" />

+      <gd name="sy6" fmla="+- vc sdy3 0" />

+      <gd name="sy7" fmla="+- vc sdy2 0" />

+      <gd name="sy8" fmla="+- vc sdy1 0" />

+      <gd name="idx" fmla="cos iwd2 2700000" />

+      <gd name="idy" fmla="sin ihd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="ib" fmla="+- vc idy 0" />

+      <gd name="yAdj" fmla="+- vc 0 ihd2" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x5" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x6" y="y3" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x6" y="y4" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x5" y="y5" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x4" y="y6" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y6" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x2" y="y5" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y4" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y3" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x2" y="y2" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x3" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x4" y="y1" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx1" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx7" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx8" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx8" y="sy5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx7" y="sy6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy8" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="sy5" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </star16>

+  <star24>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 37500" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dx1" fmla="cos wd2 900000" />

+      <gd name="dx2" fmla="cos wd2 1800000" />

+      <gd name="dx3" fmla="cos wd2 2700000" />

+      <gd name="dx4" fmla="val wd4" />

+      <gd name="dx5" fmla="cos wd2 4500000" />

+      <gd name="dy1" fmla="sin hd2 4500000" />

+      <gd name="dy2" fmla="sin hd2 3600000" />

+      <gd name="dy3" fmla="sin hd2 2700000" />

+      <gd name="dy4" fmla="val hd4" />

+      <gd name="dy5" fmla="sin hd2 900000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc 0 dx3" />

+      <gd name="x4" fmla="+- hc 0 dx4" />

+      <gd name="x5" fmla="+- hc 0 dx5" />

+      <gd name="x6" fmla="+- hc dx5 0" />

+      <gd name="x7" fmla="+- hc dx4 0" />

+      <gd name="x8" fmla="+- hc dx3 0" />

+      <gd name="x9" fmla="+- hc dx2 0" />

+      <gd name="x10" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc 0 dy2" />

+      <gd name="y3" fmla="+- vc 0 dy3" />

+      <gd name="y4" fmla="+- vc 0 dy4" />

+      <gd name="y5" fmla="+- vc 0 dy5" />

+      <gd name="y6" fmla="+- vc dy5 0" />

+      <gd name="y7" fmla="+- vc dy4 0" />

+      <gd name="y8" fmla="+- vc dy3 0" />

+      <gd name="y9" fmla="+- vc dy2 0" />

+      <gd name="y10" fmla="+- vc dy1 0" />

+      <gd name="iwd2" fmla="*/ wd2 a 50000" />

+      <gd name="ihd2" fmla="*/ hd2 a 50000" />

+      <gd name="sdx1" fmla="*/ iwd2 99144 100000" />

+      <gd name="sdx2" fmla="*/ iwd2 92388 100000" />

+      <gd name="sdx3" fmla="*/ iwd2 79335 100000" />

+      <gd name="sdx4" fmla="*/ iwd2 60876 100000" />

+      <gd name="sdx5" fmla="*/ iwd2 38268 100000" />

+      <gd name="sdx6" fmla="*/ iwd2 13053 100000" />

+      <gd name="sdy1" fmla="*/ ihd2 99144 100000" />

+      <gd name="sdy2" fmla="*/ ihd2 92388 100000" />

+      <gd name="sdy3" fmla="*/ ihd2 79335 100000" />

+      <gd name="sdy4" fmla="*/ ihd2 60876 100000" />

+      <gd name="sdy5" fmla="*/ ihd2 38268 100000" />

+      <gd name="sdy6" fmla="*/ ihd2 13053 100000" />

+      <gd name="sx1" fmla="+- hc 0 sdx1" />

+      <gd name="sx2" fmla="+- hc 0 sdx2" />

+      <gd name="sx3" fmla="+- hc 0 sdx3" />

+      <gd name="sx4" fmla="+- hc 0 sdx4" />

+      <gd name="sx5" fmla="+- hc 0 sdx5" />

+      <gd name="sx6" fmla="+- hc 0 sdx6" />

+      <gd name="sx7" fmla="+- hc sdx6 0" />

+      <gd name="sx8" fmla="+- hc sdx5 0" />

+      <gd name="sx9" fmla="+- hc sdx4 0" />

+      <gd name="sx10" fmla="+- hc sdx3 0" />

+      <gd name="sx11" fmla="+- hc sdx2 0" />

+      <gd name="sx12" fmla="+- hc sdx1 0" />

+      <gd name="sy1" fmla="+- vc 0 sdy1" />

+      <gd name="sy2" fmla="+- vc 0 sdy2" />

+      <gd name="sy3" fmla="+- vc 0 sdy3" />

+      <gd name="sy4" fmla="+- vc 0 sdy4" />

+      <gd name="sy5" fmla="+- vc 0 sdy5" />

+      <gd name="sy6" fmla="+- vc 0 sdy6" />

+      <gd name="sy7" fmla="+- vc sdy6 0" />

+      <gd name="sy8" fmla="+- vc sdy5 0" />

+      <gd name="sy9" fmla="+- vc sdy4 0" />

+      <gd name="sy10" fmla="+- vc sdy3 0" />

+      <gd name="sy11" fmla="+- vc sdy2 0" />

+      <gd name="sy12" fmla="+- vc sdy1 0" />

+      <gd name="idx" fmla="cos iwd2 2700000" />

+      <gd name="idy" fmla="sin ihd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="ib" fmla="+- vc idy 0" />

+      <gd name="yAdj" fmla="+- vc 0 ihd2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="ssd2">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx1" y="sy6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx7" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx8" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx9" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx10" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx11" y="sy5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx12" y="sy6" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx12" y="sy7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx11" y="sy8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y7" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx10" y="sy9" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx9" y="sy10" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y9" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx8" y="sy11" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y10" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx7" y="sy12" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy12" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y10" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy11" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y9" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy10" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy9" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y7" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="sy7" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </star24>

+  <star32>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 37500" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dx1" fmla="*/ wd2 98079 100000" />

+      <gd name="dx2" fmla="*/ wd2 92388 100000" />

+      <gd name="dx3" fmla="*/ wd2 83147 100000" />

+      <gd name="dx4" fmla="cos wd2 2700000" />

+      <gd name="dx5" fmla="*/ wd2 55557 100000" />

+      <gd name="dx6" fmla="*/ wd2 38268 100000" />

+      <gd name="dx7" fmla="*/ wd2 19509 100000" />

+      <gd name="dy1" fmla="*/ hd2 98079 100000" />

+      <gd name="dy2" fmla="*/ hd2 92388 100000" />

+      <gd name="dy3" fmla="*/ hd2 83147 100000" />

+      <gd name="dy4" fmla="sin hd2 2700000" />

+      <gd name="dy5" fmla="*/ hd2 55557 100000" />

+      <gd name="dy6" fmla="*/ hd2 38268 100000" />

+      <gd name="dy7" fmla="*/ hd2 19509 100000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc 0 dx3" />

+      <gd name="x4" fmla="+- hc 0 dx4" />

+      <gd name="x5" fmla="+- hc 0 dx5" />

+      <gd name="x6" fmla="+- hc 0 dx6" />

+      <gd name="x7" fmla="+- hc 0 dx7" />

+      <gd name="x8" fmla="+- hc dx7 0" />

+      <gd name="x9" fmla="+- hc dx6 0" />

+      <gd name="x10" fmla="+- hc dx5 0" />

+      <gd name="x11" fmla="+- hc dx4 0" />

+      <gd name="x12" fmla="+- hc dx3 0" />

+      <gd name="x13" fmla="+- hc dx2 0" />

+      <gd name="x14" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc 0 dy2" />

+      <gd name="y3" fmla="+- vc 0 dy3" />

+      <gd name="y4" fmla="+- vc 0 dy4" />

+      <gd name="y5" fmla="+- vc 0 dy5" />

+      <gd name="y6" fmla="+- vc 0 dy6" />

+      <gd name="y7" fmla="+- vc 0 dy7" />

+      <gd name="y8" fmla="+- vc dy7 0" />

+      <gd name="y9" fmla="+- vc dy6 0" />

+      <gd name="y10" fmla="+- vc dy5 0" />

+      <gd name="y11" fmla="+- vc dy4 0" />

+      <gd name="y12" fmla="+- vc dy3 0" />

+      <gd name="y13" fmla="+- vc dy2 0" />

+      <gd name="y14" fmla="+- vc dy1 0" />

+      <gd name="iwd2" fmla="*/ wd2 a 50000" />

+      <gd name="ihd2" fmla="*/ hd2 a 50000" />

+      <gd name="sdx1" fmla="*/ iwd2 99518 100000" />

+      <gd name="sdx2" fmla="*/ iwd2 95694 100000" />

+      <gd name="sdx3" fmla="*/ iwd2 88192 100000" />

+      <gd name="sdx4" fmla="*/ iwd2 77301 100000" />

+      <gd name="sdx5" fmla="*/ iwd2 63439 100000" />

+      <gd name="sdx6" fmla="*/ iwd2 47140 100000" />

+      <gd name="sdx7" fmla="*/ iwd2 29028 100000" />

+      <gd name="sdx8" fmla="*/ iwd2 9802 100000" />

+      <gd name="sdy1" fmla="*/ ihd2 99518 100000" />

+      <gd name="sdy2" fmla="*/ ihd2 95694 100000" />

+      <gd name="sdy3" fmla="*/ ihd2 88192 100000" />

+      <gd name="sdy4" fmla="*/ ihd2 77301 100000" />

+      <gd name="sdy5" fmla="*/ ihd2 63439 100000" />

+      <gd name="sdy6" fmla="*/ ihd2 47140 100000" />

+      <gd name="sdy7" fmla="*/ ihd2 29028 100000" />

+      <gd name="sdy8" fmla="*/ ihd2 9802 100000" />

+      <gd name="sx1" fmla="+- hc 0 sdx1" />

+      <gd name="sx2" fmla="+- hc 0 sdx2" />

+      <gd name="sx3" fmla="+- hc 0 sdx3" />

+      <gd name="sx4" fmla="+- hc 0 sdx4" />

+      <gd name="sx5" fmla="+- hc 0 sdx5" />

+      <gd name="sx6" fmla="+- hc 0 sdx6" />

+      <gd name="sx7" fmla="+- hc 0 sdx7" />

+      <gd name="sx8" fmla="+- hc 0 sdx8" />

+      <gd name="sx9" fmla="+- hc sdx8 0" />

+      <gd name="sx10" fmla="+- hc sdx7 0" />

+      <gd name="sx11" fmla="+- hc sdx6 0" />

+      <gd name="sx12" fmla="+- hc sdx5 0" />

+      <gd name="sx13" fmla="+- hc sdx4 0" />

+      <gd name="sx14" fmla="+- hc sdx3 0" />

+      <gd name="sx15" fmla="+- hc sdx2 0" />

+      <gd name="sx16" fmla="+- hc sdx1 0" />

+      <gd name="sy1" fmla="+- vc 0 sdy1" />

+      <gd name="sy2" fmla="+- vc 0 sdy2" />

+      <gd name="sy3" fmla="+- vc 0 sdy3" />

+      <gd name="sy4" fmla="+- vc 0 sdy4" />

+      <gd name="sy5" fmla="+- vc 0 sdy5" />

+      <gd name="sy6" fmla="+- vc 0 sdy6" />

+      <gd name="sy7" fmla="+- vc 0 sdy7" />

+      <gd name="sy8" fmla="+- vc 0 sdy8" />

+      <gd name="sy9" fmla="+- vc sdy8 0" />

+      <gd name="sy10" fmla="+- vc sdy7 0" />

+      <gd name="sy11" fmla="+- vc sdy6 0" />

+      <gd name="sy12" fmla="+- vc sdy5 0" />

+      <gd name="sy13" fmla="+- vc sdy4 0" />

+      <gd name="sy14" fmla="+- vc sdy3 0" />

+      <gd name="sy15" fmla="+- vc sdy2 0" />

+      <gd name="sy16" fmla="+- vc sdy1 0" />

+      <gd name="idx" fmla="cos iwd2 2700000" />

+      <gd name="idy" fmla="sin ihd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="ib" fmla="+- vc idy 0" />

+      <gd name="yAdj" fmla="+- vc 0 ihd2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="ssd2">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx1" y="sy8" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y7" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx7" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx8" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx9" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx10" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx11" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx12" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x11" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx13" y="sy5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x12" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx14" y="sy6" />

+        </lnTo>

+        <lnTo>

+          <pt x="x13" y="y6" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx15" y="sy7" />

+        </lnTo>

+        <lnTo>

+          <pt x="x14" y="y7" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx16" y="sy8" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx16" y="sy9" />

+        </lnTo>

+        <lnTo>

+          <pt x="x14" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx15" y="sy10" />

+        </lnTo>

+        <lnTo>

+          <pt x="x13" y="y9" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx14" y="sy11" />

+        </lnTo>

+        <lnTo>

+          <pt x="x12" y="y10" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx13" y="sy12" />

+        </lnTo>

+        <lnTo>

+          <pt x="x11" y="y11" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx12" y="sy13" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y12" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx11" y="sy14" />

+        </lnTo>

+        <lnTo>

+          <pt x="x9" y="y13" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx10" y="sy15" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y14" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx9" y="sy16" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx8" y="sy16" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y14" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx7" y="sy15" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y13" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy14" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y12" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy13" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y11" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy12" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y10" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy11" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y9" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy10" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y8" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="sy9" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </star32>

+  <star4>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 12500" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="iwd2" fmla="*/ wd2 a 50000" />

+      <gd name="ihd2" fmla="*/ hd2 a 50000" />

+      <gd name="sdx" fmla="cos iwd2 2700000" />

+      <gd name="sdy" fmla="sin ihd2 2700000" />

+      <gd name="sx1" fmla="+- hc 0 sdx" />

+      <gd name="sx2" fmla="+- hc sdx 0" />

+      <gd name="sy1" fmla="+- vc 0 sdy" />

+      <gd name="sy2" fmla="+- vc sdy 0" />

+      <gd name="yAdj" fmla="+- vc 0 ihd2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="sx1" t="sy1" r="sx2" b="sy2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx1" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="sy2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </star4>

+  <star5>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 19098" />

+      <gd name="hf" fmla="val 105146" />

+      <gd name="vf" fmla="val 110557" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="swd2" fmla="*/ wd2 hf 100000" />

+      <gd name="shd2" fmla="*/ hd2 vf 100000" />

+      <gd name="svc" fmla="*/ vc  vf 100000" />

+      <gd name="dx1" fmla="cos swd2 1080000" />

+      <gd name="dx2" fmla="cos swd2 18360000" />

+      <gd name="dy1" fmla="sin shd2 1080000" />

+      <gd name="dy2" fmla="sin shd2 18360000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- svc 0 dy1" />

+      <gd name="y2" fmla="+- svc 0 dy2" />

+      <gd name="iwd2" fmla="*/ swd2 a 50000" />

+      <gd name="ihd2" fmla="*/ shd2 a 50000" />

+      <gd name="sdx1" fmla="cos iwd2 20520000" />

+      <gd name="sdx2" fmla="cos iwd2 3240000" />

+      <gd name="sdy1" fmla="sin ihd2 3240000" />

+      <gd name="sdy2" fmla="sin ihd2 20520000" />

+      <gd name="sx1" fmla="+- hc 0 sdx1" />

+      <gd name="sx2" fmla="+- hc 0 sdx2" />

+      <gd name="sx3" fmla="+- hc sdx2 0" />

+      <gd name="sx4" fmla="+- hc sdx1 0" />

+      <gd name="sy1" fmla="+- svc 0 sdy1" />

+      <gd name="sy2" fmla="+- svc 0 sdy2" />

+      <gd name="sy3" fmla="+- svc ihd2 0" />

+      <gd name="yAdj" fmla="+- svc 0 ihd2" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y2" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="y1" />

+      </cxn>

+    </cxnLst>

+    <rect l="sx1" t="sy1" r="sx4" b="sy3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx2" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="sy2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </star5>

+  <star6>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 28868" />

+      <gd name="hf" fmla="val 115470" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="swd2" fmla="*/ wd2 hf 100000" />

+      <gd name="dx1" fmla="cos swd2 1800000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc dx1 0" />

+      <gd name="y2" fmla="+- vc hd4 0" />

+      <gd name="iwd2" fmla="*/ swd2 a 50000" />

+      <gd name="ihd2" fmla="*/ hd2 a 50000" />

+      <gd name="sdx2" fmla="*/ iwd2 1 2" />

+      <gd name="sx1" fmla="+- hc 0 iwd2" />

+      <gd name="sx2" fmla="+- hc 0 sdx2" />

+      <gd name="sx3" fmla="+- hc sdx2 0" />

+      <gd name="sx4" fmla="+- hc iwd2 0" />

+      <gd name="sdy1" fmla="sin ihd2 3600000" />

+      <gd name="sy1" fmla="+- vc 0 sdy1" />

+      <gd name="sy2" fmla="+- vc sdy1 0" />

+      <gd name="yAdj" fmla="+- vc 0 ihd2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x2" y="hd4" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="hd4" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="sx1" t="sy1" r="sx4" b="sy2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="hd4" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx2" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="hd4" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="vc" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </star6>

+  <star7>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 34601" />

+      <gd name="hf" fmla="val 102572" />

+      <gd name="vf" fmla="val 105210" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="swd2" fmla="*/ wd2 hf 100000" />

+      <gd name="shd2" fmla="*/ hd2 vf 100000" />

+      <gd name="svc" fmla="*/ vc  vf 100000" />

+      <gd name="dx1" fmla="*/ swd2 97493 100000" />

+      <gd name="dx2" fmla="*/ swd2 78183 100000" />

+      <gd name="dx3" fmla="*/ swd2 43388 100000" />

+      <gd name="dy1" fmla="*/ shd2 62349 100000" />

+      <gd name="dy2" fmla="*/ shd2 22252 100000" />

+      <gd name="dy3" fmla="*/ shd2 90097 100000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc 0 dx3" />

+      <gd name="x4" fmla="+- hc dx3 0" />

+      <gd name="x5" fmla="+- hc dx2 0" />

+      <gd name="x6" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- svc 0 dy1" />

+      <gd name="y2" fmla="+- svc dy2 0" />

+      <gd name="y3" fmla="+- svc dy3 0" />

+      <gd name="iwd2" fmla="*/ swd2 a 50000" />

+      <gd name="ihd2" fmla="*/ shd2 a 50000" />

+      <gd name="sdx1" fmla="*/ iwd2 97493 100000" />

+      <gd name="sdx2" fmla="*/ iwd2 78183 100000" />

+      <gd name="sdx3" fmla="*/ iwd2 43388 100000" />

+      <gd name="sx1" fmla="+- hc 0 sdx1" />

+      <gd name="sx2" fmla="+- hc 0 sdx2" />

+      <gd name="sx3" fmla="+- hc 0 sdx3" />

+      <gd name="sx4" fmla="+- hc sdx3 0" />

+      <gd name="sx5" fmla="+- hc sdx2 0" />

+      <gd name="sx6" fmla="+- hc sdx1 0" />

+      <gd name="sdy1" fmla="*/ ihd2 90097 100000" />

+      <gd name="sdy2" fmla="*/ ihd2 22252 100000" />

+      <gd name="sdy3" fmla="*/ ihd2 62349 100000" />

+      <gd name="sy1" fmla="+- svc 0 sdy1" />

+      <gd name="sy2" fmla="+- svc 0 sdy2" />

+      <gd name="sy3" fmla="+- svc sdy3 0" />

+      <gd name="sy4" fmla="+- svc ihd2 0" />

+      <gd name="yAdj" fmla="+- svc 0 ihd2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="x5" y="y1" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x6" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x4" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x3" y="y3" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x2" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="sx2" t="sy1" r="sx5" b="sy3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x1" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx1" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx6" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx5" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy3" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </star7>

+  <star8>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 37500" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 50000" />

+      <gd name="dx1" fmla="cos wd2 2700000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc dx1 0" />

+      <gd name="dy1" fmla="sin hd2 2700000" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc dy1 0" />

+      <gd name="iwd2" fmla="*/ wd2 a 50000" />

+      <gd name="ihd2" fmla="*/ hd2 a 50000" />

+      <gd name="sdx1" fmla="*/ iwd2 92388 100000" />

+      <gd name="sdx2" fmla="*/ iwd2 38268 100000" />

+      <gd name="sdy1" fmla="*/ ihd2 92388 100000" />

+      <gd name="sdy2" fmla="*/ ihd2 38268 100000" />

+      <gd name="sx1" fmla="+- hc 0 sdx1" />

+      <gd name="sx2" fmla="+- hc 0 sdx2" />

+      <gd name="sx3" fmla="+- hc sdx2 0" />

+      <gd name="sx4" fmla="+- hc sdx1 0" />

+      <gd name="sy1" fmla="+- vc 0 sdy1" />

+      <gd name="sy2" fmla="+- vc 0 sdy2" />

+      <gd name="sy3" fmla="+- vc sdy2 0" />

+      <gd name="sy4" fmla="+- vc sdy1 0" />

+      <gd name="yAdj" fmla="+- vc 0 ihd2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="50000">

+        <pos x="hc" y="yAdj" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x1" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="y1" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x2" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="sx1" t="sy1" r="sx4" b="sy4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="sx1" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx4" y="sy3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx3" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx2" y="sy4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="sx1" y="sy3" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </star8>

+  <straightConnector1>

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path fill="none">

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+      </path>

+    </pathLst>

+  </straightConnector1>

+  <stripedRightArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+

+      <gd name="adj2" fmla="val 50000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 84375 w ss" />

+

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="x4" fmla="*/ ss 5 32" />

+      <gd name="dx5" fmla="*/ ss a2 100000" />

+      <gd name="x5" fmla="+- r 0 dx5" />

+      <gd name="dy1" fmla="*/ h a1 200000" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="y2" fmla="+- vc dy1 0" />

+      <gd name="dx6" fmla="*/ dy1 dx5 hd2" />

+      <gd name="x6" fmla="+- r 0 dx6" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="100000">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x5" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x5" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x5" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x4" t="y1" r="x6" b="y2" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="ssd32" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="ssd32" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y2" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="ssd16" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="ssd8" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="ssd8" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="ssd16" y="y2" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x4" y="y1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x5" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="vc" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x5" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </stripedRightArrow>

+  <sun>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 25000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 12500 adj 46875" />

+      <gd name="g0" fmla="+- 50000 0 a" />

+      <gd name="g1" fmla="*/ g0 30274 32768" />

+      <gd name="g2" fmla="*/ g0 12540 32768" />

+      <gd name="g3" fmla="+- g1 50000 0" />

+      <gd name="g4" fmla="+- g2 50000 0" />

+      <gd name="g5" fmla="+- 50000 0 g1" />

+      <gd name="g6" fmla="+- 50000 0 g2" />

+      <gd name="g7" fmla="*/ g0 23170 32768" />

+      <gd name="g8" fmla="+- 50000 g7 0" />

+      <gd name="g9" fmla="+- 50000 0 g7" />

+      <gd name="g10" fmla="*/ g5 3 4" />

+      <gd name="g11" fmla="*/ g6 3 4" />

+      <gd name="g12" fmla="+- g10 3662 0" />

+      <gd name="g13" fmla="+- g11 3662 0" />

+      <gd name="g14" fmla="+- g11 12500 0" />

+      <gd name="g15" fmla="+- 100000 0 g10" />

+      <gd name="g16" fmla="+- 100000 0 g12" />

+      <gd name="g17" fmla="+- 100000 0 g13" />

+      <gd name="g18" fmla="+- 100000 0 g14" />

+      <gd name="ox1" fmla="*/ w 18436 21600" />

+      <gd name="oy1" fmla="*/ h 3163 21600" />

+      <gd name="ox2" fmla="*/ w 3163 21600" />

+      <gd name="oy2" fmla="*/ h 18436 21600" />

+      <gd name="x8" fmla="*/ w g8 100000" />

+      <gd name="x9" fmla="*/ w g9 100000" />

+      <gd name="x10" fmla="*/ w g10 100000" />

+      <gd name="x12" fmla="*/ w g12 100000" />

+      <gd name="x13" fmla="*/ w g13 100000" />

+      <gd name="x14" fmla="*/ w g14 100000" />

+      <gd name="x15" fmla="*/ w g15 100000" />

+      <gd name="x16" fmla="*/ w g16 100000" />

+      <gd name="x17" fmla="*/ w g17 100000" />

+      <gd name="x18" fmla="*/ w g18 100000" />

+      <gd name="x19" fmla="*/ w a 100000" />

+      <gd name="wR" fmla="*/ w g0 100000" />

+      <gd name="hR" fmla="*/ h g0 100000" />

+      <gd name="y8" fmla="*/ h g8 100000" />

+      <gd name="y9" fmla="*/ h g9 100000" />

+      <gd name="y10" fmla="*/ h g10 100000" />

+      <gd name="y12" fmla="*/ h g12 100000" />

+      <gd name="y13" fmla="*/ h g13 100000" />

+      <gd name="y14" fmla="*/ h g14 100000" />

+      <gd name="y15" fmla="*/ h g15 100000" />

+      <gd name="y16" fmla="*/ h g16 100000" />

+      <gd name="y17" fmla="*/ h g17 100000" />

+      <gd name="y18" fmla="*/ h g18 100000" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="12500" maxX="46875">

+        <pos x="x19" y="vc" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="x9" t="y9" r="x8" b="y8" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="r" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x15" y="y18" />

+        </lnTo>

+        <lnTo>

+          <pt x="x15" y="y14" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="ox1" y="oy1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x16" y="y13" />

+        </lnTo>

+        <lnTo>

+          <pt x="x17" y="y12" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="hc" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x18" y="y10" />

+        </lnTo>

+        <lnTo>

+          <pt x="x14" y="y10" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="ox2" y="oy1" />

+        </moveTo>

+        <lnTo>

+          <pt x="x13" y="y12" />

+        </lnTo>

+        <lnTo>

+          <pt x="x12" y="y13" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <lnTo>

+          <pt x="x10" y="y14" />

+        </lnTo>

+        <lnTo>

+          <pt x="x10" y="y18" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="ox2" y="oy2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x12" y="y17" />

+        </lnTo>

+        <lnTo>

+          <pt x="x13" y="y16" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="hc" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x14" y="y15" />

+        </lnTo>

+        <lnTo>

+          <pt x="x18" y="y15" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="ox1" y="oy2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x17" y="y16" />

+        </lnTo>

+        <lnTo>

+          <pt x="x16" y="y17" />

+        </lnTo>

+        <close />

+        <moveTo>

+          <pt x="x19" y="vc" />

+        </moveTo>

+        <arcTo wR="wR" hR="hR" stAng="cd2" swAng="21600000" />

+        <close />

+      </path>

+    </pathLst>

+

+  </sun>

+  <swooshArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 16667" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+

+

+      <gd name="a1" fmla="pin 1 adj1 75000" />

+

+      <gd name="maxAdj2" fmla="*/ 70000 w ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="ad1" fmla="*/ h a1 100000" />

+      <gd name="ad2" fmla="*/ ss a2 100000" />

+

+      <gd name="xB" fmla="+- r 0 ad2" />

+      <gd name="yB" fmla="+- t ssd8 0" />

+

+      <gd name="alfa" fmla="*/ cd4 1 14" />

+

+      <gd name="dx0" fmla="tan ssd8 alfa" />

+      <gd name="xC" fmla="+- xB 0 dx0" />

+

+      <gd name="dx1" fmla="tan ad1 alfa" />

+

+      <gd name="yF" fmla="+- yB ad1 0" />

+      <gd name="xF" fmla="+- xB dx1 0" />

+

+      <gd name="xE" fmla="+- xF dx0 0" />

+      <gd name="yE" fmla="+- yF ssd8 0" />

+

+      <gd name="dy2" fmla="+- yE 0 t" />

+      <gd name="dy22" fmla="*/ dy2 1 2" />

+      <gd name="dy3" fmla="*/ h 1 20" />

+      <gd name="yD" fmla="+- t dy22 dy3" />

+

+

+      <gd name="dy4" fmla="*/ hd6 1 1" />

+      <gd name="yP1" fmla="+- hd6 dy4 0" />

+      <gd name="xP1" fmla="val wd6" />

+

+

+      <gd name="dy5" fmla="*/ hd6 1 2" />

+      <gd name="yP2" fmla="+- yF dy5 0" />

+      <gd name="xP2" fmla="val wd4" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="1" maxY="75000">

+        <pos x="xF" y="yF" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="xB" y="yB" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="l" y="b" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="xC" y="t" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="yD" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="xE" y="yE" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <quadBezTo>

+          <pt x="xP1" y="yP1" />

+          <pt x="xB" y="yB" />

+        </quadBezTo>

+        <lnTo>

+          <pt x="xC" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="yD" />

+        </lnTo>

+        <lnTo>

+          <pt x="xE" y="yE" />

+        </lnTo>

+        <lnTo>

+          <pt x="xF" y="yF" />

+        </lnTo>

+        <quadBezTo>

+          <pt x="xP2" y="yP2" />

+          <pt x="l" y="b" />

+        </quadBezTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </swooshArrow>

+  <teardrop>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 100000" />

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 200000" />

+      <gd name="r2" fmla="sqrt 2" />

+      <gd name="tw" fmla="*/ wd2 r2 1" />

+      <gd name="th" fmla="*/ hd2 r2 1" />

+      <gd name="sw" fmla="*/ tw a 100000" />

+      <gd name="sh" fmla="*/ th a 100000" />

+      <gd name="dx1" fmla="cos sw 2700000" />

+      <gd name="dy1" fmla="sin sh 2700000" />

+      <gd name="x1" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc 0 dy1" />

+      <gd name="x2" fmla="+/ hc x1 2" />

+      <gd name="y2" fmla="+/ vc y1 2" />

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="200000">

+        <pos x="x1" y="t" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="x1" y="y1" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="vc" />

+        </moveTo>

+        <arcTo wR="wd2" hR="hd2" stAng="cd2" swAng="cd4" />

+        <quadBezTo>

+          <pt x="x2" y="t" />

+          <pt x="x1" y="y1" />

+        </quadBezTo>

+        <quadBezTo>

+          <pt x="r" y="y2" />

+          <pt x="r" y="vc" />

+        </quadBezTo>

+        <arcTo wR="wd2" hR="hd2" stAng="0" swAng="cd4" />

+        <arcTo wR="wd2" hR="hd2" stAng="cd4" swAng="cd4" />

+        <close />

+      </path>

+    </pathLst>

+

+  </teardrop>

+  <trapezoid>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 25000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj" fmla="*/ 50000 w ss" />

+      <gd name="a" fmla="pin 0 adj maxAdj" />

+      <gd name="x1" fmla="*/ ss a 200000" />

+      <gd name="x2" fmla="*/ ss a 100000" />

+      <gd name="x3" fmla="+- r 0 x2" />

+      <gd name="x4" fmla="+- r 0 x1" />

+      <gd name="il" fmla="*/ wd3 a maxAdj" />

+      <gd name="it" fmla="*/ hd3 a maxAdj" />

+      <gd name="ir" fmla="+- r 0 il" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="maxAdj">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x4" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="ir" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </trapezoid>

+  <triangle>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 100000" />

+      <gd name="x1" fmla="*/ w a 200000" />

+      <gd name="x2" fmla="*/ w a 100000" />

+      <gd name="x3" fmla="+- x1 wd2 0" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj" minX="0" maxX="100000">

+        <pos x="x2" y="t" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="x2" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="l" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x2" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="r" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x3" y="vc" />

+      </cxn>

+    </cxnLst>

+    <rect l="x1" t="vc" r="x3" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </triangle>

+  <upArrowCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+      <gd name="adj4" fmla="val 64977" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 w ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="maxAdj3" fmla="*/ 100000 h ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="q2" fmla="*/ a3 ss h" />

+

+      <gd name="maxAdj4" fmla="+- 100000 0 q2" />

+

+      <gd name="a4" fmla="pin 0 adj4 maxAdj4" />

+      <gd name="dx1" fmla="*/ ss a2 100000" />

+

+      <gd name="dx2" fmla="*/ ss a1 200000" />

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="*/ ss a3 100000" />

+

+      <gd name="dy2" fmla="*/ h a4 100000" />

+

+      <gd name="y2" fmla="+- b 0 dy2" />

+      <gd name="y3" fmla="+/ y2 b 2" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">

+        <pos x="x2" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="y1" />

+      </ahXY>

+      <ahXY gdRefY="adj4" minY="0" maxY="maxAdj4">

+        <pos x="l" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y2" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y2" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="y2" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </upArrowCallout>

+  <upArrow>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 h ss" />

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="y2" fmla="*/ ss a2 100000" />

+      <gd name="y3" fmla="+- b 0 y2" />

+      <gd name="dx1" fmla="*/ w a1 200000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc dx1 0" />

+      <gd name="dy1" fmla="*/ x1 y2 wd2" />

+      <gd name="y1" fmla="+- y2 0 dy1" />

+      <gd name="y4" fmla="+- y3 dy1 0" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="100000">

+        <pos x="x1" y="y3" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="l" y="y2" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y3" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="vc" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y2" />

+      </cxn>

+    </cxnLst>

+    <rect l="x1" t="y1" r="x2" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </upArrow>

+  <upDownArrow>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 50000" />

+      <gd name="adj2" fmla="val 50000" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 h ss" />

+      <gd name="a1" fmla="pin 0 adj1 100000" />

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="y2" fmla="*/ ss a2 100000" />

+      <gd name="y3" fmla="+- b 0 y2" />

+      <gd name="dx1" fmla="*/ w a1 200000" />

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc dx1 0" />

+      <gd name="dy1" fmla="*/ x1 y2 wd2" />

+      <gd name="y1" fmla="+- y2 0 dy1" />

+      <gd name="y4" fmla="+- y3 dy1 0" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="100000">

+        <pos x="x1" y="y3" />

+      </ahXY>

+      <ahXY gdRefY="adj2" minY="0" maxY="maxAdj2">

+        <pos x="l" y="y2" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y2" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="y3" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y3" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x2" y="vc" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y2" />

+      </cxn>

+    </cxnLst>

+    <rect l="x1" t="y1" r="x2" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y2" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </upDownArrow>

+  <upDownArrowCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+      <gd name="adj4" fmla="val 48123" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="maxAdj2" fmla="*/ 50000 w ss" />

+

+      <gd name="a2" fmla="pin 0 adj2 maxAdj2" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="maxAdj3" fmla="*/ 50000 h ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="q2" fmla="*/ a3 ss hd2" />

+

+      <gd name="maxAdj4" fmla="+- 100000 0 q2" />

+

+      <gd name="a4" fmla="pin 0 adj4 maxAdj4" />

+      <gd name="dx1" fmla="*/ ss a2 100000" />

+

+      <gd name="dx2" fmla="*/ ss a1 200000" />

+

+      <gd name="x1" fmla="+- hc 0 dx1" />

+      <gd name="x2" fmla="+- hc 0 dx2" />

+      <gd name="x3" fmla="+- hc dx2 0" />

+      <gd name="x4" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="*/ ss a3 100000" />

+

+      <gd name="y4" fmla="+- b 0 y1" />

+

+      <gd name="dy2" fmla="*/ h a4 200000" />

+

+      <gd name="y2" fmla="+- vc 0 dy2" />

+

+      <gd name="y3" fmla="+- vc dy2 0" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">

+        <pos x="x2" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="maxAdj2">

+        <pos x="x1" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="r" y="y1" />

+      </ahXY>

+      <ahXY gdRefY="adj4" minY="0" maxY="maxAdj4">

+        <pos x="l" y="y2" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="y2" r="r" b="y3" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="y2" />

+        </moveTo>

+        <lnTo>

+          <pt x="x2" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="x3" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x4" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="hc" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y3" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </upDownArrowCallout>

+  <uturnArrow>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 25000" />

+

+      <gd name="adj2" fmla="val 25000" />

+

+      <gd name="adj3" fmla="val 25000" />

+

+      <gd name="adj4" fmla="val 43750" />

+

+      <gd name="adj5" fmla="val 75000" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a2" fmla="pin 0 adj2 25000" />

+      <gd name="maxAdj1" fmla="*/ a2 2 1" />

+      <gd name="a1" fmla="pin 0 adj1 maxAdj1" />

+      <gd name="q2" fmla="*/ a1 ss h" />

+

+      <gd name="q3" fmla="+- 100000 0 q2" />

+

+      <gd name="maxAdj3" fmla="*/ q3 h ss" />

+

+      <gd name="a3" fmla="pin 0 adj3 maxAdj3" />

+      <gd name="q1" fmla="+- a3 a1 0" />

+      <gd name="minAdj5" fmla="*/ q1 ss h" />

+      <gd name="a5" fmla="pin minAdj5 adj5 100000" />

+      <gd name="th" fmla="*/ ss a1 100000" />

+

+      <gd name="aw2" fmla="*/ ss a2 100000" />

+

+      <gd name="th2" fmla="*/ th 1 2" />

+      <gd name="dh2" fmla="+- aw2 0 th2" />

+

+      <gd name="y5" fmla="*/ h a5 100000" />

+

+      <gd name="ah" fmla="*/ ss a3 100000" />

+

+      <gd name="y4" fmla="+- y5 0 ah" />

+      <gd name="x9" fmla="+- r 0 dh2" />

+

+      <gd name="bw" fmla="*/ x9 1 2" />

+      <gd name="bs" fmla="min bw y4" />

+      <gd name="maxAdj4" fmla="*/ bs 100000 ss" />

+      <gd name="a4" fmla="pin 0 adj4 maxAdj4" />

+

+

+      <gd name="bd" fmla="*/ ss a4 100000" />

+

+

+

+      <gd name="bd3" fmla="+- bd 0 th" />

+      <gd name="bd2" fmla="max bd3 0" />

+      <gd name="x3" fmla="+- th bd2 0" />

+

+      <gd name="x8" fmla="+- r 0 aw2" />

+

+      <gd name="x6" fmla="+- x8 0 aw2" />

+

+      <gd name="x7" fmla="+- x6 dh2 0" />

+

+      <gd name="x4" fmla="+- x9 0 bd" />

+

+      <gd name="x5" fmla="+- x7 0 bd2" />

+

+      <gd name="cx" fmla="+/ th x7 2" />

+

+

+

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="0" maxX="maxAdj1">

+        <pos x="th" y="b" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="0" maxX="25000">

+        <pos x="x6" y="b" />

+      </ahXY>

+      <ahXY gdRefY="adj3" minY="0" maxY="maxAdj3">

+        <pos x="x6" y="y4" />

+      </ahXY>

+      <ahXY gdRefX="adj4" minX="0" maxX="maxAdj4">

+        <pos x="bd" y="t" />

+      </ahXY>

+      <ahXY gdRefY="adj5" minY="minAdj5" maxY="100000">

+        <pos x="r" y="y5" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="x6" y="y4" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="x8" y="y5" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="y4" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="cx" y="t" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="th2" y="b" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="b" />

+        </moveTo>

+        <lnTo>

+          <pt x="l" y="bd" />

+        </lnTo>

+        <arcTo wR="bd" hR="bd" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x4" y="t" />

+        </lnTo>

+        <arcTo wR="bd" hR="bd" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="x9" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x8" y="y5" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="y4" />

+        </lnTo>

+        <lnTo>

+          <pt x="x7" y="x3" />

+        </lnTo>

+        <arcTo wR="bd2" hR="bd2" stAng="0" swAng="-5400000" />

+        <lnTo>

+          <pt x="x3" y="th" />

+        </lnTo>

+        <arcTo wR="bd2" hR="bd2" stAng="3cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="th" y="b" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </uturnArrow>

+  <verticalScroll>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj" fmla="val 12500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a" fmla="pin 0 adj 25000" />

+      <gd name="ch" fmla="*/ ss a 100000" />

+

+      <gd name="ch2" fmla="*/ ch 1 2" />

+

+      <gd name="ch4" fmla="*/ ch 1 4" />

+

+

+

+

+

+      <gd name="x3" fmla="+- ch ch2 0" />

+

+      <gd name="x4" fmla="+- ch ch 0" />

+

+      <gd name="x6" fmla="+- r 0 ch" />

+

+      <gd name="x7" fmla="+- r 0 ch2" />

+

+      <gd name="x5" fmla="+- x6 0 ch2" />

+

+

+

+

+

+      <gd name="y3" fmla="+- b 0 ch" />

+

+      <gd name="y4" fmla="+- b 0 ch2" />

+

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj" minY="0" maxY="25000">

+        <pos x="l" y="ch" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="ch" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x6" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="ch" t="ch" r="x6" b="y4" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="ch2" y="b" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="ch2" y="y4" />

+        </lnTo>

+        <arcTo wR="ch4" hR="ch4" stAng="cd4" swAng="-10800000" />

+        <lnTo>

+          <pt x="ch" y="y3" />

+        </lnTo>

+        <lnTo>

+          <pt x="ch" y="ch2" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x7" y="t" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x6" y="ch" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y4" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />

+        <close />

+        <moveTo>

+          <pt x="x4" y="ch2" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />

+        <arcTo wR="ch4" hR="ch4" stAng="cd4" swAng="cd2" />

+        <close />

+      </path>

+      <path fill="darkenLess" stroke="false" extrusionOk="false">

+

+        <moveTo>

+          <pt x="x4" y="ch2" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />

+        <arcTo wR="ch4" hR="ch4" stAng="cd4" swAng="cd2" />

+        <close />

+        <moveTo>

+          <pt x="ch" y="y4" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="3cd4" />

+        <arcTo wR="ch4" hR="ch4" stAng="3cd4" swAng="cd2" />

+        <close />

+      </path>

+      <path fill="none" extrusionOk="false">

+

+        <moveTo>

+          <pt x="ch" y="y3" />

+        </moveTo>

+        <lnTo>

+          <pt x="ch" y="ch2" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x7" y="t" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x6" y="ch" />

+        </lnTo>

+        <lnTo>

+          <pt x="x6" y="y4" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="ch2" y="b" />

+        </lnTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="cd2" />

+        <close />

+        <moveTo>

+          <pt x="x3" y="t" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="3cd4" swAng="cd2" />

+        <arcTo wR="ch4" hR="ch4" stAng="cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="x4" y="ch2" />

+        </lnTo>

+        <moveTo>

+          <pt x="x6" y="ch" />

+        </moveTo>

+        <lnTo>

+          <pt x="x3" y="ch" />

+        </lnTo>

+        <moveTo>

+          <pt x="ch2" y="y3" />

+        </moveTo>

+        <arcTo wR="ch4" hR="ch4" stAng="3cd4" swAng="cd2" />

+        <lnTo>

+          <pt x="ch" y="y4" />

+        </lnTo>

+        <moveTo>

+          <pt x="ch2" y="b" />

+        </moveTo>

+        <arcTo wR="ch2" hR="ch2" stAng="cd4" swAng="-5400000" />

+        <lnTo>

+          <pt x="ch" y="y3" />

+        </lnTo>

+      </path>

+    </pathLst>

+

+  </verticalScroll>

+  <wave>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val 12500" />

+

+      <gd name="adj2" fmla="val 0" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="a1" fmla="pin 0 adj1 20000" />

+      <gd name="a2" fmla="pin -10000 adj2 10000" />

+      <gd name="y1" fmla="*/ h a1 100000" />

+

+      <gd name="dy2" fmla="*/ y1 10 3" />

+      <gd name="y2" fmla="+- y1 0 dy2" />

+

+      <gd name="y3" fmla="+- y1 dy2 0" />

+

+      <gd name="y4" fmla="+- b 0 y1" />

+

+      <gd name="y5" fmla="+- y4 0 dy2" />

+

+      <gd name="y6" fmla="+- y4 dy2 0" />

+

+      <gd name="dx1" fmla="*/ w a2 100000" />

+

+      <gd name="of2" fmla="*/ w a2 50000" />

+

+      <gd name="x1" fmla="abs dx1" />

+

+      <gd name="dx2" fmla="?: of2 0 of2" />

+      <gd name="x2" fmla="+- l 0 dx2" />

+

+      <gd name="dx5" fmla="?: of2 of2 0" />

+      <gd name="x5" fmla="+- r 0 dx5" />

+

+      <gd name="dx3" fmla="+/ dx2 x5 3" />

+

+      <gd name="x3" fmla="+- x2 dx3 0" />

+

+      <gd name="x4" fmla="+/ x3 x5 2" />

+

+      <gd name="x6" fmla="+- l dx5 0" />

+

+      <gd name="x10" fmla="+- r dx2 0" />

+

+      <gd name="x7" fmla="+- x6 dx3 0" />

+

+      <gd name="x8" fmla="+/ x7 x10 2" />

+

+      <gd name="x9" fmla="+- r 0 x1" />

+

+      <gd name="xAdj" fmla="+- hc dx1 0" />

+      <gd name="xAdj2" fmla="+- hc 0 dx1" />

+      <gd name="il" fmla="max x2 x6" />

+      <gd name="ir" fmla="min x5 x10" />

+      <gd name="it" fmla="*/ h a1 50000" />

+      <gd name="ib" fmla="+- b 0 it" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefY="adj1" minY="0" maxY="20000">

+        <pos x="l" y="y1" />

+      </ahXY>

+      <ahXY gdRefX="adj2" minX="-10000" maxX="10000">

+        <pos x="xAdj" y="b" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="cd4">

+        <pos x="xAdj2" y="y1" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="x1" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="xAdj" y="y4" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="x9" y="vc" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="x2" y="y1" />

+        </moveTo>

+        <cubicBezTo>

+          <pt x="x3" y="y2" />

+          <pt x="x4" y="y3" />

+          <pt x="x5" y="y1" />

+        </cubicBezTo>

+        <lnTo>

+          <pt x="x10" y="y4" />

+        </lnTo>

+        <cubicBezTo>

+          <pt x="x8" y="y6" />

+          <pt x="x7" y="y5" />

+          <pt x="x6" y="y4" />

+        </cubicBezTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </wave>

+  <wedgeEllipseCallout>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val -20833" />

+      <gd name="adj2" fmla="val 62500" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dxPos" fmla="*/ w adj1 100000" />

+      <gd name="dyPos" fmla="*/ h adj2 100000" />

+      <gd name="xPos" fmla="+- hc dxPos 0" />

+      <gd name="yPos" fmla="+- vc dyPos 0" />

+      <gd name="sdx" fmla="*/ dxPos h 1" />

+      <gd name="sdy" fmla="*/ dyPos w 1" />

+      <gd name="pang" fmla="at2 sdx sdy" />

+      <gd name="stAng" fmla="+- pang 660000 0" />

+      <gd name="enAng" fmla="+- pang 0 660000" />

+      <gd name="dx1" fmla="cos wd2 stAng" />

+      <gd name="dy1" fmla="sin hd2 stAng" />

+      <gd name="x1" fmla="+- hc dx1 0" />

+      <gd name="y1" fmla="+- vc dy1 0" />

+      <gd name="dx2" fmla="cos wd2 enAng" />

+      <gd name="dy2" fmla="sin hd2 enAng" />

+      <gd name="x2" fmla="+- hc dx2 0" />

+      <gd name="y2" fmla="+- vc dy2 0" />

+      <gd name="stAng1" fmla="at2 dx1 dy1" />

+      <gd name="enAng1" fmla="at2 dx2 dy2" />

+      <gd name="swAng1" fmla="+- enAng1 0 stAng1" />

+      <gd name="swAng2" fmla="+- swAng1 21600000 0" />

+      <gd name="swAng" fmla="?: swAng1 swAng1 swAng2" />

+      <gd name="idx" fmla="cos wd2 2700000" />

+      <gd name="idy" fmla="sin hd2 2700000" />

+      <gd name="il" fmla="+- hc 0 idx" />

+      <gd name="ir" fmla="+- hc idx 0" />

+      <gd name="it" fmla="+- vc 0 idy" />

+      <gd name="ib" fmla="+- vc idy 0" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647" gdRefY="adj2" minY="-2147483647" maxY="2147483647">

+        <pos x="xPos" y="yPos" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="il" y="it" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="il" y="ib" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="ir" y="ib" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="3cd4">

+        <pos x="ir" y="it" />

+      </cxn>

+      <cxn ang="pang">

+        <pos x="xPos" y="yPos" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="it" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="xPos" y="yPos" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="y1" />

+        </lnTo>

+        <arcTo wR="wd2" hR="hd2" stAng="stAng1" swAng="swAng" />

+        <close />

+      </path>

+    </pathLst>

+  </wedgeEllipseCallout>

+  <wedgeRectCallout>

+

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val -20833" />

+

+      <gd name="adj2" fmla="val 62500" />

+

+    </avLst>

+

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dxPos" fmla="*/ w adj1 100000" />

+      <gd name="dyPos" fmla="*/ h adj2 100000" />

+      <gd name="xPos" fmla="+- hc dxPos 0" />

+      <gd name="yPos" fmla="+- vc dyPos 0" />

+      <gd name="dx" fmla="+- xPos 0 hc" />

+      <gd name="dy" fmla="+- yPos 0 vc" />

+      <gd name="dq" fmla="*/ dxPos h w" />

+      <gd name="ady" fmla="abs dyPos" />

+      <gd name="adq" fmla="abs dq" />

+      <gd name="dz" fmla="+- ady 0 adq" />

+      <gd name="xg1" fmla="?: dxPos 7 2" />

+      <gd name="xg2" fmla="?: dxPos 10 5" />

+      <gd name="x1" fmla="*/ w xg1 12" />

+      <gd name="x2" fmla="*/ w xg2 12" />

+      <gd name="yg1" fmla="?: dyPos 7 2" />

+      <gd name="yg2" fmla="?: dyPos 10 5" />

+      <gd name="y1" fmla="*/ h yg1 12" />

+      <gd name="y2" fmla="*/ h yg2 12" />

+      <gd name="t1" fmla="?: dxPos l xPos" />

+      <gd name="xl" fmla="?: dz l t1" />

+      <gd name="t2" fmla="?: dyPos x1 xPos" />

+      <gd name="xt" fmla="?: dz t2 x1" />

+      <gd name="t3" fmla="?: dxPos xPos r" />

+      <gd name="xr" fmla="?: dz r t3" />

+      <gd name="t4" fmla="?: dyPos xPos x1" />

+      <gd name="xb" fmla="?: dz t4 x1" />

+      <gd name="t5" fmla="?: dxPos y1 yPos" />

+      <gd name="yl" fmla="?: dz y1 t5" />

+      <gd name="t6" fmla="?: dyPos t yPos" />

+      <gd name="yt" fmla="?: dz t6 t" />

+      <gd name="t7" fmla="?: dxPos yPos y1" />

+      <gd name="yr" fmla="?: dz y1 t7" />

+      <gd name="t8" fmla="?: dyPos yPos b" />

+      <gd name="yb" fmla="?: dz t8 b" />

+    </gdLst>

+

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647" gdRefY="adj2" minY="-2147483647" maxY="2147483647">

+        <pos x="xPos" y="yPos" />

+      </ahXY>

+    </ahLst>

+

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="xPos" y="yPos" />

+      </cxn>

+    </cxnLst>

+

+    <rect l="l" t="t" r="r" b="b" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="t" />

+        </moveTo>

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="xt" y="yt" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xr" y="yr" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="xb" y="yb" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xl" y="yl" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+

+  </wedgeRectCallout>

+  <wedgeRoundRectCallout>

+    <avLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="adj1" fmla="val -20833" />

+      <gd name="adj2" fmla="val 62500" />

+      <gd name="adj3" fmla="val 16667" />

+    </avLst>

+    <gdLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <gd name="dxPos" fmla="*/ w adj1 100000" />

+      <gd name="dyPos" fmla="*/ h adj2 100000" />

+      <gd name="xPos" fmla="+- hc dxPos 0" />

+      <gd name="yPos" fmla="+- vc dyPos 0" />

+      <gd name="dq" fmla="*/ dxPos h w" />

+      <gd name="ady" fmla="abs dyPos" />

+      <gd name="adq" fmla="abs dq" />

+      <gd name="dz" fmla="+- ady 0 adq" />

+      <gd name="xg1" fmla="?: dxPos 7 2" />

+      <gd name="xg2" fmla="?: dxPos 10 5" />

+      <gd name="x1" fmla="*/ w xg1 12" />

+      <gd name="x2" fmla="*/ w xg2 12" />

+      <gd name="yg1" fmla="?: dyPos 7 2" />

+      <gd name="yg2" fmla="?: dyPos 10 5" />

+      <gd name="y1" fmla="*/ h yg1 12" />

+      <gd name="y2" fmla="*/ h yg2 12" />

+      <gd name="t1" fmla="?: dxPos l xPos" />

+      <gd name="xl" fmla="?: dz l t1" />

+      <gd name="t2" fmla="?: dyPos x1 xPos" />

+      <gd name="xt" fmla="?: dz t2 x1" />

+      <gd name="t3" fmla="?: dxPos xPos r" />

+      <gd name="xr" fmla="?: dz r t3" />

+      <gd name="t4" fmla="?: dyPos xPos x1" />

+      <gd name="xb" fmla="?: dz t4 x1" />

+      <gd name="t5" fmla="?: dxPos y1 yPos" />

+      <gd name="yl" fmla="?: dz y1 t5" />

+      <gd name="t6" fmla="?: dyPos t yPos" />

+      <gd name="yt" fmla="?: dz t6 t" />

+      <gd name="t7" fmla="?: dxPos yPos y1" />

+      <gd name="yr" fmla="?: dz y1 t7" />

+      <gd name="t8" fmla="?: dyPos yPos b" />

+      <gd name="yb" fmla="?: dz t8 b" />

+      <gd name="u1" fmla="*/ ss adj3 100000" />

+      <gd name="u2" fmla="+- r 0 u1" />

+      <gd name="v2" fmla="+- b 0 u1" />

+      <gd name="il" fmla="*/ u1 29289 100000" />

+      <gd name="ir" fmla="+- r 0 il" />

+      <gd name="ib" fmla="+- b 0 il" />

+    </gdLst>

+    <ahLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <ahXY gdRefX="adj1" minX="-2147483647" maxX="2147483647" gdRefY="adj2" minY="-2147483647" maxY="2147483647">

+        <pos x="xPos" y="yPos" />

+      </ahXY>

+    </ahLst>

+    <cxnLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <cxn ang="3cd4">

+        <pos x="hc" y="t" />

+      </cxn>

+      <cxn ang="cd2">

+        <pos x="l" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="hc" y="b" />

+      </cxn>

+      <cxn ang="0">

+        <pos x="r" y="vc" />

+      </cxn>

+      <cxn ang="cd4">

+        <pos x="xPos" y="yPos" />

+      </cxn>

+    </cxnLst>

+    <rect l="il" t="il" r="ir" b="ib" xmlns="http://schemas.openxmlformats.org/drawingml/2006/main" />

+    <pathLst xmlns="http://schemas.openxmlformats.org/drawingml/2006/main">

+      <path>

+        <moveTo>

+          <pt x="l" y="u1" />

+        </moveTo>

+        <arcTo wR="u1" hR="u1" stAng="cd2" swAng="cd4" />

+        <lnTo>

+          <pt x="x1" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="xt" y="yt" />

+        </lnTo>

+        <lnTo>

+          <pt x="x2" y="t" />

+        </lnTo>

+        <lnTo>

+          <pt x="u2" y="t" />

+        </lnTo>

+        <arcTo wR="u1" hR="u1" stAng="3cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="r" y="y1" />

+        </lnTo>

+        <lnTo>

+          <pt x="xr" y="yr" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="r" y="v2" />

+        </lnTo>

+        <arcTo wR="u1" hR="u1" stAng="0" swAng="cd4" />

+        <lnTo>

+          <pt x="x2" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="xb" y="yb" />

+        </lnTo>

+        <lnTo>

+          <pt x="x1" y="b" />

+        </lnTo>

+        <lnTo>

+          <pt x="u1" y="b" />

+        </lnTo>

+        <arcTo wR="u1" hR="u1" stAng="cd4" swAng="cd4" />

+        <lnTo>

+          <pt x="l" y="y2" />

+        </lnTo>

+        <lnTo>

+          <pt x="xl" y="yl" />

+        </lnTo>

+        <lnTo>

+          <pt x="l" y="y1" />

+        </lnTo>

+        <close />

+      </path>

+    </pathLst>

+  </wedgeRoundRectCallout>

+</presetShapeDefinitons>

diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java b/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java
index 4fd09e6..9755d46 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hslf.blip;
 
-import org.apache.poi.hslf.usermodel.PictureData;
+import org.apache.poi.hslf.usermodel.HSLFPictureData;
 
 import java.io.IOException;
 import java.io.ByteArrayOutputStream;
@@ -28,7 +28,7 @@
  *
  * @author Yegor Kozlov
  */
-public abstract  class Bitmap extends PictureData {
+public abstract  class Bitmap extends HSLFPictureData {
 
     public byte[] getData(){
         byte[] rawdata = getRawData();
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java b/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java
deleted file mode 100644
index aae83bf..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/BitmapPainter.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.blip;
-
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.model.Picture;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.POILogFactory;
-
-
-
-
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-import javax.imageio.ImageIO;
-
-import java.awt.*;
-import java.awt.geom.AffineTransform;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-
-/**
- * Creates BufferedImage using javax.imageio.ImageIO and draws it in the specified graphics.
- *
- * @author  Yegor Kozlov.
- */
-public final class BitmapPainter implements ImagePainter {
-    protected POILogger logger = POILogFactory.getLogger(this.getClass());
-
-    public void paint(Graphics2D graphics, PictureData pict, Picture parent) {
-        BufferedImage img;
-        try {
-            img = ImageIO.read(new ByteArrayInputStream(pict.getData()));
-        } catch (Exception e) {
-            logger.log(POILogger.WARN, "ImageIO failed to create image. image.type: " + pict.getType());
-            return;
-        }
-
-        boolean isClipped = true;
-        Insets clip = parent.getBlipClip();
-        if (clip == null) {
-            isClipped = false;
-            clip = new Insets(0,0,0,0);
-        }        
-        
-        int iw = img.getWidth();
-        int ih = img.getHeight();
-
-        Rectangle anchor = parent.getLogicalAnchor2D().getBounds();
-
-        double cw = (100000-clip.left-clip.right) / 100000.0;
-        double ch = (100000-clip.top-clip.bottom) / 100000.0;
-        double sx = anchor.getWidth()/(iw*cw);
-        double sy = anchor.getHeight()/(ih*ch);
-        double tx = anchor.getX()-(iw*sx*clip.left/100000.0);
-        double ty = anchor.getY()-(ih*sy*clip.top/100000.0);
-        AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ;
-
-        Shape clipOld = graphics.getClip();
-        if (isClipped) graphics.clip(anchor.getBounds2D());
-        graphics.drawRenderedImage(img, at);
-        graphics.setClip(clipOld);
-    }
-
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java
index b261539..e49fb16 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/DIB.java
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hslf.blip;
 
-import org.apache.poi.hslf.model.Picture;
+import org.apache.poi.hslf.usermodel.HSLFPictureShape;
 import org.apache.poi.util.LittleEndian;
 
 import java.io.IOException;
@@ -35,10 +35,10 @@
 
     /**
      * @return type of  this picture
-     * @see  org.apache.poi.hslf.model.Picture#DIB
+     * @see  org.apache.poi.hslf.usermodel.HSLFPictureShape#DIB
      */
     public int getType(){
-        return Picture.DIB;
+        return HSLFPictureShape.DIB;
     }
 
     /**
@@ -105,4 +105,8 @@
         System.arraycopy(data, HEADER_SIZE, dib, 0, dib.length);
         super.setData(dib);
     }
+
+    public String getContentType() {
+        return "image/bmp";
+    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java
index a2c3598..5d3a45e 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java
@@ -17,8 +17,8 @@
 
 package org.apache.poi.hslf.blip;
 
-import org.apache.poi.hslf.model.Picture;
-import org.apache.poi.hslf.model.Shape;
+import org.apache.poi.hslf.usermodel.HSLFPictureShape;
+import org.apache.poi.hslf.usermodel.HSLFShape;
 import org.apache.poi.hslf.exceptions.HSLFException;
 
 import java.io.ByteArrayOutputStream;
@@ -67,7 +67,7 @@
         header.wmfsize = data.length;
         //we don't have a EMF reader in java, have to set default image size  200x200
         header.bounds = new java.awt.Rectangle(0, 0, 200, 200);
-        header.size = new java.awt.Dimension(header.bounds.width*Shape.EMU_PER_POINT, header.bounds.height*Shape.EMU_PER_POINT);
+        header.size = new java.awt.Dimension(header.bounds.width*HSLFShape.EMU_PER_POINT, header.bounds.height*HSLFShape.EMU_PER_POINT);
         header.zipsize = compressed.length;
 
         byte[] checksum = getChecksum(data);
@@ -80,7 +80,7 @@
     }
 
     public int getType(){
-        return Picture.EMF;
+        return HSLFPictureShape.EMF;
     }
 
     /**
@@ -88,7 +88,7 @@
      *
      * @return EMF signature ({@code 0x3D40} or {@code 0x3D50})
      */
-    public int getSignature() {
+    public int getSignature(){
         return (uidInstanceCount == 1 ? 0x3D40 : 0x3D50);
     }
     
@@ -107,4 +107,8 @@
                 throw new IllegalArgumentException(signature+" is not a valid instance/signature value for EMF");
         }        
     }
+
+    public String getContentType() {
+        return "image/x-emf";
+    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java b/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java
deleted file mode 100644
index 2c35007..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/ImagePainter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.blip;
-
-import org.apache.poi.hslf.model.Picture;
-import org.apache.poi.hslf.usermodel.PictureData;
-
-import java.awt.*;
-
-/**
- * A common interface for objects that can render ppt picture data.
- * <p>
- * Subclasses can redefine it and use third-party libraries for actual rendering,
- * for example, Bitmaps can be rendered using javax.imageio.* , WMF can be rendered using Apache Batik,
- * PICT can be rendered using Apple QuickTime API for Java, etc.
- * </p>
- *
- * A typical usage is as follows:
- * <code>
- * public WMFPaiter implements ImagePainter{
- *   public void paint(Graphics2D graphics, PictureData pict, Picture parent){
- *       DataInputStream is = new DataInputStream(new ByteArrayInputStream(pict.getData()));
- *       org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore wmfStore =
- *               new org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore();
- *       try {
- *           wmfStore.read(is);
- *       } catch (IOException e){
- *           return;
- *       }
- *
- *       Rectangle anchor = parent.getAnchor();
- *       float scale = (float)anchor.width/wmfStore.getWidthPixels();
- *
- *       org.apache.batik.transcoder.wmf.tosvg.WMFPainter painter =
- *               new org.apache.batik.transcoder.wmf.tosvg.WMFPainter(wmfStore, 0, 0, scale);
- *       graphics.translate(anchor.x, anchor.y);
- *       painter.paint(graphics);
- *   }
- * }
- * PictureData.setImagePainter(Picture.WMF, new WMFPaiter());
- * ...
- * </code>
- * Subsequent calls of Slide.draw(Graphics gr) will use WMFPaiter for WMF images.
- *
- * @author  Yegor Kozlov.
- */
-public interface ImagePainter {
-
-    /**
-     * Paints the specified picture data
-     *
-     * @param graphics  the graphics to paintb into
-     * @param pict      the data to paint
-     * @param parent    the shapes that owns the picture data
-     */
-    public void paint(Graphics2D graphics, PictureData pict, Picture parent);
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java b/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java
index 836a7b9..ed436be 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hslf.blip;
 
-import org.apache.poi.hslf.model.Picture;
+import org.apache.poi.hslf.usermodel.HSLFPictureShape;
 
 /**
  * Represents a JPEG picture data in a PPT file
@@ -32,10 +32,10 @@
     
     /**
      * @return type of  this picture
-     * @see  org.apache.poi.hslf.model.Picture#JPEG
+     * @see  org.apache.poi.hslf.usermodel.HSLFPictureShape#JPEG
      */
     public int getType(){
-        return Picture.JPEG;
+        return HSLFPictureShape.JPEG;
     }
 
     public ColorSpace getColorSpace() {
@@ -81,5 +81,9 @@
             default:
                 throw new IllegalArgumentException(signature+" is not a valid instance/signature value for JPEG");
         }        
-    }    
+    }
+
+    public String getContentType() {
+        return "image/jpeg";
+    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java b/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java
index 163f6da..b9f66ff 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java
@@ -18,7 +18,7 @@
 package org.apache.poi.hslf.blip;
 
 import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hslf.usermodel.PictureData;
+import org.apache.poi.hslf.usermodel.HSLFPictureData;
 
 import java.awt.*;
 import java.io.*;
@@ -30,7 +30,7 @@
  *
  * @author Yegor Kozlov
  */
-public abstract class Metafile extends PictureData {
+public abstract class Metafile extends HSLFPictureData {
 
     /**
      *  A structure which represents a 34-byte header preceeding the compressed metafile data
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java
index 848d994..bebbcf4 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java
@@ -23,8 +23,8 @@
 import java.util.zip.InflaterInputStream;
 
 import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.hslf.model.Picture;
-import org.apache.poi.hslf.model.Shape;
+import org.apache.poi.hslf.usermodel.HSLFPictureShape;
+import org.apache.poi.hslf.usermodel.HSLFShape;
 
 /**
  * Represents Macintosh PICT picture data.
@@ -82,8 +82,8 @@
         header.wmfsize = data.length - 512;
         //we don't have a PICT reader in java, have to set default image size  200x200
         header.bounds = new java.awt.Rectangle(0, 0, 200, 200);
-        header.size = new java.awt.Dimension(header.bounds.width*Shape.EMU_PER_POINT,
-                header.bounds.height*Shape.EMU_PER_POINT);
+        header.size = new java.awt.Dimension(header.bounds.width*HSLFShape.EMU_PER_POINT,
+                header.bounds.height*HSLFShape.EMU_PER_POINT);
         header.zipsize = compressed.length;
 
         byte[] checksum = getChecksum(data);
@@ -98,10 +98,10 @@
     }
 
     /**
-     * @see org.apache.poi.hslf.model.Picture#PICT
+     * @see org.apache.poi.hslf.usermodel.HSLFPictureShape#PICT
      */
     public int getType(){
-        return Picture.PICT;
+        return HSLFPictureShape.PICT;
     }
 
     /**
@@ -128,4 +128,9 @@
                 throw new IllegalArgumentException(signature+" is not a valid instance/signature value for PICT");
         }        
     }
+
+    public String getContentType() {
+        return "image/x-pict";
+    }
+
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java
index b0a08d3..cd61a9b 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hslf.blip;
 
-import org.apache.poi.hslf.model.Picture;
+import org.apache.poi.hslf.usermodel.HSLFPictureShape;
 import org.apache.poi.util.PngUtils;
 
 /**
@@ -46,10 +46,10 @@
 
     /**
      * @return type of  this picture
-     * @see  org.apache.poi.hslf.model.Picture#PNG
+     * @see  org.apache.poi.hslf.usermodel.HSLFPictureShape#PNG
      */
     public int getType(){
-        return Picture.PNG;
+        return HSLFPictureShape.PNG;
     }
 
     /**
@@ -76,4 +76,8 @@
                 throw new IllegalArgumentException(signature+" is not a valid instance/signature value for PNG");
         }        
     }
+
+    public String getContentType() {
+        return "image/png";
+    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java
index 0e8c160..e4f3b39 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java
@@ -19,8 +19,8 @@
 
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.POILogger;
-import org.apache.poi.hslf.model.Picture;
-import org.apache.poi.hslf.model.Shape;
+import org.apache.poi.hslf.usermodel.HSLFPictureShape;
+import org.apache.poi.hslf.usermodel.HSLFShape;
 import org.apache.poi.hslf.exceptions.HSLFException;
 
 import java.io.*;
@@ -78,7 +78,7 @@
         header.wmfsize = data.length - aldus.getSize();
         header.bounds = new java.awt.Rectangle((short)aldus.left, (short)aldus.top, (short)aldus.right-(short)aldus.left, (short)aldus.bottom-(short)aldus.top);
         //coefficient to translate from WMF dpi to 96pdi
-        int coeff = 96*Shape.EMU_PER_POINT/aldus.inch;
+        int coeff = 96*HSLFShape.EMU_PER_POINT/aldus.inch;
         header.size = new java.awt.Dimension(header.bounds.width*coeff, header.bounds.height*coeff);
         header.zipsize = compressed.length;
 
@@ -97,7 +97,7 @@
      * We are of type <code>Picture.WMF</code>
      */
     public int getType(){
-        return Picture.WMF;
+        return HSLFPictureShape.WMF;
     }
 
     /**
@@ -205,4 +205,9 @@
         }
     }
 
+
+    public String getContentType() {
+        return "image/x-wmf";
+    }
+
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java
index f46906f..c26e5ca 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/PPDrawingTextListing.java
@@ -19,6 +19,7 @@
 
 import org.apache.poi.hslf.*;
 import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 
 
 /**
@@ -33,7 +34,7 @@
 			System.exit(1);
 		}
 
-		HSLFSlideShow ss = new HSLFSlideShow(args[0]);
+		HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]);
 
 		// Find PPDrawings at any second level position
 		Record[] records = ss.getRecords();
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java
index 490e3e2..91d6086 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTListing.java
@@ -17,11 +17,11 @@
 
 package org.apache.poi.hslf.dev;
 
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.record.Document;
 import org.apache.poi.hslf.record.Record;
 import org.apache.poi.hslf.record.RecordTypes;
 import org.apache.poi.hslf.record.SlideListWithText;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 
 /**
  * Uses record level code to Documents.
@@ -35,7 +35,7 @@
 			System.exit(1);
 		}
 
-		HSLFSlideShow ss = new HSLFSlideShow(args[0]);
+		HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]);
 
 		// Find the documents, and then their SLWT
 		Record[] records = ss.getRecords();
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java
index 16858aa..0f4f5db 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SLWTTextListing.java
@@ -19,6 +19,7 @@
 
 import org.apache.poi.hslf.*;
 import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 
 /**
  * Uses record level code to locate SlideListWithText entries.
@@ -32,7 +33,7 @@
 			System.exit(1);
 		}
 
-		HSLFSlideShow ss = new HSLFSlideShow(args[0]);
+		HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]);
 
 		// Find the documents, and then their SLWT
 		Record[] records = ss.getRecords();
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java
index 2dd32a4..44c2cd8 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideAndNotesAtomListing.java
@@ -19,6 +19,7 @@
 
 import org.apache.poi.hslf.*;
 import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 
 
 /**
@@ -34,7 +35,7 @@
 			System.exit(1);
 		}
 
-		HSLFSlideShow ss = new HSLFSlideShow(args[0]);
+		HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]);
 		System.out.println("");
 
 		// Find either Slides or Notes
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java
index 010f424..1398175 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideIdListing.java
@@ -20,7 +20,6 @@
 import java.io.ByteArrayOutputStream;
 import java.util.Map;
 
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.record.Document;
 import org.apache.poi.hslf.record.Notes;
 import org.apache.poi.hslf.record.NotesAtom;
@@ -31,7 +30,8 @@
 import org.apache.poi.hslf.record.SlideAtom;
 import org.apache.poi.hslf.record.SlideListWithText;
 import org.apache.poi.hslf.record.SlidePersistAtom;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -50,8 +50,8 @@
 
 
 		// Create the slideshow object, for normal working with
-		HSLFSlideShow hss = new HSLFSlideShow(args[0]);
-		SlideShow ss = new SlideShow(hss);
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(args[0]);
+		HSLFSlideShow ss = new HSLFSlideShow(hss);
 
 		// Grab the base contents
 		fileContents = hss.getUnderlyingBytes();
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java
index 5e122d9..e098d40 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowDumper.java
@@ -28,6 +28,8 @@
 import org.apache.poi.hslf.record.RecordTypes;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.hslf.record.HSLFEscherRecordFactory;
+import org.apache.poi.hslf.record.RecordTypes;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -270,7 +272,7 @@
 
 	byte[] contents = new byte[len];
 	System.arraycopy(_docstream,pos,contents,0,len);
-	DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory();
+	DefaultEscherRecordFactory erf = new HSLFEscherRecordFactory();
 	EscherRecord record = erf.createRecord(contents,0);
 
 	// For now, try filling in the fields
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java
index f2e7b36..fc96644 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/SlideShowRecordDumper.java
@@ -19,20 +19,16 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-
 import java.util.Iterator;
 
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.record.Record;
 import org.apache.poi.util.HexDump;
 import org.apache.poi.ddf.DefaultEscherRecordFactory;
 import org.apache.poi.ddf.EscherRecord;
 import org.apache.poi.ddf.EscherContainerRecord;
 import org.apache.poi.ddf.EscherTextboxRecord;
-import org.apache.poi.hslf.record.EscherTextboxWrapper;
-import org.apache.poi.hslf.record.TextCharsAtom;
-import org.apache.poi.hslf.record.TextBytesAtom;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 
 /**
  * This class provides a way to view the contents of a powerpoint file.
@@ -44,7 +40,7 @@
 public final class SlideShowRecordDumper {
   private boolean optVerbose;
   private boolean optEscher;
-  private HSLFSlideShow doc;
+  private HSLFSlideShowImpl doc;
 
   /**
    *  right now this function takes one parameter: a ppt file, and outputs
@@ -103,7 +99,7 @@
   {
 	optVerbose = verbose;
   	optEscher = escher;
-	doc = new HSLFSlideShow(fileName);
+	doc = new HSLFSlideShowImpl(fileName);
   }
 
 
@@ -264,7 +260,7 @@
 
 		// print additional information for drawings and atoms
 		if (optEscher && cname.equals("PPDrawing")) {
-			DefaultEscherRecordFactory factory = new DefaultEscherRecordFactory();
+			DefaultEscherRecordFactory factory = new HSLFEscherRecordFactory();
 
 			ByteArrayOutputStream baos = new ByteArrayOutputStream();
 			r.writeOut(baos);
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java
index a919f61..14b7706 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/TextStyleListing.java
@@ -17,13 +17,11 @@
 
 package org.apache.poi.hslf.dev;
 
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.textproperties.BitMaskTextProp;
-import org.apache.poi.hslf.model.textproperties.TextProp;
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.*;
+import java.util.List;
 
-import java.util.LinkedList;
+import org.apache.poi.hslf.model.textproperties.*;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 
 /**
  * Uses record level code to locate StyleTextPropAtom entries.
@@ -36,7 +34,7 @@
 			System.exit(1);
 		}
 
-		HSLFSlideShow ss = new HSLFSlideShow(args[0]);
+		HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]);
 
 		// Find the documents, and then their SLWT
 		Record[] records = ss.getRecords();
@@ -72,19 +70,19 @@
 	public static void showStyleTextPropAtom(StyleTextPropAtom stpa) {
 		System.out.println("\nFound a StyleTextPropAtom");
 
-		LinkedList paragraphStyles = stpa.getParagraphStyles();
+		List<TextPropCollection> paragraphStyles = stpa.getParagraphStyles();
 		System.out.println("Contains " + paragraphStyles.size() + " paragraph styles:");
 		for(int i=0; i<paragraphStyles.size(); i++) {
-			TextPropCollection tpc = (TextPropCollection)paragraphStyles.get(i);
+			TextPropCollection tpc = paragraphStyles.get(i);
 			System.out.println(" In paragraph styling " + i + ":");
 			System.out.println("  Characters covered is " + tpc.getCharactersCovered());
 			showTextProps(tpc);
 		}
 
-		LinkedList charStyles = stpa.getCharacterStyles();
+		List<TextPropCollection> charStyles = stpa.getCharacterStyles();
 		System.out.println("Contains " + charStyles.size() + " character styles:");
 		for(int i=0; i<charStyles.size(); i++) {
-			TextPropCollection tpc = (TextPropCollection)charStyles.get(i);
+			TextPropCollection tpc = charStyles.get(i);
 			System.out.println("  In character styling " + i + ":");
 			System.out.println("    Characters covered is " + tpc.getCharactersCovered());
 			showTextProps(tpc);
@@ -92,10 +90,10 @@
 	}
 
 	public static void showTextProps(TextPropCollection tpc) {
-		LinkedList textProps = tpc.getTextPropList();
+		List<TextProp> textProps = tpc.getTextPropList();
 		System.out.println("    Contains " + textProps.size() + " TextProps");
 		for(int i=0; i<textProps.size(); i++) {
-			TextProp tp = (TextProp)textProps.get(i);
+			TextProp tp = textProps.get(i);
 			System.out.println("      " + i + " - " + tp.getName());
 			System.out.println("          = " + tp.getValue());
 			System.out.println("          @ " + tp.getMask());
diff --git a/src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java b/src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java
index 749cfa9..34759ea 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/dev/UserEditAndPersistListing.java
@@ -20,12 +20,12 @@
 import java.io.ByteArrayOutputStream;
 import java.util.Map;
 
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.record.CurrentUserAtom;
 import org.apache.poi.hslf.record.PersistPtrHolder;
 import org.apache.poi.hslf.record.PositionDependentRecord;
 import org.apache.poi.hslf.record.Record;
 import org.apache.poi.hslf.record.UserEditAtom;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -44,7 +44,7 @@
 
 
 		// Create the slideshow object, for normal working with
-		HSLFSlideShow ss = new HSLFSlideShow(args[0]);
+		HSLFSlideShowImpl ss = new HSLFSlideShowImpl(args[0]);
 		fileContents = ss.getUnderlyingBytes();
 		System.out.println("");
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java
index 24d6d90..e90abbb 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java
@@ -17,10 +17,7 @@
 
 package org.apache.poi.hslf.extractor;
 
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.model.Picture;
+import org.apache.poi.hslf.usermodel.*;
 
 import java.io.IOException;
 import java.io.FileOutputStream;
@@ -37,12 +34,12 @@
             System.err.println("\tImageExtractor <file>");
             return;
         }
-        SlideShow ppt = new SlideShow(new HSLFSlideShow(args[0]));
+        HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl(args[0]));
 
         //extract all pictures contained in the presentation
-        PictureData[] pdata = ppt.getPictureData();
+        HSLFPictureData[] pdata = ppt.getPictureData();
         for (int i = 0; i < pdata.length; i++) {
-            PictureData pict = pdata[i];
+            HSLFPictureData pict = pdata[i];
 
             // picture data
             byte[] data = pict.getData();
@@ -50,22 +47,22 @@
             int type = pict.getType();
             String ext;
             switch (type) {
-                case Picture.JPEG:
+                case HSLFPictureShape.JPEG:
                     ext = ".jpg";
                     break;
-                case Picture.PNG:
+                case HSLFPictureShape.PNG:
                     ext = ".png";
                     break;
-                case Picture.WMF:
+                case HSLFPictureShape.WMF:
                     ext = ".wmf";
                     break;
-                case Picture.EMF:
+                case HSLFPictureShape.EMF:
                     ext = ".emf";
                     break;
-                case Picture.PICT:
+                case HSLFPictureShape.PICT:
                     ext = ".pict";
                     break;
-                case Picture.DIB:
+                case HSLFPictureShape.DIB:
                     ext = ".dib";
                     break;
                 default:
diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java
index 908bb44..e3beebf 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java
@@ -17,21 +17,13 @@
 
 package org.apache.poi.hslf.extractor;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashSet;
-import java.util.List;
-import java.util.ArrayList;
+import java.io.*;
+import java.util.*;
 
 import org.apache.poi.POIOLE2TextExtractor;
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.model.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.poifs.filesystem.DirectoryNode;
-import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.poifs.filesystem.*;
 
 /**
  * This class can be used to extract text from a PowerPoint file. Can optionally
@@ -40,9 +32,9 @@
  * @author Nick Burch
  */
 public final class PowerPointExtractor extends POIOLE2TextExtractor {
-   private HSLFSlideShow _hslfshow;
-   private SlideShow _show;
-   private Slide[] _slides;
+   private HSLFSlideShowImpl _hslfshow;
+   private HSLFSlideShow _show;
+   private List<HSLFSlide> _slides;
 
    private boolean _slidesByDefault = true;
    private boolean _notesByDefault = false;
@@ -76,6 +68,7 @@
 
 		PowerPointExtractor ppe = new PowerPointExtractor(file);
 		System.out.println(ppe.getText(true, notes, comments, master));
+		ppe.close();
 	}
 
 	/**
@@ -93,7 +86,7 @@
 	 * @param iStream The input stream containing the PowerPoint document
 	 */
 	public PowerPointExtractor(InputStream iStream) throws IOException {
-		this(new NPOIFSFileSystem(iStream));
+		this(new POIFSFileSystem(iStream));
 	}
 
 	/**
@@ -121,18 +114,26 @@
     * @param dir the POIFS Directory containing the PowerPoint document
     */
    public PowerPointExtractor(DirectoryNode dir) throws IOException {
-      this(new HSLFSlideShow(dir));
+      this(new HSLFSlideShowImpl(dir));
    }
 
+   /**
+    * @deprecated Use {@link #PowerPointExtractor(DirectoryNode)} instead
+    */
+   @Deprecated
+	public PowerPointExtractor(DirectoryNode dir, POIFSFileSystem fs) throws IOException {
+		this(new HSLFSlideShowImpl(dir, fs));
+	}
+
 	/**
 	 * Creates a PowerPointExtractor, from a HSLFSlideShow
 	 *
 	 * @param ss the HSLFSlideShow to extract text from
 	 */
-	public PowerPointExtractor(HSLFSlideShow ss) {
+	public PowerPointExtractor(HSLFSlideShowImpl ss) {
 		super(ss);
 		_hslfshow = ss;
-		_show = new SlideShow(_hslfshow);
+		_show = new HSLFSlideShow(_hslfshow);
 		_slides = _show.getSlides();
 	}
 
@@ -182,13 +183,10 @@
 	public List<OLEShape> getOLEShapes() {
 		List<OLEShape> list = new ArrayList<OLEShape>();
 
-		for (int i = 0; i < _slides.length; i++) {
-			Slide slide = _slides[i];
-
-			Shape[] shapes = slide.getShapes();
-			for (int j = 0; j < shapes.length; j++) {
-				if (shapes[j] instanceof OLEShape) {
-					list.add((OLEShape) shapes[j]);
+		for (HSLFSlide slide : _slides) {
+			for (HSLFShape shape : slide.getShapes()) {
+				if (shape instanceof OLEShape) {
+					list.add((OLEShape) shape);
 				}
 			}
 		}
@@ -213,16 +211,16 @@
 
 		if (getSlideText) {
             if (getMasterText) {
-                for (SlideMaster master : _show.getSlidesMasters()) {
-                    for(Shape sh : master.getShapes()){
-                        if(sh instanceof TextShape){
-                            if(MasterSheet.isPlaceholder(sh)) {
+                for (HSLFSlideMaster master : _show.getSlideMasters()) {
+                    for(HSLFShape sh : master.getShapes()){
+                        if(sh instanceof HSLFTextShape){
+                            if(HSLFMasterSheet.isPlaceholder(sh)) {
                                 // don't bother about boiler
                                 // plate text on master
                                 // sheets
                                 continue;
                             }
-                            TextShape tsh = (TextShape)sh;
+                            HSLFTextShape tsh = (HSLFTextShape)sh;
                             String text = tsh.getText();
                             if (text != null){
                                 ret.append(text);
@@ -235,8 +233,8 @@
                 }
             }
 
-            for (int i = 0; i < _slides.length; i++) {
-				Slide slide = _slides[i];
+            for (int i = 0; i < _slides.size(); i++) {
+				HSLFSlide slide = _slides.get(i);
 
 				// Slide header, if set
 				HeadersFooters hf = slide.getHeadersFooters();
@@ -245,12 +243,12 @@
 				}
 
 				// Slide text
-                textRunsToText(ret, slide.getTextRuns());
+                textRunsToText(ret, slide.getTextParagraphs());
 
                 // Table text
-                for (Shape shape : slide.getShapes()){
-                    if (shape instanceof Table){
-                        extractTableText(ret, (Table)shape);
+                for (HSLFShape shape : slide.getShapes()){
+                    if (shape instanceof HSLFTable){
+                        extractTableText(ret, (HSLFTable)shape);
                     }
                 }
                 // Slide footer, if set
@@ -278,8 +276,8 @@
 			HashSet<Integer> seenNotes = new HashSet<Integer>();
 			HeadersFooters hf = _show.getNotesHeadersFooters();
 
-			for (int i = 0; i < _slides.length; i++) {
-				Notes notes = _slides[i].getNotesSheet();
+			for (int i = 0; i < _slides.size(); i++) {
+				HSLFNotes notes = _slides.get(i).getNotes();
 				if (notes == null) {
 					continue;
 				}
@@ -295,7 +293,7 @@
 				}
 
 				// Notes text
-                textRunsToText(ret, notes.getTextRuns());
+                textRunsToText(ret, notes.getTextParagraphs());
 
 				// Repeat the notes footer, if set
 				if (hf != null && hf.isFooterVisible() && hf.getFooterText() != null) {
@@ -307,10 +305,10 @@
 		return ret.toString();
 	}
 
-    private void extractTableText(StringBuffer ret, Table table) {
+    private void extractTableText(StringBuffer ret, HSLFTable table) {
         for (int row = 0; row < table.getNumberOfRows(); row++){
             for (int col = 0; col < table.getNumberOfColumns(); col++){
-                TableCell cell = table.getCell(row, col);
+                HSLFTableCell cell = table.getCell(row, col);
                 //defensive null checks; don't know if they're necessary
                 if (cell != null){
                     String txt = cell.getText();
@@ -324,19 +322,15 @@
             ret.append('\n');
         }
     }
-    private void textRunsToText(StringBuffer ret, TextRun[] runs) {
-        if (runs==null) {
+    private void textRunsToText(StringBuffer ret, List<List<HSLFTextParagraph>> paragraphs) {
+        if (paragraphs==null) {
             return;
         }
 
-        for (int j = 0; j < runs.length; j++) {
-            TextRun run = runs[j];
-            if (run != null) {
-                String text = run.getText();
-                ret.append(text);
-                if (!text.endsWith("\n")) {
-                    ret.append("\n");
-                }
+        for (List<HSLFTextParagraph> lp : paragraphs) {
+            ret.append(HSLFTextParagraph.getText(lp));
+            if (ret.length() > 0 && ret.charAt(ret.length()-1) != '\n') {
+                ret.append("\n");
             }
         }
     }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java
index 45ca0ce..8396ae1 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/QuickButCruddyTextExtractor.java
@@ -17,20 +17,16 @@
 
 package org.apache.poi.hslf.extractor;
 
+import java.io.*;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.poi.hslf.model.TextRun;
-import org.apache.poi.hslf.record.CString;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordTypes;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextBytesAtom;
-import org.apache.poi.hslf.record.TextCharsAtom;
-import org.apache.poi.hslf.record.TextHeaderAtom;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.HSLFTextParagraph;
+import org.apache.poi.hslf.usermodel.HSLFTextShape;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.util.LittleEndian;
@@ -172,18 +168,19 @@
 		}
 
 		// Otherwise, check the type to see if it's text
-		long type = LittleEndian.getUShort(pptContents,startPos+2);
-		TextRun trun = null;
+		int type = LittleEndian.getUShort(pptContents,startPos+2);
 
 		// TextBytesAtom
 		if(type == RecordTypes.TextBytesAtom.typeID) {
 			TextBytesAtom tba = (TextBytesAtom)Record.createRecordForType(type, pptContents, startPos, len+8);
-			trun = new TextRun((TextHeaderAtom)null,tba,(StyleTextPropAtom)null);
+			String text = HSLFTextParagraph.toExternalString(tba.getText(), -1);
+			textV.add(text);
 		}
 		// TextCharsAtom
 		if(type == RecordTypes.TextCharsAtom.typeID) {
 			TextCharsAtom tca = (TextCharsAtom)Record.createRecordForType(type, pptContents, startPos, len+8);
-			trun = new TextRun((TextHeaderAtom)null,tca,(StyleTextPropAtom)null);
+            String text = HSLFTextParagraph.toExternalString(tca.getText(), -1);
+            textV.add(text);
 		}
 
 		// CString (doesn't go via a TextRun)
@@ -199,10 +196,6 @@
 			}
 		}
 
-		// If we found text via a TextRun, save it in the vector
-		if(trun != null) {
-			textV.add(trun.getText());
-		}
 
 		// Wind on by the atom length, and check we're not at the end
 		int newPos = (startPos + 8 + len);
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java
index 525f673..567b829 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/ActiveXShape.java
@@ -34,6 +34,9 @@
 import org.apache.poi.hslf.record.OEShapeAtom;
 import org.apache.poi.hslf.record.Record;
 import org.apache.poi.hslf.record.RecordTypes;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.ShapeContainer;
+import org.apache.poi.sl.usermodel.ShapeType;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.StringUtil;
 
@@ -43,7 +46,7 @@
  * TODO: finish
  * @author Yegor Kozlov
  */
-public final class ActiveXShape extends Picture {
+public final class ActiveXShape extends HSLFPictureShape {
     public static final int DEFAULT_ACTIVEX_THUMBNAIL = -1;
 
     /**
@@ -63,7 +66,7 @@
       *        this picture in the <code>Slide</code>
       * @param parent the parent shape of this picture
       */
-     protected ActiveXShape(EscherContainerRecord escherRecord, Shape parent){
+     protected ActiveXShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
@@ -78,7 +81,7 @@
         EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
         spRecord.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HASSHAPETYPE | EscherSpRecord.FLAG_OLESHAPE);
 
-        setShapeType(ShapeTypes.HostControl);
+        setShapeType(ShapeType.HOST_CONTROL);
         setEscherProperty(EscherProperties.BLIP__PICTUREID, idx);
         setEscherProperty(EscherProperties.LINESTYLE__COLOR, 0x8000001);
         setEscherProperty(EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x80008);
@@ -106,7 +109,7 @@
     /**
      * Assign a control to this shape
      *
-     * @see org.apache.poi.hslf.usermodel.SlideShow#addMovie(String, int)
+     * @see org.apache.poi.hslf.usermodel.HSLFSlideShow#addMovie(String, int)
      * @param idx  the index of the movie
      */
     public void setActiveXIndex(int idx){
@@ -162,7 +165,7 @@
         return ctrl;
     }
 
-    protected void afterInsert(Sheet sheet){
+    protected void afterInsert(HSLFSheet sheet){
         ExControl ctrl = getExControl();
         ctrl.getExControlAtom().setSlideId(sheet._getSheetNumber());
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java b/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java
deleted file mode 100644
index 02b20fb..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShapes.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Arc2D;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.geom.Rectangle2D;
-import java.awt.geom.RoundRectangle2D;
-
-import org.apache.poi.ddf.EscherProperties;
-
-/**
- * Stores definition of auto-shapes.
- * See the Office Drawing 97-2007 Binary Format Specification for details.
- *
- * TODO: follow the spec and define all the auto-shapes
- *
- * @author Yegor Kozlov
- */
-public final class AutoShapes {
-	protected static final ShapeOutline[] shapes;
-
-
-    /**
-     * Return shape outline by shape type
-     * @param type shape type see {@link ShapeTypes}
-     *
-     * @return the shape outline
-     */
-    public static ShapeOutline getShapeOutline(int type){
-        ShapeOutline outline = shapes[type];
-        return outline;
-    }
-
-    /**
-     * Auto-shapes are defined in the [0,21600] coordinate system.
-     * We need to transform it into normal slide coordinates
-     *
-    */
-    public static java.awt.Shape transform(java.awt.Shape outline, Rectangle2D anchor){
-        AffineTransform at = new AffineTransform();
-        at.translate(anchor.getX(), anchor.getY());
-        at.scale(
-                1.0f/21600*anchor.getWidth(),
-                1.0f/21600*anchor.getHeight()
-        );
-        return at.createTransformedShape(outline);
-    }
-
-    static {
-        shapes = new ShapeOutline[255];
-
-        shapes[ShapeTypes.Rectangle] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600);
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.RoundRectangle] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
-                RoundRectangle2D path = new RoundRectangle2D.Float(0, 0, 21600, 21600, adjval, adjval);
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Ellipse] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600);
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Diamond] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                GeneralPath path = new GeneralPath();
-                path.moveTo(10800, 0);
-                path.lineTo(21600, 10800);
-                path.lineTo(10800, 21600);
-                path.lineTo(0, 10800);
-                path.closePath();
-                return path;
-           }
-        };
-
-        //m@0,l,21600r21600
-        shapes[ShapeTypes.IsocelesTriangle] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 10800);
-                GeneralPath path = new GeneralPath();
-                path.moveTo(adjval, 0);
-                path.lineTo(0, 21600);
-                path.lineTo(21600, 21600);
-                path.closePath();
-                return path;
-           }
-        };
-
-        shapes[ShapeTypes.RightTriangle] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                GeneralPath path = new GeneralPath();
-                path.moveTo(0, 0);
-                path.lineTo(21600, 21600);
-                path.lineTo(0, 21600);
-                path.closePath();
-                return path;
-           }
-        };
-
-        shapes[ShapeTypes.Parallelogram] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
-
-                GeneralPath path = new GeneralPath();
-                path.moveTo(adjval, 0);
-                path.lineTo(21600, 0);
-                path.lineTo(21600 - adjval, 21600);
-                path.lineTo(0, 21600);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Trapezoid] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
-
-                GeneralPath path = new GeneralPath();
-                path.moveTo(0, 0);
-                path.lineTo(adjval, 21600);
-                path.lineTo(21600 - adjval, 21600);
-                path.lineTo(21600, 0);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Hexagon] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
-
-                GeneralPath path = new GeneralPath();
-                path.moveTo(adjval, 0);
-                path.lineTo(21600 - adjval, 0);
-                path.lineTo(21600, 10800);
-                path.lineTo(21600 - adjval, 21600);
-                path.lineTo(adjval, 21600);
-                path.lineTo(0, 10800);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Octagon] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 6326);
-
-                GeneralPath path = new GeneralPath();
-                path.moveTo(adjval, 0);
-                path.lineTo(21600 - adjval, 0);
-                path.lineTo(21600, adjval);
-                path.lineTo(21600, 21600-adjval);
-                path.lineTo(21600-adjval, 21600);
-                path.lineTo(adjval, 21600);
-                path.lineTo(0, 21600-adjval);
-                path.lineTo(0, adjval);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Plus] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
-
-                GeneralPath path = new GeneralPath();
-                path.moveTo(adjval, 0);
-                path.lineTo(21600 - adjval, 0);
-                path.lineTo(21600 - adjval, adjval);
-                path.lineTo(21600, adjval);
-                path.lineTo(21600, 21600-adjval);
-                path.lineTo(21600-adjval, 21600-adjval);
-                path.lineTo(21600-adjval, 21600);
-                path.lineTo(adjval, 21600);
-                path.lineTo(adjval, 21600-adjval);
-                path.lineTo(0, 21600-adjval);
-                path.lineTo(0, adjval);
-                path.lineTo(adjval, adjval);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Pentagon] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-
-                GeneralPath path = new GeneralPath();
-                path.moveTo(10800, 0);
-                path.lineTo(21600, 8259);
-                path.lineTo(21600 - 4200, 21600);
-                path.lineTo(4200, 21600);
-                path.lineTo(0, 8259);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.DownArrow] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                //m0@0 l@1@0 @1,0 @2,0 @2@0,21600@0,10800,21600xe
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200);
-                int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
-                GeneralPath path = new GeneralPath();
-                path.moveTo(0, adjval);
-                path.lineTo(adjval2, adjval);
-                path.lineTo(adjval2, 0);
-                path.lineTo(21600-adjval2, 0);
-                path.lineTo(21600-adjval2, adjval);
-                path.lineTo(21600, adjval);
-                path.lineTo(10800, 21600);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.UpArrow] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                //m0@0 l@1@0 @1,21600@2,21600@2@0,21600@0,10800,xe
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
-                int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
-                GeneralPath path = new GeneralPath();
-                path.moveTo(0, adjval);
-                path.lineTo(adjval2, adjval);
-                path.lineTo(adjval2, 21600);
-                path.lineTo(21600-adjval2, 21600);
-                path.lineTo(21600-adjval2, adjval);
-                path.lineTo(21600, adjval);
-                path.lineTo(10800, 0);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Arrow] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                //m@0, l@0@1 ,0@1,0@2@0@2@0,21600,21600,10800xe
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200);
-                int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
-                GeneralPath path = new GeneralPath();
-                path.moveTo(adjval, 0);
-                path.lineTo(adjval, adjval2);
-                path.lineTo(0, adjval2);
-                path.lineTo(0, 21600-adjval2);
-                path.lineTo(adjval, 21600-adjval2);
-                path.lineTo(adjval, 21600);
-                path.lineTo(21600, 10800);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.LeftArrow] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                //m@0, l@0@1,21600@1,21600@2@0@2@0,21600,,10800xe
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
-                int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
-                GeneralPath path = new GeneralPath();
-                path.moveTo(adjval, 0);
-                path.lineTo(adjval, adjval2);
-                path.lineTo(21600, adjval2);
-                path.lineTo(21600, 21600-adjval2);
-                path.lineTo(adjval, 21600-adjval2);
-                path.lineTo(adjval, 21600);
-                path.lineTo(0, 10800);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.Can] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                //m10800,qx0@1l0@2qy10800,21600,21600@2l21600@1qy10800,xem0@1qy10800@0,21600@1nfe
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
-
-                GeneralPath path = new GeneralPath();
-
-                path.append(new Arc2D.Float(0, 0, 21600, adjval, 0, 180, Arc2D.OPEN), false);
-                path.moveTo(0, adjval/2);
-
-                path.lineTo(0, 21600 - adjval/2);
-                path.closePath();
-
-                path.append(new Arc2D.Float(0, 21600 - adjval, 21600, adjval, 180, 180, Arc2D.OPEN), false);
-                path.moveTo(21600, 21600 - adjval/2);
-
-                path.lineTo(21600, adjval/2);
-                path.append(new Arc2D.Float(0, 0, 21600, adjval, 180, 180, Arc2D.OPEN), false);
-                path.moveTo(0, adjval/2);
-                path.closePath();
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.LeftBrace] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                //m21600,qx10800@0l10800@2qy0@11,10800@3l10800@1qy21600,21600e
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800);
-                int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800);
-
-                GeneralPath path = new GeneralPath();
-                path.moveTo(21600, 0);
-
-                path.append(new Arc2D.Float(10800, 0, 21600, adjval*2, 90, 90, Arc2D.OPEN), false);
-                path.moveTo(10800, adjval);
-
-                path.lineTo(10800, adjval2 - adjval);
-
-                path.append(new Arc2D.Float(-10800, adjval2 - 2*adjval, 21600, adjval*2, 270, 90, Arc2D.OPEN), false);
-                path.moveTo(0, adjval2);
-
-                path.append(new Arc2D.Float(-10800, adjval2, 21600, adjval*2, 0, 90, Arc2D.OPEN), false);
-                path.moveTo(10800, adjval2 + adjval);
-
-                path.lineTo(10800, 21600 - adjval);
-
-                path.append(new Arc2D.Float(10800, 21600 - 2*adjval, 21600, adjval*2, 180, 90, Arc2D.OPEN), false);
-
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.RightBrace] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                //m,qx10800@0 l10800@2qy21600@11,10800@3l10800@1qy,21600e
-                int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800);
-                int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800);
-
-                GeneralPath path = new GeneralPath();
-                path.moveTo(0, 0);
-
-                path.append(new Arc2D.Float(-10800, 0, 21600, adjval*2, 0, 90, Arc2D.OPEN), false);
-                path.moveTo(10800, adjval);
-
-                path.lineTo(10800, adjval2 - adjval);
-
-                path.append(new Arc2D.Float(10800, adjval2 - 2*adjval, 21600, adjval*2, 180, 90, Arc2D.OPEN), false);
-                path.moveTo(21600, adjval2);
-
-                path.append(new Arc2D.Float(10800, adjval2, 21600, adjval*2, 90, 90, Arc2D.OPEN), false);
-                path.moveTo(10800, adjval2 + adjval);
-
-                path.lineTo(10800, 21600 - adjval);
-
-                path.append(new Arc2D.Float(-10800, 21600 - 2*adjval, 21600, adjval*2, 270, 90, Arc2D.OPEN), false);
-
-                return path;
-            }
-        };
-
-        shapes[ShapeTypes.StraightConnector1] = new ShapeOutline(){
-            public java.awt.Shape getOutline(Shape shape){
-                return new Line2D.Float(0, 0, 21600, 21600);
-            }
-        };
-
-
-    }
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Background.java b/src/scratchpad/src/org/apache/poi/hslf/model/Background.java
deleted file mode 100644
index 531f2da..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Background.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.blip.Bitmap;
-import org.apache.poi.util.POILogger;
-
-import javax.imageio.ImageIO;
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-
-/**
- * Background shape
- *
- * @author Yegor Kozlov
- */
-public final class Background extends Shape {
-
-    protected Background(EscherContainerRecord escherRecord, Shape parent) {
-        super(escherRecord, parent);
-    }
-
-    protected EscherContainerRecord createSpContainer(boolean isChild) {
-        return null;
-    }
-
-    public void draw(Graphics2D graphics) {
-        Fill f = getFill();
-        Dimension pg = getSheet().getSlideShow().getPageSize();
-        Rectangle anchor = new Rectangle(0, 0, pg.width, pg.height);
-        switch (f.getFillType()) {
-            case Fill.FILL_SOLID:
-                Color color = f.getForegroundColor();
-                graphics.setPaint(color);
-                graphics.fill(anchor);
-                break;
-            case Fill.FILL_PICTURE:
-                PictureData data = f.getPictureData();
-                if (data instanceof Bitmap) {
-                    BufferedImage img = null;
-                    try {
-                        img = ImageIO.read(new ByteArrayInputStream(data.getData()));
-                    } catch (Exception e) {
-                        logger.log(POILogger.WARN, "ImageIO failed to create image. image.type: " + data.getType());
-                        return;
-                    }
-                    Image scaledImg = img.getScaledInstance(anchor.width, anchor.height, Image.SCALE_SMOOTH);
-                    graphics.drawImage(scaledImg, anchor.x, anchor.y, null);
-
-                }
-                break;
-            default:
-                logger.log(POILogger.WARN, "unsuported fill type: " + f.getFillType());
-                break;
-        }
-    }
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java b/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java
index 8bb441e..63ec3d7 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/HeadersFooters.java
@@ -18,7 +18,7 @@
 package org.apache.poi.hslf.model;
 
 import org.apache.poi.hslf.record.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.*;
 
 /**
  * Header / Footer settings.
@@ -31,19 +31,19 @@
 
     private HeadersFootersContainer _container;
     private boolean _newRecord;
-    private SlideShow _ppt;
-    private Sheet _sheet;
+    private HSLFSlideShow _ppt;
+    private HSLFSheet _sheet;
     private boolean _ppt2007;
 
 
-    public HeadersFooters(HeadersFootersContainer rec, SlideShow ppt, boolean newRecord, boolean isPpt2007){
+    public HeadersFooters(HeadersFootersContainer rec, HSLFSlideShow ppt, boolean newRecord, boolean isPpt2007){
         _container = rec;
         _newRecord = newRecord;
         _ppt = ppt;
         _ppt2007 = isPpt2007;
     }
 
-    public HeadersFooters(HeadersFootersContainer rec, Sheet sheet, boolean newRecord, boolean isPpt2007){
+    public HeadersFooters(HeadersFootersContainer rec, HSLFSheet sheet, boolean newRecord, boolean isPpt2007){
         _container = rec;
         _newRecord = newRecord;
         _sheet = sheet;
@@ -240,8 +240,8 @@
     private boolean isVisible(int flag, int placeholderId){
         boolean visible;
         if(_ppt2007){
-            Sheet master = _sheet != null ? _sheet : _ppt.getSlidesMasters()[0];
-            TextShape placeholder = master.getPlaceholder(placeholderId);
+            HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlideMasters().get(0);
+            HSLFTextShape placeholder = master.getPlaceholder(placeholderId);
             visible = placeholder != null && placeholder.getText() != null;
         } else {
             visible = _container.getHeadersFootersAtom().getFlag(flag);
@@ -252,8 +252,8 @@
     private String getPlaceholderText(int placeholderId, CString cs){
         String text = null;
         if(_ppt2007){
-            Sheet master = _sheet != null ? _sheet : _ppt.getSlidesMasters()[0];
-            TextShape placeholder = master.getPlaceholder(placeholderId);
+            HSLFSheet master = _sheet != null ? _sheet : _ppt.getSlideMasters().get(0);
+            HSLFTextShape placeholder = master.getPlaceholder(placeholderId);
             if(placeholder != null) text = placeholder.getText();
 
             //default text in master placeholders is not visible
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java
index 2a23d24..67b12be 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Line.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/Line.java
@@ -18,90 +18,23 @@
 package org.apache.poi.hslf.model;
 
 import org.apache.poi.ddf.*;
-
-import java.awt.geom.Rectangle2D;
-import java.awt.geom.Line2D;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.ShapeContainer;
+import org.apache.poi.sl.usermodel.ShapeType;
 
 /**
  * Represents a line in a PowerPoint drawing
  *
  *  @author Yegor Kozlov
  */
-public final class Line extends SimpleShape {
-    /**
-    * Solid (continuous) pen
-    */
-    public static final int PEN_SOLID = 1;
-    /**
-     *  PS_DASH system   dash style
-     */
-    public static final int PEN_PS_DASH = 2;
-    /**
-     *  PS_DOT system   dash style
-     */
-    public static final int PEN_DOT = 3;
-    /**
-     * PS_DASHDOT system dash style
-     */
-    public static final int PEN_DASHDOT = 4;
-    /**
-     * PS_DASHDOTDOT system dash style
-     */
-    public static final int PEN_DASHDOTDOT = 5;
-    /**
-     *  square dot style
-     */
-    public static final int PEN_DOTGEL = 6;
-    /**
-     *  dash style
-     */
-    public static final int PEN_DASH = 7;
-    /**
-     *  long dash style
-     */
-    public static final int PEN_LONGDASHGEL = 8;
-    /**
-     * dash short dash
-     */
-    public static final int PEN_DASHDOTGEL = 9;
-    /**
-     * long dash short dash
-     */
-    public static final int PEN_LONGDASHDOTGEL = 10;
-    /**
-     * long dash short dash short dash
-     */
-    public static final int PEN_LONGDASHDOTDOTGEL = 11;
-
-    /**
-     *  Single line (of width lineWidth)
-     */
-    public static final int LINE_SIMPLE = 0;
-    /**
-     * Double lines of equal width
-     */
-    public static final int LINE_DOUBLE = 1;
-    /**
-     * Double lines, one thick, one thin
-     */
-    public static final int LINE_THICKTHIN = 2;
-    /**
-     *  Double lines, reverse order
-     */
-    public static final int LINE_THINTHICK = 3;
-    /**
-     * Three lines, thin, thick, thin
-     */
-    public static final int LINE_TRIPLE = 4;
-
-
-    protected Line(EscherContainerRecord escherRecord, Shape parent){
+public final class Line extends HSLFSimpleShape {
+    public Line(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
-    public Line(Shape parent){
+    public Line(ShapeContainer<HSLFShape> parent){
         super(null, parent);
-        _escherContainer = createSpContainer(parent instanceof ShapeGroup);
+        _escherContainer = createSpContainer(parent instanceof HSLFGroupShape);
     }
 
     public Line(){
@@ -110,9 +43,11 @@
 
     protected EscherContainerRecord createSpContainer(boolean isChild){
         _escherContainer = super.createSpContainer(isChild);
+        
+        setShapeType(ShapeType.LINE);
 
         EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
-        short type = (ShapeTypes.Line << 4) | 0x2;
+        short type = (short)((ShapeType.LINE.nativeId << 4) | 0x2);
         spRecord.setOptions(type);
 
         //set default properties for a line
@@ -128,9 +63,24 @@
 
         return _escherContainer;
     }
-
-    public java.awt.Shape getOutline(){
-        Rectangle2D anchor = getLogicalAnchor2D();
-        return new Line2D.Double(anchor.getX(), anchor.getY(), anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight());
+    
+    /**
+     * Sets the orientation of the line, if inverse is false, then line goes
+     * from top-left to bottom-right, otherwise use inverse equals true 
+     *
+     * @param inverse the orientation of the line
+     */
+    public void setInverse(boolean inverse) {
+        setShapeType(inverse ? ShapeType.LINE_INV : ShapeType.LINE);
+    }
+    
+    /**
+     * Gets the orientation of the line, if inverse is false, then line goes
+     * from top-left to bottom-right, otherwise inverse equals true 
+     *
+     * @return inverse the orientation of the line
+     */
+    public boolean isInverse() {
+        return (getShapeType() == ShapeType.LINE_INV);
     }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java
index 93e8a12..27b0000 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/MovieShape.java
@@ -24,14 +24,15 @@
 import org.apache.poi.ddf.EscherProperties;
 import org.apache.poi.hslf.exceptions.HSLFException;
 import org.apache.poi.hslf.record.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.ShapeContainer;
 
 /**
  * Represents a movie in a PowerPoint document.
  *
  * @author Yegor Kozlov
  */
-public final class MovieShape extends Picture {
+public final class MovieShape extends HSLFPictureShape {
     public static final int DEFAULT_MOVIE_THUMBNAIL = -1;
 
     public static final int MOVIE_MPEG = 1;
@@ -54,7 +55,7 @@
      * @param idx the index of the picture
      * @param parent the parent shape
      */
-    public MovieShape(int movieIdx, int idx, Shape parent) {
+    public MovieShape(int movieIdx, int idx, ShapeContainer<HSLFShape> parent) {
         super(idx, parent);
         setMovieIndex(movieIdx);
     }
@@ -66,7 +67,7 @@
       *        this picture in the <code>Slide</code>
       * @param parent the parent shape of this picture
       */
-     protected MovieShape(EscherContainerRecord escherRecord, Shape parent){
+    public MovieShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
@@ -112,7 +113,7 @@
     /**
      * Assign a movie to this shape
      *
-     * @see org.apache.poi.hslf.usermodel.SlideShow#addMovie(String, int)
+     * @see org.apache.poi.hslf.usermodel.HSLFSlideShow#addMovie(String, int)
      * @param idx  the index of the movie
      */
     public void setMovieIndex(int idx){
@@ -153,7 +154,7 @@
         OEShapeAtom oe = getClientDataRecord(RecordTypes.OEShapeAtom.typeID);
         int idx = oe.getOptions();
 
-        SlideShow ppt = getSheet().getSlideShow();
+        HSLFSlideShow ppt = getSheet().getSlideShow();
         ExObjList lst = (ExObjList)ppt.getDocumentRecord().findFirstOfType(RecordTypes.ExObjList.typeID);
         if(lst == null) return null;
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java b/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java
deleted file mode 100644
index cdb0503..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Notes.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-/**
- * This class represents a slide's notes in a PowerPoint Document. It
- *  allows access to the text within, and the layout. For now, it only
- *  does the text side of things though
- *
- * @author Nick Burch
- */
-
-public final class Notes extends Sheet
-{
-  private TextRun[] _runs;
-
-  /**
-   * Constructs a Notes Sheet from the given Notes record.
-   * Initialises TextRuns, to provide easier access to the text
-   *
-   * @param notes the Notes record to read from
-   */
-  public Notes (org.apache.poi.hslf.record.Notes notes) {
-      super(notes, notes.getNotesAtom().getSlideID());
-
-	// Now, build up TextRuns from pairs of TextHeaderAtom and
-	//  one of TextBytesAtom or TextCharsAtom, found inside
-	//  EscherTextboxWrapper's in the PPDrawing
-	_runs = findTextRuns(getPPDrawing());
-
-	// Set the sheet on each TextRun
-	for (int i = 0; i < _runs.length; i++)
-		_runs[i].setSheet(this);
-  }
-
-
-  // Accesser methods follow
-
-  /**
-   * Returns an array of all the TextRuns found
-   */
-  public TextRun[] getTextRuns() { return _runs; }
-
-    /**
-     * Return <code>null</code> - Notes Masters are not yet supported
-     */
-    public MasterSheet getMasterSheet() {
-        return null;
-    }
-
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java
index 659b340..be680bf 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/OLEShape.java
@@ -18,12 +18,12 @@
 package org.apache.poi.hslf.model;
 
 import org.apache.poi.ddf.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.ObjectData;
+import org.apache.poi.hslf.usermodel.*;
 import org.apache.poi.hslf.record.ExObjList;
 import org.apache.poi.hslf.record.Record;
 import org.apache.poi.hslf.record.ExEmbed;
 import org.apache.poi.hslf.record.RecordTypes;
+import org.apache.poi.sl.usermodel.ShapeContainer;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.POILogger;
 
@@ -33,7 +33,7 @@
  *
  * @author Yegor Kozlov
  */
-public final class OLEShape extends Picture {
+public final class OLEShape extends HSLFPictureShape {
     protected ExEmbed _exEmbed;
 
     /**
@@ -51,7 +51,7 @@
      * @param idx the index of the picture
      * @param parent the parent shape
      */
-    public OLEShape(int idx, Shape parent) {
+    public OLEShape(int idx, ShapeContainer<HSLFShape> parent) {
         super(idx, parent);
     }
 
@@ -62,7 +62,7 @@
       *        this picture in the <code>Slide</code>
       * @param parent the parent shape of this picture
       */
-     protected OLEShape(EscherContainerRecord escherRecord, Shape parent){
+    public OLEShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
@@ -116,13 +116,13 @@
      *
      * @return the unique identifier for the OLE object
      */
-    public ObjectData getObjectData(){
-        SlideShow ppt = getSheet().getSlideShow();
-        ObjectData[] ole = ppt.getEmbeddedObjects();
+    public HSLFObjectData getObjectData(){
+        HSLFSlideShow ppt = getSheet().getSlideShow();
+        HSLFObjectData[] ole = ppt.getEmbeddedObjects();
 
         //persist reference
         ExEmbed exEmbed = getExEmbed();
-        ObjectData data = null;
+        HSLFObjectData data = null;
         if(exEmbed != null) {
             int ref = exEmbed.getExOleObjAtom().getObjStgDataRef();
 
@@ -155,7 +155,7 @@
      */
     public ExEmbed getExEmbed(){
         if(_exEmbed == null){
-            SlideShow ppt = getSheet().getSlideShow();
+            HSLFSlideShow ppt = getSheet().getSlideShow();
 
             ExObjList lst = ppt.getDocumentRecord().getExObjList();
             if(lst == null){
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java
index 99acb33..3b22227 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java
@@ -19,19 +19,20 @@
 
 
 import java.awt.*;
-import java.awt.Shape;
-import java.awt.font.FontRenderContext;
-import java.awt.font.GlyphVector;
-import java.awt.font.TextLayout;
+import java.awt.font.*;
+import java.awt.geom.*;
 import java.awt.image.*;
 import java.awt.image.renderable.RenderableImage;
-import java.awt.geom.*;
 import java.text.AttributedCharacterIterator;
 import java.util.Map;
-import org.apache.poi.hslf.usermodel.RichTextRun;
+
 import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.util.POILogger;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.StrokeStyle;
+import org.apache.poi.sl.usermodel.VerticalAlignment;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
 import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
 
 /**
  * Translates Graphics2D calls into PowerPoint.
@@ -43,7 +44,7 @@
     protected POILogger log = POILogFactory.getLogger(this.getClass());
 
     //The ppt object to write into.
-    private ShapeGroup _group;
+    private HSLFGroupShape _group;
 
     private AffineTransform _transform;
     private Stroke _stroke;
@@ -58,7 +59,7 @@
      *
      * @param group           The shape group to write the graphics calls into.
      */
-    public PPGraphics2D(ShapeGroup group){
+    public PPGraphics2D(HSLFGroupShape group){
         this._group = group;
 
         _transform = new AffineTransform();
@@ -73,7 +74,7 @@
     /**
      * @return  the shape group being used for drawing
      */
-    public ShapeGroup getShapeGroup(){
+    public HSLFGroupShape getShapeGroup(){
         return _group;
     }
 
@@ -214,7 +215,7 @@
      */
     public void draw(Shape shape){
         GeneralPath path = new GeneralPath(_transform.createTransformedShape(shape));
-        Freeform p = new Freeform(_group);
+        HSLFFreeformShape p = new HSLFFreeformShape(_group);
         p.setPath(path);
         p.getFill().setForegroundColor(null);
         applyStroke(p);
@@ -250,26 +251,25 @@
      * @see #setClip
      */
     public void drawString(String s, float x, float y) {
-        TextBox txt = new TextBox(_group);
-        txt.getTextRun().supplySlideShow(_group.getSheet().getSlideShow());
-        txt.getTextRun().setSheet(_group.getSheet());
+        HSLFTextBox txt = new HSLFTextBox(_group);
+        txt.getTextParagraphs().get(0).supplySheet(_group.getSheet());
         txt.setText(s);
 
-        RichTextRun rt = txt.getTextRun().getRichTextRuns()[0];
-        rt.setFontSize(_font.getSize());
-        rt.setFontName(_font.getFamily());
+        HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0);
+        rt.setFontSize((double)_font.getSize());
+        rt.setFontFamily(_font.getFamily());
 
         if (getColor() != null) rt.setFontColor(getColor());
         if (_font.isBold()) rt.setBold(true);
         if (_font.isItalic()) rt.setItalic(true);
 
-        txt.setMarginBottom(0);
-        txt.setMarginTop(0);
-        txt.setMarginLeft(0);
-        txt.setMarginRight(0);
-        txt.setWordWrap(TextBox.WrapNone);
-        txt.setHorizontalAlignment(TextBox.AlignLeft);
-        txt.setVerticalAlignment(TextBox.AnchorMiddle);
+        txt.setBottomInset(0);
+        txt.setTopInset(0);
+        txt.setLeftInset(0);
+        txt.setRightInset(0);
+        txt.setWordWrap(HSLFTextBox.WrapNone);
+        txt.setHorizontalCentered(false);
+        txt.setVerticalAlignment(VerticalAlignment.MIDDLE);
 
 
         TextLayout layout = new TextLayout(s, _font, getFontRenderContext());
@@ -317,7 +317,7 @@
      */
     public void fill(Shape shape){
         GeneralPath path = new GeneralPath(_transform.createTransformedShape(shape));
-        Freeform p = new Freeform(_group);
+        HSLFFreeformShape p = new HSLFFreeformShape(_group);
         p.setPath(path);
         applyPaint(p);
         p.setLineColor(null);   //Fills must be "No Line"
@@ -1456,7 +1456,7 @@
      * @param hints the rendering hints to be set
      * @see RenderingHints
      */
-    public void addRenderingHints(Map hints){
+    public void addRenderingHints(Map<?,?> hints){
         this._hints.putAll(hints);
     }
 
@@ -1581,8 +1581,9 @@
      * @param hints the rendering hints to be set
      * @see RenderingHints
      */
-    public void setRenderingHints(Map hints){
-        this._hints = new RenderingHints(hints);
+    public void setRenderingHints(Map<?,?> hints){
+        this._hints = new RenderingHints(null);
+        this._hints.putAll(hints);
     }
 
     /**
@@ -1787,19 +1788,19 @@
         }
     }
 
-    protected void applyStroke(SimpleShape shape) {
+    protected void applyStroke(HSLFSimpleShape shape) {
         if (_stroke instanceof BasicStroke){
             BasicStroke bs = (BasicStroke)_stroke;
             shape.setLineWidth(bs.getLineWidth());
             float[] dash = bs.getDashArray();
             if (dash != null) {
                 //TODO: implement more dashing styles
-                shape.setLineDashing(Line.PEN_DASH);
+                shape.setLineDashing(StrokeStyle.LineDash.DASH);
             }
         }
     }
 
-    protected void applyPaint(SimpleShape shape) {
+    protected void applyPaint(HSLFSimpleShape shape) {
         if (_paint instanceof Color) {
             shape.getFill().setForegroundColor((Color)_paint);
         }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java
index a3eb1b9..78e7a47 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java
@@ -19,7 +19,10 @@
 
 import org.apache.poi.ddf.*;
 import org.apache.poi.hslf.record.OEPlaceholderAtom;
+import org.apache.poi.hslf.usermodel.HSLFShape;
+import org.apache.poi.hslf.usermodel.HSLFTextBox;
 import org.apache.poi.hslf.exceptions.HSLFException;
+import org.apache.poi.sl.usermodel.ShapeContainer;
 
 import java.io.ByteArrayOutputStream;
 
@@ -28,13 +31,13 @@
  *
  * @author Yegor Kozlov
  */
-public final class Placeholder extends TextBox {
+public final class Placeholder extends HSLFTextBox {
 
-    protected Placeholder(EscherContainerRecord escherRecord, Shape parent){
+    protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
-    public Placeholder(Shape parent){
+    public Placeholder(ShapeContainer<HSLFShape> parent){
         super(parent);
     }
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java
index 09637a6..25f93a4 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/Polygon.java
@@ -18,6 +18,9 @@
 package org.apache.poi.hslf.model;
 
 import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.ShapeContainer;
+import org.apache.poi.sl.usermodel.ShapeType;
 import org.apache.poi.util.LittleEndian;
 
 import java.awt.geom.Point2D;
@@ -27,14 +30,14 @@
  *
  * @author Yegor Kozlov
  */
-public final class Polygon extends AutoShape {
+public final class Polygon extends HSLFAutoShape {
     /**
      * Create a Polygon object and initialize it from the supplied Record container.
      *
      * @param escherRecord       <code>EscherSpContainer</code> container which holds information about this shape
      * @param parent    the parent of the shape
      */
-   protected Polygon(EscherContainerRecord escherRecord, Shape parent){
+   protected Polygon(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
 
     }
@@ -45,9 +48,9 @@
      * @param parent    the parent of this Shape. For example, if this text box is a cell
      * in a table then the parent is Table.
      */
-    public Polygon(Shape parent){
-        super(null, parent);
-        _escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup);
+    public Polygon(ShapeContainer<HSLFShape> parent){
+        super((EscherContainerRecord)null, parent);
+        _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof HSLFGroupShape);
     }
 
     /**
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java
deleted file mode 100644
index 591bb55..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeOutline.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-/**
- * Date: Apr 17, 2008
- *
- * @author Yegor Kozlov
- */
-public interface ShapeOutline {
-    java.awt.Shape getOutline(Shape shape);
-
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java
deleted file mode 100644
index c9954a8..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapePainter.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Stroke;
-import java.awt.geom.Rectangle2D;
-
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
-
-/**
- * Paint a shape into java.awt.Graphics2D
- *
- * @author Yegor Kozlov
- */
-public final class ShapePainter {
-    protected static final POILogger logger = POILogFactory.getLogger(ShapePainter.class);
-
-    public static void paint(SimpleShape shape, Graphics2D graphics){
-        Rectangle2D anchor = shape.getLogicalAnchor2D();
-        java.awt.Shape outline = shape.getOutline();
-
-        //flip vertical
-        if(shape.getFlipVertical()){
-            graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
-            graphics.scale(1, -1);
-            graphics.translate(-anchor.getX(), -anchor.getY());
-        }
-        //flip horizontal
-        if(shape.getFlipHorizontal()){
-            graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
-            graphics.scale(-1, 1);
-            graphics.translate(-anchor.getX() , -anchor.getY());
-        }
-
-        //rotate transform
-        double angle = shape.getRotation();
-
-        if(angle != 0){
-            double centerX = anchor.getX() + anchor.getWidth()/2;
-            double centerY = anchor.getY() + anchor.getHeight()/2;
-
-            graphics.translate(centerX, centerY);
-            graphics.rotate(Math.toRadians(angle));
-            graphics.translate(-centerX, -centerY);
-        }
-
-        //fill
-        Color fillColor = shape.getFill().getForegroundColor();
-        if (fillColor != null) {
-            //TODO: implement gradient and texture fill patterns
-            graphics.setPaint(fillColor);
-            graphics.fill(outline);
-        }
-
-        //border
-        Color lineColor = shape.getLineColor();
-        if (lineColor != null){
-            graphics.setPaint(lineColor);
-            float width = (float)shape.getLineWidth();
-
-            int dashing = shape.getLineDashing();
-            //TODO: implement more dashing styles
-            float[] dashptrn = null;
-            switch(dashing){
-                case Line.PEN_SOLID:
-                    dashptrn = null;
-                    break;
-                case Line.PEN_PS_DASH:
-                    dashptrn = new float[]{width, width};
-                    break;
-                case Line.PEN_DOTGEL:
-                    dashptrn = new float[]{width*4, width*3};
-                    break;
-               default:
-                    logger.log(POILogger.WARN, "unsupported dashing: " + dashing);
-                    dashptrn = new float[]{width, width};
-                    break;
-            }
-
-            Stroke stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dashptrn, 0.0f);
-            graphics.setStroke(stroke);
-            graphics.draw(outline);
-        }
-    }
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeTypes.java b/src/scratchpad/src/org/apache/poi/hslf/model/ShapeTypes.java
deleted file mode 100644
index 4840c93..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeTypes.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-
-import org.apache.poi.hslf.exceptions.HSLFException;
-
-/**
- * Contains all known shape types in PowerPoint
- *
- * @author Yegor Kozlov
- */
-public final class ShapeTypes implements org.apache.poi.sl.usermodel.ShapeTypes {
-    /**
-     * Return name of the shape by id
-     * @param type  - the id of the shape, one of the static constants defined in this class
-     * @return  the name of the shape
-     */
-    public static String typeName(int type) {
-        String name = (String)types.get(Integer.valueOf(type));
-        return name;
-    }
-
-    public static final HashMap types;
-    static {
-        types = new HashMap();
-        try {
-            Field[] f = org.apache.poi.sl.usermodel.ShapeTypes.class.getFields();
-            for (int i = 0; i < f.length; i++){
-                Object val = f[i].get(null);
-                if (val instanceof Integer) {
-                    types.put(val, f[i].getName());
-                }
-            }
-        } catch (IllegalAccessException e){
-            throw new HSLFException("Failed to initialize shape types");
-        }
-    }
-
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java b/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java
deleted file mode 100644
index c5256b1..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Sheet.java
+++ /dev/null
@@ -1,527 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import java.awt.Graphics2D;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherDgRecord;
-import org.apache.poi.ddf.EscherDggRecord;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.hslf.record.CString;
-import org.apache.poi.hslf.record.ColorSchemeAtom;
-import org.apache.poi.hslf.record.EscherTextboxWrapper;
-import org.apache.poi.hslf.record.MasterTextPropAtom;
-import org.apache.poi.hslf.record.OEPlaceholderAtom;
-import org.apache.poi.hslf.record.PPDrawing;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordContainer;
-import org.apache.poi.hslf.record.RecordTypes;
-import org.apache.poi.hslf.record.RoundTripHFPlaceholder12;
-import org.apache.poi.hslf.record.SheetContainer;
-import org.apache.poi.hslf.record.StyleTextProp9Atom;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextBytesAtom;
-import org.apache.poi.hslf.record.TextCharsAtom;
-import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.hslf.record.TextRulerAtom;
-import org.apache.poi.hslf.record.TextSpecInfoAtom;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
-
-/**
- * This class defines the common format of "Sheets" in a powerpoint
- * document. Such sheets could be Slides, Notes, Master etc
- *
- * @author Nick Burch
- * @author Yegor Kozlov
- */
-
-public abstract class Sheet {
-	private static POILogger logger = POILogFactory.getLogger(Sheet.class);
-
-    /**
-     * The <code>SlideShow</code> we belong to
-     */
-    private SlideShow _slideShow;
-
-    /**
-     * Sheet background
-     */
-    private Background _background;
-
-    /**
-     * Record container that holds sheet data.
-     * For slides it is org.apache.poi.hslf.record.Slide,
-     * for notes it is org.apache.poi.hslf.record.Notes,
-     * for slide masters it is org.apache.poi.hslf.record.SlideMaster, etc.
-     */
-    private SheetContainer _container;
-
-    private int _sheetNo;
-
-    public Sheet(SheetContainer container, int sheetNo) {
-        _container = container;
-        _sheetNo = sheetNo;
-    }
-
-    /**
-     * Returns an array of all the TextRuns in the sheet.
-     */
-    public abstract TextRun[] getTextRuns();
-
-    /**
-     * Returns the (internal, RefID based) sheet number, as used
-     * to in PersistPtr stuff.
-     */
-    public int _getSheetRefId() {
-        return _container.getSheetId();
-    }
-
-    /**
-     * Returns the (internal, SlideIdentifier based) sheet number, as used
-     * to reference this sheet from other records.
-     */
-    public int _getSheetNumber() {
-        return _sheetNo;
-    }
-
-    /**
-     * Fetch the PPDrawing from the underlying record
-     */
-    protected PPDrawing getPPDrawing() {
-        return _container.getPPDrawing();
-    }
-
-    /**
-     * Fetch the SlideShow we're attached to
-     */
-    public SlideShow getSlideShow() {
-        return _slideShow;
-    }
-
-    /**
-     * Return record container for this sheet
-     */
-    public SheetContainer getSheetContainer() {
-        return _container;
-    }
-
-    /**
-     * Set the SlideShow we're attached to.
-     * Also passes it on to our child RichTextRuns
-     */
-    public void setSlideShow(SlideShow ss) {
-        _slideShow = ss;
-        TextRun[] trs = getTextRuns();
-        if (trs != null) {
-            for (int i = 0; i < trs.length; i++) {
-                trs[i].supplySlideShow(_slideShow);
-            }
-        }
-    }
-
-
-    /**
-     * For a given PPDrawing, grab all the TextRuns
-     */
-    public static TextRun[] findTextRuns(PPDrawing ppdrawing) {
-        final List<TextRun> runsV = new ArrayList<TextRun>();
-        final EscherTextboxWrapper[] wrappers = ppdrawing.getTextboxWrappers();
-        for (int i = 0; i < wrappers.length; i++) {
-            int s1 = runsV.size();
-
-            // propagate parents to parent-aware records
-            RecordContainer.handleParentAwareRecords(wrappers[i]);
-            findTextRuns(wrappers[i], runsV);
-            int s2 = runsV.size();
-            if (s2 != s1){
-                TextRun t = runsV.get(runsV.size()-1);
-                t.setShapeId(wrappers[i].getShapeId());
-            }
-        }
-        return runsV.toArray(new TextRun[runsV.size()]);
-    }
-    /**
-     * Scans through the supplied record array, looking for
-     * a TextHeaderAtom followed by one of a TextBytesAtom or
-     * a TextCharsAtom. Builds up TextRuns from these
-     *
-     * @param records the records to build from
-     * @param found   vector to add any found to
-     */
-    protected static void findTextRuns(final Record[] records, final List<TextRun> found) {
-    	findTextRuns(records, found, null); 
-    }
-    /**
-     * Scans through the supplied record array, looking for
-     * a TextHeaderAtom followed by one of a TextBytesAtom or
-     * a TextCharsAtom. Builds up TextRuns from these
-     *
-     * @param wrapper an EscherTextboxWrapper
-     * @param found   vector to add any found to
-     */
-    protected static void findTextRuns(final EscherTextboxWrapper wrapper, final List<TextRun> found) {
-    	findTextRuns(wrapper.getChildRecords(), found, wrapper.getStyleTextProp9Atom());
-    }
-    /**
-     * Scans through the supplied record array, looking for
-     * a TextHeaderAtom followed by one of a TextBytesAtom or
-     * a TextCharsAtom. Builds up TextRuns from these
-     *
-     * @param records the records to build from
-     * @param found   vector to add any found to
-     * @param styleTextProp9Atom a StyleTextProp9Atom with numbered lists info
-     */
-    protected static void findTextRuns(final Record[] records, final List<TextRun> found, final StyleTextProp9Atom styleTextProp9Atom) {
-        for (int i = 0, slwtIndex=0; i < (records.length - 1); i++) {
-            if (records[i] instanceof TextHeaderAtom) {
-                TextHeaderAtom tha = (TextHeaderAtom) records[i];
-                StyleTextPropAtom stpa = null;
-                TextRun trun = null;
-                Record next = null;
-                Record subs = null;
-                
-                // See what follows the TextHeaderAtom
-                next = records[i+1];
-                if (i < records.length - 2) {
-                    subs = records[i+2];
-                }
-                
-                // Is the next record one we need to skip over?
-                if (subs != null) {
-                    if (next instanceof TextRulerAtom ||
-                        next instanceof MasterTextPropAtom ||
-                        next instanceof TextSpecInfoAtom) {
-                        // Ignore this one, check the one after
-                        next = subs;
-                        if (i < records.length - 3) {
-                            subs = records[i+3];
-                        } else {
-                            subs = null;
-                        }
-                    }
-                }
-                
-                // Is the subsequent record a style one?
-                if (subs != null && subs instanceof StyleTextPropAtom) {
-                    stpa = (StyleTextPropAtom)subs;
-                }
-                
-                // Now, check if the next record is one to record
-                if (next instanceof TextCharsAtom) {
-                    TextCharsAtom tca = (TextCharsAtom)next;
-                    trun = new TextRun(tha, tca, stpa);
-                } else if (next instanceof TextBytesAtom) {
-                    TextBytesAtom tba = (TextBytesAtom)next;
-                    trun = new TextRun(tha, tba, stpa);
-                } else if (next instanceof StyleTextPropAtom) {
-                    stpa = (StyleTextPropAtom)next;
-                } else if (next instanceof TextHeaderAtom) {
-                    // Seems to be a mostly, but not completely deleted block of
-                    //  text. Only the header remains, which isn't useful alone 
-                    // Skip on to the next TextHeaderAtom
-                    continue;
-                } else {
-                    logger.log(POILogger.ERROR, "Found a TextHeaderAtom not followed by a TextBytesAtom or TextCharsAtom: Followed by " + next.getRecordType());
-                }
-
-                if (trun != null) {
-                    List<Record> lst = new ArrayList<Record>();
-                    for (int j = i; j < records.length; j++) {
-                        if(j > i && records[j] instanceof TextHeaderAtom) break;
-                        lst.add(records[j]);
-                    }
-                    Record[] recs = new Record[lst.size()];
-                    lst.toArray(recs);
-                    trun._records = recs;
-                    trun.setIndex(slwtIndex);
-                    trun.setStyleTextProp9Atom(styleTextProp9Atom);
-                    found.add(trun);
-                    i++;
-                } else {
-                    // Not a valid one, so skip on to next and look again
-                }
-                slwtIndex++;
-            }
-        }
-    }
-
-    /**
-     * Returns all shapes contained in this Sheet
-     *
-     * @return all shapes contained in this Sheet (Slide or Notes)
-     */
-    public Shape[] getShapes() {
-        PPDrawing ppdrawing = getPPDrawing();
-
-        EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
-        EscherContainerRecord spgr = null;
-
-        for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
-            EscherRecord rec = it.next();
-            if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) {
-                spgr = (EscherContainerRecord) rec;
-                break;
-            }
-        }
-        if (spgr == null) {
-            throw new IllegalStateException("spgr not found");
-        }
-
-        List<Shape> shapes = new ArrayList<Shape>();
-        Iterator<EscherRecord> it = spgr.getChildIterator();
-        if (it.hasNext()) {
-            // skip first item
-            it.next();
-        }
-        for (; it.hasNext();) {
-            EscherContainerRecord sp = (EscherContainerRecord) it.next();
-            Shape sh = ShapeFactory.createShape(sp, null);
-            sh.setSheet(this);
-            shapes.add(sh);
-        }
-
-        return shapes.toArray(new Shape[shapes.size()]);
-    }
-
-    /**
-     * Add a new Shape to this Slide
-     *
-     * @param shape - the Shape to add
-     */
-    public void addShape(Shape shape) {
-        PPDrawing ppdrawing = getPPDrawing();
-
-        EscherContainerRecord dgContainer = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
-        EscherContainerRecord spgr = (EscherContainerRecord) Shape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER);
-        spgr.addChildRecord(shape.getSpContainer());
-
-        shape.setSheet(this);
-        shape.setShapeId(allocateShapeId());
-        shape.afterInsert(this);
-    }
-
-    /**
-     * Allocates new shape id for the new drawing group id.
-     *
-     * @return a new shape id.
-     */
-    public int allocateShapeId()
-    {
-        EscherDggRecord dgg = _slideShow.getDocumentRecord().getPPDrawingGroup().getEscherDggRecord();
-        EscherDgRecord dg = _container.getPPDrawing().getEscherDgRecord();
-
-        dgg.setNumShapesSaved( dgg.getNumShapesSaved() + 1 );
-
-        // Add to existing cluster if space available
-        for (int i = 0; i < dgg.getFileIdClusters().length; i++)
-        {
-            EscherDggRecord.FileIdCluster c = dgg.getFileIdClusters()[i];
-            if (c.getDrawingGroupId() == dg.getDrawingGroupId() && c.getNumShapeIdsUsed() != 1024)
-            {
-                int result = c.getNumShapeIdsUsed() + (1024 * (i+1));
-                c.incrementShapeId();
-                dg.setNumShapes( dg.getNumShapes() + 1 );
-                dg.setLastMSOSPID( result );
-                if (result >= dgg.getShapeIdMax())
-                    dgg.setShapeIdMax( result + 1 );
-                return result;
-            }
-        }
-
-        // Create new cluster
-        dgg.addCluster( dg.getDrawingGroupId(), 0, false );
-        dgg.getFileIdClusters()[dgg.getFileIdClusters().length-1].incrementShapeId();
-        dg.setNumShapes( dg.getNumShapes() + 1 );
-        int result = (1024 * dgg.getFileIdClusters().length);
-        dg.setLastMSOSPID( result );
-        if (result >= dgg.getShapeIdMax())
-            dgg.setShapeIdMax( result + 1 );
-        return result;
-    }
-
-    /**
-     * Removes the specified shape from this sheet.
-     *
-     * @param shape shape to be removed from this sheet, if present.
-     * @return <tt>true</tt> if the shape was deleted.
-     */
-    public boolean removeShape(Shape shape) {
-        PPDrawing ppdrawing = getPPDrawing();
-
-        EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
-        EscherContainerRecord spgr = null;
-
-        for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
-            EscherRecord rec = it.next();
-            if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) {
-                spgr = (EscherContainerRecord) rec;
-                break;
-            }
-        }
-        if(spgr == null) {
-            return false;
-        }
-
-        List<EscherRecord> lst = spgr.getChildRecords();
-        boolean result = lst.remove(shape.getSpContainer());
-        spgr.setChildRecords(lst);
-        return result;
-    }
-
-    /**
-     * Called by SlideShow ater a new sheet is created
-     */
-    public void onCreate(){
-
-    }
-
-    /**
-     * Return the master sheet .
-     */
-    public abstract MasterSheet getMasterSheet();
-
-    /**
-     * Color scheme for this sheet.
-     */
-    public ColorSchemeAtom getColorScheme() {
-        return _container.getColorScheme();
-    }
-
-    /**
-     * Returns the background shape for this sheet.
-     *
-     * @return the background shape for this sheet.
-     */
-    public Background getBackground() {
-        if (_background == null) {
-            PPDrawing ppdrawing = getPPDrawing();
-
-            EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
-            EscherContainerRecord spContainer = null;
-
-            for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
-                EscherRecord rec = it.next();
-                if (rec.getRecordId() == EscherContainerRecord.SP_CONTAINER) {
-                    spContainer = (EscherContainerRecord) rec;
-                    break;
-                }
-            }
-            _background = new Background(spContainer, null);
-            _background.setSheet(this);
-        }
-        return _background;
-    }
-
-    public void draw(Graphics2D graphics){
-
-    }
-
-    /**
-     * Subclasses should call this method and update the array of text runs
-     * when a text shape is added
-     *
-     * @param shape
-     */
-    protected void onAddTextShape(TextShape shape) {
-
-    }
-
-    /**
-     * Return placeholder by text type
-     *
-     * @param type  type of text, See {@link org.apache.poi.hslf.record.TextHeaderAtom}
-     * @return  <code>TextShape</code> or <code>null</code>
-     */
-    public TextShape getPlaceholderByTextType(int type){
-        Shape[] shape = getShapes();
-        for (int i = 0; i < shape.length; i++) {
-            if(shape[i] instanceof TextShape){
-                TextShape tx = (TextShape)shape[i];
-                TextRun run = tx.getTextRun();
-                if(run != null && run.getRunType() == type){
-                    return tx;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Search text placeholer by its type
-     *
-     * @param type  type of placeholder to search. See {@link org.apache.poi.hslf.record.OEPlaceholderAtom}
-     * @return  <code>TextShape</code> or <code>null</code>
-     */
-    public TextShape getPlaceholder(int type){
-        Shape[] shape = getShapes();
-        for (int i = 0; i < shape.length; i++) {
-            if(shape[i] instanceof TextShape){
-                TextShape tx = (TextShape)shape[i];
-                int placeholderId = 0;
-                OEPlaceholderAtom oep = tx.getPlaceholderAtom();
-                if(oep != null) {
-                    placeholderId = oep.getPlaceholderId();
-                } else {
-                    //special case for files saved in Office 2007
-                    RoundTripHFPlaceholder12 hldr = tx.getClientDataRecord(RecordTypes.RoundTripHFPlaceholder12.typeID);
-                    if(hldr != null) placeholderId = hldr.getPlaceholderId();
-                }
-                if(placeholderId == type){
-                    return tx;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Return programmable tag associated with this sheet, e.g. <code>___PPT12</code>.
-     *
-     * @return programmable tag associated with this sheet.
-     */
-    public String getProgrammableTag(){
-        String tag = null;
-        RecordContainer progTags = (RecordContainer)
-                getSheetContainer().findFirstOfType(
-                            RecordTypes.ProgTags.typeID
-        );
-        if(progTags != null) {
-            RecordContainer progBinaryTag = (RecordContainer)
-                progTags.findFirstOfType(
-                        RecordTypes.ProgBinaryTag.typeID
-            );
-            if(progBinaryTag != null) {
-                CString binaryTag = (CString)
-                    progBinaryTag.findFirstOfType(
-                            RecordTypes.CString.typeID
-                );
-                if(binaryTag != null) tag = binaryTag.getText();
-            }
-        }
-
-        return tag;
-
-    }
-
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java b/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java
deleted file mode 100644
index a103d09..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/SlideMaster.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import org.apache.poi.hslf.model.textproperties.TextProp;
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
-
-/**
- * SlideMaster determines the graphics, layout, and formatting for all the slides in a given presentation.
- * It stores information about default font styles, placeholder sizes and positions,
- * background design, and color schemes.
- *
- * @author Yegor Kozlov
- */
-public final class SlideMaster extends MasterSheet {
-    private TextRun[] _runs;
-
-    /**
-     * all TxMasterStyleAtoms available in this master
-     */
-    private TxMasterStyleAtom[] _txmaster;
-
-    /**
-     * Constructs a SlideMaster from the MainMaster record,
-     *
-     */
-    public SlideMaster(MainMaster record, int sheetNo) {
-        super(record, sheetNo);
-
-        _runs = findTextRuns(getPPDrawing());
-        for (int i = 0; i < _runs.length; i++) _runs[i].setSheet(this);
-    }
-
-    /**
-     * Returns an array of all the TextRuns found
-     */
-    public TextRun[] getTextRuns() {
-        return _runs;
-    }
-
-    /**
-     * Returns <code>null</code> since SlideMasters doen't have master sheet.
-     */
-    public MasterSheet getMasterSheet() {
-        return null;
-    }
-
-    /**
-     * Pickup a style attribute from the master.
-     * This is the "workhorse" which returns the default style attrubutes.
-     */
-    public TextProp getStyleAttribute(int txtype, int level, String name, boolean isCharacter) {
-
-        TextProp prop = null;
-        for (int i = level; i >= 0; i--) {
-            TextPropCollection[] styles =
-                    isCharacter ? _txmaster[txtype].getCharacterStyles() : _txmaster[txtype].getParagraphStyles();
-            if (i < styles.length) prop = styles[i].findByName(name);
-            if (prop != null) break;
-        }
-        if (prop == null) {
-            if(isCharacter) {
-                switch (txtype) {
-                    case TextHeaderAtom.CENTRE_BODY_TYPE:
-                    case TextHeaderAtom.HALF_BODY_TYPE:
-                    case TextHeaderAtom.QUARTER_BODY_TYPE:
-                        txtype = TextHeaderAtom.BODY_TYPE;
-                        break;
-                    case TextHeaderAtom.CENTER_TITLE_TYPE:
-                        txtype = TextHeaderAtom.TITLE_TYPE;
-                        break;
-                    default:
-                        return null;
-                }
-            } else {
-                switch (txtype) {
-                    case TextHeaderAtom.CENTRE_BODY_TYPE:
-                    case TextHeaderAtom.HALF_BODY_TYPE:
-                    case TextHeaderAtom.QUARTER_BODY_TYPE:
-                        txtype = TextHeaderAtom.BODY_TYPE;
-                        break;
-                    case TextHeaderAtom.CENTER_TITLE_TYPE:
-                        txtype = TextHeaderAtom.TITLE_TYPE;
-                        break;
-                    default:
-                        return null;
-                }
-            }
-            prop = getStyleAttribute(txtype, level, name, isCharacter);
-        }
-        return prop;
-    }
-
-    /**
-     * Assign SlideShow for this slide master.
-     * (Used interanlly)
-     */
-    public void setSlideShow(SlideShow ss) {
-        super.setSlideShow(ss);
-
-        //after the slide show is assigned collect all available style records
-        if (_txmaster == null) {
-            _txmaster = new TxMasterStyleAtom[9];
-
-            TxMasterStyleAtom txdoc = getSlideShow().getDocumentRecord().getEnvironment().getTxMasterStyleAtom();
-            _txmaster[txdoc.getTextType()] = txdoc;
-
-            TxMasterStyleAtom[] txrec = ((MainMaster)getSheetContainer()).getTxMasterStyleAtoms();
-            for (int i = 0; i < txrec.length; i++) {
-                int txType = txrec[i].getTextType();
-                if(_txmaster[txType] == null) _txmaster[txType] = txrec[i];
-            }
-        }
-    }
-
-    protected void onAddTextShape(TextShape shape) {
-        TextRun run = shape.getTextRun();
-
-        if(_runs == null) _runs = new TextRun[]{run};
-        else {
-            TextRun[] tmp = new TextRun[_runs.length + 1];
-            System.arraycopy(_runs, 0, tmp, 0, _runs.length);
-            tmp[tmp.length-1] = run;
-            _runs = tmp;
-        }
-    }
-
-    public TxMasterStyleAtom[] getTxMasterStyleAtoms(){
-        return _txmaster;
-    }
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java
deleted file mode 100644
index 79864d6..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/TextPainter.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.font.FontRenderContext;
-import java.awt.font.LineBreakMeasurer;
-import java.awt.font.TextAttribute;
-import java.awt.font.TextLayout;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
-import java.text.AttributedCharacterIterator;
-import java.text.AttributedString;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.poi.hslf.record.TextRulerAtom;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
-
-/**
- * Paint text into java.awt.Graphics2D
- */
-public final class TextPainter implements org.apache.poi.sl.usermodel.TextPainter {
-    protected POILogger logger = POILogFactory.getLogger(this.getClass());
-
-    /**
-     * Display unicode square if a bullet char can't be displayed,
-     * for example, if Wingdings font is used.
-     * TODO: map Wingdngs and Symbol to unicode Arial
-     */
-    protected static final char DEFAULT_BULLET_CHAR = '\u25a0';
-
-    protected TextShape _shape;
-
-    public TextPainter(TextShape shape){
-        _shape = shape;
-    }
-
-    public AttributedString getAttributedString(TextRun txrun) {
-        return getAttributedString(txrun, null);
-    }
-    
-    /**
-     * Convert the underlying set of rich text runs into java.text.AttributedString
-     */
-    public AttributedString getAttributedString(TextRun txrun, Graphics2D graphics){
-        String text = txrun.getText();
-        //TODO: properly process tabs
-        text = text.replace('\t', ' ');
-        text = text.replace((char)160, ' ');
-
-        AttributedString at = new AttributedString(text);
-        RichTextRun[] rt = txrun.getRichTextRuns();
-        for (int i = 0; i < rt.length; i++) {
-            int start = rt[i].getStartIndex();
-            int end = rt[i].getEndIndex();
-            if(start == end) {
-                logger.log(POILogger.INFO,  "Skipping RichTextRun with zero length");
-                continue;
-            }
-
-            String mappedFont = rt[i].getFontName();
-            String fallbackFont = Font.SANS_SERIF;
-            if (graphics != null) {
-                @SuppressWarnings("unchecked")
-                Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(KEY_FONTMAP);
-                if (fontMap != null && fontMap.containsKey(mappedFont)) {
-                    mappedFont = fontMap.get(mappedFont);
-                }
-                @SuppressWarnings("unchecked")
-                Map<String,String> fallbackMap = (Map<String,String>)graphics.getRenderingHint(KEY_FONTFALLBACK);
-                if (fallbackMap != null && fallbackMap.containsKey(mappedFont)) {
-                    fallbackFont = fallbackMap.get(mappedFont);
-                }
-            }
-            
-            at.addAttribute(TextAttribute.FAMILY, mappedFont, start, end);
-            at.addAttribute(TextAttribute.SIZE, new Float(rt[i].getFontSize()), start, end);
-            at.addAttribute(TextAttribute.FOREGROUND, rt[i].getFontColor(), start, end);
-            if(rt[i].isBold()) at.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, start, end);
-            if(rt[i].isItalic()) at.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, start, end);
-            if(rt[i].isUnderlined()) {
-                at.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, start, end);
-                at.addAttribute(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, start, end);
-            }
-            if(rt[i].isStrikethrough()) at.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, start, end);
-            int superScript = rt[i].getSuperscript();
-            if(superScript != 0) at.addAttribute(TextAttribute.SUPERSCRIPT, superScript > 0 ? TextAttribute.SUPERSCRIPT_SUPER : TextAttribute.SUPERSCRIPT_SUB, start, end);
-            
-            
-            int style = (rt[i].isBold() ? Font.BOLD : 0) | (rt[i].isItalic() ? Font.ITALIC : 0);
-            Font f = new Font(mappedFont, style, rt[i].getFontSize());
-            
-            // check for unsupported characters and add a fallback font for these
-            char textChr[] = text.toCharArray();
-            int nextEnd = f.canDisplayUpTo(textChr, start, end);
-            boolean isNextValid = nextEnd == start;
-            for (int last = start; nextEnd != -1 && nextEnd <= end; ) {
-                if (isNextValid) {
-                    nextEnd = f.canDisplayUpTo(textChr, nextEnd, end);
-                    isNextValid = false;
-                } else {
-                    if (nextEnd >= end || f.canDisplay(Character.codePointAt(textChr, nextEnd, end)) ) {
-                        at.addAttribute(TextAttribute.FAMILY, fallbackFont, last, Math.min(nextEnd,end));
-                        if (nextEnd >= end) break;
-                        last = nextEnd;
-                        isNextValid = true;
-                    } else {
-                        boolean isHS = Character.isHighSurrogate(textChr[nextEnd]);
-                        nextEnd+=(isHS?2:1);
-                    }
-                }
-            }            
-        }
-        return at;
-    }
-
-    public void paint(Graphics2D graphics){
-        AffineTransform tx = graphics.getTransform();
-
-        Rectangle2D anchor = _shape.getLogicalAnchor2D();
-        TextElement[] elem = getTextElements((float)anchor.getWidth(), graphics.getFontRenderContext(), graphics);
-        if(elem == null) return;
-
-        float textHeight = 0;
-        for (int i = 0; i < elem.length; i++) {
-            textHeight += elem[i].ascent + elem[i].descent;
-        }
-
-        int valign = _shape.getVerticalAlignment();
-        double y0 = anchor.getY();
-        switch (valign){
-            case TextShape.AnchorTopBaseline:
-            case TextShape.AnchorTop:
-                y0 += _shape.getMarginTop();
-                break;
-            case TextShape.AnchorBottom:
-                y0 += anchor.getHeight() - textHeight - _shape.getMarginBottom();
-                break;
-            default:
-            case TextShape.AnchorMiddle:
-                float delta =  (float)anchor.getHeight() - textHeight - _shape.getMarginTop() - _shape.getMarginBottom();
-                y0 += _shape.getMarginTop()  + delta/2;
-                break;
-        }
-
-
-        // Transform of text in flipped shapes is special.
-        // At this point the flip and rotation transform is already applied
-        // (see XSLFShape#applyTransform ), but we need to restore it to avoid painting "upside down".
-        // See Bugzilla 54210.
-        if(_shape.getFlipVertical()){
-            graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
-            graphics.scale(1, -1);
-            graphics.translate(-anchor.getX(), -anchor.getY());
-
-            // text in vertically flipped shapes is rotated by 180 degrees
-            double centerX = anchor.getX() + anchor.getWidth()/2;
-            double centerY = anchor.getY() + anchor.getHeight()/2;
-            graphics.translate(centerX, centerY);
-            graphics.rotate(Math.toRadians(180));
-            graphics.translate(-centerX, -centerY);
-        }
-
-        // Horizontal flipping applies only to shape outline and not to the text in the shape.
-        // Applying flip second time restores the original not-flipped transform
-        if(_shape.getFlipHorizontal()){
-            graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
-            graphics.scale(-1, 1);
-            graphics.translate(-anchor.getX() , -anchor.getY());
-        }
-
-        //finally draw the text fragments
-        for (int i = 0; i < elem.length; i++) {
-            y0 += elem[i].ascent;
-
-            Point2D.Double pen = new Point2D.Double();
-            pen.y = y0;
-            switch (elem[i]._align) {
-                default:
-                case TextShape.AlignLeft:
-                    pen.x = anchor.getX() + _shape.getMarginLeft();
-                    break;
-                case TextShape.AlignCenter:
-                    pen.x = anchor.getX() + _shape.getMarginLeft() +
-                            (anchor.getWidth() - elem[i].advance - _shape.getMarginLeft() - _shape.getMarginRight()) / 2;
-                    break;
-                case TextShape.AlignRight:
-                    pen.x = anchor.getX() + _shape.getMarginLeft() +
-                            (anchor.getWidth() - elem[i].advance - _shape.getMarginLeft() - _shape.getMarginRight());
-                    break;
-            }
-            if(elem[i]._bullet != null){
-                graphics.drawString(elem[i]._bullet.getIterator(), (float)(pen.x + elem[i]._bulletOffset), (float)pen.y);
-            }
-            AttributedCharacterIterator chIt = elem[i]._text.getIterator();
-            if(chIt.getEndIndex() > chIt.getBeginIndex()) {
-                graphics.drawString(chIt, (float)(pen.x + elem[i]._textOffset), (float)pen.y);
-            }
-            y0 += elem[i].descent;
-        }
-
-        graphics.setTransform(tx);
-    }
-
-    public TextElement[] getTextElements(float textWidth, FontRenderContext frc){
-        return getTextElements(textWidth, frc, null);
-    }
-    
-    public TextElement[] getTextElements(float textWidth, FontRenderContext frc, Graphics2D graphics){
-        TextRun run = _shape.getTextRun();
-        if (run == null) return null;
-
-        String text = run.getText();
-        if (text == null || text.equals("")) return null;
-
-        AttributedString at = getAttributedString(run, graphics);
-
-        AttributedCharacterIterator it = at.getIterator();
-        int paragraphStart = it.getBeginIndex();
-        int paragraphEnd = it.getEndIndex();
-
-        List<TextElement> lines = new ArrayList<TextElement>();
-        LineBreakMeasurer measurer = new LineBreakMeasurer(it, frc);
-        measurer.setPosition(paragraphStart);
-        while (measurer.getPosition() < paragraphEnd) {
-            int startIndex = measurer.getPosition();
-            int nextBreak = text.indexOf('\n', measurer.getPosition() + 1);
-
-            boolean prStart = text.charAt(startIndex) == '\n';
-            if(prStart) measurer.setPosition(startIndex++);
-
-            RichTextRun rt = run.getRichTextRunAt(startIndex == text.length() ? (startIndex-1) : startIndex);
-            if(rt == null) {
-                logger.log(POILogger.WARN,  "RichTextRun not found at pos" + startIndex + "; text.length: " + text.length());
-                break;
-            }
-
-            float wrappingWidth = textWidth - _shape.getMarginLeft() - _shape.getMarginRight();
-            int bulletOffset = rt.getBulletOffset();
-            int textOffset = rt.getTextOffset();
-            int indent = rt.getIndentLevel();
-
-            TextRulerAtom ruler = run.getTextRuler();
-            if(ruler != null) {
-                int bullet_val = ruler.getBulletOffsets()[indent]*Shape.POINT_DPI/Shape.MASTER_DPI;
-                int text_val = ruler.getTextOffsets()[indent]*Shape.POINT_DPI/Shape.MASTER_DPI;
-                if(bullet_val > text_val){
-                    int a = bullet_val;
-                    bullet_val = text_val;
-                    text_val = a;
-                }
-                if(bullet_val != 0 ) bulletOffset = bullet_val;
-                if(text_val != 0) textOffset = text_val;
-            }
-
-            if(bulletOffset > 0 || prStart || startIndex == 0) wrappingWidth -= textOffset;
-
-            if (_shape.getWordWrap() == TextShape.WrapNone) {
-                wrappingWidth = _shape.getSheet().getSlideShow().getPageSize().width;
-            }
-
-            TextLayout textLayout = measurer.nextLayout(wrappingWidth + 1,
-                    nextBreak == -1 ? paragraphEnd : nextBreak, true);
-            if (textLayout == null) {
-                textLayout = measurer.nextLayout(textWidth,
-                    nextBreak == -1 ? paragraphEnd : nextBreak, false);
-            }
-            if(textLayout == null){
-                logger.log(POILogger.WARN, "Failed to break text into lines: wrappingWidth: "+wrappingWidth+
-                        "; text: " + rt.getText());
-                measurer.setPosition(rt.getEndIndex());
-                continue;
-            }
-            int endIndex = measurer.getPosition();
-
-            float lineHeight = (float)textLayout.getBounds().getHeight();
-            int linespacing = rt.getLineSpacing();
-            if(linespacing == 0) linespacing = 100;
-
-            TextElement el = new TextElement();
-            if(linespacing >= 0){
-                el.ascent = textLayout.getAscent()*linespacing/100;
-            } else {
-                el.ascent = -linespacing*Shape.POINT_DPI/Shape.MASTER_DPI;
-            }
-
-            el._align = rt.getAlignment();
-            el.advance = textLayout.getAdvance();
-            el._textOffset = textOffset;
-            el._text = new AttributedString(it, startIndex, endIndex);
-            el.textStartIndex = startIndex;
-            el.textEndIndex = endIndex;
-
-            if (prStart){
-                int sp = rt.getSpaceBefore();
-                float spaceBefore;
-                if(sp >= 0){
-                    spaceBefore = lineHeight * sp/100;
-                } else {
-                    spaceBefore = -sp*Shape.POINT_DPI/Shape.MASTER_DPI;
-                }
-                el.ascent += spaceBefore;
-            }
-
-            float descent;
-            if(linespacing >= 0){
-                descent = (textLayout.getDescent() + textLayout.getLeading())*linespacing/100;
-            } else {
-                descent = -linespacing*Shape.POINT_DPI/Shape.MASTER_DPI;
-            }
-            if (prStart){
-                int sp = rt.getSpaceAfter();
-                float spaceAfter;
-                if(sp >= 0){
-                    spaceAfter = lineHeight * sp/100;
-                } else {
-                    spaceAfter = -sp*Shape.POINT_DPI/Shape.MASTER_DPI;
-                }
-                el.ascent += spaceAfter;
-            }
-            el.descent = descent;
-
-            if(rt.isBullet() && (prStart || startIndex == 0)){
-                it.setIndex(startIndex);
-
-                AttributedString bat = new AttributedString(Character.toString(rt.getBulletChar()));
-                Color clr = rt.getBulletColor();
-                if (clr != null) bat.addAttribute(TextAttribute.FOREGROUND, clr);
-                else bat.addAttribute(TextAttribute.FOREGROUND, it.getAttribute(TextAttribute.FOREGROUND));
-
-                int fontIdx = rt.getBulletFont();
-                if(fontIdx == -1) fontIdx = rt.getFontIndex();
-                PPFont bulletFont = _shape.getSheet().getSlideShow().getFont(fontIdx);
-                bat.addAttribute(TextAttribute.FAMILY, bulletFont.getFontName());
-
-                int bulletSize = rt.getBulletSize();
-                int fontSize = rt.getFontSize();
-                if(bulletSize != -1) fontSize = Math.round(fontSize*bulletSize*0.01f);
-                bat.addAttribute(TextAttribute.SIZE, new Float(fontSize));
-
-                if(!new Font(bulletFont.getFontName(), Font.PLAIN, 1).canDisplay(rt.getBulletChar())){
-                    bat.addAttribute(TextAttribute.FAMILY, "Arial");
-                    bat = new AttributedString("" + DEFAULT_BULLET_CHAR, bat.getIterator().getAttributes());
-                }
-
-                if(text.substring(startIndex, endIndex).length() > 1){
-                    el._bullet = bat;
-                    el._bulletOffset = bulletOffset;
-                }
-            }
-            lines.add(el);
-        }
-
-        //finally draw the text fragments
-        TextElement[] elems = new TextElement[lines.size()];
-        return lines.toArray(elems);
-    }
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java
deleted file mode 100644
index 755482f..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java
+++ /dev/null
@@ -1,746 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.PPDrawing;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordContainer;
-import org.apache.poi.hslf.record.SlideListWithText;
-import org.apache.poi.hslf.record.StyleTextProp9Atom;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextBytesAtom;
-import org.apache.poi.hslf.record.TextCharsAtom;
-import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.hslf.record.TextRulerAtom;
-import org.apache.poi.hslf.record.TextSpecInfoAtom;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.util.StringUtil;
-
-/**
- * This class represents a run of text in a powerpoint document. That
- *  run could be text on a sheet, or text in a note.
- *  It is only a very basic class for now
- *
- * @author Nick Burch
- */
-
-public final class TextRun
-{
-	// Note: These fields are protected to help with unit testing
-	//   Other classes shouldn't really go playing with them!
-	protected TextHeaderAtom _headerAtom;
-	protected TextBytesAtom  _byteAtom;
-	protected TextCharsAtom  _charAtom;
-	protected StyleTextPropAtom _styleAtom;
-    protected TextRulerAtom _ruler;
-    protected boolean _isUnicode;
-	protected RichTextRun[] _rtRuns;
-	private SlideShow slideShow;
-    private Sheet _sheet;
-    private int shapeId;
-    private int slwtIndex = -1; //position in the owning SlideListWithText
-    /**
-     * all text run records that follow TextHeaderAtom.
-     * (there can be misc InteractiveInfo, TxInteractiveInfo and other records)
-     */
-    protected Record[] _records;
-	// private StyleTextPropAtom styleTextPropAtom;
-	private StyleTextProp9Atom styleTextProp9Atom;
-
-	/**
-	* Constructs a Text Run from a Unicode text block
-	*
-	* @param tha the TextHeaderAtom that defines what's what
-	* @param tca the TextCharsAtom containing the text
-	* @param sta the StyleTextPropAtom which defines the character stylings
-	*/
-	public TextRun(TextHeaderAtom tha, TextCharsAtom tca, StyleTextPropAtom sta) {
-		this(tha,null,tca,sta);
-	}
-
-	/**
-	* Constructs a Text Run from a Ascii text block
-	*
-	* @param tha the TextHeaderAtom that defines what's what
-	* @param tba the TextBytesAtom containing the text
-	* @param sta the StyleTextPropAtom which defines the character stylings
-	*/
-	public TextRun(TextHeaderAtom tha, TextBytesAtom tba, StyleTextPropAtom sta) {
-		this(tha,tba,null,sta);
-	}
-
-	/**
-	 * Internal constructor and initializer
-	 */
-	private TextRun(TextHeaderAtom tha, TextBytesAtom tba, TextCharsAtom tca, StyleTextPropAtom sta) {
-		_headerAtom = tha;
-		_styleAtom = sta;
-		if(tba != null) {
-			_byteAtom = tba;
-			_isUnicode = false;
-		} else {
-			_charAtom = tca;
-			_isUnicode = true;
-		}
-		String runRawText = getText();
-
-		// Figure out the rich text runs
-		LinkedList<TextPropCollection> pStyles = new LinkedList<TextPropCollection>();
-		LinkedList<TextPropCollection> cStyles = new LinkedList<TextPropCollection>();
-		if(_styleAtom != null) {
-			// Get the style atom to grok itself
-			_styleAtom.setParentTextSize(runRawText.length());
-			pStyles = _styleAtom.getParagraphStyles();
-			cStyles = _styleAtom.getCharacterStyles();
-		}
-        buildRichTextRuns(pStyles, cStyles, runRawText);
-	}
-
-	public void buildRichTextRuns(LinkedList<TextPropCollection> pStyles, LinkedList<TextPropCollection> cStyles, String runRawText){
-
-        // Handle case of no current style, with a default
-        if(pStyles.size() == 0 || cStyles.size() == 0) {
-            _rtRuns = new RichTextRun[1];
-            _rtRuns[0] = new RichTextRun(this, 0, runRawText.length());
-        } else {
-            // Build up Rich Text Runs, one for each
-            //  character/paragraph style pair
-            List<RichTextRun> rtrs = new ArrayList<RichTextRun>();
-
-            int pos = 0;
-
-            int curP = 0;
-            int curC = 0;
-            int pLenRemain = -1;
-            int cLenRemain = -1;
-
-            // Build one for each run with the same style
-            while(pos <= runRawText.length() && curP < pStyles.size() && curC < cStyles.size()) {
-                // Get the Props to use
-                TextPropCollection pProps = pStyles.get(curP);
-                TextPropCollection cProps = cStyles.get(curC);
-
-                int pLen = pProps.getCharactersCovered();
-                int cLen = cProps.getCharactersCovered();
-
-                // Handle new pass
-                boolean freshSet = false;
-                if(pLenRemain == -1 && cLenRemain == -1) { freshSet = true; }
-                if(pLenRemain == -1) { pLenRemain = pLen; }
-                if(cLenRemain == -1) { cLenRemain = cLen; }
-
-                // So we know how to build the eventual run
-                int runLen = -1;
-                boolean pShared = false;
-                boolean cShared = false;
-
-                // Same size, new styles - neither shared
-                if(pLen == cLen && freshSet) {
-                    runLen = cLen;
-                    pShared = false;
-                    cShared = false;
-                    curP++;
-                    curC++;
-                    pLenRemain = -1;
-                    cLenRemain = -1;
-                } else {
-                    // Some sharing
-
-                    // See if we are already in a shared block
-                    if(pLenRemain < pLen) {
-                        // Existing shared p block
-                        pShared = true;
-
-                        // Do we end with the c block, or either side of it?
-                        if(pLenRemain == cLenRemain) {
-                            // We end at the same time
-                            cShared = false;
-                            runLen = pLenRemain;
-                            curP++;
-                            curC++;
-                            pLenRemain = -1;
-                            cLenRemain = -1;
-                        } else if(pLenRemain < cLenRemain) {
-                            // We end before the c block
-                            cShared = true;
-                            runLen = pLenRemain;
-                            curP++;
-                            cLenRemain -= pLenRemain;
-                            pLenRemain = -1;
-                        } else {
-                            // We end after the c block
-                            cShared = false;
-                            runLen = cLenRemain;
-                            curC++;
-                            pLenRemain -= cLenRemain;
-                            cLenRemain = -1;
-                        }
-                    } else if(cLenRemain < cLen) {
-                        // Existing shared c block
-                        cShared = true;
-
-                        // Do we end with the p block, or either side of it?
-                        if(pLenRemain == cLenRemain) {
-                            // We end at the same time
-                            pShared = false;
-                            runLen = cLenRemain;
-                            curP++;
-                            curC++;
-                            pLenRemain = -1;
-                            cLenRemain = -1;
-                        } else if(cLenRemain < pLenRemain) {
-                            // We end before the p block
-                            pShared = true;
-                            runLen = cLenRemain;
-                            curC++;
-                            pLenRemain -= cLenRemain;
-                            cLenRemain = -1;
-                        } else {
-                            // We end after the p block
-                            pShared = false;
-                            runLen = pLenRemain;
-                            curP++;
-                            cLenRemain -= pLenRemain;
-                            pLenRemain = -1;
-                        }
-                    } else {
-                        // Start of a shared block
-                        if(pLenRemain < cLenRemain) {
-                            // Shared c block
-                            pShared = false;
-                            cShared = true;
-                            runLen = pLenRemain;
-                            curP++;
-                            cLenRemain -= pLenRemain;
-                            pLenRemain = -1;
-                        } else {
-                            // Shared p block
-                            pShared = true;
-                            cShared = false;
-                            runLen = cLenRemain;
-                            curC++;
-                            pLenRemain -= cLenRemain;
-                            cLenRemain = -1;
-                        }
-                    }
-                }
-
-                // Wind on
-                int prevPos = pos;
-                pos += runLen;
-                // Adjust for end-of-run extra 1 length
-                if(pos > runRawText.length()) {
-                    runLen--;
-                }
-
-                // Save
-                RichTextRun rtr = new RichTextRun(this, prevPos, runLen, pProps, cProps, pShared, cShared);
-                rtrs.add(rtr);
-            }
-
-            // Build the array
-            _rtRuns = rtrs.toArray(new RichTextRun[rtrs.size()]);
-        }
-
-    }
-
-    // Update methods follow
-
-	/**
-	 * Adds the supplied text onto the end of the TextRun,
-	 *  creating a new RichTextRun (returned) for it to
-	 *  sit in.
-	 * In many cases, before calling this, you'll want to add
-	 *  a newline onto the end of your last RichTextRun
-	 */
-	public RichTextRun appendText(String s) {
-		// We will need a StyleTextProp atom
-		ensureStyleAtomPresent();
-
-		// First up, append the text to the
-		//  underlying text atom
-		int oldSize = getRawText().length();
-		storeText(
-				getRawText() + s
-		);
-
-		// If either of the previous styles overran
-		//  the text by one, we need to shuffle that
-		//  extra character onto the new ones
-		int pOverRun = _styleAtom.getParagraphTextLengthCovered() - oldSize;
-		int cOverRun = _styleAtom.getCharacterTextLengthCovered() - oldSize;
-		if(pOverRun > 0) {
-			TextPropCollection tpc = _styleAtom.getParagraphStyles().getLast();
-			tpc.updateTextSize(
-					tpc.getCharactersCovered() - pOverRun
-			);
-		}
-		if(cOverRun > 0) {
-			TextPropCollection tpc = _styleAtom.getCharacterStyles().getLast();
-			tpc.updateTextSize(
-					tpc.getCharactersCovered() - cOverRun
-			);
-		}
-
-		// Next, add the styles for its paragraph and characters
-		TextPropCollection newPTP =
-			_styleAtom.addParagraphTextPropCollection(s.length()+pOverRun);
-		TextPropCollection newCTP =
-			_styleAtom.addCharacterTextPropCollection(s.length()+cOverRun);
-
-		// Now, create the new RichTextRun
-		RichTextRun nr = new RichTextRun(
-				this, oldSize, s.length(),
-				newPTP, newCTP, false, false
-		);
-
-		// Add the new RichTextRun onto our list
-		RichTextRun[] newRuns = new RichTextRun[_rtRuns.length+1];
-		System.arraycopy(_rtRuns, 0, newRuns, 0, _rtRuns.length);
-		newRuns[newRuns.length-1] = nr;
-		_rtRuns = newRuns;
-
-		// And return the new run to the caller
-		return nr;
-	}
-
-	/**
-	 * Saves the given string to the records. Doesn't
-	 *  touch the stylings.
-	 */
-	private void storeText(String s) {
-		// Store in the appropriate record
-		if(_isUnicode) {
-			// The atom can safely convert to unicode
-			_charAtom.setText(s);
-		} else {
-			// Will it fit in a 8 bit atom?
-			boolean hasMultibyte = StringUtil.hasMultibyte(s);
-			if(! hasMultibyte) {
-				// Fine to go into 8 bit atom
-				byte[] text = new byte[s.length()];
-				StringUtil.putCompressedUnicode(s,text,0);
-				_byteAtom.setText(text);
-			} else {
-				// Need to swap a TextBytesAtom for a TextCharsAtom
-
-				// Build the new TextCharsAtom
-				_charAtom = new TextCharsAtom();
-				_charAtom.setText(s);
-
-				// Use the TextHeaderAtom to do the swap on the parent
-				RecordContainer parent = _headerAtom.getParentRecord();
-				Record[] cr = parent.getChildRecords();
-				for(int i=0; i<cr.length; i++) {
-					// Look for TextBytesAtom
-					if(cr[i].equals(_byteAtom)) {
-						// Found it, so replace, then all done
-						cr[i] = _charAtom;
-						break;
-					}
-				}
-
-				// Flag the change
-				_byteAtom = null;
-				_isUnicode = true;
-			}
-		}
-        /**
-         * If TextSpecInfoAtom is present, we must update the text size in it,
-         * otherwise the ppt will be corrupted
-         */
-        if(_records != null) for (int i = 0; i < _records.length; i++) {
-            if(_records[i] instanceof TextSpecInfoAtom){
-                TextSpecInfoAtom specAtom = (TextSpecInfoAtom)_records[i];
-                if((s.length() + 1) != specAtom.getCharactersCovered()){
-                    specAtom.reset(s.length() + 1);
-                }
-            }
-        }
-	}
-
-	/**
-	 * Handles an update to the text stored in one of the Rich Text Runs
-	 * @param run
-	 * @param s
-	 */
-	public void changeTextInRichTextRun(RichTextRun run, String s) {
-		// Figure out which run it is
-		int runID = -1;
-		for(int i=0; i<_rtRuns.length; i++) {
-			if(run.equals(_rtRuns[i])) {
-				runID = i;
-			}
-		}
-		if(runID == -1) {
-			throw new IllegalArgumentException("Supplied RichTextRun wasn't from this TextRun");
-		}
-
-		// Ensure a StyleTextPropAtom is present, adding if required
-		ensureStyleAtomPresent();
-
-		// Update the text length for its Paragraph and Character stylings
-		// If it's shared:
-		//   * calculate the new length based on the run's old text
-		//   * this should leave in any +1's for the end of block if needed
-		// If it isn't shared:
-		//   * reset the length, to the new string's length
-		//   * add on +1 if the last block
-		// The last run needs its stylings to be 1 longer than the raw
-		//  text is. This is to define the stylings that any new text
-		//  that is added will inherit
-		TextPropCollection pCol = run._getRawParagraphStyle();
-		TextPropCollection cCol = run._getRawCharacterStyle();
-		int newSize = s.length();
-		if(runID == _rtRuns.length-1) {
-			newSize++;
-		}
-
-		if(run._isParagraphStyleShared()) {
-			pCol.updateTextSize( pCol.getCharactersCovered() - run.getLength() + s.length() );
-		} else {
-			pCol.updateTextSize(newSize);
-		}
-		if(run._isCharacterStyleShared()) {
-			cCol.updateTextSize( cCol.getCharactersCovered() - run.getLength() + s.length() );
-		} else {
-			cCol.updateTextSize(newSize);
-		}
-
-		// Build up the new text
-		// As we go through, update the start position for all subsequent runs
-		// The building relies on the old text still being present
-		StringBuffer newText = new StringBuffer();
-		for(int i=0; i<_rtRuns.length; i++) {
-			int newStartPos = newText.length();
-
-			// Build up the new text
-			if(i != runID) {
-				// Not the affected run, so keep old text
-				newText.append(_rtRuns[i].getRawText());
-			} else {
-				// Affected run, so use new text
-				newText.append(s);
-			}
-
-			// Do we need to update the start position of this run?
-			// (Need to get the text before we update the start pos)
-			if(i <= runID) {
-				// Change is after this, so don't need to change start position
-			} else {
-				// Change has occured, so update start position
-				_rtRuns[i].updateStartPosition(newStartPos);
-			}
-		}
-
-		// Now we can save the new text
-		storeText(newText.toString());
-	}
-
-	/**
-	 * Changes the text, and sets it all to have the same styling
-	 *  as the the first character has.
-	 * If you care about styling, do setText on a RichTextRun instead
-	 */
-	public void setRawText(String s) {
-		// Save the new text to the atoms
-		storeText(s);
-		RichTextRun fst = _rtRuns[0];
-
-		// Finally, zap and re-do the RichTextRuns
-		for(int i=0; i<_rtRuns.length; i++) { _rtRuns[i] = null; }
-		_rtRuns = new RichTextRun[1];
-        _rtRuns[0] = fst;
-
-		// Now handle record stylings:
-		// If there isn't styling
-		//  no change, stays with no styling
-		// If there is styling:
-		//  everthing gets the same style that the first block has
-        // Update the lengths +1 for since these will be the only runs
-		if(_styleAtom != null) {
-			LinkedList<TextPropCollection> pStyles = _styleAtom.getParagraphStyles();
-			while(pStyles.size() > 1) { pStyles.removeLast(); }
-
-            if (!pStyles.isEmpty()) {
-                pStyles.getFirst().updateTextSize( s.length()+1 );
-            }
-
-			LinkedList<TextPropCollection> cStyles = _styleAtom.getCharacterStyles();
-			while(cStyles.size() > 1) { cStyles.removeLast(); }
-            
-            if (!cStyles.isEmpty()) {
-                cStyles.getFirst().updateTextSize( s.length()+1 );
-            }
-			
-			_rtRuns[0].setText(s);
-		} else {
-			// Recreate rich text run with no styling
-			_rtRuns[0] = new RichTextRun(this,0,s.length());
-		}
-
-	}
-
-    /**
-     * Changes the text.
-     * Converts '\r' into '\n'
-     */
-    public void setText(String s) {
-        String text = normalize(s);
-        setRawText(text);
-    }
-
-    /**
-	 * Ensure a StyleTextPropAtom is present for this run,
-	 *  by adding if required. Normally for internal TextRun use.
-	 */
-	public void ensureStyleAtomPresent() {
-		if(_styleAtom != null) {
-			// All there
-			return;
-		}
-
-		// Create a new one at the right size
-		_styleAtom = new StyleTextPropAtom(getRawText().length() + 1);
-
-		// Use the TextHeader atom to get at the parent
-		RecordContainer runAtomsParent = _headerAtom.getParentRecord();
-
-		// Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom
-		Record addAfter = _byteAtom;
-		if(_byteAtom == null) { addAfter = _charAtom; }
-		runAtomsParent.addChildAfter(_styleAtom, addAfter);
-
-		// Feed this to our sole rich text run
-		if(_rtRuns.length != 1) {
-			throw new IllegalStateException("Needed to add StyleTextPropAtom when had many rich text runs");
-		}
-		// These are the only styles for now
-		_rtRuns[0].supplyTextProps(
-				_styleAtom.getParagraphStyles().get(0),
-				_styleAtom.getCharacterStyles().get(0),
-				false,
-				false
-		);
-	}
-
-	// Accesser methods follow
-
-	/**
-	 * Returns the text content of the run, which has been made safe
-	 * for printing and other use.
-	 */
-	public String getText() {
-		String rawText = getRawText();
-
-		// PowerPoint seems to store files with \r as the line break
-		// The messes things up on everything but a Mac, so translate
-		//  them to \n
-		String text = rawText.replace('\r','\n');
-
-        int type = _headerAtom == null ? 0 : _headerAtom.getTextType();
-        if(type == TextHeaderAtom.TITLE_TYPE || type == TextHeaderAtom.CENTER_TITLE_TYPE){
-            //0xB acts like cariage return in page titles and like blank in the others
-            text = text.replace((char) 0x0B, '\n');
-        } else {
-            text = text.replace((char) 0x0B, ' ');
-        }
-		return text;
-	}
-
-	/**
-	* Returns the raw text content of the run. This hasn't had any
-	*  changes applied to it, and so is probably unlikely to print
-	*  out nicely.
-	*/
-	public String getRawText() {
-		if(_isUnicode) {
-			return _charAtom.getText();
-		}
-		return _byteAtom.getText();
-	}
-
-	/**
-	 * Fetch the rich text runs (runs of text with the same styling) that
-	 *  are contained within this block of text
-	 */
-	public RichTextRun[] getRichTextRuns() {
-		return 	_rtRuns;
-	}
-
-	/**
-	* Returns the type of the text, from the TextHeaderAtom.
-	* Possible values can be seen from TextHeaderAtom
-	* @see org.apache.poi.hslf.record.TextHeaderAtom
-	*/
-	public int getRunType() {
-		return _headerAtom.getTextType();
-	}
-
-	/**
-	* Changes the type of the text. Values should be taken
-	*  from TextHeaderAtom. No checking is done to ensure you
-	*  set this to a valid value!
-	* @see org.apache.poi.hslf.record.TextHeaderAtom
-	*/
-	public void setRunType(int type) {
-		_headerAtom.setTextType(type);
-	}
-
-	/**
-	 * Supply the SlideShow we belong to.
-	 * Also passes it on to our child RichTextRuns
-	 */
-	public void supplySlideShow(SlideShow ss) {
-		slideShow = ss;
-		if(_rtRuns != null) {
-			for(int i=0; i<_rtRuns.length; i++) {
-				_rtRuns[i].supplySlideShow(slideShow);
-			}
-		}
-	}
-
-    public void setSheet(Sheet sheet){
-        this._sheet = sheet;
-    }
-
-    public Sheet getSheet(){
-        return this._sheet;
-    }
-
-    /**
-     * @return  Shape ID
-     */
-    protected int getShapeId(){
-        return shapeId;
-    }
-
-    /**
-     *  @param id Shape ID
-     */
-    protected void setShapeId(int id){
-        shapeId = id;
-    }
-
-    /**
-     * @return  0-based index of the text run in the SLWT container
-     */
-    protected int getIndex(){
-        return slwtIndex;
-    }
-
-    /**
-     *  @param id 0-based index of the text run in the SLWT container
-     */
-    protected void setIndex(int id){
-        slwtIndex = id;
-    }
-    
-    /**
-     * Is this Text Run one from a {@link PPDrawing}, or is it
-     *  one from the {@link SlideListWithText}?
-     */
-    public boolean isDrawingBased() {
-        return (slwtIndex == -1);
-    }
-
-    /**
-     * Returns the array of all hyperlinks in this text run
-     *
-     * @return the array of all hyperlinks in this text run
-     * or <code>null</code> if not found.
-     */
-    public Hyperlink[] getHyperlinks(){
-        return Hyperlink.find(this);
-    }
-
-    /**
-     * Fetch RichTextRun at a given position
-     *
-     * @param pos 0-based index in the text
-     * @return RichTextRun or null if not found
-     */
-    public RichTextRun getRichTextRunAt(int pos){
-        for (int i = 0; i < _rtRuns.length; i++) {
-            int start = _rtRuns[i].getStartIndex();
-            int end = _rtRuns[i].getEndIndex();
-            if(pos >= start && pos < end) return _rtRuns[i];
-        }
-        return null;
-    }
-
-    public TextRulerAtom getTextRuler(){
-        if(_ruler == null){
-            if(_records != null) for (int i = 0; i < _records.length; i++) {
-                if(_records[i] instanceof TextRulerAtom) {
-                    _ruler = (TextRulerAtom)_records[i];
-                    break;
-                }
-            }
-
-        }
-        return _ruler;
-
-    }
-
-    public TextRulerAtom createTextRuler(){
-        _ruler = getTextRuler();
-        if(_ruler == null){
-            _ruler = TextRulerAtom.getParagraphInstance();
-            _headerAtom.getParentRecord().appendChildRecord(_ruler);
-        }
-        return _ruler;
-    }
-
-    /**
-     * Returns a new string with line breaks converted into internal ppt representation
-     */
-    public String normalize(String s){
-        String ns = s.replaceAll("\\r?\\n", "\r");
-        return ns;
-    }
-
-    /**
-     * Returns records that make up this text run
-     *
-     * @return text run records
-     */
-    public Record[] getRecords(){
-        return _records;
-    }
-    /** Numbered List info */
-	public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) {
-		this.styleTextProp9Atom = styleTextProp9Atom;
-	}
-    /** Numbered List info */
-	public StyleTextProp9Atom getStyleTextProp9Atom() {
-		return this.styleTextProp9Atom;
-	}
-
-    /** Characters covered */
-	public StyleTextPropAtom getStyleTextPropAtom() {
-		return this._styleAtom;		
-	}
-
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java
deleted file mode 100644
index b585d61..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/model/TextShape.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.font.FontRenderContext;
-import java.awt.font.TextLayout;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Rectangle2D;
-import java.io.IOException;
-
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherOptRecord;
-import org.apache.poi.ddf.EscherProperties;
-import org.apache.poi.ddf.EscherSimpleProperty;
-import org.apache.poi.ddf.EscherSpRecord;
-import org.apache.poi.ddf.EscherTextboxRecord;
-import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.hslf.record.EscherTextboxWrapper;
-import org.apache.poi.hslf.record.InteractiveInfo;
-import org.apache.poi.hslf.record.InteractiveInfoAtom;
-import org.apache.poi.hslf.record.OEPlaceholderAtom;
-import org.apache.poi.hslf.record.OutlineTextRefAtom;
-import org.apache.poi.hslf.record.PPDrawing;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordTypes;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextBytesAtom;
-import org.apache.poi.hslf.record.TextCharsAtom;
-import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.hslf.record.TxInteractiveInfoAtom;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.util.POILogger;
-
-/**
- * A common superclass of all shapes that can hold text.
- *
- * @author Yegor Kozlov
- */
-public abstract class TextShape extends SimpleShape {
-
-    /**
-     * How to anchor the text
-     */
-    public static final int AnchorTop = 0;
-    public static final int AnchorMiddle = 1;
-    public static final int AnchorBottom = 2;
-    public static final int AnchorTopCentered = 3;
-    public static final int AnchorMiddleCentered = 4;
-    public static final int AnchorBottomCentered = 5;
-    public static final int AnchorTopBaseline = 6;
-    public static final int AnchorBottomBaseline = 7;
-    public static final int AnchorTopCenteredBaseline = 8;
-    public static final int AnchorBottomCenteredBaseline = 9;
-
-    /**
-     * How to wrap the text
-     */
-    public static final int WrapSquare = 0;
-    public static final int WrapByPoints = 1;
-    public static final int WrapNone = 2;
-    public static final int WrapTopBottom = 3;
-    public static final int WrapThrough = 4;
-
-    /**
-     * How to align the text
-     */
-    public static final int AlignLeft = 0;
-    public static final int AlignCenter = 1;
-    public static final int AlignRight = 2;
-    public static final int AlignJustify = 3;
-
-    /**
-     * TextRun object which holds actual text and format data
-     */
-    protected TextRun _txtrun;
-
-    /**
-     * Escher container which holds text attributes such as
-     * TextHeaderAtom, TextBytesAtom ot TextCharsAtom, StyleTextPropAtom etc.
-     */
-    protected EscherTextboxWrapper _txtbox;
-
-    /**
-     * Used to calculate text bounds
-     */
-    protected static final FontRenderContext _frc = new FontRenderContext(null, true, true);
-
-    /**
-     * Create a TextBox object and initialize it from the supplied Record container.
-     *
-     * @param escherRecord       <code>EscherSpContainer</code> container which holds information about this shape
-     * @param parent    the parent of the shape
-     */
-   protected TextShape(EscherContainerRecord escherRecord, Shape parent){
-        super(escherRecord, parent);
-
-    }
-
-    /**
-     * Create a new TextBox. This constructor is used when a new shape is created.
-     *
-     * @param parent    the parent of this Shape. For example, if this text box is a cell
-     * in a table then the parent is Table.
-     */
-    public TextShape(Shape parent){
-        super(null, parent);
-        _escherContainer = createSpContainer(parent instanceof ShapeGroup);
-    }
-
-    /**
-     * Create a new TextBox. This constructor is used when a new shape is created.
-     *
-     */
-    public TextShape(){
-        this(null);
-    }
-
-    public TextRun createTextRun(){
-        _txtbox = getEscherTextboxWrapper();
-        if(_txtbox == null) _txtbox = new EscherTextboxWrapper();
-
-        _txtrun = getTextRun();
-        if(_txtrun == null){
-            TextHeaderAtom tha = new TextHeaderAtom();
-            tha.setParentRecord(_txtbox);
-            _txtbox.appendChildRecord(tha);
-
-            TextCharsAtom tca = new TextCharsAtom();
-            _txtbox.appendChildRecord(tca);
-
-            StyleTextPropAtom sta = new StyleTextPropAtom(0);
-            _txtbox.appendChildRecord(sta);
-
-            _txtrun = new TextRun(tha,tca,sta);
-            _txtrun._records = new Record[]{tha, tca, sta};
-            _txtrun.setText("");
-
-            _escherContainer.addChildRecord(_txtbox.getEscherRecord());
-
-            setDefaultTextProperties(_txtrun);
-        }
-
-        return _txtrun;
-    }
-
-    /**
-     * Set default properties for the  TextRun.
-     * Depending on the text and shape type the defaults are different:
-     *   TextBox: align=left, valign=top
-     *   AutoShape: align=center, valign=middle
-     *
-     */
-    protected void setDefaultTextProperties(TextRun _txtrun){
-
-    }
-
-    /**
-     * Returns the text contained in this text frame.
-     *
-     * @return the text string for this textbox.
-     */
-     public String getText(){
-        TextRun tx = getTextRun();
-        return tx == null ? null : tx.getText();
-    }
-
-    /**
-     * Sets the text contained in this text frame.
-     *
-     * @param text the text string used by this object.
-     */
-    public void setText(String text){
-        TextRun tx = getTextRun();
-        if(tx == null){
-            tx = createTextRun();
-        }
-        tx.setText(text);
-        setTextId(text.hashCode());
-    }
-
-    /**
-     * When a textbox is added to  a sheet we need to tell upper-level
-     * <code>PPDrawing</code> about it.
-     *
-     * @param sh the sheet we are adding to
-     */
-    protected void afterInsert(Sheet sh){
-        super.afterInsert(sh);
-
-        EscherTextboxWrapper _txtbox = getEscherTextboxWrapper();
-        if(_txtbox != null){
-            PPDrawing ppdrawing = sh.getPPDrawing();
-            ppdrawing.addTextboxWrapper(_txtbox);
-            // Ensure the escher layer knows about the added records
-            try {
-                _txtbox.writeOut(null);
-            } catch (IOException e){
-                throw new HSLFException(e);
-            }
-            if(getAnchor().equals(new Rectangle()) && !"".equals(getText())) resizeToFitText();
-        }
-        if(_txtrun != null) {
-            _txtrun.setShapeId(getShapeId());
-            sh.onAddTextShape(this);
-        }
-    }
-
-    protected EscherTextboxWrapper getEscherTextboxWrapper(){
-        if(_txtbox == null){
-            EscherTextboxRecord textRecord = getEscherChild(EscherTextboxRecord.RECORD_ID);
-            if(textRecord != null) _txtbox = new EscherTextboxWrapper(textRecord);
-        }
-        return _txtbox;
-    }
-    /**
-     * Adjust the size of the TextShape so it encompasses the text inside it.
-     *
-     * @return a <code>Rectangle2D</code> that is the bounds of this <code>TextShape</code>.
-     */
-    public Rectangle2D resizeToFitText(){
-        String txt = getText();
-        if(txt == null || txt.length() == 0) return new Rectangle2D.Float();
-
-        RichTextRun rt = getTextRun().getRichTextRuns()[0];
-        int size = rt.getFontSize();
-        int style = 0;
-        if (rt.isBold()) style |= Font.BOLD;
-        if (rt.isItalic()) style |= Font.ITALIC;
-        String fntname = rt.getFontName();
-        Font font = new Font(fntname, style, size);
-
-        float width = 0, height = 0, leading = 0;
-        String[] lines = txt.split("\n");
-        for (int i = 0; i < lines.length; i++) {
-            if(lines[i].length() == 0) continue;
-
-            TextLayout layout = new TextLayout(lines[i], font, _frc);
-
-            leading = Math.max(leading, layout.getLeading());
-            width = Math.max(width, layout.getAdvance());
-            height = Math.max(height, (height + (layout.getDescent() + layout.getAscent())));
-        }
-
-        // add one character to width
-        Rectangle2D charBounds = font.getMaxCharBounds(_frc);
-        width += getMarginLeft() + getMarginRight() + charBounds.getWidth();
-
-        // add leading to height
-        height += getMarginTop() + getMarginBottom() + leading;
-
-        Rectangle2D anchor = getAnchor2D();
-        anchor.setRect(anchor.getX(), anchor.getY(), width, height);
-        setAnchor(anchor);
-
-        return anchor;
-    }
-
-    /**
-     * Returns the type of vertical alignment for the text.
-     * One of the <code>Anchor*</code> constants defined in this class.
-     *
-     * @return the type of alignment
-     */
-    public int getVerticalAlignment(){
-        EscherOptRecord opt = getEscherOptRecord();
-        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__ANCHORTEXT);
-        int valign = TextShape.AnchorTop;
-        if (prop == null){
-            /**
-             * If vertical alignment was not found in the shape properties then try to
-             * fetch the master shape and search for the align property there.
-             */
-            int type = getTextRun().getRunType();
-            MasterSheet master = getSheet().getMasterSheet();
-            if(master != null){
-                TextShape masterShape = master.getPlaceholderByTextType(type);
-                if(masterShape != null) valign = masterShape.getVerticalAlignment();
-            } else {
-                //not found in the master sheet. Use the hardcoded defaults.
-                switch (type){
-                     case TextHeaderAtom.TITLE_TYPE:
-                     case TextHeaderAtom.CENTER_TITLE_TYPE:
-                         valign = TextShape.AnchorMiddle;
-                         break;
-                     default:
-                         valign = TextShape.AnchorTop;
-                         break;
-                 }
-            }
-        } else {
-            valign = prop.getPropertyValue();
-        }
-        return valign;
-    }
-
-    /**
-     * Sets the type of vertical alignment for the text.
-     * One of the <code>Anchor*</code> constants defined in this class.
-     *
-     * @param align - the type of alignment
-     */
-    public void setVerticalAlignment(int align){
-        setEscherProperty(EscherProperties.TEXT__ANCHORTEXT, align);
-    }
-
-    /**
-     * Sets the type of horizontal alignment for the text.
-     * One of the <code>Align*</code> constants defined in this class.
-     *
-     * @param align - the type of horizontal alignment
-     */
-    public void setHorizontalAlignment(int align){
-        TextRun tx = getTextRun();
-        if(tx != null) tx.getRichTextRuns()[0].setAlignment(align);
-    }
-
-    /**
-     * Gets the type of horizontal alignment for the text.
-     * One of the <code>Align*</code> constants defined in this class.
-     *
-     * @return align - the type of horizontal alignment
-     */
-    public int getHorizontalAlignment(){
-        TextRun tx = getTextRun();
-        return tx == null ? -1 : tx.getRichTextRuns()[0].getAlignment();
-    }
-
-    /**
-     * Returns the distance (in points) between the bottom of the text frame
-     * and the bottom of the inscribed rectangle of the shape that contains the text.
-     * Default value is 1/20 inch.
-     *
-     * @return the botom margin
-     */
-    public float getMarginBottom(){
-        EscherOptRecord opt = getEscherOptRecord();
-        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTBOTTOM);
-        int val = prop == null ? EMU_PER_INCH/20 : prop.getPropertyValue();
-        return (float)val/EMU_PER_POINT;
-    }
-
-    /**
-     * Sets the botom margin.
-     * @see #getMarginBottom()
-     *
-     * @param margin    the bottom margin
-     */
-    public void setMarginBottom(float margin){
-        setEscherProperty(EscherProperties.TEXT__TEXTBOTTOM, (int)(margin*EMU_PER_POINT));
-    }
-
-    /**
-     *  Returns the distance (in points) between the left edge of the text frame
-     *  and the left edge of the inscribed rectangle of the shape that contains
-     *  the text.
-     *  Default value is 1/10 inch.
-     *
-     * @return the left margin
-     */
-    public float getMarginLeft(){
-        EscherOptRecord opt = getEscherOptRecord();
-        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTLEFT);
-        int val = prop == null ? EMU_PER_INCH/10 : prop.getPropertyValue();
-        return (float)val/EMU_PER_POINT;
-    }
-
-    /**
-     * Sets the left margin.
-     * @see #getMarginLeft()
-     *
-     * @param margin    the left margin
-     */
-    public void setMarginLeft(float margin){
-        setEscherProperty(EscherProperties.TEXT__TEXTLEFT, (int)(margin*EMU_PER_POINT));
-    }
-
-    /**
-     *  Returns the distance (in points) between the right edge of the
-     *  text frame and the right edge of the inscribed rectangle of the shape
-     *  that contains the text.
-     *  Default value is 1/10 inch.
-     *
-     * @return the right margin
-     */
-    public float getMarginRight(){
-        EscherOptRecord opt = getEscherOptRecord();
-        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTRIGHT);
-        int val = prop == null ? EMU_PER_INCH/10 : prop.getPropertyValue();
-        return (float)val/EMU_PER_POINT;
-    }
-
-    /**
-     * Sets the right margin.
-     * @see #getMarginRight()
-     *
-     * @param margin    the right margin
-     */
-    public void setMarginRight(float margin){
-        setEscherProperty(EscherProperties.TEXT__TEXTRIGHT, (int)(margin*EMU_PER_POINT));
-    }
-
-     /**
-     *  Returns the distance (in points) between the top of the text frame
-     *  and the top of the inscribed rectangle of the shape that contains the text.
-     *  Default value is 1/20 inch.
-     *
-     * @return the top margin
-     */
-    public float getMarginTop(){
-        EscherOptRecord opt = getEscherOptRecord();
-        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTTOP);
-        int val = prop == null ? EMU_PER_INCH/20 : prop.getPropertyValue();
-        return (float)val/EMU_PER_POINT;
-    }
-
-   /**
-     * Sets the top margin.
-     * @see #getMarginTop()
-     *
-     * @param margin    the top margin
-     */
-    public void setMarginTop(float margin){
-        setEscherProperty(EscherProperties.TEXT__TEXTTOP, (int)(margin*EMU_PER_POINT));
-    }
-
-
-    /**
-     * Returns the value indicating word wrap.
-     *
-     * @return the value indicating word wrap.
-     *  Must be one of the <code>Wrap*</code> constants defined in this class.
-     */
-    public int getWordWrap(){
-        EscherOptRecord opt = getEscherOptRecord();
-        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__WRAPTEXT);
-        return prop == null ? WrapSquare : prop.getPropertyValue();
-    }
-
-    /**
-     *  Specifies how the text should be wrapped
-     *
-     * @param wrap  the value indicating how the text should be wrapped.
-     *  Must be one of the <code>Wrap*</code> constants defined in this class.
-     */
-    public void setWordWrap(int wrap){
-        setEscherProperty(EscherProperties.TEXT__WRAPTEXT, wrap);
-    }
-
-    /**
-     * @return id for the text.
-     */
-    public int getTextId(){
-        EscherOptRecord opt = getEscherOptRecord();
-        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTID);
-        return prop == null ? 0 : prop.getPropertyValue();
-    }
-
-    /**
-     * Sets text ID
-     *
-     * @param id of the text
-     */
-    public void setTextId(int id){
-        setEscherProperty(EscherProperties.TEXT__TEXTID, id);
-    }
-
-    /**
-      * @return the TextRun object for this text box
-      */
-    public TextRun getTextRun(){
-       if (null == this._txtrun) initTextRun();
-       if (null == this._txtrun && null != this._txtbox) {
-          TextHeaderAtom    tha = null; 
-          TextBytesAtom     tba = null;
-          TextCharsAtom     tca = null;
-          StyleTextPropAtom sta = null;
-          Record[] childRecords = this._txtbox.getChildRecords();
-          for (Record r : childRecords) {
-             if (r instanceof TextHeaderAtom) {
-                tha = (TextHeaderAtom) r;
-             } else if (r instanceof TextBytesAtom) {
-                tba = (TextBytesAtom) r;
-             } else if (r instanceof TextCharsAtom) {
-                tca = (TextCharsAtom) r;
-             } else if (r instanceof StyleTextPropAtom) {
-                sta = (StyleTextPropAtom) r;
-             }
-          }
-          if (tba != null) {
-             this._txtrun = new TextRun(tha, tba, sta);
-          } else if (tca != null) {
-             this._txtrun = new TextRun(tha, tca, sta);
-          }
-       }
-       return _txtrun;
-    }
-
-    public void setSheet(Sheet sheet) {
-        _sheet = sheet;
-
-        // Initialize _txtrun object.
-        // (We can't do it in the constructor because the sheet
-        //  is not assigned then, it's only built once we have
-        //  all the records)
-        TextRun tx = getTextRun();
-        if (tx != null) {
-            // Supply the sheet to our child RichTextRuns
-            tx.setSheet(_sheet);
-            RichTextRun[] rt = tx.getRichTextRuns();
-            for (int i = 0; i < rt.length; i++) {
-                rt[i].supplySlideShow(_sheet.getSlideShow());
-            }
-        }
-
-    }
-
-    protected void initTextRun(){
-        EscherTextboxWrapper txtbox = getEscherTextboxWrapper();
-        Sheet sheet = getSheet();
-
-        if(sheet == null || txtbox == null) return;
-
-        OutlineTextRefAtom ota = null;
-
-        Record[] child = txtbox.getChildRecords();
-        for (int i = 0; i < child.length; i++) {
-            if (child[i] instanceof OutlineTextRefAtom) {
-                ota = (OutlineTextRefAtom)child[i];
-                break;
-            }
-        }
-
-        TextRun[] runs = _sheet.getTextRuns();
-        if (ota != null) {
-            int idx = ota.getTextIndex();
-            for (int i = 0; i < runs.length; i++) {
-                if(runs[i].getIndex() == idx){
-                    _txtrun = runs[i];
-                    break;
-                }
-            }
-            if(_txtrun == null) {
-                logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx);
-            }
-        } else {
-            EscherSpRecord escherSpRecord = getEscherChild(EscherSpRecord.RECORD_ID);
-            int shapeId = escherSpRecord.getShapeId();
-            if(runs != null) for (int i = 0; i < runs.length; i++) {
-                if(runs[i].getShapeId() == shapeId){
-                    _txtrun = runs[i];
-                    break;
-                }
-            }
-        }
-        // ensure the same references child records of TextRun
-        if(_txtrun != null) for (int i = 0; i < child.length; i++) {
-            for (Record r : _txtrun.getRecords()) {
-                if (child[i].getRecordType() == r.getRecordType()) {
-                    child[i] = r;
-                }
-            }
-        }
-    }
-
-    public void draw(Graphics2D graphics){
-        AffineTransform at = graphics.getTransform();
-        ShapePainter.paint(this, graphics);
-        new TextPainter(this).paint(graphics);
-        graphics.setTransform(at);
-    }
-
-    /**
-     * Return <code>OEPlaceholderAtom</code>, the atom that describes a placeholder.
-     *
-     * @return <code>OEPlaceholderAtom</code> or <code>null</code> if not found
-     */
-    public OEPlaceholderAtom getPlaceholderAtom(){
-        return getClientDataRecord(RecordTypes.OEPlaceholderAtom.typeID);
-    }
-
-    /**
-     *
-     * Assigns a hyperlink to this text shape
-     *
-     * @param linkId    id of the hyperlink, @see org.apache.poi.hslf.usermodel.SlideShow#addHyperlink(Hyperlink)
-     * @param      beginIndex   the beginning index, inclusive.
-     * @param      endIndex     the ending index, exclusive.
-     * @see org.apache.poi.hslf.usermodel.SlideShow#addHyperlink(Hyperlink)
-     */
-    public void setHyperlink(int linkId, int beginIndex, int endIndex){
-        //TODO validate beginIndex and endIndex and throw IllegalArgumentException
-
-        InteractiveInfo info = new InteractiveInfo();
-        InteractiveInfoAtom infoAtom = info.getInteractiveInfoAtom();
-        infoAtom.setAction(InteractiveInfoAtom.ACTION_HYPERLINK);
-        infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_Url);
-        infoAtom.setHyperlinkID(linkId);
-
-        _txtbox.appendChildRecord(info);
-
-        TxInteractiveInfoAtom txiatom = new TxInteractiveInfoAtom();
-        txiatom.setStartIndex(beginIndex);
-        txiatom.setEndIndex(endIndex);
-        _txtbox.appendChildRecord(txiatom);
-
-    }
-
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java
index cf25eb6..c76b05c 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/BitMaskTextProp.java
@@ -17,6 +17,10 @@
 
 package org.apache.poi.hslf.model.textproperties;
 
+import org.apache.poi.hslf.record.Record;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
 /** 
  * Definition of a special kind of property of some text, or its 
  *  paragraph. For these properties, a flag in the "contains" header 
@@ -24,8 +28,10 @@
  *  of the property is itself a mask, encoding several different
  *  (but related) properties
  */
-public class BitMaskTextProp extends TextProp implements Cloneable {
-	private String[] subPropNames;
+public abstract class BitMaskTextProp extends TextProp implements Cloneable {
+    protected static final POILogger logger = POILogFactory.getLogger(BitMaskTextProp.class);
+    
+    private String[] subPropNames;
 	private int[] subPropMasks;
 	private boolean[] subPropMatches;
 
@@ -34,64 +40,131 @@
 	/** Fetch the list of if the sub properties match or not */
 	public boolean[] getSubPropMatches() { return subPropMatches; }
 
-	public BitMaskTextProp(int sizeOfDataBlock, int maskInHeader, String overallName, String[] subPropNames) {
+	protected BitMaskTextProp(int sizeOfDataBlock, int maskInHeader, String overallName, String... subPropNames) {
 		super(sizeOfDataBlock,maskInHeader,"bitmask");
 		this.subPropNames = subPropNames;
 		this.propName = overallName;
 		subPropMasks = new int[subPropNames.length];
 		subPropMatches = new boolean[subPropNames.length];
 		
+		int LSB = Integer.lowestOneBit(maskInHeader);
+		
 		// Initialise the masks list
 		for(int i=0; i<subPropMasks.length; i++) {
-			subPropMasks[i] = (1 << i);
+			subPropMasks[i] = (LSB << i);
 		}
 	}
 	
 	/**
-	 * As we're purely mask based, just set flags for stuff
-	 *  that is set
+	 * Calculate mask from the subPropMatches.
 	 */
+	@Override
 	public int getWriteMask() {
-		return dataValue;
+	    /*
+	     * The dataValue can't be taken as a mask, as sometimes certain properties
+	     * are explicitly set to false, i.e. the mask says the property is defined
+	     * but in the actually nibble the property is set to false
+	     */ 
+	    int mask = 0, i = 0;
+	    for (int subMask : subPropMasks) {
+	        if (subPropMatches[i++]) mask |= subMask;
+	    }
+		return mask;
 	}
+
+	/**
+	 * Sets the write mask, i.e. which defines the text properties to be considered
+	 *
+	 * @param writeMask the mask, bit values outside the property mask range will be ignored
+	 */
+	public void setWriteMask(int writeMask) {
+        int i = 0;
+        for (int subMask : subPropMasks) {
+            subPropMatches[i++] = ((writeMask & subMask) != 0);
+        }
+	}
+
+	/**
+	 * Return the text property value.
+	 * Clears all bits of the value, which are marked as unset.
+	 * 
+	 * @return the text property value.
+	 */
+	@Override
+	public int getValue() {
+	    int val = dataValue, i = 0;;
+	    for (int mask : subPropMasks) {
+	        if (!subPropMatches[i++]) {
+	            val &= ~mask;
+	        }
+	    }
+	    return val;
+	}
+	
 	
 	/**
 	 * Set the value of the text property, and recompute the sub
-	 *  properties based on it
+	 * properties based on it, i.e. all unset subvalues will be cleared.
+	 * Use {@link #setSubValue(boolean, int)} to explicitly set subvalues to {@code false}. 
 	 */
+	@Override
 	public void setValue(int val) { 
 		dataValue = val;
 
 		// Figure out the values of the sub properties
-		for(int i=0; i< subPropMatches.length; i++) {
-			subPropMatches[i] = false;
-			if((dataValue & subPropMasks[i]) != 0) {
-				subPropMatches[i] = true;
-			}
+		int i = 0;
+		for(int mask : subPropMasks) {
+		    subPropMatches[i++] = ((val & mask) != 0);
 		}
 	}
 
 	/**
+	 * Convenience method to set a value with mask, without splitting it into the subvalues
+	 *
+	 * @param val
+	 * @param writeMask
+	 */
+	public void setValueWithMask(int val, int writeMask) {
+	    setWriteMask(writeMask);
+	    dataValue = val;
+	    dataValue = getValue();
+	    if (val != dataValue) {
+	        logger.log(POILogger.WARN, "Style properties of '"+getName()+"' don't match mask - output will be sanitized");
+	        if (logger.check(POILogger.DEBUG)) {
+	            StringBuilder sb = new StringBuilder("The following style attributes of the '"+getName()+"' property will be ignored:\n");
+	            int i=0;
+	            for (int mask : subPropMasks) {
+	                if (!subPropMatches[i] && (val & mask) != 0) {
+	                    sb.append(subPropNames[i]+",");
+	                }
+	                i++;
+	            }
+	            logger.log(POILogger.DEBUG, sb.toString());
+	        }
+	    }
+	}
+	
+	/**
 	 * Fetch the true/false status of the subproperty with the given index
 	 */
 	public boolean getSubValue(int idx) {
-		return subPropMatches[idx];
+		return subPropMatches[idx] && ((dataValue & subPropMasks[idx]) != 0);
 	}
 
 	/**
 	 * Set the true/false status of the subproperty with the given index
 	 */
 	public void setSubValue(boolean value, int idx) {
-		if(subPropMatches[idx] == value) { return; }
-		if(value) {
-			dataValue += subPropMasks[idx];
-		} else {
-			dataValue -= subPropMasks[idx];
-		}
-		subPropMatches[idx] = value;
+        subPropMatches[idx] = true;
+        if (value) {
+            dataValue |= subPropMasks[idx];
+        } else {
+            dataValue &= ~subPropMasks[idx];
+        }
 	}
 	
-	public Object clone(){
+	@Override
+	public BitMaskTextProp clone(){
 		BitMaskTextProp newObj = (BitMaskTextProp)super.clone();
 		
 		// Don't carry over matches, but keep everything 
@@ -100,4 +173,8 @@
 		
 		return newObj;
 	}
+	
+    public BitMaskTextProp cloneAll(){
+        return (BitMaskTextProp)super.clone();
+    }	
 }
\ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java
index 1afd6b1..f7cd037 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/CharFlagsTextProp.java
@@ -34,21 +34,23 @@
 
     public static final String NAME = "char_flags";
 	public CharFlagsTextProp() {
-		super(2,0xffff, NAME, new String[] {
-				"bold",                 // 0x0001  A bit that specifies whether the characters are bold.
-				"italic",               // 0x0002  A bit that specifies whether the characters are italicized.
-				"underline",            // 0x0004  A bit that specifies whether the characters are underlined.
-				"char_unknown_1",       // 0x0008  Undefined and MUST be ignored.
-				"shadow",               // 0x0010  A bit that specifies whether the characters have a shadow effect.
-				"fehint",               // 0x0020  A bit that specifies whether characters originated from double-byte input.
-				"char_unknown_2",       // 0x0040  Undefined and MUST be ignored.
-				"kumi",                 // 0x0080  A bit that specifies whether Kumimoji are used for vertical text.
-				"strikethrough",        // 0x0100  Undefined and MUST be ignored.
-				"emboss",               // 0x0200  A bit that specifies whether the characters are embossed.
-                "char_unknown_3",       // 0x0400  Undefined and MUST be ignored.
-                "char_unknown_4",       // 0x0800  Undefined and MUST be ignored.
-                "char_unknown_5",       // 0x1000  Undefined and MUST be ignored.
-			}
+		super(2, 0xffff, NAME,
+			"bold",                 // 0x0001  A bit that specifies whether the characters are bold.
+			"italic",               // 0x0002  A bit that specifies whether the characters are italicized.
+			"underline",            // 0x0004  A bit that specifies whether the characters are underlined.
+			"unused1",              // 0x0008  Undefined and MUST be ignored.
+			"shadow",               // 0x0010  A bit that specifies whether the characters have a shadow effect.
+			"fehint",               // 0x0020  A bit that specifies whether characters originated from double-byte input.
+			"unused2",              // 0x0040  Undefined and MUST be ignored.
+			"kumi",                 // 0x0080  A bit that specifies whether Kumimoji are used for vertical text.
+			"strikethrough",        // 0x0100  Undefined and MUST be ignored.
+			"emboss",               // 0x0200  A bit that specifies whether the characters are embossed.
+            "pp9rt_1",              // 0x0400  An unsigned integer that specifies the run grouping of additional text properties in StyleTextProp9Atom record.
+            "pp9rt_2",              // 0x0800
+            "pp9rt_3",              // 0x1000
+            "pp9rt_4",              // 0x2000
+            "unused4_1",            // 0x4000  Undefined and MUST be ignored.
+            "unused4_2"             // 0x8000  Undefined and MUST be ignored.
 		);
 	}
 }
\ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java
similarity index 71%
copy from src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java
copy to src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java
index c4c2729..904feee 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java
@@ -18,17 +18,16 @@
 package org.apache.poi.hslf.model.textproperties;
 
 /**
- * Definition for the alignment text property.
+ * Definition for the font alignment property.
  */
-public class AlignmentTextProp extends TextProp {
-	public static final int LEFT = 0;
-	public static final int CENTER = 1;
-	public static final int RIGHT = 2;
-	public static final int JUSTIFY = 3;
-	public static final int THAIDISTRIBUTED = 5;
-	public static final int JUSTIFYLOW = 6;
+public class FontAlignmentProp extends TextProp {
+    public static final String NAME = "fontAlign";
+	public static final int BASELINE = 0;
+	public static final int TOP = 1;
+	public static final int CENTER = 2;
+	public static final int BOTTOM = 3;
 
-	public AlignmentTextProp() {
-		super(2, 0x800, "alignment");
+	public FontAlignmentProp() {
+		super(2, 0x10000, NAME);
 	}
 }
\ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java
index 6628332..40adf46 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java
@@ -41,7 +41,7 @@
     public int getCharactersCovered() { return charactersCovered; }
     
     public int getIndentLevel() {
-        return (int)indentLevel;
+        return indentLevel;
     }
     
     /**
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java
index c0501d2..d7c6072 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/ParagraphFlagsTextProp.java
@@ -31,11 +31,11 @@
     public static final String NAME = "paragraph_flags";
 
 	public ParagraphFlagsTextProp() {
-		super(2,  0xF, NAME, new String[] {
-					"bullet",
-                    "bullet.hardfont",
-					"bullet.hardcolor",
-                    "bullet.hardsize"}
+		super(2,  0xF, NAME,
+			"bullet",
+            "bullet.hardfont",
+			"bullet.hardcolor",
+            "bullet.hardsize"
 		);
 	}
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java
new file mode 100644
index 0000000..786b373
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TabStopPropCollection.java
@@ -0,0 +1,113 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.hslf.model.textproperties;

+

+import java.util.ArrayList;

+import java.util.List;

+

+import org.apache.poi.util.LittleEndian;

+import org.apache.poi.util.LittleEndianConsts;

+

+/**

+ * Container for tabstop lists

+ */

+public class TabStopPropCollection extends TextProp {

+    public enum TabStopType {

+        LEFT(0), CENTER(1), RIGHT(2), DECIMAL(3);

+        private final int val;

+        TabStopType(int val) {

+            this.val = val;

+        }

+        public static TabStopType fromRecordVal(int val)  {

+            for (TabStopType tst : values()) {

+                if (tst.val == val) return tst;

+            }

+            return LEFT;

+        }

+    }

+

+    public static class TabStop {

+        /**

+         * If the TextPFException record that contains this TabStop structure also contains a

+         * leftMargin, then the value of position is relative to the left margin of the paragraph;

+         * otherwise, the value is relative to the left side of the paragraph.

+         * 

+         * If a TextRuler record contains this TabStop structure, the value is relative to the

+         * left side of the text ruler.

+         */

+        private int position;

+

+        /**

+         * A enumeration that specifies how text aligns at the tab stop.

+         */

+        private TabStopType type;

+

+        public TabStop(int position, TabStopType type) {

+            this.position = position;

+            this.type = type;

+        }

+        

+        public int getPosition() {

+            return position;

+        }

+

+        public void setPosition(int position) {

+            this.position = position;

+        }

+

+        public TabStopType getType() {

+            return type;

+        }

+

+        public void setType(TabStopType type) {

+            this.type = type;

+        }

+    }

+    

+    private List<TabStop> tabStops = new ArrayList<TabStop>();

+    

+    public TabStopPropCollection() {

+        super(0, 0x100000, "tabStops");

+    }

+    

+    /**

+     * Parses the tabstops from TxMasterStyle record

+     *

+     * @param data the data stream

+     * @param offset the offset within the data

+     * @return the new offset

+     */

+    public void parseProperty(byte data[], int offset) {

+        int count = LittleEndian.getUShort(data, offset);

+        offset += LittleEndianConsts.SHORT_SIZE;

+        for (int i=0; i<count; i++) {

+            int position = LittleEndian.getShort(data, offset);

+            offset += LittleEndianConsts.SHORT_SIZE;

+            int recVal = LittleEndian.getShort(data, offset);

+            TabStopType type = TabStopType.fromRecordVal(recVal);

+            offset += LittleEndianConsts.SHORT_SIZE;

+            tabStops.add(new TabStop(position, type));

+            

+        }

+    }

+    

+    @Override

+    public int getSize() {

+        return LittleEndianConsts.SHORT_SIZE + tabStops.size()*LittleEndianConsts.INT_SIZE;

+    }

+}

diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextAlignmentProp.java
similarity index 62%
copy from src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java
copy to src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextAlignmentProp.java
index c4c2729..82430f0 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextAlignmentProp.java
@@ -18,17 +18,49 @@
 package org.apache.poi.hslf.model.textproperties;
 
 /**
- * Definition for the alignment text property.
+ * Definition for the text alignment property.
  */
-public class AlignmentTextProp extends TextProp {
-	public static final int LEFT = 0;
+public class TextAlignmentProp extends TextProp {
+	/**
+	 * For horizontal text, left aligned.
+	 * For vertical text, top aligned.
+	 */
+    public static final int LEFT = 0;
+    
+    /**
+     * For horizontal text, centered.
+     * For vertical text, middle aligned.
+     */
 	public static final int CENTER = 1;
+	
+	/**
+	 * For horizontal text, right aligned.
+	 * For vertical text, bottom aligned.
+	 */
 	public static final int RIGHT = 2;
+	
+	/**
+	 * For horizontal text, flush left and right.
+	 * For vertical text, flush top and bottom.
+	 */
 	public static final int JUSTIFY = 3;
+	
+	/**
+	 * Distribute space between characters.
+	 */
+	public static final int DISTRIBUTED = 4;
+	
+	/**
+	 * Thai distribution justification.
+	 */
 	public static final int THAIDISTRIBUTED = 5;
+	
+	/**
+	 * Kashida justify low.
+	 */
 	public static final int JUSTIFYLOW = 6;
 
-	public AlignmentTextProp() {
+	public TextAlignmentProp() {
 		super(2, 0x800, "alignment");
 	}
 }
\ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPFException9.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPFException9.java
index b329c8a..271b259 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPFException9.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPFException9.java
@@ -21,7 +21,7 @@
  */
 package org.apache.poi.hslf.model.textproperties;
 
-import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum;
+import org.apache.poi.sl.usermodel.AutoNumberingScheme;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -41,8 +41,8 @@
 	private final byte mask4;
 	private final Short bulletBlipRef;
 	private final Short fBulletHasAutoNumber;
-	private final TextAutoNumberSchemeEnum autoNumberScheme;
-	private final static TextAutoNumberSchemeEnum DEFAULT_AUTONUMBER_SHEME = TextAutoNumberSchemeEnum.ANM_ArabicPeriod;
+	private final AutoNumberingScheme autoNumberScheme;
+	private final static AutoNumberingScheme DEFAULT_AUTONUMBER_SHEME = AutoNumberingScheme.arabicPeriod;
 	private final Short autoNumberStartNumber;
 	private final static Short DEFAULT_START_NUMBER = new Short((short)1);
 	private final int recordLength;
@@ -71,7 +71,7 @@
 			this.autoNumberScheme = null;
 			this.autoNumberStartNumber = null;
 		} else {
-			this.autoNumberScheme = TextAutoNumberSchemeEnum.valueOf(LittleEndian.getShort(source, index));
+			this.autoNumberScheme = AutoNumberingScheme.forNativeID(LittleEndian.getShort(source, index));
 			index +=2;
 			this.autoNumberStartNumber = LittleEndian.getShort(source, index);
 			index +=2;
@@ -85,7 +85,7 @@
 	public Short getfBulletHasAutoNumber() {
 		return fBulletHasAutoNumber;
 	}
-	public TextAutoNumberSchemeEnum getAutoNumberScheme() {
+	public AutoNumberingScheme getAutoNumberScheme() {
 		if (null != this.autoNumberScheme) {
 			return this.autoNumberScheme;
 		}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java
index c42ac71..07d663b 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextProp.java
@@ -45,6 +45,16 @@
 	}
 
 	/**
+	 * Clones the property
+	 */
+	public TextProp(TextProp other) {
+	    this.sizeOfDataBlock = other.sizeOfDataBlock;
+	    this.maskInHeader = other.maskInHeader;
+	    this.propName = other.propName;
+	    this.dataValue = other.dataValue;
+	}
+	
+	/**
 	 * Name of the text property
 	 */
 	public String getName() { return propName; }
@@ -79,11 +89,36 @@
 	/**
 	 * Clone, eg when you want to actually make use of one of these.
 	 */
-	public Object clone(){
+	@Override
+	public TextProp clone(){
 		try {
-			return super.clone();
+			return (TextProp)super.clone();
 		} catch(CloneNotSupportedException e) {
 			throw new InternalError(e.getMessage());
 		}
 	}
+	
+	public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + dataValue;
+        result = prime * result + maskInHeader;
+        result = prime * result + ((propName == null) ? 0 : propName.hashCode());
+        result = prime * result + sizeOfDataBlock;
+        return result;
+    }
+
+    public boolean equals(Object obj) {
+        if (this == obj) return true;
+        if (obj == null) return false;
+        if (getClass() != obj.getClass()) return false;
+        TextProp other = (TextProp) obj;
+        if (dataValue != other.dataValue) return false;
+        if (maskInHeader != other.maskInHeader) return false;
+        if (propName == null) {
+            if (other.propName != null) return false;
+        } else if (!propName.equals(other.propName)) return false;
+        if (sizeOfDataBlock != other.sizeOfDataBlock) return false;
+        return true;
+    }
 }
\ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
index c538f01..84cfe99 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java
@@ -17,111 +17,228 @@
 
 package org.apache.poi.hslf.model.textproperties;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.LinkedList;
+import java.io.*;
+import java.util.*;
 
 import org.apache.poi.hslf.record.StyleTextPropAtom;
+import org.apache.poi.util.HexDump;
 import org.apache.poi.util.LittleEndian;
 
 /**
  * For a given run of characters, holds the properties (which could
  *  be paragraph properties or character properties).
  * Used to hold the number of characters affected, the list of active
- *  properties, and the random reserved field if required.
+ *  properties, and the indent level if required.
  */
 public class TextPropCollection {
-	private int charactersCovered;
-	private short reservedField;
-	private LinkedList<TextProp> textPropList;
-    private int maskSpecial = 0;
+    /** All the different kinds of paragraph properties we might handle */
+    public static final TextProp[] paragraphTextPropTypes = {
+        // TextProp order is according to 2.9.20 TextPFException,
+        // bitmask order can be different
+        new ParagraphFlagsTextProp(),
+        new TextProp(2, 0x80, "bullet.char"),
+        new TextProp(2, 0x10, "bullet.font"),
+        new TextProp(2, 0x40, "bullet.size"),
+        new TextProp(4, 0x20, "bullet.color"),
+        new TextAlignmentProp(),
+        new TextProp(2, 0x1000, "linespacing"),
+        new TextProp(2, 0x2000, "spacebefore"),
+        new TextProp(2, 0x4000, "spaceafter"),
+        new TextProp(2, 0x100, "text.offset"), // left margin
+        // 0x200 - Undefined and MUST be ignored
+        new TextProp(2, 0x400, "bullet.offset"), // indent
+        new TextProp(2, 0x8000, "defaultTabSize"),
+        new TabStopPropCollection(), // tabstops size is variable!
+        new FontAlignmentProp(),
+        new WrapFlagsTextProp(),
+        new TextProp(2, 0x200000, "textDirection"),
+        // 0x400000 MUST be zero and MUST be ignored
+        new TextProp(0, 0x800000, "bullet.blip"), // TODO: check size
+        new TextProp(0, 0x1000000, "bullet.scheme"), // TODO: check size
+        new TextProp(0, 0x2000000, "hasBulletScheme"), // TODO: check size
+        // 0xFC000000 MUST be zero and MUST be ignored
+    };
     
+    /** All the different kinds of character properties we might handle */
+    public static final TextProp[] characterTextPropTypes = new TextProp[] {
+        new TextProp(0, 0x100000, "pp10ext"),
+        new TextProp(0, 0x1000000, "newAsian.font.index"), // A bit that specifies whether the newEAFontRef field of the TextCFException10 structure that contains this CFMasks exists.
+        new TextProp(0, 0x2000000, "cs.font.index"), // A bit that specifies whether the csFontRef field of the TextCFException10 structure that contains this CFMasks exists.
+        new TextProp(0, 0x4000000, "pp11ext"), // A bit that specifies whether the pp11ext field of the TextCFException10 structure that contains this CFMasks exists.
+        new CharFlagsTextProp(),
+        new TextProp(2, 0x10000, "font.index"),
+        new TextProp(2, 0x200000, "asian.font.index"),
+        new TextProp(2, 0x400000, "ansi.font.index"),
+        new TextProp(2, 0x800000, "symbol.font.index"),
+        new TextProp(2, 0x20000, "font.size"),
+        new TextProp(4, 0x40000, "font.color"),
+        new TextProp(2, 0x80000, "superscript")
+    };
+
+    public enum TextPropType {
+        paragraph, character;
+    }
+    
+    private int charactersCovered;
+	
+    // indentLevel is only valid for paragraph collection
+    // if it's set to -1, it must be omitted - see 2.9.36 TextMasterStyleLevel
+    private short indentLevel = 0;
+	private final List<TextProp> textPropList = new ArrayList<TextProp>();
+    private int maskSpecial = 0;
+    private final TextPropType textPropType;
+    
+    /**
+     * Create a new collection of text properties (be they paragraph
+     *  or character) which will be groked via a subsequent call to
+     *  buildTextPropList().
+     */
+    public TextPropCollection(int charactersCovered, TextPropType textPropType) {
+        this.charactersCovered = charactersCovered;
+        this.textPropType = textPropType;
+    }
+
     public int getSpecialMask() { return maskSpecial; }
 
 	/** Fetch the number of characters this styling applies to */
 	public int getCharactersCovered() { return charactersCovered; }
 	/** Fetch the TextProps that define this styling */
-	public LinkedList<TextProp> getTextPropList() { return textPropList; }
+	public List<TextProp> getTextPropList() { return textPropList; }
 	
 	/** Fetch the TextProp with this name, or null if it isn't present */
 	public TextProp findByName(String textPropName) {
-		for(int i=0; i<textPropList.size(); i++) {
-			TextProp prop = textPropList.get(i);
+		for(TextProp prop : textPropList) {
 			if(prop.getName().equals(textPropName)) {
 				return prop;
 			}
 		}
 		return null;
 	}
+
+	public TextProp removeByName(String name) {
+	    Iterator<TextProp> iter = textPropList.iterator();
+	    TextProp tp = null;
+	    while (iter.hasNext()) {
+	        tp = iter.next();
+	        if (tp.getName().equals(name)){
+	            iter.remove();
+	            break;
+	        }
+	    }
+	    return tp;
+	}
 	
 	/** Add the TextProp with this name to the list */
 	public TextProp addWithName(String name) {
 		// Find the base TextProp to base on
+		TextProp existing = findByName(name);
+		if (existing != null) return existing;
+		
 		TextProp base = null;
-		for(int i=0; i < StyleTextPropAtom.characterTextPropTypes.length; i++) {
-			if(StyleTextPropAtom.characterTextPropTypes[i].getName().equals(name)) {
-				base = StyleTextPropAtom.characterTextPropTypes[i];
-			}
+		for (TextProp tp : getPotentialProperties()) {
+		    if (tp.getName().equals(name)) {
+		        base = tp;
+		        break;
+		    }
 		}
-		for(int i=0; i < StyleTextPropAtom.paragraphTextPropTypes.length; i++) {
-			if(StyleTextPropAtom.paragraphTextPropTypes[i].getName().equals(name)) {
-				base = StyleTextPropAtom.paragraphTextPropTypes[i];
-			}
-		}
+		
 		if(base == null) {
-			throw new IllegalArgumentException("No TextProp with name " + name + " is defined to add from");
+			throw new IllegalArgumentException("No TextProp with name " + name + " is defined to add from. "
+		        + "Character and paragraphs have their own properties/names.");
 		}
 		
 		// Add a copy of this property, in the right place to the list
-		TextProp textProp = (TextProp)base.clone();
-		int pos = 0;
-		for(int i=0; i<textPropList.size(); i++) {
-			TextProp curProp = textPropList.get(i);
-			if(textProp.getMask() > curProp.getMask()) {
-				pos++;
-			}
-		}
-		textPropList.add(pos, textProp);
+		TextProp textProp = base.clone();
+		addProp(textProp);
 		return textProp;
 	}
 
+	public TextPropType getTextPropType() {
+	    return textPropType;
+	}
+	
+	private TextProp[] getPotentialProperties() {
+	    return (textPropType == TextPropType.paragraph) ? paragraphTextPropTypes : characterTextPropTypes;
+	}
+	
+	/**
+	 * Add the property at the correct position. Replaces an existing property with the same name.
+	 *
+	 * @param textProp the property to be added
+	 */
+	public void addProp(TextProp textProp) {
+	    assert(textProp != null);
+	    
+        int pos = 0;
+        boolean found = false;
+        for (TextProp curProp : getPotentialProperties()) {
+            String potName = curProp.getName();
+            if (pos == textPropList.size() || potName.equals(textProp.getName())) {
+                if (textPropList.size() > pos && potName.equals(textPropList.get(pos).getName())) {
+                    // replace existing prop (with same name)
+                    textPropList.set(pos, textProp);
+                } else {
+                    textPropList.add(pos, textProp);
+                }
+                found = true;
+                break;
+            }
+            
+            if (potName.equals(textPropList.get(pos).getName())) {
+                pos++;
+            }
+        }
+
+        if(!found) {
+            String err = "TextProp with name " + textProp.getName() + " doesn't belong to this collection.";
+            throw new IllegalArgumentException(err);
+        }
+	}
+
 	/**
 	 * For an existing set of text properties, build the list of 
 	 *  properties coded for in a given run of properties.
 	 * @return the number of bytes that were used encoding the properties list
 	 */
-	public int buildTextPropList(int containsField, TextProp[] potentialProperties, byte[] data, int dataOffset) {
+	public int buildTextPropList(int containsField, byte[] data, int dataOffset) {
 		int bytesPassed = 0;
 
 		// For each possible entry, see if we match the mask
 		// If we do, decode that, save it, and shuffle on
-		for(int i=0; i<potentialProperties.length; i++) {
+		for(TextProp tp : getPotentialProperties()) {
 			// Check there's still data left to read
 
 			// Check if this property is found in the mask
-			if((containsField & potentialProperties[i].getMask()) != 0) {
+			if((containsField & tp.getMask()) != 0) {
                 if(dataOffset+bytesPassed >= data.length) {
                     // Out of data, can't be any more properties to go
                     // remember the mask and return
-                    maskSpecial |= potentialProperties[i].getMask();
+                    maskSpecial |= tp.getMask();
                     return bytesPassed;
                 }
 
 				// Bingo, data contains this property
-				TextProp prop = (TextProp)potentialProperties[i].clone();
+				TextProp prop = tp.clone();
 				int val = 0;
-				if(prop.getSize() == 2) {
+				if (prop instanceof TabStopPropCollection) {
+				    ((TabStopPropCollection)prop).parseProperty(data, dataOffset+bytesPassed);
+				} else if (prop.getSize() == 2) {
 					val = LittleEndian.getShort(data,dataOffset+bytesPassed);
-				} else if(prop.getSize() == 4){
+				} else if(prop.getSize() == 4) {
 					val = LittleEndian.getInt(data,dataOffset+bytesPassed);
-				} else if (prop.getSize() == 0){
+				} else if (prop.getSize() == 0) {
                     //remember "special" bits.
-                    maskSpecial |= potentialProperties[i].getMask();
+                    maskSpecial |= tp.getMask();
                     continue;
                 }
-				prop.setValue(val);
+				
+				if (prop instanceof BitMaskTextProp) {
+				    ((BitMaskTextProp)prop).setValueWithMask(val, containsField);
+				} else {
+				    prop.setValue(val);
+				}
 				bytesPassed += prop.getSize();
-				textPropList.add(prop);
+				addProp(prop);
 			}
 		}
 
@@ -129,25 +246,21 @@
 		return bytesPassed;
 	}
 
-	/**
-	 * Create a new collection of text properties (be they paragraph
-	 *  or character) which will be groked via a subsequent call to
-	 *  buildTextPropList().
-	 */
-	public TextPropCollection(int charactersCovered, short reservedField) {
-		this.charactersCovered = charactersCovered;
-		this.reservedField = reservedField;
-		textPropList = new LinkedList<TextProp>();
-	}
-
-	/**
-	 * Create a new collection of text properties (be they paragraph
-	 *  or character) for a run of text without any
-	 */
-	public TextPropCollection(int textSize) {
-		charactersCovered = textSize;
-		reservedField = -1;
-		textPropList = new LinkedList<TextProp>();
+    /**
+     * Clones the given text properties
+     */
+	public void copy(TextPropCollection other) {
+	    if (this == other) return;
+        this.charactersCovered = other.charactersCovered;
+        this.indentLevel = other.indentLevel;
+        this.maskSpecial = other.maskSpecial;
+        this.textPropList.clear();
+        for (TextProp tp : other.textPropList) {
+            TextProp tpCopy = (tp instanceof BitMaskTextProp)
+                ? ((BitMaskTextProp)tp).cloneAll()
+                : tp.clone();
+            addProp(tpCopy);
+        }
 	}
 	
 	/**
@@ -165,43 +278,118 @@
 		// First goes the number of characters we affect
 		StyleTextPropAtom.writeLittleEndian(charactersCovered,o);
 
-		// Then we have the reserved field if required
-		if(reservedField > -1) {
-			StyleTextPropAtom.writeLittleEndian(reservedField,o);
+		// Then we have the indentLevel field if it's a paragraph collection
+		if (textPropType == TextPropType.paragraph && indentLevel > -1) {
+			StyleTextPropAtom.writeLittleEndian(indentLevel, o);
 		}
 
 		// Then the mask field
 		int mask = maskSpecial;
-		for(int i=0; i<textPropList.size(); i++) {
-			TextProp textProp = (TextProp)textPropList.get(i);
-            //sometimes header indicates that the bitmask is present but its value is 0
-
-            if (textProp instanceof BitMaskTextProp) {
-                if(mask == 0) mask |=  textProp.getWriteMask();
-            }
-            else {
-                mask |= textProp.getWriteMask();
-            }
+		for (TextProp textProp : textPropList) {
+            mask |= textProp.getWriteMask();
         }
 		StyleTextPropAtom.writeLittleEndian(mask,o);
 
 		// Then the contents of all the properties
-		for(int i=0; i<textPropList.size(); i++) {
-			TextProp textProp = textPropList.get(i);
-			int val = textProp.getValue();
-			if(textProp.getSize() == 2) {
-				StyleTextPropAtom.writeLittleEndian((short)val,o);
-			} else if(textProp.getSize() == 4){
-				StyleTextPropAtom.writeLittleEndian(val,o);
-			}
+		for (TextProp potProp : getPotentialProperties()) {
+    		for(TextProp textProp : textPropList) {
+    		    if (!textProp.getName().equals(potProp.getName())) continue;
+                int val = textProp.getValue();
+                if (textProp instanceof BitMaskTextProp && textProp.getWriteMask() == 0) {
+                    // don't add empty properties, as they can't be recognized while reading
+                    continue;
+                } else if (textProp.getSize() == 2) {
+    				StyleTextPropAtom.writeLittleEndian((short)val,o);
+    			} else if (textProp.getSize() == 4) {
+    				StyleTextPropAtom.writeLittleEndian(val,o);
+    			}
+    		}
 		}
 	}
 
-    public short getReservedField(){
-        return reservedField;
+    public short getIndentLevel(){
+        return indentLevel;
     }
 
-    public void setReservedField(short val){
-        reservedField = val;
+    public void setIndentLevel(short indentLevel) {
+        if (textPropType == TextPropType.character) {
+            throw new RuntimeException("trying to set an indent on a character collection.");
+        }
+        this.indentLevel = indentLevel;
+    }
+    
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + charactersCovered;
+        result = prime * result + maskSpecial;
+        result = prime * result + indentLevel;
+        result = prime * result + ((textPropList == null) ? 0 : textPropList.hashCode());
+        return result;
+    }
+    /**
+     * compares most properties apart of the covered characters length
+     */
+    public boolean equals(Object other) {
+        if (this == other) return true;
+        if (other == null) return false;
+        if (getClass() != other.getClass()) return false;
+        
+        TextPropCollection o = (TextPropCollection)other;
+        if (o.maskSpecial != this.maskSpecial || o.indentLevel != this.indentLevel) {
+            return false;
+        }
+
+        if (textPropList == null) {
+            return (o.textPropList == null);
+        }        
+        
+        Map<String,TextProp> m = new HashMap<String,TextProp>();
+        for (TextProp tp : o.textPropList) {
+            m.put(tp.getName(), tp);
+        }
+        
+        for (TextProp tp : this.textPropList) {
+            TextProp otp = m.get(tp.getName());
+            if (!tp.equals(otp)) return false;
+        }
+        
+        return true;
+    }
+
+    public String toString() {
+        StringBuilder out = new StringBuilder();
+        out.append("  chars covered: " + getCharactersCovered());
+        out.append("  special mask flags: 0x" + HexDump.toHex(getSpecialMask()) + "\n");
+        if (textPropType == TextPropType.paragraph) {
+            out.append("  indent level: "+getIndentLevel()+"\n");
+        }
+        for(TextProp p : getTextPropList()) {
+            out.append("    " + p.getName() + " = " + p.getValue() );
+            out.append(" (0x" + HexDump.toHex(p.getValue()) + ")\n");
+            if (p instanceof BitMaskTextProp) {
+                BitMaskTextProp bm = (BitMaskTextProp)p;
+                int i = 0;
+                for (String s : bm.getSubPropNames()) {
+                    if (bm.getSubPropMatches()[i]) {
+                        out.append("          " + s + " = " + bm.getSubValue(i) + "\n");
+                    }
+                    i++;
+                }
+            }
+        }
+
+        out.append("  bytes that would be written: \n");
+
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            writeOut(baos);
+            byte[] b = baos.toByteArray();
+            out.append(HexDump.dump(b, 0, 0));
+        } catch (Exception e ) {
+            e.printStackTrace();
+        }
+        
+        return out.toString();
     }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/WrapFlagsTextProp.java
similarity index 71%
rename from src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java
rename to src/scratchpad/src/org/apache/poi/hslf/model/textproperties/WrapFlagsTextProp.java
index c4c2729..eaacbff 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/AlignmentTextProp.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/WrapFlagsTextProp.java
@@ -1,34 +1,30 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model.textproperties;
-
-/**
- * Definition for the alignment text property.
- */
-public class AlignmentTextProp extends TextProp {
-	public static final int LEFT = 0;
-	public static final int CENTER = 1;
-	public static final int RIGHT = 2;
-	public static final int JUSTIFY = 3;
-	public static final int THAIDISTRIBUTED = 5;
-	public static final int JUSTIFYLOW = 6;
-
-	public AlignmentTextProp() {
-		super(2, 0x800, "alignment");
-	}
-}
\ No newline at end of file
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.hslf.model.textproperties;

+

+public class WrapFlagsTextProp extends BitMaskTextProp {

+    public static final int CHAR_WRAP_IDX = 0;

+    public static final int WORD_WRAO_IDX = 1;

+    public static final int OVERFLOW_IDX = 2;

+    

+    public static final String NAME = "wrapFlags";

+    

+    public WrapFlagsTextProp() {

+        super(2, 0xE0000, NAME, "charWrap", "wordWrap", "overflow");

+    }

+}

diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/EscherPlaceholder.java b/src/scratchpad/src/org/apache/poi/hslf/record/EscherPlaceholder.java
new file mode 100644
index 0000000..6aa09b9
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/EscherPlaceholder.java
@@ -0,0 +1,75 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.hslf.record;

+

+import org.apache.poi.ddf.*;

+import org.apache.poi.util.*;

+

+/**

+ * An atom record that specifies whether a shape is a placeholder shape.

+ * The number, position, and type of placeholder shapes are determined by

+ * the slide layout as specified in the SlideAtom record.

+ */

+public class EscherPlaceholder extends EscherRecord {

+    public static final short RECORD_ID = (short)RecordTypes.OEPlaceholderAtom.typeID;

+    public static final String RECORD_DESCRIPTION = "msofbtClientTextboxPlaceholder";

+

+    int position = -1;

+    byte placementId = 0;

+    byte size = 0;

+    short unused = 0;

+    

+    public EscherPlaceholder() {}

+    

+    public int fillFields(byte[] data, int offset, EscherRecordFactory recordFactory) {

+        int bytesRemaining = readHeader( data, offset );

+

+        position = LittleEndian.getInt(data, offset+8);

+        placementId = data[offset+12];

+        size = data[offset+13];

+        unused = LittleEndian.getShort(data, offset+14);

+        

+        assert(bytesRemaining + 8 == 16);

+        return bytesRemaining + 8;

+    }

+

+    public int serialize(int offset, byte[] data, EscherSerializationListener listener) {

+        listener.beforeRecordSerialize( offset, getRecordId(), this );

+        

+        LittleEndian.putShort(data, offset, getOptions());

+        LittleEndian.putShort(data, offset+2, getRecordId());

+        LittleEndian.putInt(data, offset+4, 8);

+        LittleEndian.putInt(data, offset+8, position);

+        LittleEndian.putByte(data, offset+12, placementId);

+        LittleEndian.putByte(data, offset+13, size);

+        LittleEndian.putShort(data, offset+14, unused);

+        

+        listener.afterRecordSerialize( offset+getRecordSize(), getRecordId(), getRecordSize(), this );

+        return getRecordSize();

+    }

+

+    public int getRecordSize() {

+        return 8 + 8;

+    }

+

+    public String getRecordName() {

+        return "ClientTextboxPlaceholder";

+    }

+

+    

+}

diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/EscherTextboxWrapper.java b/src/scratchpad/src/org/apache/poi/hslf/record/EscherTextboxWrapper.java
index 715eb81..10744e4 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/EscherTextboxWrapper.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/EscherTextboxWrapper.java
@@ -87,9 +87,7 @@
 
 		// Grab the children's data
 		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		for(int i=0; i<_children.length; i++) {
-			_children[i].writeOut(baos);
-		}
+		for (Record r : _children) r.writeOut(baos);
 		byte[] data = baos.toByteArray();
 
 		// Save in the escher layer
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java b/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java
index 0f7f051..b90c698 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java
@@ -17,6 +17,7 @@
 
 package org.apache.poi.hslf.record;
 
+import org.apache.poi.hslf.model.PPFont;
 import org.apache.poi.util.POILogger;
 
 import java.io.*;
@@ -75,9 +76,9 @@
      */
     public int addFont(String name) {
         int idx = getFontIndex(name);
-        if(idx != -1) return idx;
+        if (idx != -1) return idx;
 
-        return addFont(name, 0, 0, 4, 34);
+        return addFont(name, 0, 0, 4, PPFont.FF_SWISS | PPFont.VARIABLE_PITCH);
     }
 
     public int addFont(String name, int charset, int flags, int type, int pitch) {
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/HSLFEscherRecordFactory.java b/src/scratchpad/src/org/apache/poi/hslf/record/HSLFEscherRecordFactory.java
new file mode 100644
index 0000000..c985864
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/HSLFEscherRecordFactory.java
@@ -0,0 +1,70 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.hslf.record;

+

+import java.lang.reflect.Constructor;

+import java.util.Map;

+

+import org.apache.poi.ddf.*;

+import org.apache.poi.util.LittleEndian;

+

+/**

+ * Generates escher records when provided the byte array containing those records.

+ *

+ * @see EscherRecordFactory

+ */

+public class HSLFEscherRecordFactory extends DefaultEscherRecordFactory {

+    private static Class<?>[] escherRecordClasses = { EscherPlaceholder.class };

+    private static Map<Short, Constructor<? extends EscherRecord>> recordsMap = recordsToMap( escherRecordClasses );

+

+    

+    /**

+     * Creates an instance of the escher record factory

+     */

+    public HSLFEscherRecordFactory() {

+        // no instance initialisation

+    }

+    

+    /**

+     * Generates an escher record including the any children contained under that record.

+     * An exception is thrown if the record could not be generated.

+     *

+     * @param data   The byte array containing the records

+     * @param offset The starting offset into the byte array

+     * @return The generated escher record

+     */

+    public EscherRecord createRecord(byte[] data, int offset) {

+        short options = LittleEndian.getShort( data, offset );

+        short recordId = LittleEndian.getShort( data, offset + 2 );

+        // int remainingBytes = LittleEndian.getInt( data, offset + 4 );

+

+        Constructor<? extends EscherRecord> recordConstructor = recordsMap.get(Short.valueOf(recordId));

+        if (recordConstructor == null) {

+            return super.createRecord(data, offset);

+        }

+        EscherRecord escherRecord = null;

+        try {

+            escherRecord = recordConstructor.newInstance(new Object[] {});

+        } catch (Exception e) {

+            return super.createRecord(data, offset);

+        }

+        escherRecord.setRecordId(recordId);

+        escherRecord.setOptions(options);

+        return escherRecord;

+    }

+}

diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java
index 8b8146f..637f9a8 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawing.java
@@ -37,7 +37,7 @@
 import org.apache.poi.ddf.EscherSpgrRecord;
 import org.apache.poi.ddf.EscherTextboxRecord;
 import org.apache.poi.ddf.UnknownEscherRecord;
-import org.apache.poi.hslf.model.ShapeTypes;
+import org.apache.poi.sl.usermodel.ShapeType;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.POILogger;
 
@@ -92,64 +92,57 @@
 		System.arraycopy(source,start,contents,0,len);
 
 		// Build up a tree of Escher records contained within
-		final DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory();
+		final DefaultEscherRecordFactory erf = new HSLFEscherRecordFactory();
 		final List<EscherRecord> escherChildren = new ArrayList<EscherRecord>();
 		findEscherChildren(erf, contents, 8, len-8, escherChildren);
-		this.childRecords = (EscherRecord[]) escherChildren.toArray(new EscherRecord[escherChildren.size()]);
+		this.childRecords = escherChildren.toArray(new EscherRecord[escherChildren.size()]);
 
-		if (1 == this.childRecords.length && (short)0xf002 == this.childRecords[0].getRecordId() && this.childRecords[0] instanceof EscherContainerRecord) {
+		if (1 == this.childRecords.length && (short)RecordTypes.EscherDgContainer == this.childRecords[0].getRecordId() && this.childRecords[0] instanceof EscherContainerRecord) {
 			this.textboxWrappers = findInDgContainer((EscherContainerRecord) this.childRecords[0]);
 		} else {
 			// Find and EscherTextboxRecord's, and wrap them up
 			final List<EscherTextboxWrapper> textboxes = new ArrayList<EscherTextboxWrapper>();
 			findEscherTextboxRecord(childRecords, textboxes);
-			this.textboxWrappers = (EscherTextboxWrapper[]) textboxes.toArray(new EscherTextboxWrapper[textboxes.size()]);
+			this.textboxWrappers = textboxes.toArray(new EscherTextboxWrapper[textboxes.size()]);
 		}
 	}
-	private EscherTextboxWrapper[] findInDgContainer(final EscherContainerRecord escherContainerF002) {
+	private EscherTextboxWrapper[] findInDgContainer(final EscherContainerRecord dgContainer) {
 		final List<EscherTextboxWrapper> found = new LinkedList<EscherTextboxWrapper>();
-		final EscherContainerRecord SpgrContainer = findFirstEscherContainerRecordOfType((short)0xf003, escherContainerF002);
-		final EscherContainerRecord[] escherContainersF004 = findAllEscherContainerRecordOfType((short)0xf004, SpgrContainer);
-		for (EscherContainerRecord spContainer : escherContainersF004) {
+		final EscherContainerRecord spgrContainer = findFirstEscherContainerRecordOfType((short)RecordTypes.EscherSpgrContainer, dgContainer);
+		final EscherContainerRecord[] spContainers = findAllEscherContainerRecordOfType((short)RecordTypes.EscherSpContainer, spgrContainer);
+		for (EscherContainerRecord spContainer : spContainers) {
 			StyleTextProp9Atom nineAtom = findInSpContainer(spContainer);
-			EscherSpRecord sp = null;
-			final EscherRecord escherContainerF00A = findFirstEscherRecordOfType((short)0xf00a, spContainer);
-			if (null != escherContainerF00A) {
-				if (escherContainerF00A instanceof EscherSpRecord) {
-					sp = (EscherSpRecord) escherContainerF00A;
-				}
+			EscherSpRecord sp = (EscherSpRecord)findFirstEscherRecordOfType((short)RecordTypes.EscherSp, spContainer);
+			EscherTextboxRecord clientTextbox = (EscherTextboxRecord)findFirstEscherRecordOfType((short)RecordTypes.EscherClientTextbox, spContainer);
+			if (null == clientTextbox) { continue; }
+
+			EscherTextboxWrapper w = new EscherTextboxWrapper(clientTextbox);
+			w.setStyleTextProp9Atom(nineAtom);
+			if (null != sp) {
+			    w.setShapeId(sp.getShapeId());
 			}
-			final EscherRecord escherContainerF00D = findFirstEscherRecordOfType((short)0xf00d, spContainer);
-			if (null == escherContainerF00D) { continue; }
-			if (escherContainerF00D instanceof EscherTextboxRecord) {
-				EscherTextboxRecord tbr = (EscherTextboxRecord) escherContainerF00D;
-				EscherTextboxWrapper w = new EscherTextboxWrapper(tbr);
-				w.setStyleTextProp9Atom(nineAtom);
-				if (null != sp) {
-					w.setShapeId(sp.getShapeId());
-				}
-				found.add(w);
-			}
+			found.add(w);
 		}
-		return (EscherTextboxWrapper[]) found.toArray(new EscherTextboxWrapper[found.size()]);
+		return found.toArray(new EscherTextboxWrapper[found.size()]);
 	}
+	
 	private StyleTextProp9Atom findInSpContainer(final EscherContainerRecord spContainer) {
-		final EscherContainerRecord escherContainerF011 = findFirstEscherContainerRecordOfType((short)0xf011, spContainer);
-		if (null == escherContainerF011) { return null; }
-		final EscherContainerRecord escherContainer1388 = findFirstEscherContainerRecordOfType((short)0x1388, escherContainerF011);
-		if (null == escherContainer1388) { return null; }
-		final EscherContainerRecord escherContainer138A = findFirstEscherContainerRecordOfType((short)0x138A, escherContainer1388);
-		if (null == escherContainer138A) { return null; }
-		int size = escherContainer138A.getChildRecords().size();
+		EscherContainerRecord clientData = findFirstEscherContainerRecordOfType((short)RecordTypes.EscherClientData, spContainer);
+		if (null == clientData) { return null; }
+		final EscherContainerRecord progTagsContainer = findFirstEscherContainerRecordOfType((short)0x1388, clientData);
+		if (null == progTagsContainer) { return null; }
+		final EscherContainerRecord progBinaryTag = findFirstEscherContainerRecordOfType((short)0x138A, progTagsContainer);
+		if (null == progBinaryTag) { return null; }
+		int size = progBinaryTag.getChildRecords().size();
 		if (2 != size) { return null; }
-		final Record r0 = buildFromUnknownEscherRecord((UnknownEscherRecord) escherContainer138A.getChild(0));
-		final Record r1 = buildFromUnknownEscherRecord((UnknownEscherRecord) escherContainer138A.getChild(1));
+		final Record r0 = buildFromUnknownEscherRecord((UnknownEscherRecord) progBinaryTag.getChild(0));
+		final Record r1 = buildFromUnknownEscherRecord((UnknownEscherRecord) progBinaryTag.getChild(1));
 		if (!(r0 instanceof CString)) { return null; }
 		if (!("___PPT9".equals(((CString) r0).getText()))) { return null; };
 		if (!(r1 instanceof BinaryTagDataBlob )) { return null; }
 		final BinaryTagDataBlob blob = (BinaryTagDataBlob) r1;
 		if (1 != blob.getChildRecords().length) { return null; }
-		return (StyleTextProp9Atom) blob.findFirstOfType(0x0FACL);
+		return (StyleTextProp9Atom) blob.findFirstOfType(RecordTypes.StyleTextProp9Atom.typeID);
 	}
 	/**
 	 * Creates a new, empty, PPDrawing (typically for use with a new Slide
@@ -247,14 +240,14 @@
 	 */
 	public void writeOut(OutputStream out) throws IOException {
 		// Ensure the escher layer reflects the text changes
-		for(int i=0; i<textboxWrappers.length; i++) {
-			textboxWrappers[i].writeOut(null);
+		for (EscherTextboxWrapper w : textboxWrappers) {
+			w.writeOut(null);
 		}
 
 		// Find the new size of the escher children;
 		int newSize = 0;
-		for(int i=0; i<childRecords.length; i++) {
-			newSize += childRecords[i].getRecordSize();
+		for(EscherRecord er : childRecords) {
+			newSize += er.getRecordSize();
 		}
 
 		// Update the size (header bytes 5-8)
@@ -301,7 +294,7 @@
 		spContainer.addChildRecord(spgr);
 
 		EscherSpRecord sp = new EscherSpRecord();
-		sp.setOptions((short)((ShapeTypes.NotPrimitive << 4) + 2));
+		sp.setOptions((short)((ShapeType.NOT_PRIMITIVE.nativeId << 4) + 2));
 		sp.setFlags(EscherSpRecord.FLAG_PATRIARCH | EscherSpRecord.FLAG_GROUP);
 		spContainer.addChildRecord(sp);
 		spgrContainer.addChildRecord(spContainer);
@@ -311,7 +304,7 @@
 		spContainer.setOptions((short)15);
 		spContainer.setRecordId(EscherContainerRecord.SP_CONTAINER);
 		sp = new EscherSpRecord();
-		sp.setOptions((short)((ShapeTypes.Rectangle << 4) + 2));
+		sp.setOptions((short)((ShapeType.RECT.nativeId << 4) + 2));
 		sp.setFlags(EscherSpRecord.FLAG_BACKGROUND | EscherSpRecord.FLAG_HASSHAPETYPE);
 		spContainer.addChildRecord(sp);
 
@@ -393,7 +386,7 @@
 				result.add(child);
 			}
 		}
-		return (EscherContainerRecord[]) result.toArray(new EscherContainerRecord[result.size()]);
+		return result.toArray(new EscherContainerRecord[result.size()]);
     }
     protected Record buildFromUnknownEscherRecord(UnknownEscherRecord unknown) {
 		byte[] bingo = unknown.getData();
@@ -410,32 +403,13 @@
 
     public StyleTextProp9Atom[] getNumberedListInfo() {
     	final List<StyleTextProp9Atom> result = new LinkedList<StyleTextProp9Atom>();
-    	EscherRecord[] escherRecords = this.getEscherRecords();
-    	for (EscherRecord escherRecord : escherRecords) {
-			if (escherRecord instanceof EscherContainerRecord && (short)0xf002 == escherRecord.getRecordId()) {
-				EscherContainerRecord escherContainerF002 = (EscherContainerRecord) escherRecord;
-				final EscherContainerRecord escherContainerF003 = findFirstEscherContainerRecordOfType((short)0xf003, escherContainerF002);
-				final EscherContainerRecord[] escherContainersF004 = findAllEscherContainerRecordOfType((short)0xf004, escherContainerF003);
-				for (EscherContainerRecord containerF004 : escherContainersF004) {
-					final EscherContainerRecord escherContainerF011 = findFirstEscherContainerRecordOfType((short)0xf011, containerF004);
-					if (null == escherContainerF011) { continue; }
-					final EscherContainerRecord escherContainer1388 = findFirstEscherContainerRecordOfType((short)0x1388, escherContainerF011);
-					if (null == escherContainer1388) { continue; }
-					final EscherContainerRecord escherContainer138A = findFirstEscherContainerRecordOfType((short)0x138A, escherContainer1388);
-					if (null == escherContainer138A) { continue; }
-					int size = escherContainer138A.getChildRecords().size();
-					if (2 != size) { continue; }
-					final Record r0 = buildFromUnknownEscherRecord((UnknownEscherRecord) escherContainer138A.getChild(0));
-					final Record r1 = buildFromUnknownEscherRecord((UnknownEscherRecord) escherContainer138A.getChild(1));
-					if (!(r0 instanceof CString)) { continue; }
-					if (!("___PPT9".equals(((CString) r0).getText()))) { continue; };
-					if (!(r1 instanceof BinaryTagDataBlob )) { continue; }
-					final BinaryTagDataBlob blob = (BinaryTagDataBlob) r1;
-					if (1 != blob.getChildRecords().length) { continue; }
-					result.add((StyleTextProp9Atom) blob.findFirstOfType(0x0FACL));
-				}
-			}
-    	}
-    	return (StyleTextProp9Atom[]) result.toArray(new StyleTextProp9Atom[result.size()]);
+    	EscherContainerRecord dgContainer = (EscherContainerRecord)childRecords[0];
+		final EscherContainerRecord spgrContainer = findFirstEscherContainerRecordOfType((short)RecordTypes.EscherSpgrContainer, dgContainer);
+		final EscherContainerRecord[] spContainers = findAllEscherContainerRecordOfType((short)RecordTypes.EscherSpContainer, spgrContainer);
+		for (EscherContainerRecord spContainer : spContainers) {
+		    StyleTextProp9Atom prop9 = findInSpContainer(spContainer);
+		    if (prop9 != null) result.add(prop9);
+		}
+    	return result.toArray(new StyleTextProp9Atom[result.size()]);
 	}
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawingGroup.java b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawingGroup.java
index ee414bb..0cdb1f6 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawingGroup.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/PPDrawingGroup.java
@@ -49,7 +49,7 @@
         byte[] contents = new byte[len];
         System.arraycopy(source,start,contents,0,len);
 
-        DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory();
+        DefaultEscherRecordFactory erf = new HSLFEscherRecordFactory();
         EscherRecord child = erf.createRecord(contents, 0);
         child.fillFields( contents, 0, erf );
         dggContainer = (EscherContainerRecord)child.getChild(0);
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
index be732d4..91a590a 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordContainer.java
@@ -294,7 +294,7 @@
 			// Write out our header, less the size
 			mout.write(new byte[] {headerA,headerB});
 			byte[] typeB = new byte[2];
-			LittleEndian.putShort(typeB,(short)type);
+			LittleEndian.putShort(typeB, 0, (short)type);
 			mout.write(typeB);
 			mout.write(new byte[4]);
 
@@ -320,7 +320,7 @@
 			// Write out our header, less the size
 			baos.write(new byte[] {headerA,headerB});
 			byte[] typeB = new byte[2];
-			LittleEndian.putShort(typeB,(short)type);
+			LittleEndian.putShort(typeB,0,(short)type);
 			baos.write(typeB);
 			baos.write(new byte[] {0,0,0,0});
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java
index 3d99e0a..a306058 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java
@@ -273,8 +273,8 @@
 	 *  offers methods to get either back out.
 	 */
 	public static class Type {
-		public int typeID;
-		public Class<? extends Record> handlingClass;
+		public final int typeID;
+		public final Class<? extends Record> handlingClass;
 		public Type(int typeID, Class<? extends Record> handlingClass) {
 			this.typeID = typeID;
 			this.handlingClass = handlingClass;
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java b/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java
index 315455d..195b59c 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/SlideListWithText.java
@@ -93,8 +93,6 @@
 				}
 
 				int clen = endPos - i - 1;
-				boolean emptySet = false;
-				if(clen == 0) { emptySet = true; }
 
 				// Create a SlideAtomsSets, not caring if they're empty
 				//if(emptySet) { continue; }
@@ -149,7 +147,7 @@
 	}
 
 	public void setInstance(int inst){
-		LittleEndian.putShort(_header, (short)((inst << 4) | 0xF));
+		LittleEndian.putShort(_header, 0, (short)((inst << 4) | 0xF));
 	}
 
 	/**
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java
index 548027b..9a5cc7b 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextProp9Atom.java
@@ -83,7 +83,7 @@
                 break;
             }
         }
-        this.autoNumberSchemes = (TextPFException9[]) schemes.toArray(new TextPFException9[schemes.size()]);
+        this.autoNumberSchemes = schemes.toArray(new TextPFException9[schemes.size()]);
     }
 
     /**
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java
index 5730021..bfb9d74 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java
@@ -17,19 +17,13 @@
 
 package org.apache.poi.hslf.record;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.LinkedList;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
 
-import org.apache.poi.hslf.model.textproperties.AlignmentTextProp;
-import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.TextProp;
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.util.HexDump;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
+import org.apache.poi.hslf.model.textproperties.*;
+import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType;
+import org.apache.poi.util.*;
 
 /**
  * A StyleTextPropAtom (type 4001). Holds basic character properties
@@ -51,7 +45,7 @@
 public final class StyleTextPropAtom extends RecordAtom
 {
     private byte[] _header;
-    private static long _type = 4001l;
+    private static final long _type = RecordTypes.StyleTextPropAtom.typeID;
     private byte[] reserved;
 
     private byte[] rawContents; // Holds the contents between write-outs
@@ -68,26 +62,26 @@
      *  Characters the paragraph covers, and also contains the TextProps
      *  that actually define the styling of the paragraph.
      */
-    private LinkedList<TextPropCollection> paragraphStyles;
-    public LinkedList<TextPropCollection> getParagraphStyles() { return paragraphStyles; }
+    private List<TextPropCollection> paragraphStyles;
+    public List<TextPropCollection> getParagraphStyles() { return paragraphStyles; }
     /**
      * Updates the link list of TextPropCollections which make up the
      *  paragraph stylings
      */
-    public void setParagraphStyles(LinkedList<TextPropCollection> ps) { paragraphStyles = ps; }
+    public void setParagraphStyles(List<TextPropCollection> ps) { paragraphStyles = ps; }
     /**
      * The list of all the different character stylings we code for.
      * Each entry is a TextPropCollection, which tells you how many
      *  Characters the character styling covers, and also contains the
      *  TextProps that actually define the styling of the characters.
      */
-    private LinkedList<TextPropCollection> charStyles;
-    public LinkedList<TextPropCollection> getCharacterStyles() { return charStyles; }
+    private List<TextPropCollection> charStyles;
+    public List<TextPropCollection> getCharacterStyles() { return charStyles; }
     /**
      * Updates the link list of TextPropCollections which make up the
      *  character stylings
      */
-    public void setCharacterStyles(LinkedList<TextPropCollection> cs) { charStyles = cs; }
+    public void setCharacterStyles(List<TextPropCollection> cs) { charStyles = cs; }
 
     /**
      * Returns how many characters the paragraph's
@@ -109,7 +103,7 @@
     public int getCharacterTextLengthCovered() {
         return getCharactersCovered(charStyles);
     }
-    private int getCharactersCovered(LinkedList<TextPropCollection> styles) {
+    private int getCharactersCovered(List<TextPropCollection> styles) {
         int length = 0;
         for(TextPropCollection tpc : styles) {
             length += tpc.getCharactersCovered();
@@ -117,58 +111,6 @@
         return length;
     }
 
-    /** All the different kinds of paragraph properties we might handle */
-    public static final TextProp[] paragraphTextPropTypes = new TextProp[] {
-        new TextProp(0, 0x1, "hasBullet"),
-        new TextProp(0, 0x2, "hasBulletFont"),
-        new TextProp(0, 0x4, "hasBulletColor"),
-        new TextProp(0, 0x8, "hasBulletSize"),
-        new ParagraphFlagsTextProp(),
-        new TextProp(2, 0x80, "bullet.char"),
-        new TextProp(2, 0x10, "bullet.font"),
-        new TextProp(2, 0x40, "bullet.size"),
-        new TextProp(4, 0x20, "bullet.color"),
-        new AlignmentTextProp(),
-        new TextProp(2, 0x100, "text.offset"),
-        new TextProp(2, 0x400, "bullet.offset"),
-        new TextProp(2, 0x1000, "linespacing"),
-        new TextProp(2, 0x2000, "spacebefore"),
-        new TextProp(2, 0x4000, "spaceafter"),
-        new TextProp(2, 0x8000, "defaultTabSize"),
-        new TextProp(2, 0x100000, "tabStops"),
-        new TextProp(2, 0x10000, "fontAlign"),
-        new TextProp(2, 0xA0000, "wrapFlags"),
-        new TextProp(2, 0x200000, "textDirection")
-    };
-    /** All the different kinds of character properties we might handle */
-    public static final TextProp[] characterTextPropTypes = new TextProp[] {
-        new TextProp(0, 0x1, "bold"),
-        new TextProp(0, 0x2, "italic"),
-        new TextProp(0, 0x4, "underline"),
-        new TextProp(0, 0x8, "unused1"),
-        new TextProp(0, 0x10, "shadow"),
-        new TextProp(0, 0x20, "fehint"),
-        new TextProp(0, 0x40, "unused2"),
-        new TextProp(0, 0x80, "kumi"),
-        new TextProp(0, 0x100, "unused3"),
-        new TextProp(0, 0x200, "emboss"),
-        new TextProp(0, 0x400, "nibble1"),
-        new TextProp(0, 0x800, "nibble2"),
-        new TextProp(0, 0x1000, "nibble3"),
-        new TextProp(0, 0x2000, "nibble4"),
-        new TextProp(0, 0x4000, "unused4"),
-        new TextProp(0, 0x8000, "unused5"),
-        new CharFlagsTextProp(),
-        new TextProp(2, 0x10000, "font.index"),
-        new TextProp(0, 0x100000, "pp10ext"),
-        new TextProp(2, 0x200000, "asian.font.index"),
-        new TextProp(2, 0x400000, "ansi.font.index"),
-        new TextProp(2, 0x800000, "symbol.font.index"),
-        new TextProp(2, 0x20000, "font.size"),
-        new TextProp(4, 0x40000, "font.color"),
-        new TextProp(2, 0x80000, "superscript")
-    };
-
     /* *************** record code follows ********************** */
 
     /**
@@ -193,9 +135,9 @@
         System.arraycopy(source,start+8,rawContents,0,rawContents.length);
         reserved = new byte[0];
 
-        // Set empty linked lists, ready for when they call setParentTextSize
-        paragraphStyles = new LinkedList<TextPropCollection>();
-        charStyles = new LinkedList<TextPropCollection>();
+        // Set empty lists, ready for when they call setParentTextSize
+        paragraphStyles = new ArrayList<TextPropCollection>();
+        charStyles = new ArrayList<TextPropCollection>();
     }
 
 
@@ -213,19 +155,20 @@
         LittleEndian.putInt(_header,4,10);
 
         // Set empty paragraph and character styles
-        paragraphStyles = new LinkedList<TextPropCollection>();
-        charStyles = new LinkedList<TextPropCollection>();
+        paragraphStyles = new ArrayList<TextPropCollection>();
+        charStyles = new ArrayList<TextPropCollection>();
 
-        TextPropCollection defaultParagraphTextProps =
-                new TextPropCollection(parentTextSize, (short)0);
-        paragraphStyles.add(defaultParagraphTextProps);
-
-        TextPropCollection defaultCharacterTextProps =
-                new TextPropCollection(parentTextSize);
-        charStyles.add(defaultCharacterTextProps);
+        addParagraphTextPropCollection(parentTextSize);
+        addCharacterTextPropCollection(parentTextSize);
 
         // Set us as now initialised
         initialised = true;
+
+        try {
+            updateRawContents();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
     }
 
 
@@ -244,10 +187,6 @@
         //  on the properties
         updateRawContents();
 
-        // Now ensure that the header size is correct
-        int newSize = rawContents.length + reserved.length;
-        LittleEndian.putInt(_header,4,newSize);
-
         // Write out the (new) header
         out.write(_header);
 
@@ -264,9 +203,14 @@
      *  contains, so we can go ahead and initialise ourselves.
      */
     public void setParentTextSize(int size) {
+        if (initialised) return;
+        
         int pos = 0;
         int textHandled = 0;
 
+        paragraphStyles.clear();
+        charStyles.clear();
+        
         // While we have text in need of paragraph stylings, go ahead and
         // grok the contents as paragraph formatting data
         int prsize = size;
@@ -285,9 +229,9 @@
             pos += 4;
 
             // Now make sense of those properties
-            TextPropCollection thisCollection = new TextPropCollection(textLen, indent);
-            int plSize = thisCollection.buildTextPropList(
-                    paraFlags, paragraphTextPropTypes, rawContents, pos);
+            TextPropCollection thisCollection = new TextPropCollection(textLen, TextPropType.paragraph);
+            thisCollection.setIndentLevel(indent);
+            int plSize = thisCollection.buildTextPropList(paraFlags, rawContents, pos);
             pos += plSize;
 
             // Save this properties set
@@ -313,18 +257,14 @@
             textHandled += textLen;
             pos += 4;
 
-            // There is no 2 byte value
-            short no_val = -1;
-
             // Grab the 4 byte value that tells us what properties follow
             int charFlags = LittleEndian.getInt(rawContents,pos);
             pos += 4;
 
             // Now make sense of those properties
             // (Assuming we actually have some)
-            TextPropCollection thisCollection = new TextPropCollection(textLen, no_val);
-            int chSize = thisCollection.buildTextPropList(
-                               charFlags, characterTextPropTypes, rawContents, pos);
+            TextPropCollection thisCollection = new TextPropCollection(textLen, TextPropType.character);
+            int chSize = thisCollection.buildTextPropList(charFlags, rawContents, pos);
             pos += chSize;
 
             // Save this properties set
@@ -362,42 +302,47 @@
      * Updates the cache of the raw contents. Serialised the styles out.
      */
     private void updateRawContents() throws IOException {
-        if(!initialised) {
-            // We haven't groked the styles since creation, so just stick
-            // with what we found
-            return;
+        if (initialised) {
+            // Only update the style bytes, if the styles have been potentially
+            // changed
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    
+            // First up, we need to serialise the paragraph properties
+            for(TextPropCollection tpc : paragraphStyles) {
+                tpc.writeOut(baos);
+            }
+    
+            // Now, we do the character ones
+            for(TextPropCollection tpc : charStyles) {
+                tpc.writeOut(baos);
+            }
+    
+            rawContents = baos.toByteArray();
         }
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-        // First up, we need to serialise the paragraph properties
-        for(int i=0; i<paragraphStyles.size(); i++) {
-            TextPropCollection tpc = paragraphStyles.get(i);
-            tpc.writeOut(baos);
-        }
-
-        // Now, we do the character ones
-        for(int i=0; i<charStyles.size(); i++) {
-            TextPropCollection tpc = charStyles.get(i);
-            tpc.writeOut(baos);
-        }
-
-        rawContents = baos.toByteArray();
+        
+        // Now ensure that the header size is correct
+        int newSize = rawContents.length + reserved.length;
+        LittleEndian.putInt(_header,4,newSize);
     }
 
-    public void setRawContents(byte[] bytes) {
-        rawContents = bytes;
+    /**
+     * Clear styles, so new collections can be added
+     */
+    public void clearStyles() {
+        paragraphStyles.clear();
+        charStyles.clear();
         reserved = new byte[0];
-        initialised = false;
+        initialised = true;
     }
-
+    
     /**
      * Create a new Paragraph TextPropCollection, and add it to the list
      * @param charactersCovered The number of characters this TextPropCollection will cover
      * @return the new TextPropCollection, which will then be in the list
      */
     public TextPropCollection addParagraphTextPropCollection(int charactersCovered) {
-        TextPropCollection tpc = new TextPropCollection(charactersCovered, (short)0);
+        TextPropCollection tpc = new TextPropCollection(charactersCovered, TextPropType.paragraph);
         paragraphStyles.add(tpc);
         return tpc;
     }
@@ -407,7 +352,7 @@
      * @return the new TextPropCollection, which will then be in the list
      */
     public TextPropCollection addCharacterTextPropCollection(int charactersCovered) {
-        TextPropCollection tpc = new TextPropCollection(charactersCovered);
+        TextPropCollection tpc = new TextPropCollection(charactersCovered, TextPropType.character);
         charStyles.add(tpc);
         return tpc;
     }
@@ -429,51 +374,25 @@
         } else {
 
             out.append("Paragraph properties\n");
-
             for(TextPropCollection pr : getParagraphStyles()) {
-                out.append("  chars covered: " + pr.getCharactersCovered());
-                out.append("  special mask flags: 0x" + HexDump.toHex(pr.getSpecialMask()) + "\n");
-                for(TextProp p : pr.getTextPropList()) {
-                    out.append("    " + p.getName() + " = " + p.getValue() );
-                    out.append(" (0x" + HexDump.toHex(p.getValue()) + ")\n");
-                }
-
-                out.append("  para bytes that would be written: \n");
-
-                try {
-                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                    pr.writeOut(baos);
-                    byte[] b = baos.toByteArray();
-                    out.append(HexDump.dump(b, 0, 0));
-                } catch (Exception e ) {
-                    e.printStackTrace();
-                }
+                out.append(pr);
             }
 
             out.append("Character properties\n");
             for(TextPropCollection pr : getCharacterStyles()) {
-                out.append("  chars covered: " + pr.getCharactersCovered() );
-                out.append("  special mask flags: 0x" + HexDump.toHex(pr.getSpecialMask()) + "\n");
-                for(TextProp p : pr.getTextPropList()) {
-                    out.append("    " + p.getName() + " = " + p.getValue() );
-                    out.append(" (0x" + HexDump.toHex(p.getValue()) + ")\n");
-                }
-
-                out.append("  char bytes that would be written: \n");
-
-                try {
-                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                    pr.writeOut(baos);
-                    byte[] b = baos.toByteArray();
-                    out.append(HexDump.dump(b, 0, 0));
-                } catch (Exception e ) {
-                    e.printStackTrace();
-                }
+                out.append(pr);
             }
+            
+            out.append("Reserved bytes\n");
+            out.append( HexDump.dump(reserved, 0, 0) );
         }
 
         out.append("  original byte stream \n");
-        out.append( HexDump.dump(rawContents, 0, 0) );
+        
+        byte buf[] = new byte[rawContents.length+reserved.length];
+        System.arraycopy(rawContents, 0, buf, 0, rawContents.length);
+        System.arraycopy(reserved, 0, buf, rawContents.length, reserved.length);
+        out.append( HexDump.dump(buf, 0, 0) );
 
         return out.toString();
     }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextAutoNumberSchemeEnum.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextAutoNumberSchemeEnum.java
deleted file mode 100644
index ab70659..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/record/TextAutoNumberSchemeEnum.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  ====================================================================
- *    Licensed to the Apache Software Foundation (ASF) under one or more
- *    contributor license agreements.  See the NOTICE file distributed with
- *    this work for additional information regarding copyright ownership.
- *    The ASF licenses this file to You under the Apache License, Version 2.0
- *    (the "License"); you may not use this file except in compliance with
- *    the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- * ====================================================================
- */
-
-package org.apache.poi.hslf.record;
-
-public enum TextAutoNumberSchemeEnum {
-	//Name Value Meaning
-	ANM_AlphaLcPeriod 			((short) 0x0000), // "Lowercase Latin character followed by a period. Example: a., b., c., ..."),
-	ANM_AlphaUcPeriod 			((short) 0x0001), // "Uppercase Latin character followed by a period. Example: A., B., C., ..."),
-	ANM_ArabicParenRight		((short) 0x0002), // "Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ..."),
-	ANM_ArabicPeriod			((short) 0x0003), // "Arabic numeral followed by a period. Example: 1., 2., 3., ..."),
-	ANM_RomanLcParenBoth		((short) 0x0004), // "Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ..."),            
-	ANM_RomanLcParenRight		((short) 0x0005), // "Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ..."),     
-	ANM_RomanLcPeriod			((short) 0x0006), // "Lowercase Roman numeral followed by a period. Example: i., ii., iii., ..."), 
-	ANM_RomanUcPeriod			((short) 0x0007), // "Uppercase Roman numeral followed by a period. Example: I., II., III., ..."),
-	ANM_AlphaLcParenBoth		((short) 0x0008), // "Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ..."),
-	ANM_AlphaLcParenRight		((short) 0x0009), // "Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ..."),
-	ANM_AlphaUcParenBoth		((short) 0x000A), // "Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ..."),
-	ANM_AlphaUcParenRight		((short) 0x000B), // "Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ..."), 
-	ANM_ArabicParenBoth			((short) 0x000C), // "Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ..."),
-	ANM_ArabicPlain				((short) 0x000D), // "Arabic numeral. Example: 1, 2, 3, ..."),
-	ANM_RomanUcParenBoth		((short) 0x000E), // "Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ..."),
-	ANM_RomanUcParenRight		((short) 0x000F), // "Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), ..."),
-	ANM_ChsPlain				((short) 0x0010), // "Simplified Chinese."),
-	ANM_ChsPeriod				((short) 0x0011), // "Simplified Chinese with single-byte period."),
-	ANM_CircleNumDBPlain		((short) 0x0012), // "Double byte circle numbers."),
-	ANM_CircleNumWDBWhitePlain	((short) 0x0013), // "Wingdings white circle numbers."),
-	ANM_CircleNumWDBBlackPlain	((short) 0x0014), // "Wingdings black circle numbers."),
-	ANM_ChtPlain				((short) 0x0015), // "Traditional Chinese."),
-	ANM_ChtPeriod				((short) 0x0016), // "Traditional Chinese with single-byte period."),
-	ANM_Arabic1Minus			((short) 0x0017), // "Bidi Arabic 1 (AraAlpha) with ANSI minus symbol."),
-	ANM_Arabic2Minus			((short) 0x0018), // "Bidi Arabic 2 (AraAbjad) with ANSI minus symbol."),
-	ANM_Hebrew2Minus			((short) 0x0019), // "Bidi Hebrew 2 with ANSI minus symbol."),
-	ANM_JpnKorPlain				((short) 0x001A), // "Japanese/Korean."),
-	ANM_JpnKorPeriod			((short) 0x001B), // "Japanese/Korean with single-byte period."),
-	ANM_ArabicDbPlain			((short) 0x001C), // "Double-byte Arabic numbers."),
-	ANM_ArabicDbPeriod			((short) 0x001D), // "Double-byte Arabic numbers with double-byte period."),
-	ANM_ThaiAlphaPeriod			((short) 0x001E), // "Thai alphabetic character followed by a period."),
-	ANM_ThaiAlphaParenRight		((short) 0x001F), // "Thai alphabetic character followed by a closing parenthesis."),
-	ANM_ThaiAlphaParenBoth		((short) 0x0020), // "Thai alphabetic character enclosed by parentheses."),
-	ANM_ThaiNumPeriod			((short) 0x0021), // "Thai numeral followed by a period."),
-	ANM_ThaiNumParenRight		((short) 0x0022), // "Thai numeral followed by a closing parenthesis."),
-	ANM_ThaiNumParenBoth		((short) 0x0023), // "Thai numeral enclosed in parentheses."),
-	ANM_HindiAlphaPeriod		((short) 0x0024), // "Hindi alphabetic character followed by a period."),
-	ANM_HindiNumPeriod			((short) 0x0025), // "Hindi numeric character followed by a period."),
-	ANM_JpnChsDBPeriod			((short) 0x0026), // "Japanese with double-byte period."),
-	ANM_HindiNumParenRight		((short) 0x0027), // "Hindi numeric character followed by a closing parenthesis."),
-	ANM_HindiAlpha1Period		((short) 0x0028); // "Hindi alphabetic character followed by a period.");
-
-	private final short value;
-	private TextAutoNumberSchemeEnum(final short code) {
-		this.value = code;
-	}
-	private short getValue() { return value; }
-	public String getDescription() {
-		return TextAutoNumberSchemeEnum.getDescription(this);
-	}
-	public static String getDescription(final TextAutoNumberSchemeEnum code) {
-		switch (code) {
-		case ANM_AlphaLcPeriod			: return "Lowercase Latin character followed by a period. Example: a., b., c., ...";
-		case ANM_AlphaUcPeriod 			: return "Uppercase Latin character followed by a period. Example: A., B., C., ...";
-		case ANM_ArabicParenRight		: return "Arabic numeral followed by a closing parenthesis. Example: 1), 2), 3), ...";
-		case ANM_ArabicPeriod			: return "Arabic numeral followed by a period. Example: 1., 2., 3., ...";
-		case ANM_RomanLcParenBoth		: return "Lowercase Roman numeral enclosed in parentheses. Example: (i), (ii), (iii), ...";            
-		case ANM_RomanLcParenRight		: return "Lowercase Roman numeral followed by a closing parenthesis. Example: i), ii), iii), ...";     
-		case ANM_RomanLcPeriod			: return "Lowercase Roman numeral followed by a period. Example: i., ii., iii., ...";
-		case ANM_RomanUcPeriod			: return "Uppercase Roman numeral followed by a period. Example: I., II., III., ...";
-		case ANM_AlphaLcParenBoth		: return "Lowercase alphabetic character enclosed in parentheses. Example: (a), (b), (c), ...";
-		case ANM_AlphaLcParenRight		: return "Lowercase alphabetic character followed by a closing parenthesis. Example: a), b), c), ...";
-		case ANM_AlphaUcParenBoth		: return "Uppercase alphabetic character enclosed in parentheses. Example: (A), (B), (C), ...";
-		case ANM_AlphaUcParenRight		: return "Uppercase alphabetic character followed by a closing parenthesis. Example: A), B), C), ..."; 
-		case ANM_ArabicParenBoth		: return "Arabic numeral enclosed in parentheses. Example: (1), (2), (3), ...";
-		case ANM_ArabicPlain			: return "Arabic numeral. Example: 1, 2, 3, ...";
-		case ANM_RomanUcParenBoth		: return "Uppercase Roman numeral enclosed in parentheses. Example: (I), (II), (III), ...";
-		case ANM_RomanUcParenRight		: return "Uppercase Roman numeral followed by a closing parenthesis. Example: I), II), III), ...";
-		case ANM_ChsPlain				: return "Simplified Chinese.";
-		case ANM_ChsPeriod				: return "Simplified Chinese with single-byte period.";
-		case ANM_CircleNumDBPlain		: return "Double byte circle numbers.";
-		case ANM_CircleNumWDBWhitePlain	: return "Wingdings white circle numbers.";
-		case ANM_CircleNumWDBBlackPlain	: return "Wingdings black circle numbers.";
-		case ANM_ChtPlain				: return "Traditional Chinese.";
-		case ANM_ChtPeriod				: return "Traditional Chinese with single-byte period.";
-		case ANM_Arabic1Minus			: return "Bidi Arabic 1 (AraAlpha) with ANSI minus symbol.";
-		case ANM_Arabic2Minus			: return "Bidi Arabic 2 (AraAbjad) with ANSI minus symbol.";
-		case ANM_Hebrew2Minus			: return "Bidi Hebrew 2 with ANSI minus symbol.";
-		case ANM_JpnKorPlain			: return "Japanese/Korean.";
-		case ANM_JpnKorPeriod			: return "Japanese/Korean with single-byte period.";
-		case ANM_ArabicDbPlain			: return "Double-byte Arabic numbers.";
-		case ANM_ArabicDbPeriod			: return "Double-byte Arabic numbers with double-byte period.";
-		case ANM_ThaiAlphaPeriod		: return "Thai alphabetic character followed by a period.";
-		case ANM_ThaiAlphaParenRight	: return "Thai alphabetic character followed by a closing parenthesis.";
-		case ANM_ThaiAlphaParenBoth		: return "Thai alphabetic character enclosed by parentheses.";
-		case ANM_ThaiNumPeriod			: return "Thai numeral followed by a period.";
-		case ANM_ThaiNumParenRight		: return "Thai numeral followed by a closing parenthesis.";
-		case ANM_ThaiNumParenBoth		: return "Thai numeral enclosed in parentheses.";
-		case ANM_HindiAlphaPeriod		: return "Hindi alphabetic character followed by a period.";
-		case ANM_HindiNumPeriod			: return "Hindi numeric character followed by a period.";
-		case ANM_JpnChsDBPeriod			: return "Japanese with double-byte period.";
-		case ANM_HindiNumParenRight		: return "Hindi numeric character followed by a closing parenthesis.";
-		case ANM_HindiAlpha1Period		: return "Hindi alphabetic character followed by a period.";
-		default							: return "Unknown Numbered Scheme";
-		}
-	}
-	public static TextAutoNumberSchemeEnum valueOf(short autoNumberScheme) {
-		for (TextAutoNumberSchemeEnum item: TextAutoNumberSchemeEnum.values()) {
-			if (autoNumberScheme == item.getValue()) {
-				return item;
-			}
-		}
-		return null;
-	}
-}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java
index b793613..a576146 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextBytesAtom.java
@@ -35,7 +35,7 @@
 public final class TextBytesAtom extends RecordAtom
 {
 	private byte[] _header;
-	private static long _type = 4008l;
+	private static long _type = RecordTypes.TextBytesAtom.typeID;
 
 	/** The bytes that make up the text */
 	private byte[] _text;
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java
index e279af0..3449250 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextCharsAtom.java
@@ -33,7 +33,7 @@
 public final class TextCharsAtom extends RecordAtom
 {
 	private byte[] _header;
-	private static long _type = 4000l;
+	private static long _type = RecordTypes.TextCharsAtom.typeID;
 
 	/** The bytes that make up the text */
 	private byte[] _text;
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextHeaderAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextHeaderAtom.java
index d19a6c1..a63d893 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/TextHeaderAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextHeaderAtom.java
@@ -32,7 +32,7 @@
 public final class TextHeaderAtom extends RecordAtom implements ParentAwareRecord
 {
 	private byte[] _header;
-	private static long _type = 3999l;
+	private static long _type = RecordTypes.TextHeaderAtom.typeID;
 	private RecordContainer parentRecord;
 
 	public static final int TITLE_TYPE = 0;
@@ -46,9 +46,21 @@
 
 	/** The kind of text it is */
 	private int textType;
+	/** position in the owning SlideListWithText */
+	private int index = -1;
 
 	public int getTextType() { return textType; }
 	public void setTextType(int type) { textType = type; }
+	
+    /**
+     * @return  0-based index of the text run in the SLWT container
+     */
+	public int getIndex() { return index; }
+
+    /**
+     *  @param id 0-based index of the text run in the SLWT container
+     */
+	public void setIndex(int index) { this.index = index; }
 
 	public RecordContainer getParentRecord() { return parentRecord; }
 	public void setParentRecord(RecordContainer record) { this.parentRecord = record; }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoAtom.java
index f1452bc..6782def 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoAtom.java
@@ -17,11 +17,12 @@
 
 package org.apache.poi.hslf.record;
 
-import org.apache.poi.util.LittleEndian;
-
-import java.io.OutputStream;
-import java.io.IOException;
+import java.io.*;
 import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.LittleEndianByteArrayInputStream;
 
 /**
  * The special info runs contained in this text.
@@ -30,6 +31,8 @@
  * @author Yegor Kozlov
  */
 public final class TextSpecInfoAtom extends RecordAtom {
+    private static final long _type = RecordTypes.TextSpecInfoAtom.typeID;
+    
     /**
      * Record header.
      */
@@ -41,6 +44,15 @@
     private byte[] _data;
 
     /**
+     * Constructs an empty atom, with a default run of size 1 
+     */
+    public TextSpecInfoAtom() {
+        _header = new byte[8];
+        LittleEndian.putUInt(_header, 4, _type);
+        reset(1);
+    }
+    
+    /**
      * Constructs the link related atom record from its
      *  source data.
      *
@@ -48,7 +60,7 @@
      * @param start the start offset into the byte array.
      * @param len the length of the slice in the byte array.
      */
-    protected TextSpecInfoAtom(byte[] source, int start, int len) {
+    public TextSpecInfoAtom(byte[] source, int start, int len) {
         // Get the header.
         _header = new byte[8];
         System.arraycopy(source,start,_header,0,8);
@@ -62,7 +74,7 @@
      * Gets the record type.
      * @return the record type.
      */
-    public long getRecordType() { return RecordTypes.TextSpecInfoAtom.typeID; }
+    public long getRecordType() { return _type; }
 
     /**
      * Write the contents of the record back, so it can be written
@@ -90,111 +102,67 @@
      * @param size  the site of parent text
      */
     public void reset(int size){
-        _data = new byte[10];
-        // 01 00 00 00
-        LittleEndian.putInt(_data, 0, size);
-        // 01 00 00 00
-        LittleEndian.putInt(_data, 4, 1); //mask
-        // 00 00
-        LittleEndian.putShort(_data, 8, (short)0); //langId
+        TextSpecInfoRun sir = new TextSpecInfoRun(size);
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        try {
+            sir.writeOut(bos);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        _data = bos.toByteArray();
 
         // Update the size (header bytes 5-8)
         LittleEndian.putInt(_header, 4, _data.length);
     }
 
     /**
+     * Adapts the size by enlarging the last {@link TextSpecInfoRun}
+     * or chopping the runs to the given length
+     *
+     * @param size
+     */
+    public void setParentSize(int size) {
+        assert(size > 0);
+        int covered = 0;
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        TextSpecInfoRun runs[] = getTextSpecInfoRuns();
+        assert(runs.length > 0);
+        for (int i=0; i<runs.length && covered < size; i++) {
+            TextSpecInfoRun run = runs[i];
+            if (covered + run.getLength() > size || i == runs.length-1) {
+                run.setLength(size-covered);
+            }
+            covered += run.getLength();
+            try {
+                run.writeOut(bos);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        _data = bos.toByteArray();
+
+        // Update the size (header bytes 5-8)
+        LittleEndian.putInt(_header, 4, _data.length);
+    }
+    
+    /**
      * Get the number of characters covered by this records
      *
      * @return the number of characters covered by this records
      */
     public int getCharactersCovered(){
         int covered = 0;
-        TextSpecInfoRun[] runs = getTextSpecInfoRuns();
-        for (int i = 0; i < runs.length; i++) covered += runs[i].len;
+        for (TextSpecInfoRun r : getTextSpecInfoRuns()) covered += r.length;
         return covered;
     }
 
     public TextSpecInfoRun[] getTextSpecInfoRuns(){
-        ArrayList<TextSpecInfoRun> lst = new ArrayList<TextSpecInfoRun>();
-        int pos = 0;
-        int[] bits = {1, 0, 2};
-        while(pos < _data.length) {
-            TextSpecInfoRun run = new TextSpecInfoRun();
-            run.len = LittleEndian.getInt(_data, pos); pos += 4;
-            run.mask = LittleEndian.getInt(_data, pos); pos += 4;
-            for (int i = 0; i < bits.length; i++) {
-                if((run.mask & 1 << bits[i]) != 0){
-                    switch (bits[i]){
-                        case 0:
-                            run.spellInfo = LittleEndian.getShort(_data, pos); pos += 2;
-                            break;
-                        case 1:
-                            run.langId = LittleEndian.getShort(_data, pos); pos += 2;
-                            break;
-                        case 2:
-                            run.altLangId = LittleEndian.getShort(_data, pos); pos += 2;
-                            break;
-                    }
-                }
-            }
-            lst.add(run);
+        LittleEndianByteArrayInputStream bis = new LittleEndianByteArrayInputStream(_data);
+        List<TextSpecInfoRun> lst = new ArrayList<TextSpecInfoRun>();
+        while (bis.available() > 0) {
+            lst.add(new TextSpecInfoRun(bis));
         }
         return lst.toArray(new TextSpecInfoRun[lst.size()]);
     }
 
-    public static class TextSpecInfoRun {
-        //Length of special info run.
-        protected int len;
-
-        //Special info mask of this run;
-        protected int mask;
-
-        // info fields as indicated by the mask.
-        // -1 means the bit is not set
-        protected short spellInfo = -1;
-        protected short langId = -1;
-        protected short altLangId = -1;
-
-        /**
-         * Spelling status of this text. See Spell Info table below.
-         *
-         * <p>Spell Info Types:</p>
-         * <li>0    Unchecked
-         * <li>1    Previously incorrect, needs rechecking
-         * <li>2    Correct
-         * <li>3    Incorrect
-         *
-         * @return Spelling status of this text
-         */
-        public short getSpellInfo(){
-            return spellInfo;
-        }
-
-        /**
-         * Windows LANGID for this text.
-         *
-         * @return Windows LANGID for this text.
-         */
-        public short getLangId(){
-            return spellInfo;
-        }
-
-        /**
-         * Alternate Windows LANGID of this text;
-         * must be a valid non-East Asian LANGID if the text has an East Asian language,
-         * otherwise may be an East Asian LANGID or language neutral (zero).
-         *
-         * @return  Alternate Windows LANGID of this text
-         */
-        public short getAltLangId(){
-            return altLangId;
-        }
-
-        /**
-         * @return Length of special info run.
-         */
-        public int length(){
-            return len;
-        }
-    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoRun.java b/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoRun.java
new file mode 100644
index 0000000..0e2f730
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/TextSpecInfoRun.java
@@ -0,0 +1,346 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.hslf.record;

+

+import java.io.IOException;

+import java.io.OutputStream;

+

+import org.apache.poi.util.*;

+

+public class TextSpecInfoRun {

+    /**

+     * A enum that specifies the spelling status of a run of text.

+     */

+    public enum SpellInfoEnum {

+        /** the text is spelled incorrectly. */

+        error(new BitField(1)),

+        /** the text needs rechecking. */

+        clean(new BitField(2)),

+        /** the text has a grammar error. */

+        grammar(new BitField(4)),

+        /** the text is spelled correct */

+        correct(new BitField(0));

+        

+        final BitField bitField;

+        

+        SpellInfoEnum(BitField bitField) {

+            this.bitField = bitField;

+        }

+    }

+    

+    /** A bit that specifies whether the spellInfo field exists. */

+    private static final BitField spellFld    = new BitField(0X00000001);

+    /** A bit that specifies whether the lid field exists. */

+    private static final BitField langFld     = new BitField(0X00000002);

+    /** A bit that specifies whether the altLid field exists. */

+    private static final BitField altLangFld  = new BitField(0X00000004);

+    // unused1, unused2 - Undefined and MUST be ignored.

+    /** A bit that specifies whether the pp10runid, reserved3, and grammarError fields exist. */

+    private static final BitField pp10extFld  = new BitField(0X00000020);

+    /** A bit that specifies whether the bidi field exists. */

+    private static final BitField bidiFld     = new BitField(0X00000040);

+    // unused3 - Undefined and MUST be ignored.

+    // reserved1 - MUST be zero and MUST be ignored.

+    /** A bit that specifies whether the smartTags field exists. */

+    private static final BitField smartTagFld = new BitField(0X00000200);

+    // reserved2 - MUST be zero and MUST be ignored. 

+

+    /**

+     * An optional unsigned integer that specifies an identifier for a character

+     * run that contains StyleTextProp11 data. It MUST exist if and only if pp10ext is TRUE.

+     **/

+    private static final BitField pp10runidFld = new BitField(0X0000000F);

+    // reserved3 - An optional unsigned integer that MUST be zero, and MUST be ignored. It

+    // MUST exist if and only if fPp10ext is TRUE.

+    /**

+     * An optional bit that specifies a grammar error. It MUST exist if and

+     * only if fPp10ext is TRUE.

+     **/

+    private static final BitField grammarErrorFld = new BitField(0X80000000);

+    

+    //Length of special info run.

+    protected int length;

+

+    //Special info mask of this run;

+    protected int mask;

+

+    // info fields as indicated by the mask.

+    // -1 means the bit is not set

+

+    /**

+     * An optional SpellingFlags structure that specifies the spelling status of this

+     * text. It MUST exist if and only if spell is TRUE.

+     * The spellInfo.grammar sub-field MUST be zero.

+     * <br>

+     * error (1 bit): A bit that specifies whether the text is spelled incorrectly.<br>

+     * clean (1 bit): A bit that specifies whether the text needs rechecking.<br>

+     * grammar (1 bit): A bit that specifies whether the text has a grammar error.<br>

+     * reserved (13 bits): MUST be zero and MUST be ignored.

+     */

+    protected short spellInfo = -1;

+    

+    /**

+     * An optional TxLCID that specifies the language identifier of this text.

+     * It MUST exist if and only if lang is TRUE.

+     * <br>

+     * 0x0000 = No language.<br>

+     * 0x0013 = Any Dutch language is preferred over non-Dutch languages when proofing the text.<br>

+     * 0x0400 = No proofing is performed on the text.<br>

+     * &gt; 0x0400 = A valid LCID as specified by [MS-LCID].

+     */

+    protected short langId = -1;

+    

+    /**

+     * An optional TxLCID that specifies the alternate language identifier of this text.

+     * It MUST exist if and only if altLang is TRUE.

+     */

+    protected short altLangId = -1;

+    

+    /**

+     * An optional signed integer that specifies whether the text contains bidirectional

+     * characters. It MUST exist if and only if fBidi is TRUE.

+     * 0x0000 = Contains no bidirectional characters,

+     * 0x0001 = Contains bidirectional characters.

+     */

+    protected short bidi = -1;

+    

+    protected int pp10extMask = -1;

+    protected byte[] smartTagsBytes = null;

+

+    /**

+     * Inits a TextSpecInfoRun with default values

+     *

+     * @param len the length of the one and only run

+     */

+    public TextSpecInfoRun(int len) {

+        setLength(len);

+        setLangId((short)0);

+    }

+    

+    public TextSpecInfoRun(LittleEndianByteArrayInputStream source) {

+        length = source.readInt();

+        mask = source.readInt();

+        if (spellFld.isSet(mask)) {

+            spellInfo = source.readShort();

+        }

+        if (langFld.isSet(mask)) {

+            langId = source.readShort();

+        }

+        if (altLangFld.isSet(mask)) {

+            altLangId = source.readShort();

+        }

+        if (bidiFld.isSet(mask)) {

+            bidi = source.readShort();

+        }

+        if (pp10extFld.isSet(mask)) {

+            pp10extMask = source.readInt();

+        }

+        if (smartTagFld.isSet(mask)) {

+            // An unsigned integer specifies the count of items in rgSmartTagIndex.

+            int count = source.readInt();

+            smartTagsBytes = new byte[4+count*4];

+            LittleEndian.putInt(smartTagsBytes, 0, count);

+            // An array of SmartTagIndex that specifies the indices.

+            // The count of items in the array is specified by count.

+            source.readFully(smartTagsBytes, 4, count*4);

+        }

+    }

+

+    /**

+     * Write the contents of the record back, so it can be written

+     * to disk

+     *

+     * @param out the output stream to write to.

+     * @throws java.io.IOException if an error occurs.

+     */

+    public void writeOut(OutputStream out) throws IOException {

+        final byte buf[] = new byte[4];

+        LittleEndian.putInt(buf, 0, length);

+        out.write(buf);

+        LittleEndian.putInt(buf, 0, mask);

+        out.write(buf);

+        Object flds[] = {

+            spellFld, spellInfo, "spell info",

+            langFld, langId, "lang id",

+            altLangFld, altLangId, "alt lang id",

+            bidiFld, bidi, "bidi",

+            pp10extFld, pp10extMask, "pp10 extension field",

+            smartTagFld, smartTagsBytes, "smart tags"

+        };

+        

+        for (int i=0; i<flds.length; i+=3) {

+            BitField fld = (BitField)flds[i+0];

+            Object valO = flds[i+1];

+            if (!fld.isSet(mask)) continue;

+            boolean valid;

+            if (valO instanceof byte[]) {

+                byte bufB[] = (byte[])valO;

+                valid = bufB.length > 0;

+                out.write(bufB);

+            } else if (valO instanceof Integer) {

+                int valI = ((Integer)valO);

+                valid = (valI != -1);

+                LittleEndian.putInt(buf, 0, valI);

+                out.write(buf);

+            } else if (valO instanceof Short) {

+                short valS = ((Short)valO);

+                valid = (valS != -1);

+                LittleEndian.putShort(buf, 0, valS);

+                out.write(buf, 0, 2);

+            } else {

+                valid = false;

+            }

+            if (!valid) {

+                throw new IOException(flds[i+2]+" is activated, but its value is invalid");

+            }

+        }

+    }        

+    

+    /**

+     * @return Spelling status of this text. null if not defined.

+     */

+    public SpellInfoEnum getSpellInfo(){

+        if (spellInfo == -1) return null;

+        for (SpellInfoEnum si : new SpellInfoEnum[]{SpellInfoEnum.clean,SpellInfoEnum.error,SpellInfoEnum.grammar}) {

+            if (si.bitField.isSet(spellInfo)) return si;

+        }

+        return SpellInfoEnum.correct;

+    }

+

+    /**

+     * @param spellInfo Spelling status of this text. null if not defined.

+     */

+    public void setSpellInfo(SpellInfoEnum spellInfo) {

+        this.spellInfo = (spellInfo == null)

+            ? -1

+            : (short)spellInfo.bitField.set(0);

+        mask = spellFld.setBoolean(mask, spellInfo != null);

+    }

+    

+    /**

+     * Windows LANGID for this text.

+     *

+     * @return Windows LANGID for this text, -1 if it's not set

+     */

+    public short getLangId(){

+        return langId;

+    }

+

+    /**

+     * @param langId Windows LANGID for this text, -1 to unset

+     */

+    public void setLangId(short langId) {

+        this.langId = langId;

+        mask = langFld.setBoolean(mask, langId != -1);

+    }

+    

+    /**

+     * Alternate Windows LANGID of this text;

+     * must be a valid non-East Asian LANGID if the text has an East Asian language,

+     * otherwise may be an East Asian LANGID or language neutral (zero).

+     *

+     * @return  Alternate Windows LANGID of this text, -1 if it's not set

+     */

+    public short getAltLangId(){

+        return altLangId;

+    }

+

+    public void setAltLangId(short altLangId) {

+        this.altLangId = altLangId;

+        mask = altLangFld.setBoolean(mask, altLangId != -1);

+    }

+

+    /**

+     * @return Length of special info run.

+     */

+    public int getLength() {

+        return length;

+    }

+

+    /**

+     * @param length Length of special info run.

+     */

+    public void setLength(int length) {

+        this.length = length;

+    }

+

+    /**

+     * @return the bidirectional characters flag. false = not bidi, true = is bidi, null = not set

+     */

+    public Boolean getBidi() {

+        return (bidi == -1 ? null : bidi != 0);

+    }

+

+    /**

+     * @param bidi the bidirectional characters flag. false = not bidi, true = is bidi, null = not set

+     */

+    public void setBidi(Boolean bidi) {

+        this.bidi = (bidi == null) ? -1 : (short)(bidi ? 1 : 0);

+        mask = bidiFld.setBoolean(mask, bidi != null);

+    }

+

+    /**

+     * @return the unparsed smart tags

+     */

+    public byte[] getSmartTagsBytes() {

+        return smartTagsBytes;

+    }

+

+    /**

+     * @param smartTagsBytes the unparsed smart tags, null to unset

+     */

+    public void setSmartTagsBytes(byte[] smartTagsBytes) {

+        this.smartTagsBytes = smartTagsBytes;

+        mask = smartTagFld.setBoolean(mask, smartTagsBytes != null);

+    }

+    

+    /**

+     * @return an identifier for a character run that contains StyleTextProp11 data.

+     */

+    public int getPP10RunId() {

+        return (pp10extMask == -1 || !pp10extFld.isSet(mask)) ? -1 : pp10runidFld.getValue(pp10extMask);

+        

+    }

+    

+    /**

+     * @param pp10RunId an identifier for a character run that contains StyleTextProp11 data, -1 to unset

+     */

+    public void setPP10RunId(int pp10RunId) {

+        if (pp10RunId == -1) {

+            pp10extMask = (getGrammarError() == null) ? -1 : pp10runidFld.clear(pp10extMask);

+        } else {

+            pp10extMask = pp10runidFld.setValue(pp10extMask, pp10RunId);

+        }

+        // if both parameters are invalid, remove the extension mask

+        mask = pp10extFld.setBoolean(mask, pp10extMask != -1);

+    }

+    

+    public Boolean getGrammarError() {

+        return (pp10extMask == -1 || !pp10extFld.isSet(mask)) ? null : grammarErrorFld.isSet(pp10extMask);

+    }

+    

+    public void getGrammarError(Boolean grammarError) {

+        if (grammarError == null) {

+            pp10extMask = (getPP10RunId() == -1) ? -1 : grammarErrorFld.clear(pp10extMask);

+        } else {

+            pp10extMask = grammarErrorFld.set(pp10extMask);

+        }

+        // if both parameters are invalid, remove the extension mask

+        mask = pp10extFld.setBoolean(mask, pp10extMask != -1);

+    }

+}

diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java
index 966c8eb..54e7529 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java
@@ -19,11 +19,11 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
 
-import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.TextProp;
 import org.apache.poi.hslf.model.textproperties.TextPropCollection;
+import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -52,8 +52,8 @@
     private static long _type = 4003;
     private byte[] _data;
 
-    private TextPropCollection[] prstyles;
-    private TextPropCollection[] chstyles;
+    private List<TextPropCollection> paragraphStyles;
+    private List<TextPropCollection> charStylesyles;
 
     protected TxMasterStyleAtom(byte[] source, int start, int len) {
         _header = new byte[8];
@@ -98,8 +98,8 @@
      *
      * @return character styles defined in this record
      */
-    public TextPropCollection[] getCharacterStyles(){
-        return chstyles;
+    public List<TextPropCollection> getCharacterStyles(){
+        return charStylesyles;
     }
 
     /**
@@ -107,8 +107,8 @@
      *
      * @return paragraph styles defined in this record
      */
-    public TextPropCollection[] getParagraphStyles(){
-        return prstyles;
+    public List<TextPropCollection> getParagraphStyles(){
+        return paragraphStyles;
     }
 
     /**
@@ -137,28 +137,31 @@
         short levels = LittleEndian.getShort(_data, 0);
         pos += LittleEndian.SHORT_SIZE;
 
-        prstyles = new TextPropCollection[levels];
-        chstyles = new TextPropCollection[levels];
+        paragraphStyles = new ArrayList<TextPropCollection>(levels);
+        charStylesyles = new ArrayList<TextPropCollection>(levels);
 
         for(short j = 0; j < levels; j++) {
-
+            TextPropCollection prprops = new TextPropCollection(0, TextPropType.paragraph); //  getParagraphProps(type, j)
             if (type >= TextHeaderAtom.CENTRE_BODY_TYPE) {
                 // Fetch the 2 byte value, that is safe to ignore for some types of text
-                short val = LittleEndian.getShort(_data, pos);
+                short indentLevel = LittleEndian.getShort(_data, pos);
+                prprops.setIndentLevel(indentLevel);
                 pos += LittleEndian.SHORT_SIZE;
+            } else {
+                prprops.setIndentLevel((short)-1);
             }
 
             head = LittleEndian.getInt(_data, pos);
             pos += LittleEndian.INT_SIZE;
-            TextPropCollection prprops = new TextPropCollection(0);
-            pos += prprops.buildTextPropList( head, getParagraphProps(type, j), _data, pos);
-            prstyles[j] = prprops;
+            
+            pos += prprops.buildTextPropList( head, _data, pos);
+            paragraphStyles.add(prprops);
 
             head = LittleEndian.getInt(_data, pos);
             pos += LittleEndian.INT_SIZE;
-            TextPropCollection chprops = new TextPropCollection(0);
-            pos += chprops.buildTextPropList( head, getCharacterProps(type, j), _data, pos);
-            chstyles[j] = chprops;
+            TextPropCollection chprops = new TextPropCollection(0, TextPropType.character); //  getCharacterProps(type, j)
+            pos += chprops.buildTextPropList( head, _data, pos);
+            charStylesyles.add(chprops);
         }
 
     }
@@ -169,30 +172,12 @@
      * Depending on the level and type, it may be our special
      *  ones, or the standard StyleTextPropAtom ones
      */
-    protected TextProp[] getParagraphProps(int type, int level){
-        if (level != 0 || type >= MAX_INDENT){
-            return StyleTextPropAtom.paragraphTextPropTypes;
-        }
-        return new TextProp[] {
-                new ParagraphFlagsTextProp(),
-                new TextProp(2, 0x80, "bullet.char"),
-                new TextProp(2, 0x10, "bullet.font"),
-                new TextProp(2, 0x40, "bullet.size"),
-                new TextProp(4, 0x20, "bullet.color"),
-                new TextProp(2, 0xD00, "alignment"),
-                new TextProp(2, 0x1000, "linespacing"),
-                new TextProp(2, 0x2000, "spacebefore"),
-                new TextProp(2, 0x4000, "spaceafter"),
-                new TextProp(2, 0x8000, "text.offset"),
-                new TextProp(2, 0x10000, "bullet.offset"),
-                new TextProp(2, 0x20000, "defaulttab"),
-                new TextProp(2, 0x40000, "para_unknown_2"),
-                new TextProp(2, 0x80000, "para_unknown_3"),
-                new TextProp(2, 0x100000, "para_unknown_4"),
-                new TextProp(2, 0x200000, "para_unknown_5")
-        };
-
-    }
+//    protected TextProp[] getParagraphProps(int type, int level){
+//        return StyleTextPropAtom.paragraphTextPropTypes;
+//        return (level != 0 || type >= MAX_INDENT)
+//            ? StyleTextPropAtom.paragraphTextPropTypes
+//            : paragraphSpecialPropTypes;
+//    }
 
     /**
      * Character properties for the specified text type and
@@ -200,19 +185,10 @@
      * Depending on the level and type, it may be our special
      *  ones, or the standard StyleTextPropAtom ones
      */
-    protected TextProp[] getCharacterProps(int type, int level){
-        if (level != 0 || type >= MAX_INDENT){
-            return StyleTextPropAtom.characterTextPropTypes;
-        }
-        return new TextProp[] {
-                new CharFlagsTextProp(),
-                new TextProp(2, 0x10000, "font.index"),
-                new TextProp(2, 0x20000, "char_unknown_1"),
-                new TextProp(4, 0x40000, "char_unknown_2"),
-                new TextProp(2, 0x80000, "font.size"),
-                new TextProp(2, 0x100000, "char_unknown_3"),
-                new TextProp(4, 0x200000, "font.color"),
-                new TextProp(2, 0x800000, "char_unknown_4")
-        };
-    }
+//    protected TextProp[] getCharacterProps(int type, int level){
+//        return StyleTextPropAtom.characterTextPropTypes;
+//        return (level != 0 || type >= MAX_INDENT) 
+//            ? StyleTextPropAtom.characterTextPropTypes
+//            : characterSpecialPropTypes;
+//    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java
similarity index 76%
rename from src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java
index 1b8e7dd..ceb6552 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/AutoShape.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java
@@ -15,12 +15,12 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
-import org.apache.poi.ddf.*;
-import org.apache.poi.util.POILogger;
-
-import java.awt.geom.Rectangle2D;
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherProperties;
+import org.apache.poi.sl.usermodel.*;
+import org.apache.poi.ss.usermodel.ShapeTypes;
 
 /**
  * Represents an AutoShape.
@@ -31,22 +31,22 @@
  *
  *  @author Yegor Kozlov
  */
-public class AutoShape extends TextShape {
+public class HSLFAutoShape extends HSLFTextShape implements AutoShape<HSLFTextParagraph> {
 
-    protected AutoShape(EscherContainerRecord escherRecord, Shape parent){
+    protected HSLFAutoShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
-    public AutoShape(int type, Shape parent){
+    public HSLFAutoShape(ShapeType type, ShapeContainer<HSLFShape> parent){
         super(null, parent);
-        _escherContainer = createSpContainer(type, parent instanceof ShapeGroup);
+        _escherContainer = createSpContainer(type, parent instanceof HSLFGroupShape);
     }
 
-    public AutoShape(int type){
+    public HSLFAutoShape(ShapeType type){
         this(type, null);
     }
 
-    protected EscherContainerRecord createSpContainer(int shapeType, boolean isChild){
+    protected EscherContainerRecord createSpContainer(ShapeType shapeType, boolean isChild){
         _escherContainer = super.createSpContainer(isChild);
 
         setShapeType(shapeType);
@@ -64,10 +64,10 @@
         return _escherContainer;
     }
 
-    protected void setDefaultTextProperties(TextRun _txtrun){
-        setVerticalAlignment(TextBox.AnchorMiddle);
-        setHorizontalAlignment(TextBox.AlignCenter);
-        setWordWrap(TextBox.WrapNone);
+    protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){
+        setVerticalAlignment(VerticalAlignment.MIDDLE);
+        setHorizontalCentered(true);
+        setWordWrap(HSLFTextBox.WrapNone);
     }
 
     /**
@@ -105,16 +105,4 @@
 
         setEscherProperty((short)(EscherProperties.GEOMETRY__ADJUSTVALUE + idx), val);
     }
-
-    public java.awt.Shape getOutline(){
-        ShapeOutline outline = AutoShapes.getShapeOutline(getShapeType());
-        Rectangle2D anchor = getLogicalAnchor2D();
-        if(outline == null){
-            logger.log(POILogger.WARN, "Outline not found for " + ShapeTypes.typeName(getShapeType()));
-            return anchor;
-        }
-        java.awt.Shape shape = outline.getOutline(this);
-        return AutoShapes.transform(shape, anchor);
-    }
-
 }
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFBackground.java
similarity index 64%
copy from src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java
copy to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFBackground.java
index 71891f8..4b9846f 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/LineDash.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFBackground.java
@@ -1,34 +1,38 @@
-/* ====================================================================

-   Licensed to the Apache Software Foundation (ASF) under one or more

-   contributor license agreements.  See the NOTICE file distributed with

-   this work for additional information regarding copyright ownership.

-   The ASF licenses this file to You under the Apache License, Version 2.0

-   (the "License"); you may not use this file except in compliance with

-   the License.  You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

-==================================================================== */

-package org.apache.poi.xslf.usermodel;

-

-/**

- * @author Yegor Kozlov

- */

-public enum LineDash {

-    SOLID,

-    DOT,

-    DASH,

-    LG_DASH,

-    DASH_DOT,

-    LG_DASH_DOT,

-    LG_DASH_DOT_DOT,

-    SYS_DASH,

-    SYS_DOT,

-    SYS_DASH_DOT,

-    SYS_DASH_DOT_DOT;

-}

+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.sl.usermodel.Background;
+import org.apache.poi.sl.usermodel.ShapeContainer;
+
+/**
+ * Background shape
+ *
+ * @author Yegor Kozlov
+ */
+public final class HSLFBackground extends HSLFShape implements Background {
+
+    protected HSLFBackground(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent) {
+        super(escherRecord, parent);
+    }
+
+    protected EscherContainerRecord createSpContainer(boolean isChild) {
+        return null;
+    }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFill.java
similarity index 62%
rename from src/scratchpad/src/org/apache/poi/hslf/model/Fill.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFill.java
index 5302e26..09d97a3 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Fill.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFill.java
@@ -15,20 +15,18 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
 import java.awt.Color;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.util.List;
 
-import org.apache.poi.ddf.EscherBSERecord;
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherOptRecord;
-import org.apache.poi.ddf.EscherProperties;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.ddf.EscherSimpleProperty;
+import org.apache.poi.ddf.*;
 import org.apache.poi.hslf.record.Document;
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.sl.usermodel.*;
+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
+import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 
@@ -37,7 +35,7 @@
  *
  * @author Yegor Kozlov
  */
-public final class Fill {
+public final class HSLFFill {
     // For logging
     protected POILogger logger = POILogFactory.getLogger(this.getClass());
 
@@ -98,7 +96,7 @@
     /**
      * The shape this background applies to
      */
-    protected Shape shape;
+    protected HSLFShape shape;
 
     /**
      * Construct a <code>Fill</code> object for a shape.
@@ -106,10 +104,56 @@
      *
      * @param shape the shape this background applies to
      */
-    public Fill(Shape shape){
+    public HSLFFill(HSLFShape shape){
         this.shape = shape;
     }
 
+
+    public FillStyle getFillStyle() {
+        return new FillStyle() {
+            public PaintStyle getPaint() {
+                switch (getFillType()) {
+                    case FILL_SOLID: {
+                        return new SolidPaint() {
+                            public ColorStyle getSolidColor() {
+                                return new ColorStyle() {
+                                    public Color getColor() { return getForegroundColor(); }
+                                    public int getAlpha() { return -1; }
+                                    public int getLumOff() { return -1; }
+                                    public int getLumMod() { return -1; }
+                                    public int getShade()  { return -1; }
+                                    public int getTint()  { return -1; }
+                                };
+                            }
+                        };
+                    }
+                    case FILL_PICTURE: {
+                        final HSLFPictureData pd = getPictureData();
+                        if (pd == null) break;
+                        
+                        return new TexturePaint() {
+                            public InputStream getImageData() {
+                                return new ByteArrayInputStream(pd.getData());
+                            }
+
+                            public String getContentType() {
+                                return pd.getContentType();
+                            }
+
+                            public int getAlpha() {
+                                return (int)(shape.getAlpha(EscherProperties.FILL__FILLOPACITY)*100000.0);
+                            }
+                        };
+                    }
+                    default:
+                        logger.log(POILogger.WARN, "unsuported fill type: " + getFillType());
+                        break;
+                }
+                return PaintStyle.TRANSPARENT_PAINT;
+            }
+        };
+    }
+    
     /**
      * Returns fill type.
      * Must be one of the <code>FILL_*</code> constants defined in this class.
@@ -118,15 +162,15 @@
      */
     public int getFillType(){
         EscherOptRecord opt = shape.getEscherOptRecord();
-        EscherSimpleProperty prop = Shape.getEscherProperty(opt, EscherProperties.FILL__FILLTYPE);
+        EscherSimpleProperty prop = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__FILLTYPE);
         return prop == null ? FILL_SOLID : prop.getPropertyValue();
     }
 
     /**
      */
-    protected void afterInsert(Sheet sh){
+    protected void afterInsert(HSLFSheet sh){
         EscherOptRecord opt = shape.getEscherOptRecord();
-        EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
+        EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
         if(p != null) {
             int idx = p.getPropertyValue();
             EscherBSERecord bse = getEscherBSERecord(idx);
@@ -135,15 +179,15 @@
     }
 
     protected EscherBSERecord getEscherBSERecord(int idx){
-        Sheet sheet = shape.getSheet();
+        HSLFSheet sheet = shape.getSheet();
         if(sheet == null) {
             logger.log(POILogger.DEBUG, "Fill has not yet been assigned to a sheet");
             return null;
         }
-        SlideShow ppt = sheet.getSlideShow();
+        HSLFSlideShow ppt = sheet.getSlideShow();
         Document doc = ppt.getDocumentRecord();
         EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
-        EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
+        EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
         if(bstore == null) {
             logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found ");
             return null;
@@ -160,7 +204,7 @@
      */
     public void setFillType(int type){
         EscherOptRecord opt = shape.getEscherOptRecord();
-        Shape.setEscherProperty(opt, EscherProperties.FILL__FILLTYPE, type);
+        HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLTYPE, type);
     }
 
     /**
@@ -168,7 +212,7 @@
      */
     public Color getForegroundColor(){
         EscherOptRecord opt = shape.getEscherOptRecord();
-        EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
+        EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
 
         if(p != null && (p.getPropertyValue() & 0x10) == 0) return null;
 
@@ -182,12 +226,12 @@
     public void setForegroundColor(Color color){
         EscherOptRecord opt = shape.getEscherOptRecord();
         if (color == null) {
-            Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150000);
+            HSLFShape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150000);
         }
         else {
             int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
-            Shape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, rgb);
-            Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150011);
+            HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, rgb);
+            HSLFShape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150011);
         }
     }
 
@@ -196,7 +240,7 @@
      */
     public Color getBackgroundColor(){
         EscherOptRecord opt = shape.getEscherOptRecord();
-        EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
+        EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
 
         if(p != null && (p.getPropertyValue() & 0x10) == 0) return null;
 
@@ -209,28 +253,28 @@
     public void setBackgroundColor(Color color){
         EscherOptRecord opt = shape.getEscherOptRecord();
         if (color == null) {
-            Shape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, -1);
+            HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, -1);
         }
         else {
             int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
-            Shape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, rgb);
+            HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, rgb);
         }
     }
 
     /**
      * <code>PictureData</code> object used in a texture, pattern of picture fill.
      */
-    public PictureData getPictureData(){
+    public HSLFPictureData getPictureData(){
         EscherOptRecord opt = shape.getEscherOptRecord();
-        EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
+        EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
         if (p == null) return null;
 
-        SlideShow ppt = shape.getSheet().getSlideShow();
-        PictureData[] pict = ppt.getPictureData();
+        HSLFSlideShow ppt = shape.getSheet().getSlideShow();
+        HSLFPictureData[] pict = ppt.getPictureData();
         Document doc = ppt.getDocumentRecord();
 
         EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
-        EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
+        EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
 
         java.util.List<EscherRecord> lst = bstore.getChildRecords();
         int idx = p.getPropertyValue();
@@ -255,7 +299,7 @@
      */
     public void setPictureData(int idx){
         EscherOptRecord opt = shape.getEscherOptRecord();
-        Shape.setEscherProperty(opt, (short)(EscherProperties.FILL__PATTERNTEXTURE + 0x4000), idx);
+        HSLFShape.setEscherProperty(opt, (short)(EscherProperties.FILL__PATTERNTEXTURE + 0x4000), idx);
         if( idx != 0 ) {
             if( shape.getSheet() != null ) {
                 EscherBSERecord bse = getEscherBSERecord(idx);
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java
similarity index 94%
rename from src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java
index 82f46b5..5128b55 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Freeform.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java
@@ -15,7 +15,7 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
 import java.awt.geom.AffineTransform;
 import java.awt.geom.GeneralPath;
@@ -31,6 +31,8 @@
 import org.apache.poi.ddf.EscherOptRecord;
 import org.apache.poi.ddf.EscherProperties;
 import org.apache.poi.ddf.EscherSimpleProperty;
+import org.apache.poi.sl.usermodel.ShapeContainer;
+import org.apache.poi.sl.usermodel.ShapeType;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.POILogger;
 
@@ -43,7 +45,7 @@
  * </p>
  * @author Yegor Kozlov
  */
-public final class Freeform extends AutoShape {
+public final class HSLFFreeformShape extends HSLFAutoShape {
 
     public static final byte[] SEGMENTINFO_MOVETO   = new byte[]{0x00, 0x40};
     public static final byte[] SEGMENTINFO_LINETO   = new byte[]{0x00, (byte)0xAC};
@@ -60,7 +62,7 @@
      * @param escherRecord       <code>EscherSpContainer</code> container which holds information about this shape
      * @param parent    the parent of the shape
      */
-   protected Freeform(EscherContainerRecord escherRecord, Shape parent){
+   protected HSLFFreeformShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
 
     }
@@ -71,16 +73,16 @@
      * @param parent    the parent of this Shape. For example, if this text box is a cell
      * in a table then the parent is Table.
      */
-    public Freeform(Shape parent){
-        super(null, parent);
-        _escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup);
+    public HSLFFreeformShape(ShapeContainer<HSLFShape> parent){
+        super((EscherContainerRecord)null, parent);
+        _escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof HSLFGroupShape);
     }
 
     /**
      * Create a new Freeform. This constructor is used when a new shape is created.
      *
      */
-    public Freeform(){
+    public HSLFFreeformShape(){
         this(null);
     }
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java
similarity index 65%
rename from src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java
index 796b248..5133ff1 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeGroup.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java
@@ -15,21 +15,13 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
-import java.awt.Graphics2D;
-import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
-import org.apache.poi.ddf.EscherChildAnchorRecord;
-import org.apache.poi.ddf.EscherClientAnchorRecord;
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.ddf.EscherSpRecord;
-import org.apache.poi.ddf.EscherSpgrRecord;
+import org.apache.poi.ddf.*;
+import org.apache.poi.sl.usermodel.*;
 import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.POILogger;
 
@@ -38,13 +30,13 @@
  *
  * @author Yegor Kozlov
  */
-public class ShapeGroup extends Shape{
+public class HSLFGroupShape extends HSLFShape implements GroupShape<HSLFShape> {
 
     /**
       * Create a new ShapeGroup. This constructor is used when a new shape is created.
       *
       */
-    public ShapeGroup(){
+    public HSLFGroupShape(){
         this(null, null);
         _escherContainer = createSpContainer(false);
     }
@@ -55,41 +47,13 @@
       * @param escherRecord       <code>EscherSpContainer</code> container which holds information about this shape
       * @param parent    the parent of the shape
       */
-    protected ShapeGroup(EscherContainerRecord escherRecord, Shape parent){
+    protected HSLFGroupShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
-    /**
-     * @return the shapes contained in this group container
-     */
-    public Shape[] getShapes() {
-    	// Out escher container record should contain several
-        //  SpContainers, the first of which is the group shape itself
-        Iterator<EscherRecord> iter = _escherContainer.getChildIterator();
-
-        // Don't include the first SpContainer, it is always NotPrimitive
-        if (iter.hasNext()) {
-        	iter.next();
-        }
-        List<Shape> shapeList = new ArrayList<Shape>();
-        while (iter.hasNext()) {
-        	EscherRecord r = iter.next();
-        	if(r instanceof EscherContainerRecord) {
-        		// Create the Shape for it
-        		EscherContainerRecord container = (EscherContainerRecord)r;
-        		Shape shape = ShapeFactory.createShape(container, this);
-                shape.setSheet(getSheet());
-        		shapeList.add( shape );
-        	} else {
-        		// Should we do anything special with these non
-        		//  Container records?
-        		logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName());
-        	}
-        }
-
-        // Put the shapes into an array, and return
-        Shape[] shapes = shapeList.toArray(new Shape[shapeList.size()]);
-        return shapes;
+    @Override
+    public List<HSLFShape> getShapes() {
+        return getShapeList();
     }
 
     /**
@@ -122,13 +86,8 @@
         spgr.setRectY2((anchor.y + anchor.height)*MASTER_DPI/POINT_DPI);
     }
 
-    /**
-     * Sets the coordinate space of this group.  All children are constrained
-     * to these coordinates.
-     *
-     * @param anchor the coordinate space of this group
-     */
-    public void setCoordinates(Rectangle2D anchor){
+    @Override
+    public void setInteriorAnchor(Rectangle2D anchor){
         EscherSpgrRecord spgr = getEscherChild(EscherSpgrRecord.RECORD_ID);
 
         int x1 = (int)Math.round(anchor.getX()*MASTER_DPI/POINT_DPI);
@@ -143,22 +102,14 @@
 
     }
 
-    /**
-     * Gets the coordinate space of this group.  All children are constrained
-     * to these coordinates.
-     *
-     * @return the coordinate space of this group
-     */
-    public Rectangle2D getCoordinates(){
-        EscherSpgrRecord spgr = getEscherChild(EscherSpgrRecord.RECORD_ID);
-
-        Rectangle2D.Float anchor = new Rectangle2D.Float();
-        anchor.x = (float)spgr.getRectX1()*POINT_DPI/MASTER_DPI;
-        anchor.y = (float)spgr.getRectY1()*POINT_DPI/MASTER_DPI;
-        anchor.width = (float)(spgr.getRectX2() - spgr.getRectX1())*POINT_DPI/MASTER_DPI;
-        anchor.height = (float)(spgr.getRectY2() - spgr.getRectY1())*POINT_DPI/MASTER_DPI;
-
-        return anchor;
+    @Override
+    public Rectangle2D getInteriorAnchor(){
+        EscherSpgrRecord rec = getEscherChild(EscherSpgrRecord.RECORD_ID);
+        double x = rec.getRectX1()*POINT_DPI/MASTER_DPI;
+        double y = rec.getRectY1()*POINT_DPI/MASTER_DPI;
+        double width = (rec.getRectX2()-rec.getRectX1())*POINT_DPI/MASTER_DPI;
+        double height = (rec.getRectY2()-rec.getRectY1())*POINT_DPI/MASTER_DPI;
+        return new Rectangle2D.Double(x,y,width,height);
     }
 
     /**
@@ -179,7 +130,7 @@
         spcont.addChildRecord(spg);
 
         EscherSpRecord sp = new EscherSpRecord();
-        short type = (ShapeTypes.NotPrimitive << 4) + 2;
+        short type = (short)((ShapeType.NOT_PRIMITIVE.nativeId << 4) + 2);
         sp.setOptions(type);
         sp.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_GROUP);
         spcont.addChildRecord(sp);
@@ -196,10 +147,10 @@
      *
      * @param shape - the Shape to add
      */
-    public void addShape(Shape shape){
+    public void addShape(HSLFShape shape){
         _escherContainer.addChildRecord(shape.getSpContainer());
 
-        Sheet sheet = getSheet();
+        HSLFSheet sheet = getSheet();
         shape.setSheet(sheet);
         shape.setShapeId(sheet.allocateShapeId());
         shape.afterInsert(sheet);
@@ -218,11 +169,11 @@
         anchor.translate(dx, dy);
         setAnchor(anchor);
 
-        Shape[] shape = getShapes();
-        for (int i = 0; i < shape.length; i++) {
-            java.awt.Rectangle chanchor = shape[i].getAnchor();
+        
+        for (HSLFShape shape : getShapes()) {
+            java.awt.Rectangle chanchor = shape.getAnchor();
             chanchor.translate(dx, dy);
-            shape[i].setAnchor(chanchor);
+            shape.setAnchor(chanchor);
         }
     }
 
@@ -234,21 +185,21 @@
      */
     public Rectangle2D getAnchor2D(){
         EscherClientAnchorRecord clientAnchor = getEscherChild(EscherClientAnchorRecord.RECORD_ID);
-        Rectangle2D.Float anchor = new Rectangle2D.Float();
+        Rectangle2D anchor;
         if(clientAnchor == null){
             logger.log(POILogger.INFO, "EscherClientAnchorRecord was not found for shape group. Searching for EscherChildAnchorRecord.");
             EscherChildAnchorRecord rec = getEscherChild(EscherChildAnchorRecord.RECORD_ID);
-            anchor = new Rectangle2D.Float(
-                (float)rec.getDx1()*POINT_DPI/MASTER_DPI,
-                (float)rec.getDy1()*POINT_DPI/MASTER_DPI,
-                (float)(rec.getDx2()-rec.getDx1())*POINT_DPI/MASTER_DPI,
-                (float)(rec.getDy2()-rec.getDy1())*POINT_DPI/MASTER_DPI
-            );
+            double x = rec.getDx1()*POINT_DPI/MASTER_DPI;
+            double y = rec.getDy1()*POINT_DPI/MASTER_DPI;
+            double width = (rec.getDx2()-rec.getDx1())*POINT_DPI/MASTER_DPI;
+            double height = (rec.getDy2()-rec.getDy1())*POINT_DPI/MASTER_DPI;
+            anchor = new Rectangle2D.Double(x,y,width,height);
         } else {
-            anchor.x = (float)clientAnchor.getCol1()*POINT_DPI/MASTER_DPI;
-            anchor.y = (float)clientAnchor.getFlag()*POINT_DPI/MASTER_DPI;
-            anchor.width = (float)(clientAnchor.getDx1() - clientAnchor.getCol1())*POINT_DPI/MASTER_DPI ;
-            anchor.height = (float)(clientAnchor.getRow1() - clientAnchor.getFlag())*POINT_DPI/MASTER_DPI;
+            double x = clientAnchor.getCol1()*POINT_DPI/MASTER_DPI;
+            double y = clientAnchor.getFlag()*POINT_DPI/MASTER_DPI;
+            double width = (clientAnchor.getDx1() - clientAnchor.getCol1())*POINT_DPI/MASTER_DPI ;
+            double height = (clientAnchor.getRow1() - clientAnchor.getFlag())*POINT_DPI/MASTER_DPI;
+            anchor = new Rectangle2D.Double(x,y,width,height);
         }
 
         return anchor;
@@ -260,9 +211,10 @@
      *
      * @return type of the shape.
      */
-    public int getShapeType(){
+    public ShapeType getShapeType(){
         EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
-        return spRecord.getOptions() >> 4;
+        int nativeId = spRecord.getOptions() >> 4;
+        return ShapeType.forId(nativeId, false);
     }
 
     /**
@@ -270,25 +222,54 @@
      *
      * @return <code>null</code>.
      */
-     public Hyperlink getHyperlink(){
+     public HSLFHyperlink getHyperlink(){
         return null;
     }
 
-    public void draw(Graphics2D graphics){
-
-        AffineTransform at = graphics.getTransform();
-
-        Shape[] sh = getShapes();
-        for (int i = 0; i < sh.length; i++) {
-            sh[i].draw(graphics);
-        }
-
-        graphics.setTransform(at);
-    }
-
     @Override
     public <T extends EscherRecord> T getEscherChild(int recordId){
         EscherContainerRecord groupInfoContainer = (EscherContainerRecord)_escherContainer.getChild(0);
         return groupInfoContainer.getChildById((short)recordId);
     }
+
+    public Iterator<HSLFShape> iterator() {
+        return getShapeList().iterator();
+    }
+
+    public boolean removeShape(HSLFShape shape) {
+        // TODO: implement!
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @return the shapes contained in this group container
+     */
+    protected List<HSLFShape> getShapeList() {
+        // Out escher container record should contain several
+        //  SpContainers, the first of which is the group shape itself
+        Iterator<EscherRecord> iter = _escherContainer.getChildIterator();
+
+        // Don't include the first SpContainer, it is always NotPrimitive
+        if (iter.hasNext()) {
+            iter.next();
+        }
+        List<HSLFShape> shapeList = new ArrayList<HSLFShape>();
+        while (iter.hasNext()) {
+            EscherRecord r = iter.next();
+            if(r instanceof EscherContainerRecord) {
+                // Create the Shape for it
+                EscherContainerRecord container = (EscherContainerRecord)r;
+                HSLFShape shape = HSLFShapeFactory.createShape(container, this);
+                shape.setSheet(getSheet());
+                shapeList.add( shape );
+            } else {
+                // Should we do anything special with these non
+                //  Container records?
+                logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName());
+            }
+        }
+
+        return shapeList;
+    }
+
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFHyperlink.java
similarity index 68%
rename from src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFHyperlink.java
index 56c8a6a..02608b7 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Hyperlink.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFHyperlink.java
@@ -15,24 +15,19 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
+import java.util.*;
+
+import org.apache.poi.ddf.*;
 import org.apache.poi.hslf.record.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.ddf.EscherClientDataRecord;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Iterator;
 
 /**
  * Represents a hyperlink in a PowerPoint document
  *
  * @author Yegor Kozlov
  */
-public final class Hyperlink {
+public final class HSLFHyperlink {
     public static final byte LINK_NEXTSLIDE = InteractiveInfoAtom.LINK_NextSlide;
     public static final byte LINK_PREVIOUSSLIDE = InteractiveInfoAtom.LINK_PreviousSlide;
     public static final byte LINK_FIRSTSLIDE = InteractiveInfoAtom.LINK_FirstSlide;
@@ -95,11 +90,11 @@
         return address;
     }
 
-    public void setAddress(Slide slide) {
+    public void setAddress(HSLFSlide slide) {
         String href = slide._getSheetNumber() + ","+slide.getSlideNumber()+",Slide " + slide.getSlideNumber();
         setAddress(href);;
         setTitle("Slide " + slide.getSlideNumber());
-        setType(Hyperlink.LINK_SLIDENUMBER);
+        setType(HSLFHyperlink.LINK_SLIDENUMBER);
     }
 
     public void setAddress(String str) {
@@ -146,28 +141,36 @@
     }
 
     /**
-     * Find hyperlinks in a text run
+     * Find hyperlinks in a text shape
      *
-     * @param run  <code>TextRun</code> to lookup hyperlinks in
+     * @param shape  <code>TextRun</code> to lookup hyperlinks in
      * @return found hyperlinks or <code>null</code> if not found
      */
-    protected static Hyperlink[] find(TextRun run){
-        List<Hyperlink> lst = new ArrayList<Hyperlink>();
-        SlideShow ppt = run.getSheet().getSlideShow();
+    public static List<HSLFHyperlink> find(HSLFTextShape shape){
+        return find(shape.getTextParagraphs());
+    }
+
+    /**
+     * Find hyperlinks in a text paragraph
+     *
+     * @param paragraphs  List of <code>TextParagraph</code> to lookup hyperlinks
+     * @return found hyperlinks
+     */
+    public static List<HSLFHyperlink> find(List<HSLFTextParagraph> paragraphs){
+        List<HSLFHyperlink> lst = new ArrayList<HSLFHyperlink>();
+        if (paragraphs == null || paragraphs.isEmpty()) return lst;
+
+        HSLFTextParagraph firstPara = paragraphs.get(0);
+        
+        HSLFSlideShow ppt = firstPara.getSheet().getSlideShow();
         //document-level container which stores info about all links in a presentation
         ExObjList exobj = ppt.getDocumentRecord().getExObjList();
-        if (exobj == null) {
-            return null;
-        }
-        Record[] records = run._records;
-        if(records != null) find(records, exobj, lst);
+        if (exobj == null) return lst;
+        
+        Record[] records = firstPara.getRecords();
+        find(records, exobj, lst);
 
-        Hyperlink[] links = null;
-        if (lst.size() > 0){
-            links = new Hyperlink[lst.size()];
-            lst.toArray(links);
-        }
-        return links;
+        return lst;
     }
 
     /**
@@ -176,9 +179,9 @@
      * @param shape  <code>Shape</code> to lookup hyperlink in
      * @return found hyperlink or <code>null</code>
      */
-    protected static Hyperlink find(Shape shape){
-        List<Hyperlink> lst = new ArrayList<Hyperlink>();
-        SlideShow ppt = shape.getSheet().getSlideShow();
+    public static HSLFHyperlink find(HSLFShape shape){
+        List<HSLFHyperlink> lst = new ArrayList<HSLFHyperlink>();
+        HSLFSlideShow ppt = shape.getSheet().getSlideShow();
         //document-level container which stores info about all links in a presentation
         ExObjList exobj = ppt.getDocumentRecord().getExObjList();
         if (exobj == null) {
@@ -191,34 +194,35 @@
             if (obj.getRecordId() ==  EscherClientDataRecord.RECORD_ID){
                 byte[] data = obj.serialize();
                 Record[] records = Record.findChildRecords(data, 8, data.length-8);
-                if(records != null) find(records, exobj, lst);
+                find(records, exobj, lst);
             }
         }
 
-        return lst.size() == 1 ? lst.get(0) : null;
+        return lst.size() == 1 ? (HSLFHyperlink)lst.get(0) : null;
     }
 
-    private static void find(Record[] records, ExObjList exobj, List<Hyperlink> out){
+    private static void find(Record[] records, ExObjList exobj, List<HSLFHyperlink> out){
+        if (records == null) return;
         for (int i = 0; i < records.length; i++) {
             //see if we have InteractiveInfo in the textrun's records
-            if( records[i] instanceof InteractiveInfo){
-                InteractiveInfo hldr = (InteractiveInfo)records[i];
-                InteractiveInfoAtom info = hldr.getInteractiveInfoAtom();
-                int id = info.getHyperlinkID();
-                ExHyperlink linkRecord = exobj.get(id);
-                if (linkRecord != null){
-                    Hyperlink link = new Hyperlink();
-                    link.title = linkRecord.getLinkTitle();
-                    link.address = linkRecord.getLinkURL();
-                    link.type = info.getAction();
+            if(!(records[i] instanceof InteractiveInfo)) continue;
+            
+            InteractiveInfo hldr = (InteractiveInfo)records[i];
+            InteractiveInfoAtom info = hldr.getInteractiveInfoAtom();
+            int id = info.getHyperlinkID();
+            ExHyperlink linkRecord = exobj.get(id);
+            if (linkRecord == null) continue;
+            
+            HSLFHyperlink link = new HSLFHyperlink();
+            link.title = linkRecord.getLinkTitle();
+            link.address = linkRecord.getLinkURL();
+            link.type = info.getAction();
+            out.add(link);
 
-                    if (++i < records.length && records[i] instanceof TxInteractiveInfoAtom){
-                        TxInteractiveInfoAtom txinfo = (TxInteractiveInfoAtom)records[i];
-                        link.startIndex = txinfo.getStartIndex();
-                        link.endIndex = txinfo.getEndIndex();
-                    }
-                    out.add(link);
-                }
+            if (i+1 < records.length && records[i+1] instanceof TxInteractiveInfoAtom){
+                TxInteractiveInfoAtom txinfo = (TxInteractiveInfoAtom)records[++i];
+                link.startIndex = txinfo.getStartIndex();
+                link.endIndex = txinfo.getEndIndex();
             }
         }
     }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFMasterSheet.java
similarity index 80%
rename from src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFMasterSheet.java
index c3cfaba..974a858 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/MasterSheet.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFMasterSheet.java
@@ -15,10 +15,11 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
 import org.apache.poi.hslf.record.SheetContainer;
 import org.apache.poi.hslf.model.textproperties.TextProp;
+import org.apache.poi.sl.usermodel.MasterSheet;
 
 /**
  * The superclass of all master sheets - Slide masters, Notes masters, etc.
@@ -27,8 +28,8 @@
  *
  * @author Yegor Kozlov
  */
-public abstract class MasterSheet extends Sheet {
-    public MasterSheet(SheetContainer container, int sheetNo){
+public abstract class HSLFMasterSheet extends HSLFSheet implements MasterSheet<HSLFShape,HSLFSlideShow> {
+    public HSLFMasterSheet(SheetContainer container, int sheetNo){
         super(container, sheetNo);
     }
 
@@ -46,10 +47,10 @@
      *
      * @return true if the shape is a placeholder
      */
-    public static boolean isPlaceholder(Shape shape){
-        if(!(shape instanceof TextShape)) return false;
+    public static boolean isPlaceholder(HSLFShape shape){
+        if(!(shape instanceof HSLFTextShape)) return false;
 
-        TextShape tx = (TextShape)shape;
+        HSLFTextShape tx = (HSLFTextShape)shape;
         return tx.getPlaceholderAtom() != null;
     }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFNotes.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFNotes.java
new file mode 100644
index 0000000..7f47eaf
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFNotes.java
@@ -0,0 +1,82 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.sl.usermodel.Notes;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
+/**
+ * This class represents a slide's notes in a PowerPoint Document. It
+ *  allows access to the text within, and the layout. For now, it only
+ *  does the text side of things though
+ *
+ * @author Nick Burch
+ */
+
+public final class HSLFNotes extends HSLFSheet implements Notes<HSLFShape, HSLFSlideShow> {
+    protected static POILogger logger = POILogFactory.getLogger(HSLFNotes.class);
+    
+    private List<List<HSLFTextParagraph>> _paragraphs = new ArrayList<List<HSLFTextParagraph>>();
+
+    /**
+     * Constructs a Notes Sheet from the given Notes record.
+     * Initialises TextRuns, to provide easier access to the text
+     * 
+     * @param notes the Notes record to read from
+     */
+    public HSLFNotes(org.apache.poi.hslf.record.Notes notes) {
+        super(notes, notes.getNotesAtom().getSlideID());
+
+        // Now, build up TextRuns from pairs of TextHeaderAtom and
+        // one of TextBytesAtom or TextCharsAtom, found inside
+        // EscherTextboxWrapper's in the PPDrawing
+        for (List<HSLFTextParagraph> l : HSLFTextParagraph.findTextParagraphs(getPPDrawing(), this)) {
+            if (!_paragraphs.contains(l)) _paragraphs.add(l);
+        }
+        
+        if (_paragraphs.isEmpty()) {
+            logger.log(POILogger.WARN, "No text records found for notes sheet");
+        }
+
+        // Set the sheet on each TextRun
+        for (List<HSLFTextParagraph> ltp : _paragraphs) {
+            for (HSLFTextParagraph tp : ltp) {
+                tp.supplySheet(this);
+            }
+        }
+    }
+
+    /**
+     * Returns an array of all the TextParagraphs found
+     */
+    @Override
+    public List<List<HSLFTextParagraph>> getTextParagraphs() {
+        return _paragraphs;
+    }
+
+    /**
+     * Return <code>null</code> - Notes Masters are not yet supported
+     */
+    public HSLFMasterSheet getMasterSheet() {
+        return null;
+    }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/ObjectData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFObjectData.java
similarity index 96%
rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/ObjectData.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFObjectData.java
index bbef87a..f02ddbe 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/ObjectData.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFObjectData.java
@@ -26,7 +26,7 @@
  *
  * @author Daniel Noll
  */
-public class ObjectData {
+public class HSLFObjectData {
     /**
      * The record that contains the object data.
      */
@@ -37,7 +37,7 @@
      *
      * @param storage the record that contains the object data.
      */
-    public ObjectData(ExOleObjStg storage) {
+    public HSLFObjectData(ExOleObjStg storage) {
         this.storage = storage;
     }
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java
similarity index 74%
rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java
index 3fa900c..aa7e8a3 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureData.java
@@ -17,32 +17,22 @@
 
 package org.apache.poi.hslf.usermodel;
 
-import java.awt.Graphics2D;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.security.MessageDigest;
 
-import org.apache.poi.hslf.blip.BitmapPainter;
-import org.apache.poi.hslf.blip.DIB;
-import org.apache.poi.hslf.blip.EMF;
-import org.apache.poi.hslf.blip.ImagePainter;
-import org.apache.poi.hslf.blip.JPEG;
-import org.apache.poi.hslf.blip.PICT;
-import org.apache.poi.hslf.blip.PNG;
-import org.apache.poi.hslf.blip.WMF;
-import org.apache.poi.hslf.model.Picture;
+import org.apache.poi.hslf.blip.*;
 import org.apache.poi.poifs.crypt.CryptoFunctions;
 import org.apache.poi.poifs.crypt.HashAlgorithm;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
+import org.apache.poi.sl.usermodel.PictureData;
+import org.apache.poi.util.*;
 
 /**
  * A class that represents image data contained in a slide show.
  *
  *  @author Yegor Kozlov
  */
-public abstract class PictureData {
+public abstract class HSLFPictureData implements PictureData {
 
     protected POILogger logger = POILogFactory.getLogger(this.getClass());
 
@@ -55,12 +45,11 @@
     * Binary data of the picture
     */
     private byte[] rawdata;
-    
     /**
      * The offset to the picture in the stream
      */
     protected int offset;
-    
+
     /**
      * The instance type/signatures defines if one or two UID instances will be included
      */
@@ -74,6 +63,14 @@
      */
     public abstract int getType();
 
+
+    /**
+     * Returns content type (mime type) of this picture.
+     *
+     * @return content type of this picture.
+     */
+    public abstract String getContentType();
+    
     /**
      * Returns the binary data of this Picture
      * @return picture data
@@ -88,8 +85,8 @@
     /**
      * Blip signature.
      */
-    public abstract int getSignature();
-    
+    protected abstract int getSignature();
+
     public abstract void setSignature(int signature);
 
     /**
@@ -98,13 +95,6 @@
     protected int getUIDInstanceCount() {
         return uidInstanceCount;
     }
-    
-    protected static final ImagePainter[] painters = new ImagePainter[8];
-    static {
-        PictureData.setImagePainter(Picture.PNG, new BitmapPainter());
-        PictureData.setImagePainter(Picture.JPEG, new BitmapPainter());
-        PictureData.setImagePainter(Picture.DIB, new BitmapPainter());
-    }
 
     /**
      * Returns the raw binary data of this Picture excluding the first 8 bytes
@@ -188,25 +178,25 @@
      * Must be one of the static constants defined in the <code>Picture<code> class.
      * @return concrete instance of <code>PictureData</code>
      */
-     public static PictureData create(int type){
-        PictureData pict;
+     public static HSLFPictureData create(int type){
+        HSLFPictureData pict;
         switch (type){
-            case Picture.EMF:
+            case HSLFPictureShape.EMF:
                 pict = new EMF();
                 break;
-            case Picture.WMF:
+            case HSLFPictureShape.WMF:
                 pict = new WMF();
                 break;
-            case Picture.PICT:
+            case HSLFPictureShape.PICT:
                 pict = new PICT();
                 break;
-            case Picture.JPEG:
+            case HSLFPictureShape.JPEG:
                 pict = new JPEG();
                 break;
-            case Picture.PNG:
+            case HSLFPictureShape.PNG:
                 pict = new PNG();
                 break;
-            case Picture.DIB:
+            case HSLFPictureShape.DIB:
                 pict = new DIB();
                 break;
             default:
@@ -241,31 +231,4 @@
     public int getSize(){
         return getData().length;
     }
-
-    public void draw(Graphics2D graphics, Picture parent){
-        ImagePainter painter = painters[getType()];
-        if(painter != null) painter.paint(graphics, this, parent);
-        else logger.log(POILogger.WARN, "Rendering is not supported: " + getClass().getName());
-    }
-
-    /**
-     * Register ImagePainter for the specified image type
-     *
-     * @param type  image type, must be one of the static constants defined in the <code>Picture<code> class.
-     * @param painter
-     */
-    public static void setImagePainter(int type, ImagePainter painter){
-        painters[type] = painter;
-    }
-
-    /**
-     * Return ImagePainter for the specified image type
-     *
-     * @param type blip type, must be one of the static constants defined in the <code>Picture<code> class.
-     * @return ImagePainter for the specified image type
-     */
-    public static ImagePainter getImagePainter(int type){
-        return painters[type];
-    }
-
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java
similarity index 80%
rename from src/scratchpad/src/org/apache/poi/hslf/model/Picture.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java
index eda9d25..03a9861 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java
@@ -15,11 +15,9 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
-import java.awt.Graphics2D;
 import java.awt.Insets;
-import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -27,21 +25,11 @@
 
 import javax.imageio.ImageIO;
 
-import org.apache.poi.ddf.EscherBSERecord;
-import org.apache.poi.ddf.EscherComplexProperty;
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherOptRecord;
-import org.apache.poi.ddf.EscherProperties;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.ddf.EscherSimpleProperty;
-import org.apache.poi.ddf.EscherSpRecord;
+import org.apache.poi.ddf.*;
 import org.apache.poi.hslf.blip.Bitmap;
 import org.apache.poi.hslf.record.Document;
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.Units;
+import org.apache.poi.sl.usermodel.*;
+import org.apache.poi.util.*;
 
 
 /**
@@ -49,7 +37,7 @@
  *
  * @author Yegor Kozlov
  */
-public class Picture extends SimpleShape {
+public class HSLFPictureShape extends HSLFSimpleShape implements PictureShape {
 
     /**
     *  Windows Enhanced Metafile (EMF)
@@ -86,7 +74,7 @@
      *
     * @param idx the index of the picture
      */
-    public Picture(int idx){
+    public HSLFPictureShape(int idx){
         this(idx, null);
     }
 
@@ -96,9 +84,9 @@
      * @param idx the index of the picture
      * @param parent the parent shape
      */
-    public Picture(int idx, Shape parent) {
+    public HSLFPictureShape(int idx, ShapeContainer<HSLFShape> parent) {
         super(null, parent);
-        _escherContainer = createSpContainer(idx, parent instanceof ShapeGroup);
+        _escherContainer = createSpContainer(idx, parent instanceof HSLFGroupShape);
     }
 
     /**
@@ -108,7 +96,7 @@
       *        this picture in the <code>Slide</code>
       * @param parent the parent shape of this picture
       */
-     protected Picture(EscherContainerRecord escherRecord, Shape parent){
+     protected HSLFPictureShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
@@ -136,7 +124,7 @@
         _escherContainer.setOptions((short)15);
 
         EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
-        spRecord.setOptions((short)((ShapeTypes.PictureFrame << 4) | 0x2));
+        spRecord.setOptions((short)((ShapeType.FRAME.nativeId << 4) | 0x2));
 
         //set default properties for a picture
         EscherOptRecord opt = getEscherOptRecord();
@@ -154,7 +142,7 @@
      * for other types sets the default size of 200x200 pixels.
      */
     public void setDefaultSize(){
-        PictureData pict = getPictureData();
+        HSLFPictureData pict = getPictureData();
         if (pict  instanceof Bitmap){
             BufferedImage img = null;
             try {
@@ -176,14 +164,10 @@
         }
     }
 
-    /**
-     * Returns the picture data for this picture.
-     *
-     * @return the picture data for this picture.
-     */
-    public PictureData getPictureData(){
-        SlideShow ppt = getSheet().getSlideShow();
-        PictureData[] pict = ppt.getPictureData();
+    @Override
+    public HSLFPictureData getPictureData(){
+        HSLFSlideShow ppt = getSheet().getSlideShow();
+        HSLFPictureData[] pict = ppt.getPictureData();
 
         EscherBSERecord bse = getEscherBSERecord();
         if (bse == null){
@@ -200,10 +184,10 @@
     }
 
     protected EscherBSERecord getEscherBSERecord(){
-        SlideShow ppt = getSheet().getSlideShow();
+        HSLFSlideShow ppt = getSheet().getSlideShow();
         Document doc = ppt.getDocumentRecord();
         EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
-        EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
+        EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
         if(bstore == null) {
             logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found ");
             return null;
@@ -245,7 +229,7 @@
     /**
      * By default set the orininal image size
      */
-    protected void afterInsert(Sheet sh){
+    protected void afterInsert(HSLFSheet sh){
         super.afterInsert(sh);
 
         EscherBSERecord bse = getEscherBSERecord();
@@ -257,24 +241,12 @@
         }
     }
 
-    public void draw(Graphics2D graphics){
-        AffineTransform at = graphics.getTransform();
-        ShapePainter.paint(this, graphics);
-
-        PictureData data = getPictureData();
-        if(data != null) data.draw(graphics, this);
-
-        graphics.setTransform(at);
-    }
-
     /**
-     * Returns the clipping values as percent ratio relatively to the image size.
      * The anchor specified by {@link #getLogicalAnchor2D()} is the displayed size,
      * i.e. the size of the already clipped image
-     * 
-     * @return the clipping as insets converted/scaled to 100000 (=100%) 
      */
-    public Insets getBlipClip() {
+    @Override
+    public Insets getClipping() {
         EscherOptRecord opt = getEscherOptRecord();
         
         double top    = getFractProp(opt, EscherProperties.BLIP__CROPFROMTOP);
@@ -295,6 +267,6 @@
         EscherSimpleProperty prop = getEscherProperty(opt, propertyId);
         if (prop == null) return 0;
         int fixedPoint = prop.getPropertyValue();
-        return Units.fixedPointToDecimal(fixedPoint);
+        return Units.fixedPointToDouble(fixedPoint);
     }
 }
\ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java
similarity index 75%
rename from src/scratchpad/src/org/apache/poi/hslf/model/Shape.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java
index 4a13661..2ecb7ef 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Shape.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShape.java
@@ -15,17 +15,18 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import java.util.Iterator;
 
 import org.apache.poi.ddf.*;
 import org.apache.poi.hslf.record.ColorSchemeAtom;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.Units;
-
-import java.util.*;
-import java.awt.*;
-import java.awt.geom.Rectangle2D;
+import org.apache.poi.hslf.record.RecordTypes;
+import org.apache.poi.sl.usermodel.*;
+import org.apache.poi.util.*;
 
 /**
  *  <p>
@@ -43,7 +44,7 @@
   *
   * @author Yegor Kozlov
  */
-public abstract class Shape {
+public abstract class HSLFShape implements Shape {
 
     // For logging
     protected POILogger logger = POILogFactory.getLogger(this.getClass());
@@ -83,17 +84,17 @@
      * Parent of this shape.
      * <code>null</code> for the topmost shapes.
      */
-    protected Shape _parent;
+    protected ShapeContainer<HSLFShape> _parent;
 
     /**
      * The <code>Sheet</code> this shape belongs to
      */
-    protected Sheet _sheet;
+    protected HSLFSheet _sheet;
 
     /**
      * Fill
      */
-    protected Fill _fill;
+    protected HSLFFill _fill;
 
     /**
      * Create a Shape object. This constructor is used when an existing Shape is read from from a PowerPoint document.
@@ -101,7 +102,7 @@
      * @param escherRecord       <code>EscherSpContainer</code> container which holds information about this shape
      * @param parent             the parent of this Shape
      */
-      protected Shape(EscherContainerRecord escherRecord, Shape parent){
+      protected HSLFShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         _escherContainer = escherRecord;
         _parent = parent;
      }
@@ -114,7 +115,7 @@
     /**
      *  @return the parent of this shape
      */
-    public Shape getParent(){
+    public ShapeContainer<HSLFShape> getParent(){
         return _parent;
     }
 
@@ -122,25 +123,25 @@
      * @return name of the shape.
      */
     public String getShapeName(){
-        return ShapeTypes.typeName(getShapeType());
+        return getShapeType().nativeName;
     }
 
     /**
      * @return type of the shape.
      * @see org.apache.poi.hslf.record.RecordTypes
      */
-    public int getShapeType(){
+    public ShapeType getShapeType(){
         EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
-        return spRecord.getShapeType();
+        return ShapeType.forId(spRecord.getShapeType(), false);
     }
 
     /**
      * @param type type of the shape.
      * @see org.apache.poi.hslf.record.RecordTypes
      */
-    public void setShapeType(int type){
+    public void setShapeType(ShapeType type){
         EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
-        spRecord.setShapeType( (short) type );
+        spRecord.setShapeType( (short) type.nativeId );
         spRecord.setVersion( (short) 0x2 );
     }
 
@@ -164,44 +165,34 @@
     public Rectangle2D getAnchor2D(){
         EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
         int flags = spRecord.getFlags();
-        Rectangle2D anchor=null;
-        if ((flags & EscherSpRecord.FLAG_CHILD) != 0){
-            EscherChildAnchorRecord rec = getEscherChild(EscherChildAnchorRecord.RECORD_ID);
-            anchor = new java.awt.Rectangle();
-            if(rec == null){
+        int x,y,w,h;
+        EscherChildAnchorRecord childRec = getEscherChild(EscherChildAnchorRecord.RECORD_ID);
+        boolean useChildRec = ((flags & EscherSpRecord.FLAG_CHILD) != 0);
+        if (useChildRec && childRec != null){
+            x = childRec.getDx1();
+            y = childRec.getDy1();
+            w = childRec.getDx2()-childRec.getDx1();
+            h = childRec.getDy2()-childRec.getDy1();
+        } else {
+            if (useChildRec) {
                 logger.log(POILogger.WARN, "EscherSpRecord.FLAG_CHILD is set but EscherChildAnchorRecord was not found");
-                EscherClientAnchorRecord clrec = getEscherChild(EscherClientAnchorRecord.RECORD_ID);
-                anchor = new java.awt.Rectangle();
-                anchor = new Rectangle2D.Float(
-                    (float)clrec.getCol1()*POINT_DPI/MASTER_DPI,
-                    (float)clrec.getFlag()*POINT_DPI/MASTER_DPI,
-                    (float)(clrec.getDx1()-clrec.getCol1())*POINT_DPI/MASTER_DPI,
-                    (float)(clrec.getRow1()-clrec.getFlag())*POINT_DPI/MASTER_DPI
-                );
-            } else {
-                anchor = new Rectangle2D.Float(
-                    (float)rec.getDx1()*POINT_DPI/MASTER_DPI,
-                    (float)rec.getDy1()*POINT_DPI/MASTER_DPI,
-                    (float)(rec.getDx2()-rec.getDx1())*POINT_DPI/MASTER_DPI,
-                    (float)(rec.getDy2()-rec.getDy1())*POINT_DPI/MASTER_DPI
-                );
             }
+            EscherClientAnchorRecord clientRec = getEscherChild(EscherClientAnchorRecord.RECORD_ID);
+            x = clientRec.getFlag();
+            y = clientRec.getCol1();
+            w = clientRec.getDx1()-clientRec.getFlag();
+            h = clientRec.getRow1()-clientRec.getCol1();
         }
-        else {
-            EscherClientAnchorRecord rec = getEscherChild(EscherClientAnchorRecord.RECORD_ID);
-            anchor = new java.awt.Rectangle();
-            anchor = new Rectangle2D.Float(
-                (float)rec.getCol1()*POINT_DPI/MASTER_DPI,
-                (float)rec.getFlag()*POINT_DPI/MASTER_DPI,
-                (float)(rec.getDx1()-rec.getCol1())*POINT_DPI/MASTER_DPI,
-                (float)(rec.getRow1()-rec.getFlag())*POINT_DPI/MASTER_DPI
-            );
-        }
-        return anchor;
-    }
 
-    public Rectangle2D getLogicalAnchor2D(){
-        return getAnchor2D();
+        // TODO: find out where this -1 value comes from at #57820 (link to ms docs?)
+        Rectangle2D anchor = new Rectangle2D.Float(
+            (float)(x == -1 ? -1 : Units.masterToPoints(x)),
+            (float)(y == -1 ? -1 : Units.masterToPoints(y)),
+            (float)(w == -1 ? -1 : Units.masterToPoints(w)),
+            (float)(h == -1 ? -1 : Units.masterToPoints(h))
+        );
+        
+        return anchor;
     }
 
     /**
@@ -211,21 +202,24 @@
      * @param anchor new anchor
      */
     public void setAnchor(Rectangle2D anchor){
+        int x = Units.pointsToMaster(anchor.getX());
+        int y = Units.pointsToMaster(anchor.getY());
+        int w = Units.pointsToMaster(anchor.getWidth() + anchor.getX());
+        int h = Units.pointsToMaster(anchor.getHeight() + anchor.getY());
         EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
         int flags = spRecord.getFlags();
         if ((flags & EscherSpRecord.FLAG_CHILD) != 0){
             EscherChildAnchorRecord rec = (EscherChildAnchorRecord)getEscherChild(EscherChildAnchorRecord.RECORD_ID);
-            rec.setDx1((int)(anchor.getX()*MASTER_DPI/POINT_DPI));
-            rec.setDy1((int)(anchor.getY()*MASTER_DPI/POINT_DPI));
-            rec.setDx2((int)((anchor.getWidth() + anchor.getX())*MASTER_DPI/POINT_DPI));
-            rec.setDy2((int)((anchor.getHeight() + anchor.getY())*MASTER_DPI/POINT_DPI));
-        }
-        else {
+            rec.setDx1(x);
+            rec.setDy1(y);
+            rec.setDx2(w);
+            rec.setDy2(h);
+        } else {
             EscherClientAnchorRecord rec = (EscherClientAnchorRecord)getEscherChild(EscherClientAnchorRecord.RECORD_ID);
-            rec.setFlag((short)(anchor.getY()*MASTER_DPI/POINT_DPI));
-            rec.setCol1((short)(anchor.getX()*MASTER_DPI/POINT_DPI));
-            rec.setDx1((short)(((anchor.getWidth() + anchor.getX())*MASTER_DPI/POINT_DPI)));
-            rec.setRow1((short)(((anchor.getHeight() + anchor.getY())*MASTER_DPI/POINT_DPI)));
+            rec.setFlag((short)x);
+            rec.setCol1((short)y);
+            rec.setDx1((short)w);
+            rec.setRow1((short)h);
         }
 
     }
@@ -261,8 +255,9 @@
      * @return escher property or <code>null</code> if not found.
      */
      public static <T extends EscherProperty> T getEscherProperty(EscherOptRecord opt, int propId){
-        return opt.lookup(propId);
-    }
+         if (opt == null) return null;
+         return opt.lookup(propId);
+     }
 
     /**
      * Set an escher property for this shape.
@@ -334,7 +329,7 @@
      *
      * @param sh - owning shape
      */
-    protected void afterInsert(Sheet sh){
+    protected void afterInsert(HSLFSheet sh){
         if(_fill != null) {
             _fill.afterInsert(sh);
         }
@@ -343,7 +338,7 @@
     /**
      *  @return the <code>SlideShow</code> this shape belongs to
      */
-    public Sheet getSheet(){
+    public HSLFSheet getSheet(){
         return _sheet;
     }
 
@@ -352,7 +347,7 @@
      *
      * @param sheet owner of this shape
      */
-    public void setSheet(Sheet sheet){
+    public void setSheet(HSLFSheet sheet){
         _sheet = sheet;
     }
 
@@ -373,7 +368,7 @@
         
         int rgb[] = ecr.getRGB();
 
-        Sheet sheet = getSheet();
+        HSLFSheet sheet = getSheet();
         if (fSchemeIndex && sheet != null) {
             //red is the index to the color scheme
             ColorSchemeAtom ca = sheet.getColorScheme();
@@ -392,13 +387,18 @@
             //TODO
         }
 
+        double alpha = getAlpha(opacityProperty);
+        return new Color(rgb[0], rgb[1], rgb[2], (int)(alpha*255.0));
+    }
+
+    double getAlpha(short opacityProperty) {
+        EscherOptRecord opt = getEscherOptRecord();
         EscherSimpleProperty op = getEscherProperty(opt, opacityProperty);
         int defaultOpacity = 0x00010000;
         int opacity = (op == null) ? defaultOpacity : op.getPropertyValue();
-        double alpha = Units.fixedPointToDecimal(opacity)*255.0;
-        return new Color(rgb[0], rgb[1], rgb[2], (int)alpha);
+        return Units.fixedPointToDouble(opacity);
     }
-
+    
     Color toRGB(int val){
         int a = (val >> 24) & 0xFF;
         int b = (val >> 16) & 0xFF;
@@ -444,11 +444,16 @@
      *
      * @return fill properties of this shape
      */
-    public Fill getFill(){
-        if(_fill == null) _fill = new Fill(this);
+    public HSLFFill getFill(){
+        if(_fill == null) {
+            _fill = new HSLFFill(this);
+        }
         return _fill;
     }
 
+    public FillStyle getFillStyle() {
+        return getFill().getFillStyle();
+    }
 
     /**
      * Returns the hyperlink assigned to this shape
@@ -456,65 +461,55 @@
      * @return the hyperlink assigned to this shape
      * or <code>null</code> if not found.
      */
-     public Hyperlink getHyperlink(){
-        return Hyperlink.find(this);
+    public HSLFHyperlink getHyperlink(){
+        return HSLFHyperlink.find(this);
     }
 
     public void draw(Graphics2D graphics){
         logger.log(POILogger.INFO, "Rendering " + getShapeName());
     }
 
-    /**
-     * Return shape outline as a java.awt.Shape object
-     *
-     * @return the shape outline
-     */
-    public java.awt.Shape getOutline(){
-        return getLogicalAnchor2D();
-    }
-    
     public EscherOptRecord getEscherOptRecord() {
-        return getEscherChild(EscherOptRecord.RECORD_ID);
+        EscherOptRecord opt = getEscherChild(EscherOptRecord.RECORD_ID);
+        if (opt == null) {
+            opt = getEscherChild(RecordTypes.EscherUserDefined);
+        }
+        return opt;
     }
     
-    /**
-     * Whether the shape is horizontally flipped
-     *
-     * @return whether the shape is horizontally flipped
-     */
-     public boolean getFlipHorizontal(){
+    public boolean getFlipHorizontal(){
         EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
         return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPHORIZ) != 0;
     }
+     
+    public void setFlipHorizontal(boolean flip) {
+        EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
+        int flag = spRecord.getFlags() | EscherSpRecord.FLAG_FLIPHORIZ;
+        spRecord.setFlags(flag);
+    }
 
-    /**
-     * Whether the shape is vertically flipped
-     *
-     * @return whether the shape is vertically flipped
-     */
     public boolean getFlipVertical(){
         EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
         return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPVERT) != 0;
     }
-
-    /**
-     * Rotation angle in degrees
-     *
-     * @return rotation angle in degrees
-     */
-    public int getRotation(){
-        int rot = getEscherProperty(EscherProperties.TRANSFORM__ROTATION);
-        int angle = (rot >> 16) % 360;
-
-        return angle;
+    
+    public void setFlipVertical(boolean flip) {
+        EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
+        int flag = spRecord.getFlags() | EscherSpRecord.FLAG_FLIPVERT;
+        spRecord.setFlags(flag);
     }
 
-    /**
-     * Rotate this shape
-     *
-     * @param theta the rotation angle in degrees
-     */
-    public void setRotation(int theta){
-        setEscherProperty(EscherProperties.TRANSFORM__ROTATION, (theta << 16));
+    public double getRotation(){
+        int rot = getEscherProperty(EscherProperties.TRANSFORM__ROTATION);
+        return Units.fixedPointToDouble(rot);
+    }
+    
+    public void setRotation(double theta){
+        int rot = Units.doubleToFixedPoint(theta % 360.0);
+        setEscherProperty(EscherProperties.TRANSFORM__ROTATION, rot);
+    }
+
+    public boolean isPlaceholder() {
+        return false;
     }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java
similarity index 64%
rename from src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java
index c3843c2..5948b40 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/ShapeFactory.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java
@@ -15,25 +15,16 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.poi.ddf.EscherClientDataRecord;
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherOptRecord;
-import org.apache.poi.ddf.EscherProperties;
-import org.apache.poi.ddf.EscherProperty;
-import org.apache.poi.ddf.EscherPropertyFactory;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.ddf.EscherSimpleProperty;
-import org.apache.poi.ddf.EscherSpRecord;
-import org.apache.poi.hslf.record.InteractiveInfo;
-import org.apache.poi.hslf.record.InteractiveInfoAtom;
-import org.apache.poi.hslf.record.OEShapeAtom;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordTypes;
+import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.model.*;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.sl.usermodel.ShapeContainer;
+import org.apache.poi.sl.usermodel.ShapeType;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 
@@ -42,55 +33,55 @@
  *
  * @author Yegor Kozlov
  */
-public final class ShapeFactory {
+public final class HSLFShapeFactory {
     // For logging
-    protected static final POILogger logger = POILogFactory.getLogger(ShapeFactory.class);
+    protected static final POILogger logger = POILogFactory.getLogger(HSLFShapeFactory.class);
 
     /**
      * Create a new shape from the data provided.
      */
-    public static Shape createShape(EscherContainerRecord spContainer, Shape parent){
+    public static HSLFShape createShape(EscherContainerRecord spContainer, ShapeContainer<HSLFShape> parent){
         if (spContainer.getRecordId() == EscherContainerRecord.SPGR_CONTAINER){
             return createShapeGroup(spContainer, parent);
         }
-        return createSimpeShape(spContainer, parent);
+        return createSimpleShape(spContainer, parent);
     }
 
-    public static ShapeGroup createShapeGroup(EscherContainerRecord spContainer, Shape parent){
-        ShapeGroup group = null;
-        EscherRecord opt = Shape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122);
+    public static HSLFGroupShape createShapeGroup(EscherContainerRecord spContainer, ShapeContainer<HSLFShape> parent){
+        HSLFGroupShape group = null;
+        EscherRecord opt = HSLFShape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122);
         if(opt != null){
             try {
                 EscherPropertyFactory f = new EscherPropertyFactory();
                 List<EscherProperty> props = f.createProperties( opt.serialize(), 8, opt.getInstance() );
                 EscherSimpleProperty p = (EscherSimpleProperty)props.get(0);
                 if(p.getPropertyNumber() == 0x39F && p.getPropertyValue() == 1){
-                    group = new Table(spContainer, parent);
+                    group = new HSLFTable(spContainer, parent);
                 } else {
-                    group = new ShapeGroup(spContainer, parent);
+                    group = new HSLFGroupShape(spContainer, parent);
                 }
             } catch (Exception e){
                 logger.log(POILogger.WARN, e.getMessage());
-                group = new ShapeGroup(spContainer, parent);
+                group = new HSLFGroupShape(spContainer, parent);
             }
         }  else {
-            group = new ShapeGroup(spContainer, parent);
+            group = new HSLFGroupShape(spContainer, parent);
         }
 
         return group;
      }
 
-    public static Shape createSimpeShape(EscherContainerRecord spContainer, Shape parent){
-        Shape shape = null;
+    public static HSLFShape createSimpleShape(EscherContainerRecord spContainer, ShapeContainer<HSLFShape> parent){
+        HSLFShape shape = null;
         EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID);
 
-        int type = spRecord.getShapeType();
+        ShapeType type = ShapeType.forId(spRecord.getShapeType(), false);
         switch (type){
-            case ShapeTypes.TextBox:
-                shape = new TextBox(spContainer, parent);
+            case TEXT_BOX:
+                shape = new HSLFTextBox(spContainer, parent);
                 break;
-            case ShapeTypes.HostControl:
-            case ShapeTypes.PictureFrame: {
+            case HOST_CONTROL:
+            case FRAME: {
                 InteractiveInfo info = getClientDataRecord(spContainer, RecordTypes.InteractiveInfo.typeID);
                 OEShapeAtom oes = getClientDataRecord(spContainer, RecordTypes.OEShapeAtom.typeID);
                 if(info != null && info.getInteractiveInfoAtom() != null){
@@ -108,26 +99,25 @@
                     shape = new OLEShape(spContainer, parent);
                 }
 
-                if(shape == null) shape = new Picture(spContainer, parent);
+                if(shape == null) shape = new HSLFPictureShape(spContainer, parent);
                 break;
             }
-            case ShapeTypes.Line:
+            case LINE:
                 shape = new Line(spContainer, parent);
                 break;
-            case ShapeTypes.NotPrimitive: {
-                EscherOptRecord opt = Shape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID);
-                EscherProperty prop = Shape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES);
+            case NOT_PRIMITIVE: {
+                EscherOptRecord opt = HSLFShape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID);
+                EscherProperty prop = HSLFShape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES);
                 if(prop != null)
-                    shape = new Freeform(spContainer, parent);
+                    shape = new HSLFFreeformShape(spContainer, parent);
                 else {
-
-                    logger.log(POILogger.WARN, "Creating AutoShape for a NotPrimitive shape");
-                    shape = new AutoShape(spContainer, parent);
+                    logger.log(POILogger.INFO, "Creating AutoShape for a NotPrimitive shape");
+                    shape = new HSLFAutoShape(spContainer, parent);
                 }
                 break;
             }
             default:
-                shape = new AutoShape(spContainer, parent);
+                shape = new HSLFAutoShape(spContainer, parent);
                 break;
         }
         return shape;
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java
new file mode 100644
index 0000000..d0c594f
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java
@@ -0,0 +1,390 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import java.awt.Graphics2D;
+import java.util.*;
+
+import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.sl.draw.DrawFactory;
+import org.apache.poi.sl.draw.Drawable;
+import org.apache.poi.sl.usermodel.Sheet;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
+/**
+ * This class defines the common format of "Sheets" in a powerpoint
+ * document. Such sheets could be Slides, Notes, Master etc
+ *
+ * @author Nick Burch
+ * @author Yegor Kozlov
+ */
+
+public abstract class HSLFSheet implements Sheet<HSLFShape,HSLFSlideShow> {
+	private static POILogger logger = POILogFactory.getLogger(HSLFSheet.class);
+
+    /**
+     * The <code>SlideShow</code> we belong to
+     */
+    private HSLFSlideShow _slideShow;
+
+    /**
+     * Sheet background
+     */
+    private HSLFBackground _background;
+
+    /**
+     * Record container that holds sheet data.
+     * For slides it is org.apache.poi.hslf.record.Slide,
+     * for notes it is org.apache.poi.hslf.record.Notes,
+     * for slide masters it is org.apache.poi.hslf.record.SlideMaster, etc.
+     */
+    private SheetContainer _container;
+
+    private int _sheetNo;
+
+    public HSLFSheet(SheetContainer container, int sheetNo) {
+        _container = container;
+        _sheetNo = sheetNo;
+    }
+
+    /**
+     * Returns an array of all the TextRuns in the sheet.
+     */
+    public abstract List<List<HSLFTextParagraph>> getTextParagraphs();
+
+    /**
+     * Returns the (internal, RefID based) sheet number, as used
+     * to in PersistPtr stuff.
+     */
+    public int _getSheetRefId() {
+        return _container.getSheetId();
+    }
+
+    /**
+     * Returns the (internal, SlideIdentifier based) sheet number, as used
+     * to reference this sheet from other records.
+     */
+    public int _getSheetNumber() {
+        return _sheetNo;
+    }
+
+    /**
+     * Fetch the PPDrawing from the underlying record
+     */
+    public PPDrawing getPPDrawing() {
+        return _container.getPPDrawing();
+    }
+
+    /**
+     * Fetch the SlideShow we're attached to
+     */
+    public HSLFSlideShow getSlideShow() {
+        return _slideShow;
+    }
+
+    /**
+     * Return record container for this sheet
+     */
+    public SheetContainer getSheetContainer() {
+        return _container;
+    }
+
+    /**
+     * Set the SlideShow we're attached to.
+     * Also passes it on to our child RichTextRuns
+     */
+    public void setSlideShow(HSLFSlideShow ss) {
+        _slideShow = ss;
+        List<List<HSLFTextParagraph>> trs = getTextParagraphs();
+        if (trs == null) return;
+        for (List<HSLFTextParagraph> ltp : trs) {
+            for (HSLFTextParagraph tp : ltp) {
+                tp.supplySheet(this);
+            }
+        }
+    }
+
+
+    /**
+     * Returns all shapes contained in this Sheet
+     *
+     * @return all shapes contained in this Sheet (Slide or Notes)
+     */
+    @Override
+    public List<HSLFShape> getShapes() {
+        PPDrawing ppdrawing = getPPDrawing();
+
+        EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
+        EscherContainerRecord spgr = null;
+
+        for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
+            EscherRecord rec = it.next();
+            if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) {
+                spgr = (EscherContainerRecord) rec;
+                break;
+            }
+        }
+        if (spgr == null) {
+            throw new IllegalStateException("spgr not found");
+        }
+
+        List<HSLFShape> shapeList = new ArrayList<HSLFShape>();
+        Iterator<EscherRecord> it = spgr.getChildIterator();
+        if (it.hasNext()) {
+            // skip first item
+            it.next();
+        }
+        for (; it.hasNext();) {
+            EscherContainerRecord sp = (EscherContainerRecord) it.next();
+            HSLFShape sh = HSLFShapeFactory.createShape(sp, null);
+            sh.setSheet(this);
+            shapeList.add(sh);
+        }
+
+        return shapeList;
+    }
+
+    /**
+     * Add a new Shape to this Slide
+     *
+     * @param shape - the Shape to add
+     */
+    public void addShape(HSLFShape shape) {
+        PPDrawing ppdrawing = getPPDrawing();
+
+        EscherContainerRecord dgContainer = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
+        EscherContainerRecord spgr = (EscherContainerRecord) HSLFShape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER);
+        spgr.addChildRecord(shape.getSpContainer());
+
+        shape.setSheet(this);
+        shape.setShapeId(allocateShapeId());
+        shape.afterInsert(this);
+    }
+
+    /**
+     * Allocates new shape id for the new drawing group id.
+     *
+     * @return a new shape id.
+     */
+    public int allocateShapeId()
+    {
+        EscherDggRecord dgg = _slideShow.getDocumentRecord().getPPDrawingGroup().getEscherDggRecord();
+        EscherDgRecord dg = _container.getPPDrawing().getEscherDgRecord();
+
+        dgg.setNumShapesSaved( dgg.getNumShapesSaved() + 1 );
+
+        // Add to existing cluster if space available
+        for (int i = 0; i < dgg.getFileIdClusters().length; i++)
+        {
+            EscherDggRecord.FileIdCluster c = dgg.getFileIdClusters()[i];
+            if (c.getDrawingGroupId() == dg.getDrawingGroupId() && c.getNumShapeIdsUsed() != 1024)
+            {
+                int result = c.getNumShapeIdsUsed() + (1024 * (i+1));
+                c.incrementShapeId();
+                dg.setNumShapes( dg.getNumShapes() + 1 );
+                dg.setLastMSOSPID( result );
+                if (result >= dgg.getShapeIdMax())
+                    dgg.setShapeIdMax( result + 1 );
+                return result;
+            }
+        }
+
+        // Create new cluster
+        dgg.addCluster( dg.getDrawingGroupId(), 0, false );
+        dgg.getFileIdClusters()[dgg.getFileIdClusters().length-1].incrementShapeId();
+        dg.setNumShapes( dg.getNumShapes() + 1 );
+        int result = (1024 * dgg.getFileIdClusters().length);
+        dg.setLastMSOSPID( result );
+        if (result >= dgg.getShapeIdMax())
+            dgg.setShapeIdMax( result + 1 );
+        return result;
+    }
+
+    /**
+     * Removes the specified shape from this sheet.
+     *
+     * @param shape shape to be removed from this sheet, if present.
+     * @return <tt>true</tt> if the shape was deleted.
+     */
+    public boolean removeShape(HSLFShape shape) {
+        PPDrawing ppdrawing = getPPDrawing();
+
+        EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
+        EscherContainerRecord spgr = null;
+
+        for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
+            EscherRecord rec = it.next();
+            if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) {
+                spgr = (EscherContainerRecord) rec;
+                break;
+            }
+        }
+        if(spgr == null) {
+            return false;
+        }
+
+        List<EscherRecord> lst = spgr.getChildRecords();
+        boolean result = lst.remove(shape.getSpContainer());
+        spgr.setChildRecords(lst);
+        return result;
+    }
+
+    /**
+     * Called by SlideShow ater a new sheet is created
+     */
+    public void onCreate(){
+
+    }
+
+    /**
+     * Return the master sheet .
+     */
+    public abstract HSLFMasterSheet getMasterSheet();
+
+    /**
+     * Color scheme for this sheet.
+     */
+    public ColorSchemeAtom getColorScheme() {
+        return _container.getColorScheme();
+    }
+
+    /**
+     * Returns the background shape for this sheet.
+     *
+     * @return the background shape for this sheet.
+     */
+    public HSLFBackground getBackground() {
+        if (_background == null) {
+            PPDrawing ppdrawing = getPPDrawing();
+
+            EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
+            EscherContainerRecord spContainer = dg.getChildById(EscherContainerRecord.SP_CONTAINER);
+            _background = new HSLFBackground(spContainer, null);
+            _background.setSheet(this);
+        }
+        return _background;
+    }
+
+    @Override
+    public void draw(Graphics2D graphics) {
+        DrawFactory drawFact = DrawFactory.getInstance(graphics);
+        Drawable draw = drawFact.getDrawable(this);
+        draw.draw(graphics);
+    }
+
+    /**
+     * Subclasses should call this method and update the array of text runs
+     * when a text shape is added
+     *
+     * @param shape
+     */
+    protected void onAddTextShape(HSLFTextShape shape) {
+    }
+
+    /**
+     * Return placeholder by text type
+     *
+     * @param type  type of text, See {@link org.apache.poi.hslf.record.TextHeaderAtom}
+     * @return  <code>TextShape</code> or <code>null</code>
+     */
+    public HSLFTextShape getPlaceholderByTextType(int type){
+        for (HSLFShape shape : getShapes()) {
+            if(shape instanceof HSLFTextShape){
+                HSLFTextShape tx = (HSLFTextShape)shape;
+                if (tx != null && tx.getRunType() == type) {
+                    return tx;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Search text placeholer by its type
+     *
+     * @param type  type of placeholder to search. See {@link org.apache.poi.hslf.record.OEPlaceholderAtom}
+     * @return  <code>TextShape</code> or <code>null</code>
+     */
+    public HSLFTextShape getPlaceholder(int type){
+        for (HSLFShape shape : getShapes()) {
+            if(shape instanceof HSLFTextShape){
+                HSLFTextShape tx = (HSLFTextShape)shape;
+                int placeholderId = 0;
+                OEPlaceholderAtom oep = tx.getPlaceholderAtom();
+                if(oep != null) {
+                    placeholderId = oep.getPlaceholderId();
+                } else {
+                    //special case for files saved in Office 2007
+                    RoundTripHFPlaceholder12 hldr = tx.getClientDataRecord(RecordTypes.RoundTripHFPlaceholder12.typeID);
+                    if(hldr != null) placeholderId = hldr.getPlaceholderId();
+                }
+                if(placeholderId == type){
+                    return tx;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Return programmable tag associated with this sheet, e.g. <code>___PPT12</code>.
+     *
+     * @return programmable tag associated with this sheet.
+     */
+    public String getProgrammableTag(){
+        String tag = null;
+        RecordContainer progTags = (RecordContainer)
+                getSheetContainer().findFirstOfType(
+                            RecordTypes.ProgTags.typeID
+        );
+        if(progTags != null) {
+            RecordContainer progBinaryTag = (RecordContainer)
+                progTags.findFirstOfType(
+                        RecordTypes.ProgBinaryTag.typeID
+            );
+            if(progBinaryTag != null) {
+                CString binaryTag = (CString)
+                    progBinaryTag.findFirstOfType(
+                            RecordTypes.CString.typeID
+                );
+                if(binaryTag != null) tag = binaryTag.getText();
+            }
+        }
+
+        return tag;
+
+    }
+
+    public Iterator<HSLFShape> iterator() {
+        return getShapes().iterator();
+    }
+
+
+    /**
+     * @return whether shapes on the master sheet should be shown. By default master graphics is turned off.
+     * Sheets that support the notion of master (slide, slideLayout) should override it and
+     * check this setting
+     */
+    public boolean getFollowMasterGraphics() {
+        return false;
+    }
+
+
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
similarity index 60%
rename from src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
index 34db620..c90452d 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/SimpleShape.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSimpleShape.java
@@ -15,30 +15,22 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
 import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Rectangle2D;
 import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
 
-import org.apache.poi.ddf.DefaultEscherRecordFactory;
-import org.apache.poi.ddf.EscherChildAnchorRecord;
-import org.apache.poi.ddf.EscherClientAnchorRecord;
-import org.apache.poi.ddf.EscherClientDataRecord;
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherOptRecord;
-import org.apache.poi.ddf.EscherProperties;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.ddf.EscherSimpleProperty;
-import org.apache.poi.ddf.EscherSpRecord;
+import org.apache.poi.ddf.*;
 import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.hslf.record.InteractiveInfo;
-import org.apache.poi.hslf.record.InteractiveInfoAtom;
-import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.sl.draw.DrawPaint;
+import org.apache.poi.sl.draw.geom.*;
+import org.apache.poi.sl.usermodel.*;
+import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
+import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
+import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
 import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.Units;
 
 /**
  *  An abstract simple (non-group) shape.
@@ -46,7 +38,7 @@
  *
  *  @author Yegor Kozlov
  */
-public abstract class SimpleShape extends Shape {
+public abstract class HSLFSimpleShape extends HSLFShape implements SimpleShape {
 
     public final static double DEFAULT_LINE_WIDTH = 0.75;
 
@@ -62,7 +54,7 @@
      * @param escherRecord    <code>EscherSpContainer</code> container which holds information about this shape
      * @param parent    the parent of the shape
      */
-    protected SimpleShape(EscherContainerRecord escherRecord, Shape parent){
+    protected HSLFSimpleShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
@@ -111,7 +103,7 @@
     public double getLineWidth(){
         EscherOptRecord opt = getEscherOptRecord();
         EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH);
-        double width = prop == null ? DEFAULT_LINE_WIDTH : (double)prop.getPropertyValue()/EMU_PER_POINT;
+        double width = (prop == null) ? DEFAULT_LINE_WIDTH : Units.toPoints(prop.getPropertyValue());
         return width;
     }
 
@@ -121,7 +113,7 @@
      */
     public void setLineWidth(double width){
         EscherOptRecord opt = getEscherOptRecord();
-        setEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH, (int)(width*EMU_PER_POINT));
+        setEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH, Units.toEMU(width));
     }
 
     /**
@@ -154,36 +146,45 @@
     }
 
     /**
-     * Gets line dashing. One of the PEN_* constants defined in this class.
+     * Gets line dashing.
      *
      * @return dashing of the line.
      */
-    public int getLineDashing(){
+    public LineDash getLineDashing(){
         EscherOptRecord opt = getEscherOptRecord();
-
         EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINEDASHING);
-        return prop == null ? Line.PEN_SOLID : prop.getPropertyValue();
+        return (prop == null) ? LineDash.SOLID : LineDash.fromNativeId(prop.getPropertyValue());
     }
 
     /**
-     * Sets line dashing. One of the PEN_* constants defined in this class.
+     * Sets line dashing.
      *
      * @param pen new style of the line.
      */
-    public void setLineDashing(int pen){
+    public void setLineDashing(LineDash pen){
         EscherOptRecord opt = getEscherOptRecord();
-
-        setEscherProperty(opt, EscherProperties.LINESTYLE__LINEDASHING, pen == Line.PEN_SOLID ? -1 : pen);
+        setEscherProperty(opt, EscherProperties.LINESTYLE__LINEDASHING, pen == LineDash.SOLID ? -1 : pen.nativeId);
     }
 
     /**
-     * Sets line style. One of the constants defined in this class.
+     * Gets the line compound style
      *
-     * @param style new style of the line.
+     * @return the compound style of the line.
      */
-    public void setLineStyle(int style){
+    public LineCompound getLineCompound() {
         EscherOptRecord opt = getEscherOptRecord();
-        setEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE, style == Line.LINE_SIMPLE ? -1 : style);
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE);
+        return (prop == null) ? LineCompound.SINGLE : LineCompound.fromNativeId(prop.getPropertyValue());
+    }
+    
+    /**
+     * Sets the line compound style
+     *
+     * @param style new compound style of the line.
+     */
+    public void setLineCompound(LineCompound style){
+        EscherOptRecord opt = getEscherOptRecord();
+        setEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE, style == LineCompound.SINGLE ? -1 : style.nativeId);
     }
 
     /**
@@ -191,10 +192,29 @@
      *
      * @return style of the line.
      */
-    public int getLineStyle(){
-        EscherOptRecord opt = getEscherOptRecord();
-        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE);
-        return prop == null ? Line.LINE_SIMPLE : prop.getPropertyValue();
+    public StrokeStyle getStrokeStyle(){
+        return new StrokeStyle() {
+            public PaintStyle getPaint() {
+                return DrawPaint.createSolidPaint(HSLFSimpleShape.this.getLineColor());
+            }
+
+            public LineCap getLineCap() {
+                return null;
+            }
+
+            public LineDash getLineDash() {
+                return HSLFSimpleShape.this.getLineDashing();
+            }
+
+            public LineCompound getLineCompound() {
+                return HSLFSimpleShape.this.getLineCompound();
+            }
+
+            public double getLineWidth() {
+                return HSLFSimpleShape.this.getLineWidth();
+            }
+            
+        };
     }
 
     /**
@@ -214,65 +234,6 @@
     }
 
     /**
-     *
-     * @return 'absolute' anchor of this shape relative to the parent sheet
-     */
-    public Rectangle2D getLogicalAnchor2D(){
-        Rectangle2D anchor = getAnchor2D();
-
-        //if it is a groupped shape see if we need to transform the coordinates
-        if (_parent != null){
-            ArrayList<ShapeGroup> lst = new ArrayList<ShapeGroup>();
-            for (Shape top=this; (top = top.getParent()) != null; ) {
-                lst.add(0, (ShapeGroup)top);
-            }
-
-            AffineTransform tx = new AffineTransform();
-            for(ShapeGroup prnt : lst) {
-                Rectangle2D exterior = prnt.getAnchor2D();
-                Rectangle2D interior = prnt.getCoordinates();
-
-                double scaleX =  exterior.getWidth() / interior.getWidth();
-                double scaleY = exterior.getHeight() / interior.getHeight();
-
-                tx.translate(exterior.getX(), exterior.getY());
-                tx.scale(scaleX, scaleY);
-                tx.translate(-interior.getX(), -interior.getY());
-                
-            }
-            anchor = tx.createTransformedShape(anchor).getBounds2D();
-        }
-
-        int angle = getRotation();
-        if(angle != 0){
-            double centerX = anchor.getX() + anchor.getWidth()/2;
-            double centerY = anchor.getY() + anchor.getHeight()/2;
-
-            AffineTransform trans = new AffineTransform();
-            trans.translate(centerX, centerY);
-            trans.rotate(Math.toRadians(angle));
-            trans.translate(-centerX, -centerY);
-
-            Rectangle2D rect = trans.createTransformedShape(anchor).getBounds2D();
-            if((anchor.getWidth() < anchor.getHeight() && rect.getWidth() > rect.getHeight()) ||
-                (anchor.getWidth() > anchor.getHeight() && rect.getWidth() < rect.getHeight())    ){
-                trans = new AffineTransform();
-                trans.translate(centerX, centerY);
-                trans.rotate(Math.PI/2);
-                trans.translate(-centerX, -centerY);
-                anchor = trans.createTransformedShape(anchor).getBounds2D();
-            }
-        }
-        return anchor;
-    }
-
-    public void draw(Graphics2D graphics){
-        AffineTransform at = graphics.getTransform();
-        ShapePainter.paint(this, graphics);
-        graphics.setTransform(at);
-    }
-
-    /**
      *  Find a record in the underlying EscherClientDataRecord
      *
      * @param recordType type of the record to search
@@ -302,7 +263,7 @@
             if(r != null && !(r instanceof EscherClientDataRecord)){
                 byte[] data = r.serialize();
                 r = new EscherClientDataRecord();
-                r.fillFields(data, 0, new DefaultEscherRecordFactory());
+                r.fillFields(data, 0, new HSLFEscherRecordFactory());
             }
             _clientData = (EscherClientDataRecord)r;
         }
@@ -327,7 +288,7 @@
         }
     }
 
-    public void setHyperlink(Hyperlink link){
+    public void setHyperlink(HSLFHyperlink link){
         if(link.getId() == -1){
             throw new HSLFException("You must call SlideShow.addHyperlink(Hyperlink link) first");
         }
@@ -340,32 +301,32 @@
         InteractiveInfoAtom infoAtom = info.getInteractiveInfoAtom();
 
         switch(link.getType()){
-            case Hyperlink.LINK_FIRSTSLIDE:
+            case HSLFHyperlink.LINK_FIRSTSLIDE:
                 infoAtom.setAction(InteractiveInfoAtom.ACTION_JUMP);
                 infoAtom.setJump(InteractiveInfoAtom.JUMP_FIRSTSLIDE);
                 infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_FirstSlide);
                 break;
-            case Hyperlink.LINK_LASTSLIDE:
+            case HSLFHyperlink.LINK_LASTSLIDE:
                 infoAtom.setAction(InteractiveInfoAtom.ACTION_JUMP);
                 infoAtom.setJump(InteractiveInfoAtom.JUMP_LASTSLIDE);
                 infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_LastSlide);
                 break;
-            case Hyperlink.LINK_NEXTSLIDE:
+            case HSLFHyperlink.LINK_NEXTSLIDE:
                 infoAtom.setAction(InteractiveInfoAtom.ACTION_JUMP);
                 infoAtom.setJump(InteractiveInfoAtom.JUMP_NEXTSLIDE);
                 infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_NextSlide);
                 break;
-            case Hyperlink.LINK_PREVIOUSSLIDE:
+            case HSLFHyperlink.LINK_PREVIOUSSLIDE:
                 infoAtom.setAction(InteractiveInfoAtom.ACTION_JUMP);
                 infoAtom.setJump(InteractiveInfoAtom.JUMP_PREVIOUSSLIDE);
                 infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_PreviousSlide);
                 break;
-            case Hyperlink.LINK_URL:
+            case HSLFHyperlink.LINK_URL:
                 infoAtom.setAction(InteractiveInfoAtom.ACTION_HYPERLINK);
                 infoAtom.setJump(InteractiveInfoAtom.JUMP_NONE);
                 infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_Url);
                 break;
-            case Hyperlink.LINK_SLIDENUMBER:
+            case HSLFHyperlink.LINK_SLIDENUMBER:
                 infoAtom.setAction(InteractiveInfoAtom.ACTION_HYPERLINK);
                 infoAtom.setJump(InteractiveInfoAtom.JUMP_NONE);
                 infoAtom.setHyperlinkType(InteractiveInfoAtom.LINK_SlideNumber);
@@ -384,4 +345,125 @@
 
     }
 
+    public Guide getAdjustValue(String name) {
+        if (name == null || !name.matches("adj([1-9]|10)")) {
+            throw new IllegalArgumentException("Adjust value '"+name+"' not supported.");
+        }
+        short escherProp;
+        switch (Integer.parseInt(name.substring(3))) {
+            case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break;
+            case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE; break;
+            case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE; break;
+            case 4: escherProp = EscherProperties.GEOMETRY__ADJUST4VALUE; break;
+            case 5: escherProp = EscherProperties.GEOMETRY__ADJUST5VALUE; break;
+            case 6: escherProp = EscherProperties.GEOMETRY__ADJUST6VALUE; break;
+            case 7: escherProp = EscherProperties.GEOMETRY__ADJUST7VALUE; break;
+            case 8: escherProp = EscherProperties.GEOMETRY__ADJUST8VALUE; break;
+            case 9: escherProp = EscherProperties.GEOMETRY__ADJUST9VALUE; break;
+            case 10: escherProp = EscherProperties.GEOMETRY__ADJUST10VALUE; break;
+            default: throw new RuntimeException();
+        }
+        
+        int adjval = getEscherProperty(escherProp, -1);
+        return (adjval == -1) ? null : new Guide(name, "val "+adjval);
+    }
+
+    public CustomGeometry getGeometry() {
+        ShapeType st = getShapeType();
+        String name = st.getOoxmlName();
+        
+        PresetGeometries dict = PresetGeometries.getInstance();
+        CustomGeometry geom = dict.get(name);
+        if(geom == null) {
+            throw new IllegalStateException("Unknown shape geometry: " + name);
+        }
+        
+        return geom;
+    }
+
+
+    public double getShadowAngle() {
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.SHADOWSTYLE__OFFSETX);
+        int offX = (prop == null) ? 0 : prop.getPropertyValue();
+        prop = getEscherProperty(opt, EscherProperties.SHADOWSTYLE__OFFSETY);
+        int offY = (prop == null) ? 0 : prop.getPropertyValue();
+        return Math.toDegrees(Math.atan2(offY, offX));
+    }
+    
+    public double getShadowDistance() {
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.SHADOWSTYLE__OFFSETX);
+        int offX = (prop == null) ? 0 : prop.getPropertyValue();
+        prop = getEscherProperty(opt, EscherProperties.SHADOWSTYLE__OFFSETY);
+        int offY = (prop == null) ? 0 : prop.getPropertyValue();
+        return Units.toPoints((long)Math.hypot(offX, offY));
+    }
+
+    /**
+     * @return color of the line. If color is not set returns <code>java.awt.Color.black</code>
+     */
+    public Color getShadowColor(){
+        Color clr = getColor(EscherProperties.SHADOWSTYLE__COLOR, EscherProperties.SHADOWSTYLE__OPACITY, -1);
+        return clr == null ? Color.black : clr;
+    }    
+    
+    public Shadow getShadow() {
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherProperty shadowType = opt.lookup(EscherProperties.SHADOWSTYLE__TYPE);
+        if (shadowType == null) return null;
+        
+        return new Shadow(){
+            public SimpleShape getShadowParent() {
+                return HSLFSimpleShape.this;
+            }
+
+            public double getDistance() {
+                return getShadowDistance();
+            }
+
+            public double getAngle() {
+                return getShadowAngle();
+            }
+
+            public double getBlur() {
+                // TODO Auto-generated method stub
+                return 0;
+            }
+
+            public SolidPaint getFillStyle() {
+                return DrawPaint.createSolidPaint(getShadowColor());
+            }
+            
+        };
+    }
+
+    public LineDecoration getLineDecoration() {
+        return new LineDecoration() {
+
+            public DecorationShape getHeadShape() {
+                return DecorationShape.NONE;
+            }
+
+            public DecorationSize getHeadWidth() {
+                return DecorationSize.MEDIUM;
+            }
+
+            public DecorationSize getHeadLength() {
+                return DecorationSize.MEDIUM;
+            }
+
+            public DecorationShape getTailShape() {
+                return DecorationShape.NONE;
+            }
+
+            public DecorationSize getTailWidth() {
+                return DecorationSize.MEDIUM;
+            }
+
+            public DecorationSize getTailLength() {
+                return DecorationSize.MEDIUM;
+            }
+        };
+    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java
similarity index 72%
rename from src/scratchpad/src/org/apache/poi/hslf/model/Slide.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java
index 9e040c1..8feee23 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Slide.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java
@@ -15,28 +15,20 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
 import java.awt.Graphics2D;
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherDgRecord;
-import org.apache.poi.ddf.EscherDggRecord;
-import org.apache.poi.ddf.EscherSpRecord;
-import org.apache.poi.hslf.record.ColorSchemeAtom;
-import org.apache.poi.hslf.record.Comment2000;
-import org.apache.poi.hslf.record.EscherTextboxWrapper;
-import org.apache.poi.hslf.record.HeadersFootersContainer;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordContainer;
-import org.apache.poi.hslf.record.RecordTypes;
-import org.apache.poi.hslf.record.SSSlideInfoAtom;
-import org.apache.poi.hslf.record.SlideAtom;
-import org.apache.poi.hslf.record.StyleTextProp9Atom;
-import org.apache.poi.hslf.record.TextHeaderAtom;
+import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.model.*;
+import org.apache.poi.hslf.record.*;
 import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
+import org.apache.poi.sl.draw.DrawFactory;
+import org.apache.poi.sl.draw.Drawable;
+import org.apache.poi.sl.usermodel.ShapeType;
+import org.apache.poi.sl.usermodel.Slide;
 
 /**
  * This class represents a slide in a PowerPoint Document. It allows
@@ -47,12 +39,11 @@
  * @author Yegor Kozlov
  */
 
-public final class Slide extends Sheet
-{
+public final class HSLFSlide extends HSLFSheet implements Slide<HSLFShape,HSLFSlideShow,HSLFNotes> {
 	private int _slideNo;
 	private SlideAtomsSet _atomSet;
-	private TextRun[] _runs;
-	private Notes _notes; // usermodel needs to set this
+	private final List<List<HSLFTextParagraph>> _paragraphs = new ArrayList<List<HSLFTextParagraph>>();
+	private HSLFNotes _notes; // usermodel needs to set this
 
 	/**
 	 * Constructs a Slide from the Slide record, and the SlideAtomsSet
@@ -63,40 +54,36 @@
 	 * @param notes the Notes sheet attached to us
 	 * @param atomSet the SlideAtomsSet to get the text from
 	 */
-	public Slide(org.apache.poi.hslf.record.Slide slide, Notes notes, SlideAtomsSet atomSet, int slideIdentifier, int slideNumber) {
+	public HSLFSlide(org.apache.poi.hslf.record.Slide slide, HSLFNotes notes, SlideAtomsSet atomSet, int slideIdentifier, int slideNumber) {
         super(slide, slideIdentifier);
 
 		_notes = notes;
 		_atomSet = atomSet;
 		_slideNo = slideNumber;
 
- 		// Grab the TextRuns from the PPDrawing
-		TextRun[] _otherRuns = findTextRuns(getPPDrawing());
-
 		// For the text coming in from the SlideAtomsSet:
 		// Build up TextRuns from pairs of TextHeaderAtom and
 		//  one of TextBytesAtom or TextCharsAtom
-		final List<TextRun> textRuns = new LinkedList<TextRun>();
-		if(_atomSet != null) {
-			findTextRuns(_atomSet.getSlideRecords(),textRuns);
+		if (_atomSet != null && _atomSet.getSlideRecords().length > 0) {
+		    // Grab text from SlideListWithTexts entries
+		    _paragraphs.addAll(HSLFTextParagraph.findTextParagraphs(_atomSet.getSlideRecords()));
+	        if (_paragraphs.isEmpty()) {
+	            throw new RuntimeException("No text records found for slide");
+	        }
 		} else {
 			// No text on the slide, must just be pictures
 		}
 
-		// Build an array, more useful than a vector
-		_runs = new TextRun[textRuns.size()+_otherRuns.length];
-		// Grab text from SlideListWithTexts entries
-		int i=0;
-		for(i=0; i<textRuns.size(); i++) {
-			_runs[i] = textRuns.get(i);
-            _runs[i].setSheet(this);
-		}
 		// Grab text from slide's PPDrawing
-		for(int k=0; k<_otherRuns.length; i++, k++) {
-			_runs[i] = _otherRuns[k];
-            _runs[i].setSheet(this);
-            _runs[i].setIndex(-1); // runs found in PPDrawing are not linked with SlideListWithTexts
+		for (List<HSLFTextParagraph> l : HSLFTextParagraph.findTextParagraphs(getPPDrawing(), this)) {
+		    if (!_paragraphs.contains(l)) _paragraphs.add(l);
 		}
+
+        for(List<HSLFTextParagraph> ltp : _paragraphs) {
+            for (HSLFTextParagraph tp : ltp) {
+                tp.supplySheet(this);
+            }
+        }
 	}
 
 	/**
@@ -104,34 +91,43 @@
 	* @param sheetNumber The internal number of the sheet, as used by PersistPtrHolder
 	* @param slideNumber The user facing number of the sheet
 	*/
-	public Slide(int sheetNumber, int sheetRefId, int slideNumber){
+	public HSLFSlide(int sheetNumber, int sheetRefId, int slideNumber){
 		super(new org.apache.poi.hslf.record.Slide(), sheetNumber);
 		_slideNo = slideNumber;
         getSheetContainer().setSheetId(sheetRefId);
 	}
 
+    /**
+     * Returns the Notes Sheet for this slide, or null if there isn't one
+     */
+    @Override
+    public HSLFNotes getNotes() {
+        return _notes;
+    }
+
 	/**
 	 * Sets the Notes that are associated with this. Updates the
 	 *  references in the records to point to the new ID
 	 */
-	public void setNotes(Notes notes) {
+	@Override
+	public void setNotes(HSLFNotes notes) {
 		_notes = notes;
 
 		// Update the Slide Atom's ID of where to point to
 		SlideAtom sa = getSlideRecord().getSlideAtom();
 
-		if(notes == null) {
+		if(_notes == null) {
 			// Set to 0
 			sa.setNotesID(0);
 		} else {
 			// Set to the value from the notes' sheet id
-			sa.setNotesID(notes._getSheetNumber());
+			sa.setNotesID(_notes._getSheetNumber());
 		}
 	}
 
 	/**
 	* Changes the Slide's (external facing) page number.
-	* @see org.apache.poi.hslf.usermodel.SlideShow#reorderSlide(int, int)
+	* @see org.apache.poi.hslf.usermodel.HSLFSlideShow#reorderSlide(int, int)
 	*/
 	public void setSlideNumber(int newSlideNumber) {
 		_slideNo = newSlideNumber;
@@ -149,7 +145,7 @@
         //initialize drawing group id
         EscherDggRecord dgg = getSlideShow().getDocumentRecord().getPPDrawingGroup().getEscherDggRecord();
         EscherContainerRecord dgContainer = (EscherContainerRecord)getSheetContainer().getPPDrawing().getEscherRecords()[0];
-        EscherDgRecord dg = (EscherDgRecord) Shape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID);
+        EscherDgRecord dg = (EscherDgRecord) HSLFShape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID);
         int dgId = dgg.getMaxDrawingGroupId() + 1;
         dg.setOptions((short)(dgId << 4));
         dgg.setDrawingsSaved(dgg.getDrawingsSaved() + 1);
@@ -178,10 +174,10 @@
 	 *
 	 * @return <code>TextBox</code> object that represents the slide's title.
 	 */
-	public TextBox addTitle() {
+	public HSLFTextBox addTitle() {
 		Placeholder pl = new Placeholder();
-		pl.setShapeType(ShapeTypes.Rectangle);
-		pl.getTextRun().setRunType(TextHeaderAtom.TITLE_TYPE);
+		pl.setShapeType(ShapeType.RECT);
+		pl.setRunType(TextHeaderAtom.TITLE_TYPE);
 		pl.setText("Click to edit title");
 		pl.setAnchor(new java.awt.Rectangle(54, 48, 612, 90));
 		addShape(pl);
@@ -203,13 +199,14 @@
 	 * @return title of this slide
 	 */
 	public String getTitle(){
-		TextRun[] txt = getTextRuns();
-		for (int i = 0; i < txt.length; i++) {
-			int type = txt[i].getRunType();
-			if (type == TextHeaderAtom.CENTER_TITLE_TYPE ||
-			type == TextHeaderAtom.TITLE_TYPE ){
-				String title = txt[i].getText();
-				return title;
+		for (List<HSLFTextParagraph> tp : getTextParagraphs()) {
+		    if (tp.isEmpty()) continue;
+			int type = tp.get(0).getRunType();
+			switch (type) {
+    			case TextHeaderAtom.CENTER_TITLE_TYPE:
+    			case TextHeaderAtom.TITLE_TYPE:
+    			    String str = HSLFTextParagraph.getRawText(tp);
+    			    return HSLFTextParagraph.toExternalString(str, type);
 			}
 		}
 		return null;
@@ -220,11 +217,12 @@
 	/**
 	 * Returns an array of all the TextRuns found
 	 */
-	public TextRun[] getTextRuns() { return _runs; }
+	public List<List<HSLFTextParagraph>> getTextParagraphs() { return _paragraphs; }
 
 	/**
 	 * Returns the (public facing) page number of this slide
 	 */
+	@Override
 	public int getSlideNumber() { return _slideNo; }
 
 	/**
@@ -235,11 +233,6 @@
     }
 
 	/**
-	 * Returns the Notes Sheet for this slide, or null if there isn't one
-	 */
-	public Notes getNotesSheet() { return _notes; }
-
-	/**
 	 * @return set of records inside <code>SlideListWithtext</code> container
 	 *  which hold text data for this slide (typically for placeholders).
 	 */
@@ -251,33 +244,21 @@
      *
      * @return the master sheet associated with this slide.
      */
-     public MasterSheet getMasterSheet(){
-        SlideMaster[] master = getSlideShow().getSlidesMasters();
-        SlideAtom sa = getSlideRecord().getSlideAtom();
-        int masterId = sa.getMasterID();
-        MasterSheet sheet = null;
-        for (int i = 0; i < master.length; i++) {
-            if (masterId == master[i]._getSheetNumber()) {
-                sheet = master[i];
-                break;
-            }
+     public HSLFMasterSheet getMasterSheet(){
+        int masterId = getSlideRecord().getSlideAtom().getMasterID();
+        for (HSLFSlideMaster sm : getSlideShow().getSlideMasters()) {
+            if (masterId == sm._getSheetNumber()) return sm;
         }
-        if (sheet == null){
-            TitleMaster[] titleMaster = getSlideShow().getTitleMasters();
-            if(titleMaster != null) for (int i = 0; i < titleMaster.length; i++) {
-                if (masterId == titleMaster[i]._getSheetNumber()) {
-                    sheet = titleMaster[i];
-                    break;
-                }
-            }
+        for (HSLFTitleMaster tm : getSlideShow().getTitleMasters()) {
+            if (masterId == tm._getSheetNumber()) return tm;
         }
-        return sheet;
+        return null;
     }
 
     /**
      * Change Master of this slide.
      */
-    public void setMasterSheet(MasterSheet master){
+    public void setMasterSheet(HSLFMasterSheet master){
         SlideAtom sa = getSlideRecord().getSlideAtom();
         int sheetNo = master._getSheetNumber();
         sa.setMasterID(sheetNo);
@@ -352,7 +333,7 @@
     /**
      * Background for this slide.
      */
-     public Background getBackground() {
+     public HSLFBackground getBackground() {
         if(getFollowMasterBackground()) {
             return getMasterSheet().getBackground();
         }
@@ -422,26 +403,6 @@
     	return new Comment[0];
     }
 
-    public void draw(Graphics2D graphics){
-        MasterSheet master = getMasterSheet();
-        Background bg = getBackground();
-        if(bg != null)bg.draw(graphics);
-
-        if(getFollowMasterObjects()){
-            Shape[] sh = master.getShapes();
-            for (int i = 0; i < sh.length; i++) {
-                if(MasterSheet.isPlaceholder(sh[i])) continue;
-
-                sh[i].draw(graphics);
-            }
-        }
-
-        Shape[] sh = getShapes();
-        for (int i = 0; i < sh.length; i++) {
-            sh[i].draw(graphics);
-        }
-    }
-
     /**
      * Header / Footer settings for this slide.
      *
@@ -469,16 +430,9 @@
         return new HeadersFooters(hdd, this, newRecord, ppt2007);
     }
 
-    protected void onAddTextShape(TextShape shape) {
-        TextRun run = shape.getTextRun();
-
-        if(_runs == null) _runs = new TextRun[]{run};
-        else {
-            TextRun[] tmp = new TextRun[_runs.length + 1];
-            System.arraycopy(_runs, 0, tmp, 0, _runs.length);
-            tmp[tmp.length-1] = run;
-            _runs = tmp;
-        }
+    protected void onAddTextShape(HSLFTextShape shape) {
+        List<HSLFTextParagraph> newParas = shape.getTextParagraphs();
+        _paragraphs.add(newParas);
     }
 
     /** This will return an atom per TextBox, so if the page has two text boxes the method should return two atoms. */
@@ -492,22 +446,39 @@
 
 	public void setHidden(boolean hidden) {
 		org.apache.poi.hslf.record.Slide cont =	getSlideRecord();
-		
-		SSSlideInfoAtom slideInfo = 
+
+		SSSlideInfoAtom slideInfo =
 			(SSSlideInfoAtom)cont.findFirstOfType(RecordTypes.SSSlideInfoAtom.typeID);
 		if (slideInfo == null) {
 			slideInfo = new SSSlideInfoAtom();
 			cont.addChildAfter(slideInfo, cont.findFirstOfType(RecordTypes.SlideAtom.typeID));
 		}
-		
+
 		slideInfo.setEffectTransitionFlagByBit(SSSlideInfoAtom.HIDDEN_BIT, hidden);
 	}
-	
+
 	public boolean getHidden() {
-		SSSlideInfoAtom slideInfo = 
+		SSSlideInfoAtom slideInfo =
 			(SSSlideInfoAtom)getSlideRecord().findFirstOfType(RecordTypes.SSSlideInfoAtom.typeID);
 		return (slideInfo == null)
 			? false
 			: slideInfo.getEffectTransitionFlagByBit(SSSlideInfoAtom.HIDDEN_BIT);
 	}
+
+    @Override
+    public void draw(Graphics2D graphics) {
+        DrawFactory drawFact = DrawFactory.getInstance(graphics);
+        Drawable draw = drawFact.getDrawable(this);
+        draw.draw(graphics);
+    }
+    
+    public boolean getFollowMasterColourScheme() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public void setFollowMasterColourScheme(boolean follow) {
+        // TODO Auto-generated method stub
+
+    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java
new file mode 100644
index 0000000..346dab7
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java
@@ -0,0 +1,136 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.hslf.model.textproperties.TextProp;
+import org.apache.poi.hslf.model.textproperties.TextPropCollection;
+import org.apache.poi.hslf.record.*;
+
+/**
+ * SlideMaster determines the graphics, layout, and formatting for all the slides in a given presentation.
+ * It stores information about default font styles, placeholder sizes and positions,
+ * background design, and color schemes.
+ *
+ * @author Yegor Kozlov
+ */
+public final class HSLFSlideMaster extends HSLFMasterSheet {
+    private final List<List<HSLFTextParagraph>> _paragraphs = new ArrayList<List<HSLFTextParagraph>>();
+
+    /**
+     * all TxMasterStyleAtoms available in this master
+     */
+    private TxMasterStyleAtom[] _txmaster;
+
+    /**
+     * Constructs a SlideMaster from the MainMaster record,
+     *
+     */
+    public HSLFSlideMaster(MainMaster record, int sheetNo) {
+        super(record, sheetNo);
+
+        for (List<HSLFTextParagraph> l : HSLFTextParagraph.findTextParagraphs(getPPDrawing(), this)) {
+            if (!_paragraphs.contains(l)) _paragraphs.add(l);
+        }
+
+        for (List<HSLFTextParagraph> p : _paragraphs) {
+            for (HSLFTextParagraph htp : p) {
+                htp.supplySheet(this);
+            }
+        }
+    }
+
+    /**
+     * Returns an array of all the TextRuns found
+     */
+    public List<List<HSLFTextParagraph>> getTextParagraphs() {
+        return _paragraphs;
+    }
+
+    /**
+     * Returns <code>null</code> since SlideMasters doen't have master sheet.
+     */
+    public HSLFMasterSheet getMasterSheet() {
+        return null;
+    }
+
+    /**
+     * Pickup a style attribute from the master.
+     * This is the "workhorse" which returns the default style attrubutes.
+     */
+    public TextProp getStyleAttribute(int txtype, int level, String name, boolean isCharacter) {
+        if (_txmaster.length <= txtype) return null;
+        TxMasterStyleAtom t = _txmaster[txtype];
+        List<TextPropCollection> styles = isCharacter ? t.getCharacterStyles() : t.getParagraphStyles();
+        
+        TextProp prop = null;
+        for (int i = Math.min(level, styles.size()-1); prop == null && i >= 0; i--) {
+            prop = styles.get(i).findByName(name);
+        }
+
+        if (prop != null) return prop;
+        
+        switch (txtype) {
+            case TextHeaderAtom.CENTRE_BODY_TYPE:
+            case TextHeaderAtom.HALF_BODY_TYPE:
+            case TextHeaderAtom.QUARTER_BODY_TYPE:
+                txtype = TextHeaderAtom.BODY_TYPE;
+                break;
+            case TextHeaderAtom.CENTER_TITLE_TYPE:
+                txtype = TextHeaderAtom.TITLE_TYPE;
+                break;
+            default:
+                return null;
+        }
+
+        return getStyleAttribute(txtype, level, name, isCharacter);
+    }
+
+    /**
+     * Assign SlideShow for this slide master.
+     * (Used interanlly)
+     */
+    public void setSlideShow(HSLFSlideShow ss) {
+        super.setSlideShow(ss);
+
+        //after the slide show is assigned collect all available style records
+        if (_txmaster == null) {
+            _txmaster = new TxMasterStyleAtom[9];
+
+            TxMasterStyleAtom txdoc = getSlideShow().getDocumentRecord().getEnvironment().getTxMasterStyleAtom();
+            _txmaster[txdoc.getTextType()] = txdoc;
+
+            TxMasterStyleAtom[] txrec = ((MainMaster)getSheetContainer()).getTxMasterStyleAtoms();
+            for (int i = 0; i < txrec.length; i++) {
+                int txType = txrec[i].getTextType();
+                if(_txmaster[txType] == null) _txmaster[txType] = txrec[i];
+            }
+        }
+    }
+
+    protected void onAddTextShape(HSLFTextShape shape) {
+        List<HSLFTextParagraph> runs = shape.getTextParagraphs();
+        _paragraphs.add(runs);
+    }
+
+    public TxMasterStyleAtom[] getTxMasterStyleAtoms(){
+        return _txmaster;
+    }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
similarity index 85%
rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
index 22aa0b6..ec7de66 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShow.java
@@ -25,31 +25,16 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import org.apache.poi.ddf.EscherBSERecord;
 import org.apache.poi.ddf.EscherContainerRecord;
 import org.apache.poi.ddf.EscherOptRecord;
 import org.apache.poi.ddf.EscherRecord;
 import org.apache.poi.hpsf.ClassID;
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
 import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.hslf.model.HeadersFooters;
-import org.apache.poi.hslf.model.Hyperlink;
-import org.apache.poi.hslf.model.MovieShape;
-import org.apache.poi.hslf.model.Notes;
-import org.apache.poi.hslf.model.PPFont;
-import org.apache.poi.hslf.model.Picture;
-import org.apache.poi.hslf.model.Shape;
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.SlideMaster;
-import org.apache.poi.hslf.model.TitleMaster;
+import org.apache.poi.hslf.model.*;
 import org.apache.poi.hslf.record.Document;
 import org.apache.poi.hslf.record.DocumentAtom;
 import org.apache.poi.hslf.record.ExAviMovie;
@@ -79,6 +64,7 @@
 import org.apache.poi.hslf.record.UserEditAtom;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.sl.usermodel.*;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 
@@ -91,9 +77,9 @@
  * @author Nick Burch
  * @author Yegor kozlov
  */
-public final class SlideShow {
+public final class HSLFSlideShow implements SlideShow {
 	// What we're based on
-	private HSLFSlideShow _hslfSlideShow;
+	private HSLFSlideShowImpl _hslfSlideShow;
 
 	// Pointers to the most recent versions of the core records
 	// (Document, Notes, Slide etc)
@@ -106,10 +92,10 @@
 	private Document _documentRecord;
 
 	// Friendly objects for people to deal with
-	private SlideMaster[] _masters;
-	private TitleMaster[] _titleMasters;
-	private Slide[] _slides;
-	private Notes[] _notes;
+	private final List<HSLFSlideMaster> _masters = new ArrayList<HSLFSlideMaster>();
+	private final List<HSLFTitleMaster> _titleMasters = new ArrayList<HSLFTitleMaster>();
+	private final List<HSLFSlide> _slides = new ArrayList<HSLFSlide>();
+	private final List<HSLFNotes> _notes = new ArrayList<HSLFNotes>();
 	private FontCollection _fonts;
 
 	// For logging
@@ -128,7 +114,7 @@
 	 *
 	 * @param hslfSlideShow the HSLFSlideShow to base on
 	 */
-	public SlideShow(HSLFSlideShow hslfSlideShow) {
+	public HSLFSlideShow(HSLFSlideShowImpl hslfSlideShow) {
 	    // Get useful things from our base slideshow
 	    _hslfSlideShow = hslfSlideShow;
 
@@ -149,15 +135,15 @@
 	/**
 	 * Constructs a new, empty, Powerpoint document.
 	 */
-	public SlideShow() {
-		this(HSLFSlideShow.create());
+	public HSLFSlideShow() {
+		this(HSLFSlideShowImpl.create());
 	}
 
 	/**
 	 * Constructs a Powerpoint document from an input stream.
 	 */
-	public SlideShow(InputStream inputStream) throws IOException {
-		this(new HSLFSlideShow(inputStream));
+	public HSLFSlideShow(InputStream inputStream) throws IOException {
+		this(new HSLFSlideShowImpl(inputStream));
 	}
 
 	/**
@@ -319,27 +305,21 @@
 		if (masterSLWT != null) {
 			masterSets = masterSLWT.getSlideAtomsSets();
 
-			ArrayList<SlideMaster> mmr = new ArrayList<SlideMaster>();
-			ArrayList<TitleMaster> tmr = new ArrayList<TitleMaster>();
-
 			for (SlideAtomsSet sas : masterSets) {
 				Record r = getCoreRecordForSAS(sas);
 				int sheetNo = sas.getSlidePersistAtom().getSlideIdentifier();
 				if (r instanceof org.apache.poi.hslf.record.Slide) {
-					TitleMaster master = new TitleMaster((org.apache.poi.hslf.record.Slide) r,
+					HSLFTitleMaster master = new HSLFTitleMaster((org.apache.poi.hslf.record.Slide) r,
 							sheetNo);
 					master.setSlideShow(this);
-					tmr.add(master);
+					_titleMasters.add(master);
 				} else if (r instanceof org.apache.poi.hslf.record.MainMaster) {
-					SlideMaster master = new SlideMaster((org.apache.poi.hslf.record.MainMaster) r,
+					HSLFSlideMaster master = new HSLFSlideMaster((org.apache.poi.hslf.record.MainMaster) r,
 							sheetNo);
 					master.setSlideShow(this);
-					mmr.add(master);
+					_masters.add(master);
 				}
 			}
-
-			_masters = mmr.toArray(new SlideMaster[mmr.size()]);
-			_titleMasters = tmr.toArray(new TitleMaster[tmr.size()]);
 		}
 
 		// Having sorted out the masters, that leaves the notes and slides
@@ -417,36 +397,37 @@
 
 		// Finally, generate model objects for everything
 		// Notes first
-		_notes = new Notes[notesRecords.length];
-		for (int i = 0; i < _notes.length; i++) {
-		    if (notesRecords[i] != null) {
-    		    _notes[i] = new Notes(notesRecords[i]);
-    			_notes[i].setSlideShow(this);
+		for (org.apache.poi.hslf.record.Notes n : notesRecords) {
+		    HSLFNotes hn = null;
+		    if (n != null) {
+    		    hn = new HSLFNotes(n);
+    		    hn.setSlideShow(this);
 		    }
+		    _notes.add(hn);
 		}
 		// Then slides
-		_slides = new Slide[slidesRecords.length];
-		for (int i = 0; i < _slides.length; i++) {
+		for (int i = 0; i < slidesRecords.length; i++) {
 			SlideAtomsSet sas = slidesSets[i];
 			int slideIdentifier = sas.getSlidePersistAtom().getSlideIdentifier();
 
 			// Do we have a notes for this?
-			Notes notes = null;
+			HSLFNotes notes = null;
 			// Slide.SlideAtom.notesId references the corresponding notes slide.
 			// 0 if slide has no notes.
 			int noteId = slidesRecords[i].getSlideAtom().getNotesID();
 			if (noteId != 0) {
 				Integer notesPos = slideIdToNotes.get(noteId);
 				if (notesPos != null) {
-					notes = _notes[notesPos];
+					notes = _notes.get(notesPos);
 				} else {
 					logger.log(POILogger.ERROR, "Notes not found for noteId=" + noteId);
 				}
 			}
 
 			// Now, build our slide
-			_slides[i] = new Slide(slidesRecords[i], notes, sas, slideIdentifier, (i + 1));
-			_slides[i].setSlideShow(this);
+			HSLFSlide hs = new HSLFSlide(slidesRecords[i], notes, sas, slideIdentifier, (i + 1));
+			hs.setSlideShow(this);
+			_slides.add(hs);
 		}
 	}
 
@@ -461,6 +442,20 @@
 	 *             OutputStream
 	 */
 	public void write(OutputStream out) throws IOException {
+	    // check for text paragraph modifications
+	    for (HSLFSlide sl : getSlides()) {
+	        for (HSLFShape sh : sl.getShapes()) {
+	            if (!(sh instanceof HSLFTextShape)) continue;
+	            HSLFTextShape hts = (HSLFTextShape)sh;
+                boolean isDirty = false;
+                for (HSLFTextParagraph p : hts.getTextParagraphs()) {
+                    isDirty |= p.isDirty();
+                }
+	            if (isDirty) hts.storeText();
+	        }
+	    }
+	    
+	    
 		_hslfSlideShow.write(out);
 	}
 
@@ -481,50 +476,52 @@
 	/**
 	 * Returns an array of all the normal Slides found in the slideshow
 	 */
-	public Slide[] getSlides() {
+	@Override
+	public List<HSLFSlide> getSlides() {
 		return _slides;
 	}
 
 	/**
 	 * Returns an array of all the normal Notes found in the slideshow
 	 */
-	public Notes[] getNotes() {
+	public List<HSLFNotes> getNotes() {
 		return _notes;
 	}
 
 	/**
 	 * Returns an array of all the normal Slide Masters found in the slideshow
 	 */
-	public SlideMaster[] getSlidesMasters() {
+	@Override
+	public List<HSLFSlideMaster> getSlideMasters() {
 		return _masters;
 	}
-
+	
 	/**
 	 * Returns an array of all the normal Title Masters found in the slideshow
 	 */
-	public TitleMaster[] getTitleMasters() {
+	public List<HSLFTitleMaster> getTitleMasters() {
 		return _titleMasters;
 	}
 
 	/**
 	 * Returns the data of all the pictures attached to the SlideShow
 	 */
-	public PictureData[] getPictureData() {
+	public HSLFPictureData[] getPictureData() {
 		return _hslfSlideShow.getPictures();
 	}
 
 	/**
 	 * Returns the data of all the embedded OLE object in the SlideShow
 	 */
-	public ObjectData[] getEmbeddedObjects() {
+	public HSLFObjectData[] getEmbeddedObjects() {
 		return _hslfSlideShow.getEmbeddedObjects();
 	}
 
 	/**
 	 * Returns the data of all the embedded sounds in the SlideShow
 	 */
-	public SoundData[] getSoundData() {
-		return SoundData.find(_documentRecord);
+	public HSLFSoundData[] getSoundData() {
+		return HSLFSoundData.find(_documentRecord);
 	}
 
 	/**
@@ -532,8 +529,8 @@
 	 */
 	public Dimension getPageSize() {
 		DocumentAtom docatom = _documentRecord.getDocumentAtom();
-		int pgx = (int) docatom.getSlideSizeX() * Shape.POINT_DPI / Shape.MASTER_DPI;
-		int pgy = (int) docatom.getSlideSizeY() * Shape.POINT_DPI / Shape.MASTER_DPI;
+		int pgx = (int) docatom.getSlideSizeX() * HSLFShape.POINT_DPI / HSLFShape.MASTER_DPI;
+		int pgy = (int) docatom.getSlideSizeY() * HSLFShape.POINT_DPI / HSLFShape.MASTER_DPI;
 		return new Dimension(pgx, pgy);
 	}
 
@@ -545,8 +542,8 @@
 	 */
 	public void setPageSize(Dimension pgsize) {
 		DocumentAtom docatom = _documentRecord.getDocumentAtom();
-		docatom.setSlideSizeX(pgsize.width * Shape.MASTER_DPI / Shape.POINT_DPI);
-		docatom.setSlideSizeY(pgsize.height * Shape.MASTER_DPI / Shape.POINT_DPI);
+		docatom.setSlideSizeX(pgsize.width * HSLFShape.MASTER_DPI / HSLFShape.POINT_DPI);
+		docatom.setSlideSizeY(pgsize.height * HSLFShape.MASTER_DPI / HSLFShape.POINT_DPI);
 	}
 
 	/**
@@ -582,10 +579,10 @@
 		if (oldSlideNumber < 1 || newSlideNumber < 1) {
 			throw new IllegalArgumentException("Old and new slide numbers must be greater than 0");
 		}
-		if (oldSlideNumber > _slides.length || newSlideNumber > _slides.length) {
+		if (oldSlideNumber > _slides.size() || newSlideNumber > _slides.size()) {
 			throw new IllegalArgumentException(
 					"Old and new slide numbers must not exceed the number of slides ("
-							+ _slides.length + ")");
+							+ _slides.size() + ")");
 		}
 
 		// The order of slides is defined by the order of slide atom sets in the
@@ -597,15 +594,16 @@
 		sas[oldSlideNumber - 1] = sas[newSlideNumber - 1];
 		sas[newSlideNumber - 1] = tmp;
 
+		Collections.swap(_slides, oldSlideNumber - 1, newSlideNumber - 1);
+		_slides.get(newSlideNumber - 1).setSlideNumber(newSlideNumber);
+		_slides.get(oldSlideNumber - 1).setSlideNumber(oldSlideNumber);
+		
 		ArrayList<Record> lst = new ArrayList<Record>();
-		for (int i = 0; i < sas.length; i++) {
-			lst.add(sas[i].getSlidePersistAtom());
-			Record[] r = sas[i].getSlideRecords();
-			for (int j = 0; j < r.length; j++) {
-				lst.add(r[j]);
-			}
-			_slides[i].setSlideNumber(i + 1);
+		for (SlideAtomsSet s : sas) {
+			lst.add(s.getSlidePersistAtom());
+			lst.addAll(Arrays.asList(s.getSlideRecords()));
 		}
+		
 		Record[] r = lst.toArray(new Record[lst.size()]);
 		slwt.setChildRecord(r);
 	}
@@ -621,8 +619,8 @@
 	 *            the index of the slide to remove (0-based)
 	 * @return the slide that was removed from the slide show.
 	 */
-	public Slide removeSlide(int index) {
-		int lastSlideIdx = _slides.length - 1;
+	public HSLFSlide removeSlide(int index) {
+		int lastSlideIdx = _slides.size() - 1;
 		if (index < 0 || index > lastSlideIdx) {
 			throw new IllegalArgumentException("Slide index (" + index + ") is out of range (0.."
 					+ lastSlideIdx + ")");
@@ -631,61 +629,49 @@
 		SlideListWithText slwt = _documentRecord.getSlideSlideListWithText();
 		SlideAtomsSet[] sas = slwt.getSlideAtomsSets();
 
-		Slide removedSlide = null;
-		ArrayList<Record> records = new ArrayList<Record>();
-		ArrayList<SlideAtomsSet> sa = new ArrayList<SlideAtomsSet>();
-		ArrayList<Slide> sl = new ArrayList<Slide>();
+		List<Record> records = new ArrayList<Record>();
+		List<SlideAtomsSet> sa = new ArrayList<SlideAtomsSet>(Arrays.asList(sas));
 
-		ArrayList<Notes> nt = new ArrayList<Notes>();
-		for (Notes notes : getNotes())
-			nt.add(notes);
-
-		for (int i = 0, num = 0; i < _slides.length; i++) {
-			if (i != index) {
-				sl.add(_slides[i]);
-				sa.add(sas[i]);
-				_slides[i].setSlideNumber(num++);
-				records.add(sas[i].getSlidePersistAtom());
-				records.addAll(Arrays.asList(sas[i].getSlideRecords()));
-			} else {
-				removedSlide = _slides[i];
-				nt.remove(_slides[i].getNotesSheet());
-			}
+		HSLFSlide removedSlide = _slides.remove(index);
+		_notes.remove(removedSlide.getNotes());
+		sa.remove(index);
+		
+		int i=0;
+		for (HSLFSlide s : _slides) s.setSlideNumber(i++);
+		
+		for (SlideAtomsSet s : sa) {
+            records.add(s.getSlidePersistAtom());
+            records.addAll(Arrays.asList(s.getSlideRecords()));
 		}
-		if (sa.size() == 0) {
+		if (sa.isEmpty()) {
 			_documentRecord.removeSlideListWithText(slwt);
 		} else {
 			slwt.setSlideAtomsSets(sa.toArray(new SlideAtomsSet[sa.size()]));
 			slwt.setChildRecord(records.toArray(new Record[records.size()]));
 		}
-		_slides = sl.toArray(new Slide[sl.size()]);
 
 		// if the removed slide had notes - remove references to them too
 
-		if (removedSlide != null) {
-			int notesId = removedSlide.getSlideRecord().getSlideAtom().getNotesID();
-			if (notesId != 0) {
-				SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText();
-				records = new ArrayList<Record>();
-				ArrayList<SlideAtomsSet> na = new ArrayList<SlideAtomsSet>();
-				for (SlideAtomsSet ns : nslwt.getSlideAtomsSets()) {
-					if (ns.getSlidePersistAtom().getSlideIdentifier() != notesId) {
-						na.add(ns);
-						records.add(ns.getSlidePersistAtom());
-						if (ns.getSlideRecords() != null)
-							records.addAll(Arrays.asList(ns.getSlideRecords()));
-					}
+        int notesId = (removedSlide != null) ? removedSlide.getSlideRecord().getSlideAtom().getNotesID() : 0;
+		if (notesId != 0) {
+			SlideListWithText nslwt = _documentRecord.getNotesSlideListWithText();
+			records = new ArrayList<Record>();
+			ArrayList<SlideAtomsSet> na = new ArrayList<SlideAtomsSet>();
+			for (SlideAtomsSet ns : nslwt.getSlideAtomsSets()) {
+				if (ns.getSlidePersistAtom().getSlideIdentifier() == notesId) continue;
+				na.add(ns);
+				records.add(ns.getSlidePersistAtom());
+				if (ns.getSlideRecords() != null) {
+					records.addAll(Arrays.asList(ns.getSlideRecords()));
 				}
-				if (na.size() == 0) {
-					_documentRecord.removeSlideListWithText(nslwt);
-				} else {
-					nslwt.setSlideAtomsSets(na.toArray(new SlideAtomsSet[na.size()]));
-					nslwt.setChildRecord(records.toArray(new Record[records.size()]));
-				}
-
+			}
+			if (na.isEmpty()) {
+				_documentRecord.removeSlideListWithText(nslwt);
+			} else {
+				nslwt.setSlideAtomsSets(na.toArray(new SlideAtomsSet[na.size()]));
+				nslwt.setChildRecord(records.toArray(new Record[records.size()]));
 			}
 		}
-		_notes = nt.toArray(new Notes[nt.size()]);
 
 		return removedSlide;
 	}
@@ -701,7 +687,7 @@
 	 *
 	 * @return the created <code>Slide</code>
 	 */
-	public Slide createSlide() {
+	public HSLFSlide createSlide() {
 		SlideListWithText slist = null;
 
 		// We need to add the records to the SLWT that deals
@@ -745,16 +731,13 @@
 		slist.addSlidePersistAtom(sp);
 
 		// Create a new Slide
-		Slide slide = new Slide(sp.getSlideIdentifier(), sp.getRefID(), _slides.length + 1);
+		HSLFSlide slide = new HSLFSlide(sp.getSlideIdentifier(), sp.getRefID(), _slides.size() + 1);
 		slide.setSlideShow(this);
 		slide.onCreate();
 
 		// Add in to the list of Slides
-		Slide[] s = new Slide[_slides.length + 1];
-		System.arraycopy(_slides, 0, s, 0, _slides.length);
-		s[_slides.length] = slide;
-		_slides = s;
-		logger.log(POILogger.INFO, "Added slide " + _slides.length + " with ref " + sp.getRefID()
+		_slides.add(slide);
+		logger.log(POILogger.INFO, "Added slide " + _slides.size() + " with ref " + sp.getRefID()
 				+ " and identifier " + sp.getSlideIdentifier());
 
 		// Add the core records for this new Slide to the record tree
@@ -763,7 +746,7 @@
 		sp.setRefID(psrId);
 		slideRecord.setSheetId(psrId);
 		
-		slide.setMasterSheet(_masters[0]);
+		slide.setMasterSheet(_masters.get(0));
 		// All done and added
 		return slide;
 	}
@@ -779,12 +762,12 @@
 	 * @return the index to this picture (1 based).
 	 */
 	public int addPicture(byte[] data, int format) throws IOException {
-		byte[] uid = PictureData.getChecksum(data);
+		byte[] uid = HSLFPictureData.getChecksum(data);
 
 		EscherContainerRecord bstore;
 
 		EscherContainerRecord dggContainer = _documentRecord.getPPDrawingGroup().getDggContainer();
-		bstore = (EscherContainerRecord) Shape.getEscherChild(dggContainer,
+		bstore = (EscherContainerRecord) HSLFShape.getEscherChild(dggContainer,
 				EscherContainerRecord.BSTORE_CONTAINER);
 		if (bstore == null) {
 			bstore = new EscherContainerRecord();
@@ -801,7 +784,7 @@
 			}
 		}
 
-		PictureData pict = PictureData.create(format);
+		HSLFPictureData pict = HSLFPictureData.create(format);
 		pict.setData(data);
 
 		int offset = _hslfSlideShow.addPicture(pict);
@@ -815,12 +798,12 @@
 		bse.setBlipTypeMacOS((byte) format);
 		bse.setBlipTypeWin32((byte) format);
 
-		if (format == Picture.EMF)
-			bse.setBlipTypeMacOS((byte) Picture.PICT);
-		else if (format == Picture.WMF)
-			bse.setBlipTypeMacOS((byte) Picture.PICT);
-		else if (format == Picture.PICT)
-			bse.setBlipTypeWin32((byte) Picture.WMF);
+		if (format == HSLFPictureShape.EMF)
+			bse.setBlipTypeMacOS((byte) HSLFPictureShape.PICT);
+		else if (format == HSLFPictureShape.WMF)
+			bse.setBlipTypeMacOS((byte) HSLFPictureShape.PICT);
+		else if (format == HSLFPictureShape.PICT)
+			bse.setBlipTypeWin32((byte) HSLFPictureShape.WMF);
 
 		bse.setRef(0);
 		bse.setOffset(offset);
@@ -910,7 +893,7 @@
 	 */
 	public HeadersFooters getSlideHeadersFooters() {
 		// detect if this ppt was saved in Office2007
-		String tag = getSlidesMasters()[0].getProgrammableTag();
+		String tag = getSlideMasters().get(0).getProgrammableTag();
 		boolean ppt2007 = "___PPT12".equals(tag);
 
 		HeadersFootersContainer hdd = null;
@@ -936,7 +919,7 @@
 	 */
 	public HeadersFooters getNotesHeadersFooters() {
 		// detect if this ppt was saved in Office2007
-		String tag = getSlidesMasters()[0].getProgrammableTag();
+		String tag = getSlideMasters().get(0).getProgrammableTag();
 		boolean ppt2007 = "___PPT12".equals(tag);
 
 		HeadersFootersContainer hdd = null;
@@ -952,8 +935,8 @@
 			hdd = new HeadersFootersContainer(HeadersFootersContainer.NotesHeadersFootersContainer);
 			newRecord = true;
 		}
-		if (ppt2007 && _notes.length > 0) {
-			return new HeadersFooters(hdd, _notes[0], newRecord, ppt2007);
+		if (ppt2007 && !_notes.isEmpty()) {
+			return new HeadersFooters(hdd, _notes.get(0), newRecord, ppt2007);
 		}
 		return new HeadersFooters(hdd, this, newRecord, ppt2007);
 	}
@@ -1019,10 +1002,10 @@
 	 *
 	 * @return 0-based index of the hyperlink
 	 */
-	public int addHyperlink(Hyperlink link) {
+	public int addHyperlink(HSLFHyperlink link) {
 		ExHyperlink ctrl = new ExHyperlink();
 		ExHyperlinkAtom obj = ctrl.getExHyperlinkAtom();
-        if(link.getType() == Hyperlink.LINK_SLIDENUMBER) {
+        if(link.getType() == HSLFHyperlink.LINK_SLIDENUMBER) {
             ctrl.setLinkURL(link.getAddress(), 0x30);
         } else {
             ctrl.setLinkURL(link.getAddress());
@@ -1134,7 +1117,7 @@
     }
 
     protected int addPersistentObject(PositionDependentRecord slideRecord) {
-    	slideRecord.setLastOnDiskOffset(HSLFSlideShow.UNSET_OFFSET);
+    	slideRecord.setLastOnDiskOffset(HSLFSlideShowImpl.UNSET_OFFSET);
 		_hslfSlideShow.appendRootLevelRecord((Record)slideRecord);
 
         // For position dependent records, hold where they were and now are
@@ -1169,4 +1152,15 @@
 
 		return psrId;
     }
+
+    public MasterSheet<? extends Shape, ? extends SlideShow> createMasterSheet()
+            throws IOException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public Resources getResources() {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/EncryptedSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java
similarity index 97%
rename from src/scratchpad/src/org/apache/poi/hslf/EncryptedSlideShow.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java
index 07a01aa..30397bf 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/EncryptedSlideShow.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java
@@ -15,7 +15,7 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf;
+package org.apache.poi.hslf.usermodel;
 
 import java.io.OutputStream;
 import java.security.GeneralSecurityException;
@@ -49,7 +49,7 @@
  * This class provides helper functions for encrypted PowerPoint documents.
  */
 @Internal
-public class EncryptedSlideShow {
+public class HSLFSlideShowEncrypted {
     DocumentEncryptionAtom dea;
     CryptoAPIEncryptor enc = null;
     CryptoAPIDecryptor dec = null;
@@ -58,11 +58,11 @@
 
     private static final BitField fieldRecInst = new BitField(0xFFF0);
     
-    protected EncryptedSlideShow(DocumentEncryptionAtom dea) {
+    protected HSLFSlideShowEncrypted(DocumentEncryptionAtom dea) {
         this.dea = dea;
     }
 
-    protected EncryptedSlideShow(byte[] docstream, NavigableMap<Integer,Record> recordMap) {
+    protected HSLFSlideShowEncrypted(byte[] docstream, NavigableMap<Integer,Record> recordMap) {
         // check for DocumentEncryptionAtom, which would be at the last offset
         // need to ignore already set UserEdit and PersistAtoms
         UserEditAtom userEditAtomWithEncryption = null;
@@ -362,7 +362,7 @@
     /**
      * remove duplicated UserEditAtoms and merge PersistPtrHolder.
      * Before this method is called, make sure that the offsets are correct,
-     * i.e. call {@link HSLFSlideShow#updateAndWriteDependantRecords(OutputStream, Map)}
+     * i.e. call {@link HSLFSlideShowImpl#updateAndWriteDependantRecords(OutputStream, Map)}
      */
     protected static Record[] normalizeRecords(Record records[]) {
         // http://msdn.microsoft.com/en-us/library/office/gg615594(v=office.14).aspx
diff --git a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
similarity index 89%
rename from src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
index 5ee4f2e..34638f6 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
@@ -15,11 +15,11 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf;
+package org.apache.poi.hslf.usermodel;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -45,14 +45,11 @@
 import org.apache.poi.hslf.record.Record;
 import org.apache.poi.hslf.record.RecordTypes;
 import org.apache.poi.hslf.record.UserEditAtom;
-import org.apache.poi.hslf.usermodel.ObjectData;
-import org.apache.poi.hslf.usermodel.PictureData;
 import org.apache.poi.poifs.crypt.cryptoapi.CryptoAPIEncryptor;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.DocumentInputStream;
 import org.apache.poi.poifs.filesystem.EntryUtils;
-import org.apache.poi.poifs.filesystem.FilteringDirectoryNode;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.util.LittleEndian;
@@ -65,7 +62,7 @@
  *
  * @author Nick Burch
  */
-public final class HSLFSlideShow extends POIDocument {
+public final class HSLFSlideShowImpl extends POIDocument {
     public static final int UNSET_OFFSET = -1;
     
     // For logging
@@ -81,29 +78,29 @@
 	private Record[] _records;
 
 	// Raw Pictures contained in the pictures stream
-	private List<PictureData> _pictures;
+	private List<HSLFPictureData> _pictures;
 
     // Embedded objects stored in storage records in the document stream, lazily populated.
-    private ObjectData[] _objects;
+    private HSLFObjectData[] _objects;
     
-    /**
-     * Returns the directory in the underlying POIFSFileSystem for the 
-     *  document that is open.
-     */
-    protected DirectoryNode getPOIFSDirectory() {
-        return directory;
-    }
+   /**
+    * Returns the directory in the underlying POIFSFileSystem for the 
+    *  document that is open.
+    */
+   protected DirectoryNode getPOIFSDirectory() {
+      return directory;
+   }
 
 	/**
-	 * Constructs a PowerPoint document from fileName. Parses the document
+	 * Constructs a Powerpoint document from fileName. Parses the document
 	 * and places all the important stuff into data structures.
 	 *
 	 * @param fileName The name of the file to read.
 	 * @throws IOException if there is a problem while parsing the document.
 	 */
-	public HSLFSlideShow(String fileName) throws IOException
+	public HSLFSlideShowImpl(String fileName) throws IOException
 	{
-		this(new NPOIFSFileSystem(new File(fileName)));
+		this(new FileInputStream(fileName));
 	}
 
 	/**
@@ -113,9 +110,9 @@
 	 * @param inputStream the source of the data
 	 * @throws IOException if there is a problem while parsing the document.
 	 */
-	public HSLFSlideShow(InputStream inputStream) throws IOException {
+	public HSLFSlideShowImpl(InputStream inputStream) throws IOException {
 		//do Ole stuff
-		this(new NPOIFSFileSystem(inputStream));
+		this(new POIFSFileSystem(inputStream));
 	}
 
 	/**
@@ -125,7 +122,7 @@
 	 * @param filesystem the POIFS FileSystem to read from
 	 * @throws IOException if there is a problem while parsing the document.
 	 */
-	public HSLFSlideShow(POIFSFileSystem filesystem) throws IOException
+	public HSLFSlideShowImpl(POIFSFileSystem filesystem) throws IOException
 	{
 		this(filesystem.getRoot());
 	}
@@ -137,11 +134,27 @@
     * @param filesystem the POIFS FileSystem to read from
     * @throws IOException if there is a problem while parsing the document.
     */
-   public HSLFSlideShow(NPOIFSFileSystem filesystem) throws IOException
+   public HSLFSlideShowImpl(NPOIFSFileSystem filesystem) throws IOException
    {
       this(filesystem.getRoot());
    }
 
+   /**
+    * Constructs a Powerpoint document from a specific point in a
+    *  POIFS Filesystem. Parses the document and places all the
+    *  important stuff into data structures.
+    *
+    * @deprecated Use {@link #HSLFSlideShow(DirectoryNode)} instead
+    * @param dir the POIFS directory to read from
+    * @param filesystem the POIFS FileSystem to read from
+    * @throws IOException if there is a problem while parsing the document.
+    */
+	@Deprecated
+   public HSLFSlideShowImpl(DirectoryNode dir, POIFSFileSystem filesystem) throws IOException
+   {
+      this(dir);
+   }
+   
 	/**
 	 * Constructs a Powerpoint document from a specific point in a
 	 *  POIFS Filesystem. Parses the document and places all the
@@ -150,7 +163,7 @@
 	 * @param dir the POIFS directory to read from
 	 * @throws IOException if there is a problem while parsing the document.
 	 */
-	public HSLFSlideShow(DirectoryNode dir) throws IOException {
+	public HSLFSlideShowImpl(DirectoryNode dir) throws IOException {
 		super(handleDualStorage(dir));
 
 		// First up, grab the "Current User" stream
@@ -179,13 +192,13 @@
 	/**
 	 * Constructs a new, empty, Powerpoint document.
 	 */
-	public static final HSLFSlideShow create() {
-		InputStream is = HSLFSlideShow.class.getResourceAsStream("data/empty.ppt");
+	public static final HSLFSlideShowImpl create() {
+		InputStream is = HSLFSlideShowImpl.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt");
 		if (is == null) {
 			throw new RuntimeException("Missing resource 'empty.ppt'");
 		}
 		try {
-			return new HSLFSlideShow(is);
+			return new HSLFSlideShowImpl(is);
 		} catch (IOException e) {
 			throw new RuntimeException(e);
 		}
@@ -256,7 +269,7 @@
 	    NavigableMap<Integer,Record> records = new TreeMap<Integer,Record>(); // offset -> record
         Map<Integer,Integer> persistIds = new HashMap<Integer,Integer>(); // offset -> persistId
         initRecordOffsets(docstream, usrOffset, records, persistIds);
-        EncryptedSlideShow decryptData = new EncryptedSlideShow(docstream, records);
+        HSLFSlideShowEncrypted decryptData = new HSLFSlideShowEncrypted(docstream, records);
         
         for (Map.Entry<Integer,Record> entry : records.entrySet()) {
             Integer offset = entry.getKey();
@@ -350,12 +363,12 @@
 	 */
     @SuppressWarnings("unused")
 	private void readPictures() throws IOException {
-        _pictures = new ArrayList<PictureData>();
+        _pictures = new ArrayList<HSLFPictureData>();
 
         // if the presentation doesn't contain pictures - will use a null set instead
         if (!directory.hasEntry("Pictures")) return;
 
-        EncryptedSlideShow decryptData = new EncryptedSlideShow(getDocumentEncryptionAtom());
+        HSLFSlideShowEncrypted decryptData = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom());
         
 		DocumentEntry entry = (DocumentEntry)directory.getEntry("Pictures");
 		byte[] pictstream = new byte[entry.getSize()];
@@ -400,8 +413,7 @@
 			} else {
 				// Build the PictureData object from the data
 				try {
-					PictureData pict = PictureData.create(type - 0xF018);
-					pict.setSignature(signature);
+					HSLFPictureData pict = HSLFPictureData.create(type - 0xF018);
 
                     // Copy the data, ready to pass to PictureData
                     byte[] imgdata = new byte[imgsize];
@@ -429,7 +441,7 @@
         } catch (IOException e) {
             throw new CorruptPowerPointFileException(e);
         }
-        _records = EncryptedSlideShow.normalizeRecords(_records);
+        _records = HSLFSlideShowEncrypted.normalizeRecords(_records);
     }
    
     
@@ -495,7 +507,7 @@
             persistIds.put(oldToNewPositions.get(entry.getValue()), entry.getKey());
         }
         
-        EncryptedSlideShow encData = new EncryptedSlideShow(getDocumentEncryptionAtom());
+        HSLFSlideShowEncrypted encData = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom());
 	    
 	    for (Record record : _records) {
             assert(record instanceof PositionDependentRecord);
@@ -558,11 +570,11 @@
         getDocumentSummaryInformation();
 
         // set new encryption settings
-        EncryptedSlideShow encryptedSS = new EncryptedSlideShow(getDocumentEncryptionAtom());
+        HSLFSlideShowEncrypted encryptedSS = new HSLFSlideShowEncrypted(getDocumentEncryptionAtom());
         _records = encryptedSS.updateEncryptionRecord(_records);
 
         // Get a new Filesystem to write into
-        NPOIFSFileSystem outFS = new NPOIFSFileSystem();
+        POIFSFileSystem outFS = new POIFSFileSystem();
 
         // The list of entries we've written out
         List<String> writtenEntries = new ArrayList<String>(1);
@@ -593,7 +605,7 @@
 
         if (_pictures.size() > 0) {
             BufAccessBAOS pict = new BufAccessBAOS();
-            for (PictureData p : _pictures) {
+            for (HSLFPictureData p : _pictures) {
                 int offset = pict.size();
                 p.write(pict);
                 encryptedSS.encryptPicture(pict.getBuf(), offset);
@@ -606,9 +618,7 @@
 
         // If requested, write out any other streams we spot
         if(preserveNodes) {
-            FilteringDirectoryNode sNode = new FilteringDirectoryNode(directory, writtenEntries);
-            FilteringDirectoryNode dNode = new FilteringDirectoryNode(outFS.getRoot(), writtenEntries);
-            EntryUtils.copyNodes(sNode, dNode);
+            EntryUtils.copyNodes(directory.getFileSystem(), outFS, writtenEntries);
         }
 
         // Send the POIFSFileSystem object out to the underlying stream
@@ -631,14 +641,13 @@
 
     /**
      * Writes out the standard Documment Information Properties (HPSF)
-     * @param outFS the NPOIFSFileSystem to write the properties into
+     * @param outFS the POIFSFileSystem to write the properties into
      * @param writtenEntries a list of POIFS entries to add the property names too
      * 
      * @throws IOException if an error when writing to the 
      *      {@link POIFSFileSystem} occurs
      */
-    @Override
-    protected void writeProperties(NPOIFSFileSystem outFS, List<String> writtenEntries) throws IOException {
+    protected void writeProperties(POIFSFileSystem outFS, List<String> writtenEntries) throws IOException {
         super.writeProperties(outFS, writtenEntries);
         DocumentEncryptionAtom dea = getDocumentEncryptionAtom();
         if (dea != null) {
@@ -685,7 +694,7 @@
      *
      * @return offset of this picture in the Pictures stream
 	 */
-	public int addPicture(PictureData img) {
+	public int addPicture(HSLFPictureData img) {
 	   // Process any existing pictures if we haven't yet
 	   if(_pictures == null) {
          try {
@@ -698,7 +707,7 @@
 	   // Add the new picture in
       int offset = 0;
 	   if(_pictures.size() > 0) {
-	      PictureData prev = _pictures.get(_pictures.size() - 1);
+	      HSLFPictureData prev = _pictures.get(_pictures.size() - 1);
 	      offset = prev.getOffset() + prev.getRawData().length + 8;
 	   }
 	   img.setOffset(offset);
@@ -731,7 +740,7 @@
 	 *  @return array with the read pictures or <code>null</code> if the
 	 *  presentation doesn't contain pictures.
 	 */
-	public PictureData[] getPictures() {
+	public HSLFPictureData[] getPictures() {
 	   if(_pictures == null) {
 	      try {
 	         readPictures();
@@ -740,7 +749,7 @@
 	      }
 	   }
 	   
-		return _pictures.toArray(new PictureData[_pictures.size()]);
+		return _pictures.toArray(new HSLFPictureData[_pictures.size()]);
 	}
 
     /**
@@ -748,15 +757,15 @@
      *
      * @return the embedded objects.
      */
-    public ObjectData[] getEmbeddedObjects() {
+    public HSLFObjectData[] getEmbeddedObjects() {
         if (_objects == null) {
-            List<ObjectData> objects = new ArrayList<ObjectData>();
+            List<HSLFObjectData> objects = new ArrayList<HSLFObjectData>();
             for (Record r : _records) {
                 if (r instanceof ExOleObjStg) {
-                    objects.add(new ObjectData((ExOleObjStg)r));
+                    objects.add(new HSLFObjectData((ExOleObjStg)r));
                 }
             }
-            _objects = objects.toArray(new ObjectData[objects.size()]);
+            _objects = objects.toArray(new HSLFObjectData[objects.size()]);
         }
         return _objects;
     }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSoundData.java
similarity index 88%
rename from src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSoundData.java
index 9fd85e1..7750b25 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSoundData.java
@@ -26,7 +26,7 @@
  *
  * @author Yegor Kozlov
  */
-public final class SoundData {
+public final class HSLFSoundData {
     /**
      * The record that contains the object data.
      */
@@ -37,7 +37,7 @@
      *
      * @param container the record that contains the sound data.
      */
-    public SoundData(Sound container) {
+    public HSLFSoundData(Sound container) {
         this._container = container;
     }
 
@@ -74,8 +74,8 @@
      * @param document the document to find in
      * @return the array with the sound data
      */
-    public static SoundData[] find(Document document){
-        ArrayList<SoundData> lst = new ArrayList<SoundData>();
+    public static HSLFSoundData[] find(Document document){
+        ArrayList<HSLFSoundData> lst = new ArrayList<HSLFSoundData>();
         Record[] ch = document.getChildRecords();
         for (int i = 0; i < ch.length; i++) {
             if(ch[i].getRecordType() == RecordTypes.SoundCollection.typeID){
@@ -83,12 +83,12 @@
                 Record[] sr = col.getChildRecords();
                 for (int j = 0; j < sr.length; j++) {
                     if(sr[j] instanceof Sound){
-                        lst.add(new SoundData((Sound)sr[j]));
+                        lst.add(new HSLFSoundData((Sound)sr[j]));
                     }
                 }
             }
 
         }
-        return lst.toArray(new SoundData[lst.size()]);
+        return lst.toArray(new HSLFSoundData[lst.size()]);
     }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java
similarity index 77%
rename from src/scratchpad/src/org/apache/poi/hslf/model/Table.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java
index 5c253b1..d9f5b11 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/Table.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTable.java
@@ -15,9 +15,13 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
 import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.model.Line;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.ShapeContainer;
+import org.apache.poi.sl.usermodel.TableShape;
 import org.apache.poi.util.LittleEndian;
 
 import java.util.*;
@@ -29,7 +33,7 @@
  *
  * @author Yegor Kozlov
  */
-public final class Table extends ShapeGroup {
+public final class HSLFTable extends HSLFGroupShape implements TableShape {
 
     protected static final int BORDER_TOP = 1;
     protected static final int BORDER_RIGHT = 2;
@@ -42,7 +46,7 @@
     protected static final int BORDERS_NONE = 8;
 
 
-    protected TableCell[][] cells;
+    protected HSLFTableCell[][] cells;
 
     /**
      * Create a new Table of the given number of rows and columns
@@ -50,23 +54,23 @@
      * @param numrows the number of rows
      * @param numcols the number of columns
      */
-    public Table(int numrows, int numcols) {
+    public HSLFTable(int numrows, int numcols) {
         super();
 
         if(numrows < 1) throw new IllegalArgumentException("The number of rows must be greater than 1");
         if(numcols < 1) throw new IllegalArgumentException("The number of columns must be greater than 1");
 
         int x=0, y=0, tblWidth=0, tblHeight=0;
-        cells = new TableCell[numrows][numcols];
+        cells = new HSLFTableCell[numrows][numcols];
         for (int i = 0; i < cells.length; i++) {
             x = 0;
             for (int j = 0; j < cells[i].length; j++) {
-                cells[i][j] = new TableCell(this);
-                Rectangle anchor = new Rectangle(x, y, TableCell.DEFAULT_WIDTH, TableCell.DEFAULT_HEIGHT);
+                cells[i][j] = new HSLFTableCell(this);
+                Rectangle anchor = new Rectangle(x, y, HSLFTableCell.DEFAULT_WIDTH, HSLFTableCell.DEFAULT_HEIGHT);
                 cells[i][j].setAnchor(anchor);
-                x += TableCell.DEFAULT_WIDTH;
+                x += HSLFTableCell.DEFAULT_WIDTH;
             }
-            y += TableCell.DEFAULT_HEIGHT;
+            y += HSLFTableCell.DEFAULT_HEIGHT;
         }
         tblWidth = x;
         tblHeight = y;
@@ -76,7 +80,7 @@
         EscherOptRecord opt = new EscherOptRecord();
         opt.setRecordId((short)0xF122);
         opt.addEscherProperty(new EscherSimpleProperty((short)0x39F, 1));
-        EscherArrayProperty p = new EscherArrayProperty((short)0x43A0, false, null);
+        EscherArrayProperty p = new EscherArrayProperty((short)(0x4000 | 0x3A0), false, null);
         p.setSizeOfElements(0x0004);
         p.setNumberOfElementsInArray(numrows);
         p.setNumberOfElementsInMemory(numrows);
@@ -92,7 +96,7 @@
      * @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
      * @param parent       the parent of the shape
      */
-    public Table(EscherContainerRecord escherRecord, Shape parent) {
+    public HSLFTable(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent) {
         super(escherRecord, parent);
     }
 
@@ -103,7 +107,7 @@
      * @param col the column index (0-based)
      * @return the cell
      */
-    public TableCell getCell(int row, int col) {
+    public HSLFTableCell getCell(int row, int col) {
         return cells[row][col];
     }
 
@@ -114,21 +118,21 @@
         return cells.length;
     }
 
-    protected void afterInsert(Sheet sh){
+    protected void afterInsert(HSLFSheet sh){
         super.afterInsert(sh);
 
         EscherContainerRecord spCont = (EscherContainerRecord) getSpContainer().getChild(0);
         List<EscherRecord> lst = spCont.getChildRecords();
         EscherOptRecord opt = (EscherOptRecord)lst.get(lst.size()-2);
-        EscherArrayProperty p = (EscherArrayProperty)opt.getEscherProperty(1);
+        EscherArrayProperty p = opt.lookup(0x3A0); 
         for (int i = 0; i < cells.length; i++) {
-            TableCell cell = cells[i][0];
+            HSLFTableCell cell = cells[i][0];
             int rowHeight = cell.getAnchor().height*MASTER_DPI/POINT_DPI;
             byte[] val = new byte[4];
-            LittleEndian.putInt(val, rowHeight);
+            LittleEndian.putInt(val, 0, rowHeight);
             p.setElement(i, val);
             for (int j = 0; j < cells[i].length; j++) {
-                TableCell c = cells[i][j];
+                HSLFTableCell c = cells[i][j];
                 addShape(c);
 
                 Line bt = c.getBorderTop();
@@ -149,39 +153,53 @@
     }
 
     protected void initTable(){
-        Shape[] sh = getShapes();
-        Arrays.sort(sh, new Comparator<Shape>(){
-            public int compare( Shape o1, Shape o2 ) {
+        List<HSLFShape> shapeList = getShapeList();
+
+        Iterator<HSLFShape> shapeIter = shapeList.iterator();
+        while (shapeIter.hasNext()) {
+            HSLFShape shape = shapeIter.next();
+            if (shape instanceof HSLFAutoShape) {
+                HSLFAutoShape autoShape = (HSLFAutoShape)shape;
+                EscherTextboxRecord etr = autoShape.getEscherChild(EscherTextboxRecord.RECORD_ID);
+                if (etr != null) continue;
+            }
+            shapeIter.remove();
+        }        
+        
+        Collections.sort(shapeList, new Comparator<HSLFShape>(){
+            public int compare( HSLFShape o1, HSLFShape o2 ) {
                 Rectangle anchor1 = o1.getAnchor();
                 Rectangle anchor2 = o2.getAnchor();
                 int delta = anchor1.y - anchor2.y;
-                if(delta == 0) delta = anchor1.x - anchor2.x;
+                if (delta == 0) delta = anchor1.x - anchor2.x;
+                // descending size
+                if (delta == 0) delta = (anchor2.width*anchor2.height)-(anchor1.width*anchor1.height);
                 return delta;
             }
         });
-
-        int y0 = (sh.length > 0) ? sh[0].getAnchor().y - 1 : -1;
+        
+        int y0 = (shapeList.isEmpty()) ? -1 : shapeList.get(0).getAnchor().y - 1;
         int maxrowlen = 0;
-        List<List<Shape>> lst = new ArrayList<List<Shape>>();
-        List<Shape> row = null;
-        for (int i = 0; i < sh.length; i++) {
-            if(sh[i] instanceof TextShape){
-                Rectangle anchor = sh[i].getAnchor();
+        List<List<HSLFShape>> lst = new ArrayList<List<HSLFShape>>();
+        List<HSLFShape> row = null;
+        for (HSLFShape sh : shapeList) {
+            if(sh instanceof HSLFTextShape){
+                Rectangle anchor = sh.getAnchor();
                 if(anchor.y != y0){
                     y0 = anchor.y;
-                    row = new ArrayList<Shape>();
+                    row = new ArrayList<HSLFShape>();
                     lst.add(row);
                 }
-                row.add(sh[i]);
+                row.add(sh);
                 maxrowlen = Math.max(maxrowlen, row.size());
             }
         }
-        cells = new TableCell[lst.size()][maxrowlen];
+        cells = new HSLFTableCell[lst.size()][maxrowlen];
         for (int i = 0; i < lst.size(); i++) {
             row = lst.get(i);
             for (int j = 0; j < row.size(); j++) {
-                TextShape tx = (TextShape)row.get(j);
-                cells[i][j] = new TableCell(tx.getSpContainer(), getParent());
+                HSLFTextShape tx = (HSLFTextShape)row.get(j);
+                cells[i][j] = new HSLFTableCell(tx.getSpContainer(), getParent());
                 cells[i][j].setSheet(tx.getSheet());
             }
         }
@@ -192,7 +210,7 @@
      *
      * @param sheet owner of this shape
      */
-    public void setSheet(Sheet sheet){
+    public void setSheet(HSLFSheet sheet){
         super.setSheet(sheet);
         if(cells == null) initTable();
     }
@@ -255,7 +273,7 @@
     public void setAllBorders(Line line){
         for (int i = 0; i < cells.length; i++) {
             for (int j = 0; j < cells[i].length; j++) {
-                TableCell cell = cells[i][j];
+                HSLFTableCell cell = cells[i][j];
                 cell.setBorderTop(cloneBorder(line));
                 cell.setBorderLeft(cloneBorder(line));
                 if(j == cells[i].length - 1) cell.setBorderRight(cloneBorder(line));
@@ -272,7 +290,7 @@
     public void setOutsideBorders(Line line){
         for (int i = 0; i < cells.length; i++) {
             for (int j = 0; j < cells[i].length; j++) {
-                TableCell cell = cells[i][j];
+                HSLFTableCell cell = cells[i][j];
 
                 if(j == 0) cell.setBorderLeft(cloneBorder(line));
                 if(j == cells[i].length - 1) cell.setBorderRight(cloneBorder(line));
@@ -299,7 +317,7 @@
     public void setInsideBorders(Line line){
         for (int i = 0; i < cells.length; i++) {
             for (int j = 0; j < cells[i].length; j++) {
-                TableCell cell = cells[i][j];
+                HSLFTableCell cell = cells[i][j];
 
                 if(j != cells[i].length - 1)
                     cell.setBorderRight(cloneBorder(line));
@@ -319,9 +337,9 @@
     private Line cloneBorder(Line line){
         Line border = createBorder();
         border.setLineWidth(line.getLineWidth());
-        border.setLineStyle(line.getLineStyle());
         border.setLineDashing(line.getLineDashing());
         border.setLineColor(line.getLineColor());
+        border.setLineCompound(line.getLineCompound());
         return border;
     }
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java
similarity index 74%
rename from src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java
index 864d55e..b1e7c3e 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/TableCell.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java
@@ -15,18 +15,23 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
-import org.apache.poi.ddf.*;
+import java.awt.Rectangle;
 
-import java.awt.*;
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherOptRecord;
+import org.apache.poi.ddf.EscherProperties;
+import org.apache.poi.hslf.model.Line;
+import org.apache.poi.sl.usermodel.ShapeContainer;
+import org.apache.poi.sl.usermodel.ShapeType;
 
 /**
  * Represents a cell in a ppt table
  *
  * @author Yegor Kozlov
  */
-public final class TableCell extends TextBox {
+public final class HSLFTableCell extends HSLFTextBox {
     protected static final int DEFAULT_WIDTH = 100;
     protected static final int DEFAULT_HEIGHT = 40;
 
@@ -38,10 +43,10 @@
     /**
      * Create a TableCell object and initialize it from the supplied Record container.
      *
-     * @param escherRecord       <code>EscherSpContainer</code> container which holds information about this shape
+     * @param escherRecord       {@link EscherSpContainer} container which holds information about this shape
      * @param parent    the parent of the shape
      */
-   protected TableCell(EscherContainerRecord escherRecord, Shape parent){
+   protected HSLFTableCell(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
     }
 
@@ -51,10 +56,10 @@
      * @param parent    the parent of this Shape. For example, if this text box is a cell
      * in a table then the parent is Table.
      */
-    public TableCell(Shape parent){
+    public HSLFTableCell(ShapeContainer<HSLFShape> parent){
         super(parent);
 
-        setShapeType(ShapeTypes.Rectangle);
+        setShapeType(ShapeType.RECT);
         //_txtrun.setRunType(TextHeaderAtom.HALF_BODY_TYPE);
         //_txtrun.getRichTextRuns()[0].setFlag(false, 0, false);
     }
@@ -75,25 +80,25 @@
         Rectangle cellAnchor = getAnchor();
         Rectangle lineAnchor = new Rectangle();
         switch(type){
-            case Table.BORDER_TOP:
+            case HSLFTable.BORDER_TOP:
                 lineAnchor.x = cellAnchor.x;
                 lineAnchor.y = cellAnchor.y;
                 lineAnchor.width = cellAnchor.width;
                 lineAnchor.height = 0;
                 break;
-            case Table.BORDER_RIGHT:
+            case HSLFTable.BORDER_RIGHT:
                 lineAnchor.x = cellAnchor.x + cellAnchor.width;
                 lineAnchor.y = cellAnchor.y;
                 lineAnchor.width = 0;
                 lineAnchor.height = cellAnchor.height;
                 break;
-            case Table.BORDER_BOTTOM:
+            case HSLFTable.BORDER_BOTTOM:
                 lineAnchor.x = cellAnchor.x;
                 lineAnchor.y = cellAnchor.y + cellAnchor.height;
                 lineAnchor.width = cellAnchor.width;
                 lineAnchor.height = 0;
                 break;
-            case Table.BORDER_LEFT:
+            case HSLFTable.BORDER_LEFT:
                 lineAnchor.x = cellAnchor.x;
                 lineAnchor.y = cellAnchor.y;
                 lineAnchor.width = 0;
@@ -110,7 +115,7 @@
     }
 
     public void setBorderLeft(Line line) {
-        if(line != null) anchorBorder(Table.BORDER_LEFT, line);
+        if(line != null) anchorBorder(HSLFTable.BORDER_LEFT, line);
         this.borderLeft = line;
     }
 
@@ -119,7 +124,7 @@
     }
 
     public void setBorderRight(Line line) {
-        if(line != null) anchorBorder(Table.BORDER_RIGHT, line);
+        if(line != null) anchorBorder(HSLFTable.BORDER_RIGHT, line);
         this.borderRight = line;
     }
 
@@ -128,7 +133,7 @@
     }
 
     public void setBorderTop(Line line) {
-        if(line != null) anchorBorder(Table.BORDER_TOP, line);
+        if(line != null) anchorBorder(HSLFTable.BORDER_TOP, line);
         this.borderTop = line;
     }
 
@@ -137,16 +142,16 @@
     }
 
     public void setBorderBottom(Line line) {
-        if(line != null) anchorBorder(Table.BORDER_BOTTOM, line);
+        if(line != null) anchorBorder(HSLFTable.BORDER_BOTTOM, line);
         this.borderBottom = line;
     }
 
     public void setAnchor(Rectangle anchor){
         super.setAnchor(anchor);
 
-        if(borderTop != null) anchorBorder(Table.BORDER_TOP, borderTop);
-        if(borderRight != null) anchorBorder(Table.BORDER_RIGHT, borderRight);
-        if(borderBottom != null) anchorBorder(Table.BORDER_BOTTOM, borderBottom);
-        if(borderLeft != null) anchorBorder(Table.BORDER_LEFT, borderLeft);
+        if(borderTop != null) anchorBorder(HSLFTable.BORDER_TOP, borderTop);
+        if(borderRight != null) anchorBorder(HSLFTable.BORDER_RIGHT, borderRight);
+        if(borderBottom != null) anchorBorder(HSLFTable.BORDER_BOTTOM, borderBottom);
+        if(borderLeft != null) anchorBorder(HSLFTable.BORDER_LEFT, borderLeft);
     }
 }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextBox.java
similarity index 84%
rename from src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextBox.java
index 46e080e..b7895a6 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextBox.java
@@ -15,9 +15,10 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
 
 import org.apache.poi.ddf.*;
+import org.apache.poi.sl.usermodel.*;
 
 /**
  * Represents a TextFrame shape in PowerPoint.
@@ -28,7 +29,7 @@
  *
  * @author Yegor Kozlov
  */
-public class TextBox extends TextShape {
+public class HSLFTextBox extends HSLFTextShape {
 
     /**
      * Create a TextBox object and initialize it from the supplied Record container.
@@ -36,7 +37,7 @@
      * @param escherRecord       <code>EscherSpContainer</code> container which holds information about this shape
      * @param parent    the parent of the shape
      */
-   protected TextBox(EscherContainerRecord escherRecord, Shape parent){
+   protected HSLFTextBox(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
         super(escherRecord, parent);
 
     }
@@ -47,7 +48,7 @@
      * @param parent    the parent of this Shape. For example, if this text box is a cell
      * in a table then the parent is Table.
      */
-    public TextBox(Shape parent){
+    public HSLFTextBox(ShapeContainer<HSLFShape> parent){
         super(parent);
     }
 
@@ -55,7 +56,7 @@
      * Create a new TextBox. This constructor is used when a new shape is created.
      *
      */
-    public TextBox(){
+    public HSLFTextBox(){
         this(null);
     }
 
@@ -67,7 +68,7 @@
     protected EscherContainerRecord createSpContainer(boolean isChild){
         _escherContainer = super.createSpContainer(isChild);
 
-        setShapeType(ShapeTypes.TextBox);
+        setShapeType(ShapeType.TEXT_BOX);
 
         //set default properties for a TextBox
         setEscherProperty(EscherProperties.FILL__FILLCOLOR, 0x8000004);
@@ -77,13 +78,14 @@
         setEscherProperty(EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x80000);
         setEscherProperty(EscherProperties.SHADOWSTYLE__COLOR, 0x8000002);
 
-        _txtrun = createTextRun();
+        // init paragraphs
+        getTextParagraphs();
 
         return _escherContainer;
     }
 
-    protected void setDefaultTextProperties(TextRun _txtrun){
-        setVerticalAlignment(TextBox.AnchorTop);
+    protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){
+        setVerticalAlignment(VerticalAlignment.TOP);
         setEscherProperty(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE, 0x20002);
     }
 
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java
new file mode 100644
index 0000000..b07a8f8
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java
@@ -0,0 +1,1291 @@
+/* ====================================================================

+   Licensed to the Apache Software Foundation (ASF) under one or more

+   contributor license agreements.  See the NOTICE file distributed with

+   this work for additional information regarding copyright ownership.

+   The ASF licenses this file to You under the Apache License, Version 2.0

+   (the "License"); you may not use this file except in compliance with

+   the License.  You may obtain a copy of the License at

+

+       http://www.apache.org/licenses/LICENSE-2.0

+

+   Unless required by applicable law or agreed to in writing, software

+   distributed under the License is distributed on an "AS IS" BASIS,

+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+   See the License for the specific language governing permissions and

+   limitations under the License.

+==================================================================== */

+

+package org.apache.poi.hslf.usermodel;

+

+import static org.apache.poi.hslf.record.RecordTypes.OutlineTextRefAtom;

+

+import java.awt.Color;

+import java.io.IOException;

+import java.util.*;

+

+import org.apache.poi.hslf.model.PPFont;

+import org.apache.poi.hslf.model.textproperties.*;

+import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType;

+import org.apache.poi.hslf.record.*;

+import org.apache.poi.sl.usermodel.AutoNumberingScheme;

+import org.apache.poi.sl.usermodel.TextParagraph;

+import org.apache.poi.util.*;

+

+/**

+ * This class represents a run of text in a powerpoint document. That

+ *  run could be text on a sheet, or text in a note.

+ *  It is only a very basic class for now

+ * 

+ * @author Nick Burch

+ */

+

+public final class HSLFTextParagraph implements TextParagraph<HSLFTextRun> {

+    protected static POILogger logger = POILogFactory.getLogger(HSLFTextParagraph.class);

+

+    /**

+     * How to align the text

+     */

+    /* package */static final int AlignLeft = 0;

+    /* package */static final int AlignCenter = 1;

+    /* package */static final int AlignRight = 2;

+    /* package */static final int AlignJustify = 3;

+

+    // Note: These fields are protected to help with unit testing

+    // Other classes shouldn't really go playing with them!

+    private final TextHeaderAtom _headerAtom;

+    private TextBytesAtom _byteAtom;

+    private TextCharsAtom _charAtom;

+    private final TextPropCollection _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph);

+

+    protected TextRulerAtom _ruler;

+    protected final List<HSLFTextRun> _runs = new ArrayList<HSLFTextRun>();

+    protected HSLFTextShape _parentShape;

+    private HSLFSheet _sheet;

+    private int shapeId;

+

+    private StyleTextProp9Atom styleTextProp9Atom;

+    

+    private boolean _dirty = false;

+

+    /**

+    * Constructs a Text Run from a Unicode text block.

+    * Either a {@link TextCharsAtom} or a {@link TextBytesAtom} needs to be provided.

+     * 

+    * @param tha the TextHeaderAtom that defines what's what

+    * @param tba the TextBytesAtom containing the text or null if {@link TextCharsAtom} is provided

+    * @param tca the TextCharsAtom containing the text or null if {@link TextBytesAtom} is provided

+     */

+	/* package */ HSLFTextParagraph(

+        TextHeaderAtom tha,

+        TextBytesAtom tba,

+        TextCharsAtom tca

+    ) {

+        if (tha == null) {

+            throw new IllegalArgumentException("TextHeaderAtom must be set.");

+        }

+        _headerAtom = tha;

+        _byteAtom = tba;

+        _charAtom = tca;

+    }

+

+    /* package */HSLFTextParagraph(HSLFTextParagraph other) {

+        _headerAtom = other._headerAtom;

+        _byteAtom = other._byteAtom;

+        _charAtom = other._charAtom;

+        _parentShape = other._parentShape;

+        _sheet = other._sheet;

+        _ruler = other._ruler;

+        shapeId = other.shapeId;

+        _paragraphStyle.copy(other._paragraphStyle);

+    }

+

+    public void addTextRun(HSLFTextRun run) {

+        _runs.add(run);

+    }

+

+    /**

+	 * Fetch the rich text runs (runs of text with the same styling) that

+	 *  are contained within this block of text

+     */

+    public List<HSLFTextRun> getTextRuns() {

+        return _runs;

+    }

+

+    public TextPropCollection getParagraphStyle() {

+        return _paragraphStyle;

+    }

+

+    public void setParagraphStyle(TextPropCollection paragraphStyle) {

+        _paragraphStyle.copy(paragraphStyle);

+    }

+

+    /**

+     * Supply the Sheet we belong to, which might have an assigned SlideShow

+     * Also passes it on to our child RichTextRuns

+     */

+    public void supplySheet(HSLFSheet sheet) {

+        this._sheet = sheet;

+

+        if (_runs == null) return;

+        for (HSLFTextRun rt : _runs) {

+            rt.updateSheet();

+        }

+    }

+

+    public HSLFSheet getSheet() {

+        return this._sheet;

+    }

+

+    /**

+     * @return Shape ID

+     */

+    protected int getShapeId() {

+        return shapeId;

+    }

+

+    /**

+     * @param id Shape ID

+     */

+    protected void setShapeId(int id) {

+        shapeId = id;

+    }

+

+    /**

+     * @return 0-based index of the text run in the SLWT container

+     */

+    protected int getIndex() {

+        return (_headerAtom != null) ? _headerAtom.getIndex() : -1;

+    }

+

+    /**

+     * Sets the index of the paragraph in the SLWT container

+     * 

+     * @param index

+     */

+    protected void setIndex(int index) {

+        if (_headerAtom != null) _headerAtom.setIndex(index);

+    }

+

+    /**

+     * Returns the type of the text, from the TextHeaderAtom.

+     * Possible values can be seen from TextHeaderAtom

+     * @see org.apache.poi.hslf.record.TextHeaderAtom

+     */

+    public int getRunType() {

+        return (_headerAtom != null) ? _headerAtom.getTextType() : -1;

+    }

+

+    public void setRunType(int runType) {

+        if (_headerAtom != null) _headerAtom.setTextType(runType);

+    }

+

+    /**

+     * Is this Text Run one from a {@link PPDrawing}, or is it

+     *  one from the {@link SlideListWithText}?

+     */

+    public boolean isDrawingBased() {

+        return (getIndex() == -1);

+    }

+

+    public TextRulerAtom getTextRuler() {

+        return _ruler;

+

+    }

+

+    public TextRulerAtom createTextRuler() {

+        _ruler = getTextRuler();

+        if (_ruler == null) {

+            _ruler = TextRulerAtom.getParagraphInstance();

+            Record childAfter = _byteAtom;

+            if (childAfter == null) childAfter = _charAtom;

+            if (childAfter == null) childAfter = _headerAtom;

+            _headerAtom.getParentRecord().addChildAfter(_ruler, childAfter);

+        }

+        return _ruler;

+    }

+

+    /**

+     * Returns records that make up the list of text paragraphs

+     * (there can be misc InteractiveInfo, TxInteractiveInfo and other records)

+     * 

+     * @return text run records

+     */

+    public Record[] getRecords() {

+        Record r[] = _headerAtom.getParentRecord().getChildRecords();

+        return getRecords(r, new int[] { 0 }, _headerAtom);

+    }

+

+    private static Record[] getRecords(Record[] records, int[] startIdx, TextHeaderAtom headerAtom) {

+        if (records == null) {

+            throw new NullPointerException("records need to be set.");

+        }

+

+        for (; startIdx[0] < records.length; startIdx[0]++) {

+            Record r = records[startIdx[0]];

+            if (r instanceof TextHeaderAtom && (headerAtom == null || r == headerAtom)) break;

+        }

+

+        if (startIdx[0] >= records.length) {

+            logger.log(POILogger.INFO, "header atom wasn't found - container might contain only an OutlineTextRefAtom");

+            return new Record[0];

+        }

+

+        int length;

+        for (length = 1; startIdx[0] + length < records.length; length++) {

+            Record r = records[startIdx[0]+length];

+            if (r instanceof TextHeaderAtom || r instanceof SlidePersistAtom) break;

+        }

+

+        Record result[] = new Record[length];

+        System.arraycopy(records, startIdx[0], result, 0, length);

+        startIdx[0] += length;

+

+        return result;

+    }

+

+    /** Numbered List info */

+	public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) {

+        this.styleTextProp9Atom = styleTextProp9Atom;

+    }

+

+    /** Numbered List info */

+    public StyleTextProp9Atom getStyleTextProp9Atom() {

+        return this.styleTextProp9Atom;

+    }

+    

+    @Override

+    public Iterator<HSLFTextRun> iterator() {

+        return _runs.iterator();

+    }

+

+    @Override

+    public Double getLeftMargin() {

+        TextProp val = getPropVal(_paragraphStyle, "text.offset", this);

+        return (val == null) ? null : Units.masterToPoints(val.getValue());

+    }

+

+    @Override

+    public void setLeftMargin(Double leftMargin) {

+        Integer val = (leftMargin == null) ? null : Units.pointsToMaster(leftMargin);

+        setParagraphTextPropVal("text.offset", val);

+    }

+

+    @Override

+    public Double getRightMargin() {

+        // TODO: find out, how to determine this value

+        return null;

+    }

+

+    @Override

+    public void setRightMargin(Double rightMargin) {

+        // TODO: find out, how to set this value

+    }

+

+    @Override

+    public Double getIndent() {

+        TextProp val = getPropVal(_paragraphStyle, "bullet.offset", this);

+        return (val == null) ? null : Units.masterToPoints(val.getValue());

+    }

+

+    @Override

+    public void setIndent(Double indent) {

+        Integer val = (indent == null) ? null : Units.pointsToMaster(indent);

+        setParagraphTextPropVal("bullet.offset", val);

+    }

+

+    @Override

+    public String getDefaultFontFamily() {

+        String typeface = null;

+        if (!_runs.isEmpty()) {

+            typeface = _runs.get(0).getFontFamily();

+        }

+        return (typeface != null) ? typeface : "Arial";

+    }

+

+    @Override

+    public Double getDefaultFontSize() {

+        Double d = null;

+        if (!_runs.isEmpty()) {

+            d = _runs.get(0).getFontSize();

+        }

+        

+        return (d != null) ? d : 12d;

+    }

+

+    /**

+     * Sets the type of horizontal alignment for the paragraph.

+     * 

+     * @param align - the type of alignment

+     */

+    public void setAlignment(org.apache.poi.sl.usermodel.TextParagraph.TextAlign align) {

+        Integer alignInt = null;

+        if (align != null) switch (align) {

+            default:

+            case LEFT: alignInt = TextAlignmentProp.LEFT;break;

+            case CENTER: alignInt = TextAlignmentProp.CENTER; break;

+            case RIGHT: alignInt = TextAlignmentProp.RIGHT; break;

+            case DIST: alignInt = TextAlignmentProp.DISTRIBUTED; break;

+            case JUSTIFY: alignInt = TextAlignmentProp.JUSTIFY; break;

+            case JUSTIFY_LOW: alignInt = TextAlignmentProp.JUSTIFYLOW; break;

+            case THAI_DIST: alignInt = TextAlignmentProp.THAIDISTRIBUTED; break;

+        }

+        setParagraphTextPropVal("alignment", alignInt);

+    }

+

+    @Override

+    public org.apache.poi.sl.usermodel.TextParagraph.TextAlign getTextAlign() {

+        TextProp tp = getPropVal(_paragraphStyle, "alignment", this);

+        if (tp == null) return null;

+        switch (tp.getValue()) {

+            default:

+            case TextAlignmentProp.LEFT: return TextAlign.LEFT;

+            case TextAlignmentProp.CENTER: return TextAlign.CENTER;

+            case TextAlignmentProp.RIGHT: return TextAlign.RIGHT;

+            case TextAlignmentProp.JUSTIFY: return TextAlign.JUSTIFY;

+            case TextAlignmentProp.JUSTIFYLOW: return TextAlign.JUSTIFY_LOW;

+            case TextAlignmentProp.DISTRIBUTED: return TextAlign.DIST;

+            case TextAlignmentProp.THAIDISTRIBUTED: return TextAlign.THAI_DIST;

+        }

+    }

+

+    @Override

+    public FontAlign getFontAlign() {

+        TextProp tp = getPropVal(_paragraphStyle, FontAlignmentProp.NAME, this);

+        if (tp == null) return null;

+        

+        switch (tp.getValue()) {

+            case FontAlignmentProp.BASELINE: return FontAlign.BASELINE;

+            case FontAlignmentProp.TOP: return FontAlign.TOP;

+            case FontAlignmentProp.CENTER: return FontAlign.CENTER;

+            case FontAlignmentProp.BOTTOM: return FontAlign.BOTTOM;

+            default: return FontAlign.AUTO;

+        }

+    }

+

+    public AutoNumberingScheme getAutoNumberingScheme() {

+        if (styleTextProp9Atom == null) return null;

+        TextPFException9[] ant = styleTextProp9Atom.getAutoNumberTypes();

+        int level = getIndentLevel();

+        if (ant == null || level  >= ant.length) return null;

+        return ant[level].getAutoNumberScheme();

+    }

+

+    public Integer getAutoNumberingStartAt() {

+        if (styleTextProp9Atom == null) return null;

+        TextPFException9[] ant = styleTextProp9Atom.getAutoNumberTypes();

+        int level = getIndentLevel();

+        if (ant == null || level  >= ant.length) return null;

+        Short startAt = ant[level].getAutoNumberStartNumber();

+        assert(startAt != null);

+        return startAt.intValue();

+    }

+    

+    

+    @Override

+    public BulletStyle getBulletStyle() {

+        if (!isBullet() && getAutoNumberingScheme() == null) return null;

+

+        return new BulletStyle() {

+            @Override

+            public String getBulletCharacter() {

+                Character chr = HSLFTextParagraph.this.getBulletChar();

+                return (chr == null || chr == 0) ? "" : "" + chr;

+            }

+

+            @Override

+            public String getBulletFont() {

+                return HSLFTextParagraph.this.getBulletFont();

+            }

+

+            @Override

+            public Double getBulletFontSize() {

+                return HSLFTextParagraph.this.getBulletSize();

+            }

+

+            @Override

+            public Color getBulletFontColor() {

+                return HSLFTextParagraph.this.getBulletColor();

+            }

+

+            @Override

+            public AutoNumberingScheme getAutoNumberingScheme() {

+                return HSLFTextParagraph.this.getAutoNumberingScheme();

+            }

+

+            @Override

+            public Integer getAutoNumberingStartAt() {

+                return HSLFTextParagraph.this.getAutoNumberingStartAt();

+            }

+        };

+    }

+

+    @Override

+    public HSLFTextShape getParentShape() {

+        return _parentShape;

+    }

+

+    public void setParentShape(HSLFTextShape parentShape) {

+        _parentShape = parentShape;

+    }

+

+    @Override

+    public int getIndentLevel() {

+        return _paragraphStyle == null ? 0 : _paragraphStyle.getIndentLevel();

+    }

+

+    @Override

+    public void setIndentLevel(int level) {

+       if( _paragraphStyle != null ) _paragraphStyle.setIndentLevel((short)level);

+    }

+

+    /**

+     * Sets whether this rich text run has bullets

+     */

+    public void setBullet(boolean flag) {

+        setFlag(ParagraphFlagsTextProp.BULLET_IDX, flag);

+    }

+

+    /**

+     * Returns whether this rich text run has bullets

+     */

+    public boolean isBullet() {

+        return getFlag(ParagraphFlagsTextProp.BULLET_IDX);

+    }

+

+    /**

+     * Sets the bullet character

+     */

+    public void setBulletChar(Character c) {

+        Integer val = (c == null) ? null : (int)c.charValue();

+        setParagraphTextPropVal("bullet.char", val);

+    }

+

+    /**

+     * Returns the bullet character

+     */

+    public Character getBulletChar() {

+        TextProp tp = getPropVal(_paragraphStyle, "bullet.char", this);

+        return (tp == null) ? null : (char)tp.getValue();

+    }

+

+    /**

+     * Sets the bullet size

+     */

+    public void setBulletSize(Double size) {

+        setPctOrPoints("bullet.size", size);

+    }

+

+    /**

+     * Returns the bullet size, null if unset

+     */

+    public Double getBulletSize() {

+        return getPctOrPoints("bullet.size");

+    }

+

+    /**

+     * Sets the bullet color

+     */

+    public void setBulletColor(Color color) {

+        Integer val = (color == null) ? null : new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB();

+        setParagraphTextPropVal("bullet.color", val);

+    }

+

+    /**

+     * Returns the bullet color

+     */

+    public Color getBulletColor() {

+        TextProp tp = getPropVal(_paragraphStyle, "bullet.color", this);

+        if (tp == null) {

+            // if bullet color is undefined, return color of first run

+            return (_runs.isEmpty()) ? null : _runs.get(0).getFontColor();

+        }

+

+        return getColorFromColorIndexStruct(tp.getValue(), _sheet);

+    }

+

+    /**

+     * Sets the bullet font

+     */

+    public void setBulletFont(String typeface) {

+        if (typeface == null) {

+            setPropVal(_paragraphStyle, "bullet.font", null);

+            setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, false);

+        }

+

+        FontCollection fc = getSheet().getSlideShow().getFontCollection();

+        int idx = fc.addFont(typeface);

+

+        setParagraphTextPropVal("bullet.font", idx);

+        setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true);

+    }

+

+    /**

+     * Returns the bullet font

+     */

+    public String getBulletFont() {

+        TextProp tp = getPropVal(_paragraphStyle, "bullet.font", this);

+        if (tp == null) return getDefaultFontFamily();

+        PPFont ppFont = getSheet().getSlideShow().getFont(tp.getValue());

+        assert(ppFont != null);

+        return ppFont.getFontName();

+    }

+

+    @Override

+    public void setLineSpacing(Double lineSpacing) {

+        setPctOrPoints("linespacing", lineSpacing);

+    }

+

+    @Override

+    public Double getLineSpacing() {

+        return getPctOrPoints("linespacing");

+    }

+

+    @Override

+    public void setSpaceBefore(Double spaceBefore) {

+        setPctOrPoints("spacebefore", spaceBefore);

+    }

+

+    @Override

+    public Double getSpaceBefore() {

+        return getPctOrPoints("spacebefore");

+    }

+

+    @Override

+    public void setSpaceAfter(Double spaceAfter) {

+        setPctOrPoints("spaceafter", spaceAfter);

+    }

+

+    @Override

+    public Double getSpaceAfter() {

+        return getPctOrPoints("spaceafter");

+    }

+

+    @Override

+    public Double getDefaultTabSize() {

+        // TODO: implement

+        return null;

+    }

+    

+    private Double getPctOrPoints(String propName) {

+        TextProp tp = getPropVal(_paragraphStyle, propName, this);

+        if (tp == null) return null;

+        int val = tp.getValue();

+        return (val < 0) ? Units.masterToPoints(val) : val;

+    }

+

+    private void setPctOrPoints(String propName, Double dval) {

+        Integer ival = null;

+        if (dval != null) {

+            ival = (dval < 0) ? Units.pointsToMaster(dval) : dval.intValue();

+        }

+        setParagraphTextPropVal(propName, ival);

+    }

+    

+    private boolean getFlag(int index) {

+        BitMaskTextProp tp = (BitMaskTextProp)getPropVal(_paragraphStyle, ParagraphFlagsTextProp.NAME, this);

+        return (tp == null) ? false : tp.getSubValue(index);

+    }

+

+    private void setFlag(int index, boolean value) {

+        BitMaskTextProp tp = (BitMaskTextProp)_paragraphStyle.addWithName(ParagraphFlagsTextProp.NAME);

+        tp.setSubValue(value, index);

+        setDirty();

+    }

+

+    /**

+     * Fetch the value of the given Paragraph related TextProp. Returns null if

+     * that TextProp isn't present. If the TextProp isn't present, the value

+     * from the appropriate Master Sheet will apply.

+     */

+    protected static TextProp getPropVal(TextPropCollection props, String propName, HSLFTextParagraph paragraph) {

+        TextProp prop = props.findByName(propName);

+        if (prop != null) return prop;

+

+        BitMaskTextProp maskProp = (BitMaskTextProp) props.findByName(ParagraphFlagsTextProp.NAME);

+        boolean hardAttribute = (maskProp != null && maskProp.getValue() == 0);

+        if (hardAttribute) return null;

+

+        HSLFSheet sheet = paragraph.getSheet();

+        int txtype = paragraph.getRunType();

+        HSLFMasterSheet master = sheet.getMasterSheet();

+        if (master == null) {

+            logger.log(POILogger.WARN, "MasterSheet is not available");

+            return null;

+        }

+

+        boolean isChar = props.getTextPropType() == TextPropType.character;

+        return master.getStyleAttribute(txtype, paragraph.getIndentLevel(), propName, isChar);

+    }

+

+    /**

+     * Returns the named TextProp, either by fetching it (if it exists) or

+     * adding it (if it didn't)

+     * 

+     * @param props the TextPropCollection to fetch from / add into

+     * @param name the name of the TextProp to fetch/add

+     * @param val the value, null if unset

+     */

+    protected static void setPropVal(TextPropCollection props, String name, Integer val) {

+        if (val == null) {

+            props.removeByName(name);

+            return;

+        }

+        

+        // Fetch / Add the TextProp

+        TextProp tp = props.addWithName(name);

+        tp.setValue(val);

+    }

+    

+    /**

+     * Check and add linebreaks to text runs leading other paragraphs

+     * 

+     * @param paragraphs

+     */

+    protected static void fixLineEndings(List<HSLFTextParagraph> paragraphs) {

+        HSLFTextRun lastRun = null;

+        for (HSLFTextParagraph p : paragraphs) {

+            if (lastRun != null && !lastRun.getRawText().endsWith("\r")) {

+                lastRun.setText(lastRun.getRawText() + "\r");

+            }

+            List<HSLFTextRun> ltr = p.getTextRuns();

+            if (ltr.isEmpty()) {

+                throw new RuntimeException("paragraph without textruns found");

+            }

+            lastRun = ltr.get(ltr.size() - 1);

+            assert (lastRun.getRawText() != null);

+        }

+    }

+

+    /**

+     * Search for a StyleTextPropAtom is for this text header (list of paragraphs)

+     * 

+     * @param header the header

+     * @param textLen the length of the rawtext, or -1 if the length is not known

+     */

+    private static StyleTextPropAtom findStyleAtomPresent(TextHeaderAtom header, int textLen) {

+        boolean afterHeader = false;

+        StyleTextPropAtom style = null;

+        for (Record record : header.getParentRecord().getChildRecords()) {

+            long rt = record.getRecordType();

+            if (afterHeader && rt == RecordTypes.TextHeaderAtom.typeID) {

+                // already on the next header, quit searching

+                break;

+            }

+            afterHeader |= (header == record);

+            if (afterHeader && rt == RecordTypes.StyleTextPropAtom.typeID) {

+                // found it

+                style = (StyleTextPropAtom) record;

+            }

+        }

+

+        if (style == null) {

+            logger.log(POILogger.INFO, "styles atom doesn't exist. Creating dummy record for later saving.");

+            style = new StyleTextPropAtom((textLen < 0) ? 1 : textLen);

+        } else {

+            if (textLen >= 0) {

+                style.setParentTextSize(textLen);

+            }

+        }

+

+        return style;

+    }

+

+    /**

+     * Saves the modified paragraphs/textrun to the records.

+     * Also updates the styles to the correct text length.

+     */

+    protected static void storeText(List<HSLFTextParagraph> paragraphs) {

+        fixLineEndings(paragraphs);

+

+        String rawText = toInternalString(getRawText(paragraphs));

+

+        // Will it fit in a 8 bit atom?

+        boolean isUnicode = StringUtil.hasMultibyte(rawText);

+        // isUnicode = true;

+

+        TextHeaderAtom headerAtom = paragraphs.get(0)._headerAtom;

+        TextBytesAtom byteAtom = paragraphs.get(0)._byteAtom;

+        TextCharsAtom charAtom = paragraphs.get(0)._charAtom;

+        StyleTextPropAtom styleAtom = findStyleAtomPresent(headerAtom, rawText.length());

+

+        // Store in the appropriate record

+        Record oldRecord = null, newRecord = null;

+        if (isUnicode) {

+            if (byteAtom != null || charAtom == null) {

+                oldRecord = byteAtom;

+                charAtom = new TextCharsAtom();

+            }

+            newRecord = charAtom;

+            charAtom.setText(rawText);

+        } else {

+            if (charAtom != null || byteAtom == null) {

+                oldRecord = charAtom;

+                byteAtom = new TextBytesAtom();

+            }

+            newRecord = byteAtom;

+            byte[] byteText = new byte[rawText.length()];

+            StringUtil.putCompressedUnicode(rawText, byteText, 0);

+            byteAtom.setText(byteText);

+        }

+        assert (newRecord != null);

+

+        RecordContainer _txtbox = headerAtom.getParentRecord();

+        Record[] cr = _txtbox.getChildRecords();

+        int headerIdx = -1, textIdx = -1, styleIdx = -1;

+        for (int i = 0; i < cr.length; i++) {

+            Record r = cr[i];

+            if (r == headerAtom) headerIdx = i;

+            else if (r == oldRecord || r == newRecord) textIdx = i;

+            else if (r == styleAtom) styleIdx = i;

+        }

+

+        if (textIdx == -1) {

+            // the old record was never registered, ignore it

+            _txtbox.addChildAfter(newRecord, headerAtom);

+            textIdx = headerIdx + 1;

+        } else {

+            // swap not appropriated records - noop if unchanged

+            cr[textIdx] = newRecord;

+        }

+

+        if (styleIdx == -1) {

+            // Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom

+            _txtbox.addChildAfter(styleAtom, newRecord);

+        }

+

+        for (HSLFTextParagraph p : paragraphs) {

+            if (newRecord == byteAtom) {

+                p._byteAtom = byteAtom;

+                p._charAtom = null;

+            } else {

+                p._byteAtom = null;

+                p._charAtom = charAtom;

+            }

+        }

+

+        // Update the text length for its Paragraph and Character stylings

+        // * reset the length, to the new string's length

+        // * add on +1 if the last block

+

+        styleAtom.clearStyles();

+

+        TextPropCollection lastPTPC = null, lastRTPC = null, ptpc = null, rtpc = null;

+        for (HSLFTextParagraph para : paragraphs) {

+            ptpc = para.getParagraphStyle();

+            ptpc.updateTextSize(0);

+            if (!ptpc.equals(lastPTPC)) {

+                lastPTPC = styleAtom.addParagraphTextPropCollection(0);

+                lastPTPC.copy(ptpc);

+            }

+            for (HSLFTextRun tr : para.getTextRuns()) {

+                rtpc = tr.getCharacterStyle();

+                rtpc.updateTextSize(0);

+                if (!rtpc.equals(lastRTPC)) {

+                    lastRTPC = styleAtom.addCharacterTextPropCollection(0);

+                    lastRTPC.copy(rtpc);

+                }

+                int len = tr.getLength();

+                ptpc.updateTextSize(ptpc.getCharactersCovered() + len);

+                rtpc.updateTextSize(len);

+                lastPTPC.updateTextSize(lastPTPC.getCharactersCovered() + len);

+                lastRTPC.updateTextSize(lastRTPC.getCharactersCovered() + len);

+            }

+        }

+

+        assert (lastPTPC != null && lastRTPC != null && ptpc != null && rtpc != null);

+        ptpc.updateTextSize(ptpc.getCharactersCovered() + 1);

+        rtpc.updateTextSize(rtpc.getCharactersCovered() + 1);

+        lastPTPC.updateTextSize(lastPTPC.getCharactersCovered() + 1);

+        lastRTPC.updateTextSize(lastRTPC.getCharactersCovered() + 1);

+

+        /**

+         * If TextSpecInfoAtom is present, we must update the text size in it,

+         * otherwise the ppt will be corrupted

+         */

+        for (Record r : paragraphs.get(0).getRecords()) {

+            if (r instanceof TextSpecInfoAtom) {

+                ((TextSpecInfoAtom) r).setParentSize(rawText.length() + 1);

+                break;

+            }

+        }

+

+        if (_txtbox instanceof EscherTextboxWrapper) {

+            try {

+                ((EscherTextboxWrapper) _txtbox).writeOut(null);

+            } catch (IOException e) {

+                throw new RuntimeException("failed dummy write", e);

+            }

+        }

+        

+        for (HSLFTextParagraph p : paragraphs) {

+            p._dirty = false;

+        }

+    }

+

+    /**

+     * Adds the supplied text onto the end of the TextParagraphs,

+     * creating a new RichTextRun for it to sit in.

+     * 

+     * @param text the text string used by this object.

+     */

+    protected static HSLFTextRun appendText(List<HSLFTextParagraph> paragraphs, String text, boolean newParagraph) {

+        text = toInternalString(text);

+

+        // check paragraphs

+        assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty());

+

+        HSLFTextParagraph htp = paragraphs.get(paragraphs.size() - 1);

+        HSLFTextRun htr = htp.getTextRuns().get(htp.getTextRuns().size() - 1);

+

+        boolean isFirst = !newParagraph;

+        for (String rawText : text.split("(?<=\r)")) {

+            if (!isFirst) {

+                TextPropCollection tpc = htp.getParagraphStyle();

+                HSLFTextParagraph prevHtp = htp;

+                htp = new HSLFTextParagraph(htp._headerAtom, htp._byteAtom, htp._charAtom);

+                htp.getParagraphStyle().copy(tpc);

+                htp.setParentShape(prevHtp.getParentShape());

+                htp.setShapeId(prevHtp.getShapeId());

+                htp.supplySheet(prevHtp.getSheet());

+                paragraphs.add(htp);

+            }

+            isFirst = false;

+

+            TextPropCollection tpc = htr.getCharacterStyle();

+            // special case, last text run is empty, we will reuse it

+            if (htr.getLength() > 0) {

+                htr = new HSLFTextRun(htp);

+                htr.getCharacterStyle().copy(tpc);

+                htp.addTextRun(htr);

+            }

+            htr.setText(rawText);

+        }

+

+        storeText(paragraphs);

+

+        return htr;

+    }

+

+    /**

+     * Sets (overwrites) the current text.

+     * Uses the properties of the first paragraph / textrun

+     * 

+     * @param text the text string used by this object.

+     */

+    public static HSLFTextRun setText(List<HSLFTextParagraph> paragraphs, String text) {

+        // check paragraphs

+        assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty());

+

+        Iterator<HSLFTextParagraph> paraIter = paragraphs.iterator();

+        HSLFTextParagraph htp = paraIter.next(); // keep first

+        assert (htp != null);

+        while (paraIter.hasNext()) {

+            paraIter.next();

+            paraIter.remove();

+        }

+

+        Iterator<HSLFTextRun> runIter = htp.getTextRuns().iterator();

+        HSLFTextRun htr = runIter.next();

+        htr.setText("");

+        assert (htr != null);

+        while (runIter.hasNext()) {

+            runIter.next();

+            runIter.remove();

+        }

+

+        return appendText(paragraphs, text, false);

+    }

+

+    public static String getText(List<HSLFTextParagraph> paragraphs) {

+        assert (!paragraphs.isEmpty());

+        String rawText = getRawText(paragraphs);

+        return toExternalString(rawText, paragraphs.get(0).getRunType());

+    }

+

+    public static String getRawText(List<HSLFTextParagraph> paragraphs) {

+        StringBuilder sb = new StringBuilder();

+        for (HSLFTextParagraph p : paragraphs) {

+            for (HSLFTextRun r : p.getTextRuns()) {

+                sb.append(r.getRawText());

+            }

+        }

+        return sb.toString();

+    }

+

+    /**

+     * Returns a new string with line breaks converted into internal ppt

+     * representation

+     */

+    protected static String toInternalString(String s) {

+        String ns = s.replaceAll("\\r?\\n", "\r");

+        return ns;

+    }

+

+    /**

+     * Converts raw text from the text paragraphs to a formatted string,

+     * i.e. it converts certain control characters used in the raw txt

+     * 

+     * @param rawText the raw text

+     * @param runType the run type of the shape, paragraph or headerAtom.

+     *        use -1 if unknown

+     * @return the formatted string

+     */

+    public static String toExternalString(String rawText, int runType) {

+        // PowerPoint seems to store files with \r as the line break

+        // The messes things up on everything but a Mac, so translate

+        // them to \n

+        String text = rawText.replace('\r', '\n');

+

+        switch (runType) {

+        // 0xB acts like cariage return in page titles and like blank in the

+        // others

+        case -1:

+        case org.apache.poi.hslf.record.TextHeaderAtom.TITLE_TYPE:

+        case org.apache.poi.hslf.record.TextHeaderAtom.CENTER_TITLE_TYPE:

+            text = text.replace((char) 0x0B, '\n');

+            break;

+        default:

+            text = text.replace((char) 0x0B, ' ');

+            break;

+        }

+

+        return text;

+    }

+

+    /**

+     * For a given PPDrawing, grab all the TextRuns

+     */

+   public static List<List<HSLFTextParagraph>> findTextParagraphs(PPDrawing ppdrawing, HSLFSheet sheet) {

+        List<List<HSLFTextParagraph>> runsV = new ArrayList<List<HSLFTextParagraph>>();

+        for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) {

+            List<HSLFTextParagraph> p = findTextParagraphs(wrapper, sheet);

+            if (p != null) runsV.add(p);

+        }

+        return runsV;

+    }

+

+    /**

+     * Scans through the supplied record array, looking for

+     * a TextHeaderAtom followed by one of a TextBytesAtom or

+     * a TextCharsAtom. Builds up TextRuns from these

+     * 

+     * @param wrapper an EscherTextboxWrapper

+     */

+    protected static List<HSLFTextParagraph> findTextParagraphs(EscherTextboxWrapper wrapper, HSLFSheet sheet) {

+        // propagate parents to parent-aware records

+        RecordContainer.handleParentAwareRecords(wrapper);

+        int shapeId = wrapper.getShapeId();

+        List<HSLFTextParagraph> rv = null;

+

+        OutlineTextRefAtom ota = (OutlineTextRefAtom)wrapper.findFirstOfType(OutlineTextRefAtom.typeID);

+        if (ota != null) {

+            // if we are based on an outline, there are no further records to be parsed from the wrapper

+            if (sheet == null) {

+                throw new RuntimeException("Outline atom reference can't be solved without a sheet record");

+            }

+

+            List<List<HSLFTextParagraph>> sheetRuns = sheet.getTextParagraphs();

+            assert (sheetRuns != null);

+

+            int idx = ota.getTextIndex();

+            for (List<HSLFTextParagraph> r : sheetRuns) {

+                if (r.isEmpty()) continue;

+                int ridx = r.get(0).getIndex();

+                if (ridx > idx) break;

+                if (ridx == idx) {

+                    if (rv == null) {

+                        rv = r;

+                    } else {

+                        // create a new container

+                        // TODO: ... is this case really happening?

+                        rv = new ArrayList<HSLFTextParagraph>(rv);

+                        rv.addAll(r);

+                    }

+                }

+            }

+            if (rv == null || rv.isEmpty()) {

+                logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx);

+            }

+        } else {

+            if (sheet != null) {

+                // check sheet runs first, so we get exactly the same paragraph list

+                List<List<HSLFTextParagraph>> sheetRuns = sheet.getTextParagraphs();

+                assert (sheetRuns != null);

+

+                for (List<HSLFTextParagraph> paras : sheetRuns) {

+                   if (!paras.isEmpty() && paras.get(0)._headerAtom.getParentRecord() == wrapper) {

+                        rv = paras;

+                        break;

+                    }

+                }

+            }

+

+            if (rv == null) {

+                // if we haven't found the wrapper in the sheet runs, create a new paragraph list from its record

+                List<List<HSLFTextParagraph>> rvl = findTextParagraphs(wrapper.getChildRecords());

+                switch (rvl.size()) {

+                case 0: break; // nothing found

+                case 1: rv = rvl.get(0); break; // normal case

+                default:

+                    throw new RuntimeException("TextBox contains more than one list of paragraphs.");

+                }

+            }

+        }

+

+        if (rv != null) {

+            StyleTextProp9Atom styleTextProp9Atom = wrapper.getStyleTextProp9Atom();

+

+            for (HSLFTextParagraph htp : rv) {

+                htp.setShapeId(shapeId);

+                htp.setStyleTextProp9Atom(styleTextProp9Atom);

+            }

+        }

+        return rv;

+    }

+

+    /**

+     * Scans through the supplied record array, looking for

+     * a TextHeaderAtom followed by one of a TextBytesAtom or

+     * a TextCharsAtom. Builds up TextRuns from these

+     * 

+     * @param records the records to build from

+     */

+    protected static List<List<HSLFTextParagraph>> findTextParagraphs(Record[] records) {

+        List<List<HSLFTextParagraph>> paragraphCollection = new ArrayList<List<HSLFTextParagraph>>();

+

+        int[] recordIdx = { 0 };

+

+        for (int slwtIndex = 0; recordIdx[0] < records.length; slwtIndex++) {

+            TextHeaderAtom header = null;

+            TextBytesAtom tbytes = null;

+            TextCharsAtom tchars = null;

+            TextRulerAtom ruler = null;

+            MasterTextPropAtom indents = null;

+

+            for (Record r : getRecords(records, recordIdx, null)) {

+                long rt = r.getRecordType();

+                if (RecordTypes.TextHeaderAtom.typeID == rt) {

+                    header = (TextHeaderAtom) r;

+                } else if (RecordTypes.TextBytesAtom.typeID == rt) {

+                    tbytes = (TextBytesAtom) r;

+                } else if (RecordTypes.TextCharsAtom.typeID == rt) {

+                    tchars = (TextCharsAtom) r;

+                } else if (RecordTypes.TextRulerAtom.typeID == rt) {

+                    ruler = (TextRulerAtom) r;

+                } else if (RecordTypes.MasterTextPropAtom.typeID == rt) {

+                    indents = (MasterTextPropAtom) r;

+                }

+                // don't search for RecordTypes.StyleTextPropAtom.typeID here ... see findStyleAtomPresent below

+            }

+

+            if (header == null) break;

+

+            if (header.getParentRecord() instanceof SlideListWithText) {

+                // runs found in PPDrawing are not linked with SlideListWithTexts

+                header.setIndex(slwtIndex);

+            }

+

+            if (tbytes == null && tchars == null) {

+                tbytes = new TextBytesAtom();

+                // don't add record yet - set it in storeText

+                logger.log(POILogger.INFO, "bytes nor chars atom doesn't exist. Creating dummy record for later saving.");

+            }

+

+            String rawText = (tchars != null) ? tchars.getText() : tbytes.getText();

+            StyleTextPropAtom styles = findStyleAtomPresent(header, rawText.length());

+

+            List<HSLFTextParagraph> paragraphs = new ArrayList<HSLFTextParagraph>();

+            paragraphCollection.add(paragraphs);

+

+            // split, but keep delimiter

+            for (String para : rawText.split("(?<=\r)")) {

+                HSLFTextParagraph tpara = new HSLFTextParagraph(header, tbytes, tchars);

+                paragraphs.add(tpara);

+                tpara._ruler = ruler;

+                tpara.getParagraphStyle().updateTextSize(para.length());

+

+                HSLFTextRun trun = new HSLFTextRun(tpara);

+                tpara.addTextRun(trun);

+                trun.setText(para);

+            }

+

+            applyCharacterStyles(paragraphs, styles.getCharacterStyles());

+            applyParagraphStyles(paragraphs, styles.getParagraphStyles());

+            if (indents != null) {

+                applyParagraphIndents(paragraphs, indents.getIndents());

+            }

+        }

+

+        if (paragraphCollection.isEmpty()) {

+            logger.log(POILogger.DEBUG, "No text records found.");

+        }

+

+        return paragraphCollection;

+    }

+

+    protected static void applyCharacterStyles(List<HSLFTextParagraph> paragraphs, List<TextPropCollection> charStyles) {

+        int paraIdx = 0, runIdx = 0;

+        HSLFTextRun trun;

+

+        for (int csIdx = 0; csIdx < charStyles.size(); csIdx++) {

+            TextPropCollection p = charStyles.get(csIdx);

+            for (int ccRun = 0, ccStyle = p.getCharactersCovered(); ccRun < ccStyle;) {

+                HSLFTextParagraph para = paragraphs.get(paraIdx);

+                List<HSLFTextRun> runs = para.getTextRuns();

+                trun = runs.get(runIdx);

+                int len = trun.getLength();

+

+                if (ccRun + len <= ccStyle) {

+                    ccRun += len;

+                } else {

+                    String text = trun.getRawText();

+                    trun.setText(text.substring(0, ccStyle - ccRun));

+

+                    HSLFTextRun nextRun = new HSLFTextRun(para);

+                    nextRun.setText(text.substring(ccStyle - ccRun));

+                    runs.add(runIdx + 1, nextRun);

+

+                    ccRun += ccStyle - ccRun;

+                }

+

+                TextPropCollection pCopy = new TextPropCollection(0, TextPropType.character);

+                pCopy.copy(p);

+                trun.setCharacterStyle(pCopy);

+

+                len = trun.getLength();

+                if (paraIdx == paragraphs.size()-1 && runIdx == runs.size()-1) {

+                    if (csIdx < charStyles.size() - 1) {

+                        // special case, empty trailing text run

+                        HSLFTextRun nextRun = new HSLFTextRun(para);

+                        nextRun.setText("");

+                        runs.add(nextRun);

+                        ccRun++;

+                    } else {

+                        // need to add +1 to the last run of the last paragraph

+                        len++;

+                        ccRun++;

+                    }

+                }

+                pCopy.updateTextSize(len);

+

+                // need to compare it again, in case a run has been added after

+                if (++runIdx == runs.size()) {

+                    paraIdx++;

+                    runIdx = 0;

+                }

+            }

+        }

+    }

+

+    protected static void applyParagraphStyles(List<HSLFTextParagraph> paragraphs, List<TextPropCollection> paraStyles) {

+        int paraIdx = 0;

+        for (TextPropCollection p : paraStyles) {

+            for (int ccPara = 0, ccStyle = p.getCharactersCovered(); ccPara < ccStyle; paraIdx++) {

+                if (paraIdx >= paragraphs.size() || ccPara >= ccStyle-1) return;

+                HSLFTextParagraph htp = paragraphs.get(paraIdx);

+                TextPropCollection pCopy = new TextPropCollection(0, TextPropType.paragraph);

+                pCopy.copy(p);

+                htp.setParagraphStyle(pCopy);

+                int len = 0;

+                for (HSLFTextRun trun : htp.getTextRuns()) {

+                    len += trun.getLength();

+                }

+                if (paraIdx == paragraphs.size()-1) len++;

+                pCopy.updateTextSize(len);

+                ccPara += len;

+            }

+        }

+    }

+

+    protected static void applyParagraphIndents(List<HSLFTextParagraph> paragraphs, List<IndentProp> paraStyles) {

+        int paraIdx = 0;

+        for (IndentProp p : paraStyles) {

+            for (int ccPara = 0, ccStyle = p.getCharactersCovered(); ccPara < ccStyle; paraIdx++) {

+                HSLFTextParagraph para = paragraphs.get(paraIdx);

+                int len = 0;

+                for (HSLFTextRun trun : para.getTextRuns()) {

+                    len += trun.getLength();

+                }

+                para.setIndentLevel(p.getIndentLevel());

+                ccPara += len + 1;

+            }

+        }

+    }

+

+    protected static List<HSLFTextParagraph> createEmptyParagraph() {

+        EscherTextboxWrapper wrapper = new EscherTextboxWrapper();

+        return createEmptyParagraph(wrapper);

+    }

+    

+    protected static List<HSLFTextParagraph> createEmptyParagraph(EscherTextboxWrapper wrapper) {

+        TextHeaderAtom tha = new TextHeaderAtom();

+        tha.setParentRecord(wrapper);

+        wrapper.appendChildRecord(tha);

+

+        TextBytesAtom tba = new TextBytesAtom();

+        tba.setText("".getBytes());

+        wrapper.appendChildRecord(tba);

+

+        StyleTextPropAtom sta = new StyleTextPropAtom(1);

+        TextPropCollection paraStyle = sta.addParagraphTextPropCollection(1);

+        TextPropCollection charStyle = sta.addCharacterTextPropCollection(1);

+        wrapper.appendChildRecord(sta);

+

+        HSLFTextParagraph htp = new HSLFTextParagraph(tha, tba, null);

+        htp.setParagraphStyle(paraStyle);

+

+        HSLFTextRun htr = new HSLFTextRun(htp);

+        htr.setCharacterStyle(charStyle);

+        htr.setText("");

+        htp.addTextRun(htr);

+

+        return Arrays.asList(htp);

+    }

+

+    public EscherTextboxWrapper getTextboxWrapper() {

+        return (EscherTextboxWrapper) _headerAtom.getParentRecord();

+    }

+    

+    protected static Color getColorFromColorIndexStruct(int rgb, HSLFSheet sheet) {

+        int cidx = rgb >>> 24;

+        Color tmp; 

+        switch (cidx) {

+            // Background ... Accent 3 color

+            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:

+                if (sheet == null) return null;

+                ColorSchemeAtom ca = sheet.getColorScheme();

+                tmp = new Color(ca.getColor(cidx), true);

+                break;

+            // Color is an sRGB value specified by red, green, and blue fields.

+            case 0xFE:

+                tmp = new Color(rgb, true);

+                break;

+            // Color is undefined.

+            default:

+            case 0xFF:

+                return null;

+        }

+        return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed());

+    }

+

+    /**

+     * Sets the value of the given Paragraph TextProp, add if required

+     * @param propName The name of the Paragraph TextProp

+     * @param val The value to set for the TextProp

+     */

+    public void setParagraphTextPropVal(String propName, Integer val) {

+        setPropVal(_paragraphStyle, propName, val);

+        setDirty();

+    }

+    

+    /**

+     * marks this paragraph dirty, so its records will be renewed on save

+     */

+    public void setDirty() {

+        _dirty = true;

+    }

+    

+    public boolean isDirty() {

+        return _dirty;

+    }

+}

diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java
new file mode 100644
index 0000000..8728eab
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java
@@ -0,0 +1,370 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.getPropVal;
+
+import java.awt.Color;
+
+import org.apache.poi.hslf.model.textproperties.*;
+import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType;
+import org.apache.poi.sl.usermodel.TextRun;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
+
+/**
+ * Represents a run of text, all with the same style
+ *
+ */
+public final class HSLFTextRun implements TextRun {
+	protected POILogger logger = POILogFactory.getLogger(this.getClass());
+
+	/** The TextRun we belong to */
+	private HSLFTextParagraph parentParagraph;
+	private String _runText = "";
+	private String _fontFamily;
+	
+	/**
+	 * Our paragraph and character style.
+	 * Note - we may share these styles with other RichTextRuns
+	 */
+	private TextPropCollection characterStyle = new TextPropCollection(1, TextPropType.character);
+
+	/**
+	 * Create a new wrapper around a rich text string
+	 * @param parent The parent paragraph
+	 */
+	public HSLFTextRun(HSLFTextParagraph parentParagraph) {
+		this.parentParagraph = parentParagraph;
+	}
+	
+	public TextPropCollection getCharacterStyle() {
+	    return characterStyle;
+	}
+
+	public void setCharacterStyle(TextPropCollection characterStyle) {
+	    assert(characterStyle != null);
+	    this.characterStyle = characterStyle;
+	}
+	
+	/**
+	 * Supply the SlideShow we belong to
+	 */
+	public void updateSheet() {
+		if (_fontFamily != null) {
+			setFontFamily(_fontFamily);
+			_fontFamily = null;
+		}
+	}
+
+	/**
+	 * Get the length of the text
+	 */
+	public int getLength() {
+		return _runText.length();
+	}
+
+	/**
+	 * Fetch the text, in raw storage form
+	 */
+	public String getRawText() {
+		return _runText;
+	}
+
+	/**
+	 * Change the text
+	 */
+	public void setText(String text) {
+	    _runText = HSLFTextParagraph.toInternalString(text);
+	}
+
+	// --------------- Internal helpers on rich text properties -------
+
+	/**
+	 * Fetch the value of the given flag in the CharFlagsTextProp.
+	 * Returns false if the CharFlagsTextProp isn't present, since the
+	 *  text property won't be set if there's no CharFlagsTextProp.
+	 */
+	private boolean isCharFlagsTextPropVal(int index) {
+		return getFlag(index);
+	}
+
+	protected boolean getFlag(int index) {
+	    if (characterStyle == null) return false;
+
+		BitMaskTextProp prop = (BitMaskTextProp)characterStyle.findByName(CharFlagsTextProp.NAME);
+
+		if (prop == null){
+            int txtype = parentParagraph.getRunType();
+			HSLFSheet sheet = parentParagraph.getSheet();
+			if (sheet != null) {
+				HSLFMasterSheet master = sheet.getMasterSheet();
+				if (master != null){
+					prop = (BitMaskTextProp)master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), CharFlagsTextProp.NAME, true);
+				}
+			} else {
+				logger.log(POILogger.WARN, "MasterSheet is not available");
+			}
+		}
+
+		return prop == null ? false : prop.getSubValue(index);
+	}
+
+	/**
+	 * Set the value of the given flag in the CharFlagsTextProp, adding
+	 *  it if required.
+	 */
+	private void setCharFlagsTextPropVal(int index, boolean value) {
+	    // TODO: check if paragraph/chars can be handled the same ...
+		if (getFlag(index) != value) {
+		    setFlag(index, value);
+		    parentParagraph.setDirty();
+		}
+	}
+
+	/**
+	 * Sets the value of the given Paragraph TextProp, add if required
+	 * @param propName The name of the Paragraph TextProp
+	 * @param val The value to set for the TextProp
+	 */
+	public void setCharTextPropVal(String propName, Integer val) {
+	    HSLFTextParagraph.setPropVal(characterStyle, propName, val);
+	    parentParagraph.setDirty();
+	}
+
+
+	// --------------- Friendly getters / setters on rich text properties -------
+
+	/**
+	 * Is the text bold?
+	 */
+	public boolean isBold() {
+		return isCharFlagsTextPropVal(CharFlagsTextProp.BOLD_IDX);
+	}
+
+	/**
+	 * Is the text bold?
+	 */
+	public void setBold(boolean bold) {
+		setCharFlagsTextPropVal(CharFlagsTextProp.BOLD_IDX, bold);
+	}
+
+	/**
+	 * Is the text italic?
+	 */
+	public boolean isItalic() {
+		return isCharFlagsTextPropVal(CharFlagsTextProp.ITALIC_IDX);
+	}
+
+	/**
+	 * Is the text italic?
+	 */
+	public void setItalic(boolean italic) {
+		setCharFlagsTextPropVal(CharFlagsTextProp.ITALIC_IDX, italic);
+	}
+
+	/**
+	 * Is the text underlined?
+	 */
+	public boolean isUnderlined() {
+		return isCharFlagsTextPropVal(CharFlagsTextProp.UNDERLINE_IDX);
+	}
+
+	/**
+	 * Is the text underlined?
+	 */
+	public void setUnderlined(boolean underlined) {
+		setCharFlagsTextPropVal(CharFlagsTextProp.UNDERLINE_IDX, underlined);
+	}
+
+	/**
+	 * Does the text have a shadow?
+	 */
+	public boolean isShadowed() {
+		return isCharFlagsTextPropVal(CharFlagsTextProp.SHADOW_IDX);
+	}
+
+	/**
+	 * Does the text have a shadow?
+	 */
+	public void setShadowed(boolean flag) {
+		setCharFlagsTextPropVal(CharFlagsTextProp.SHADOW_IDX, flag);
+	}
+
+	/**
+	 * Is this text embossed?
+	 */
+	 public boolean isEmbossed() {
+		return isCharFlagsTextPropVal(CharFlagsTextProp.RELIEF_IDX);
+	}
+
+	/**
+	 * Is this text embossed?
+	 */
+	 public void setEmbossed(boolean flag) {
+		setCharFlagsTextPropVal(CharFlagsTextProp.RELIEF_IDX, flag);
+	}
+
+	/**
+	 * Gets the strikethrough flag
+	 */
+	public boolean isStrikethrough() {
+		return isCharFlagsTextPropVal(CharFlagsTextProp.STRIKETHROUGH_IDX);
+	}
+
+	/**
+	 * Sets the strikethrough flag
+	 */
+	public void setStrikethrough(boolean flag) {
+		setCharFlagsTextPropVal(CharFlagsTextProp.STRIKETHROUGH_IDX, flag);
+	}
+
+	/**
+	 * Gets the subscript/superscript option
+	 *
+	 * @return the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript
+	 */
+	public int getSuperscript() {
+		TextProp tp = getPropVal(characterStyle, "superscript", parentParagraph);
+		return tp == null ? 0 : tp.getValue();
+	}
+
+	/**
+	 * Sets the subscript/superscript option
+	 *
+	 * @param val the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript
+	 */
+	public void setSuperscript(int val) {
+	    setCharTextPropVal("superscript", val);
+	}
+
+    @Override
+	public Double getFontSize() {
+        TextProp tp = getPropVal(characterStyle, "font.size", parentParagraph);
+        return tp == null ? null : (double)tp.getValue();
+	}
+
+
+	@Override
+	public void setFontSize(Double fontSize) {
+	    Integer iFontSize = (fontSize == null) ? null : fontSize.intValue();
+		setCharTextPropVal("font.size", iFontSize);
+	}
+
+	/**
+	 * Gets the font index
+	 */
+	public int getFontIndex() {
+        TextProp tp = getPropVal(characterStyle, "font.index", parentParagraph);
+        return tp == null ? -1 : tp.getValue();
+	}
+
+	/**
+	 * Sets the font index
+	 */
+	public void setFontIndex(int idx) {
+		setCharTextPropVal("font.index", idx);
+	}
+
+
+	/**
+	 * Sets the font name to use
+	 */
+	public void setFontFamily(String fontFamily) {
+	    HSLFSheet sheet = parentParagraph.getSheet();
+	    HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow();
+		if (sheet == null || slideShow == null) {
+			//we can't set font since slideshow is not assigned yet
+			_fontFamily = fontFamily;
+			return;
+		}
+		// Get the index for this font (adding if needed)
+		int fontIdx = slideShow.getFontCollection().addFont(fontFamily);
+		setCharTextPropVal("font.index", fontIdx);
+	}
+
+	/**
+	 * Gets the font name
+	 */
+	@Override
+	public String getFontFamily() {
+        HSLFSheet sheet = parentParagraph.getSheet();
+        HSLFSlideShow slideShow = (sheet == null) ? null : sheet.getSlideShow();
+		if (sheet == null || slideShow == null) {
+			return _fontFamily;
+		}
+        TextProp tp = getPropVal(characterStyle, "font.index", parentParagraph);
+        if (tp == null) { return null; }
+		return slideShow.getFontCollection().getFontWithId(tp.getValue());
+	}
+
+	/**
+	 * @return font color as RGB value
+	 * @see java.awt.Color
+	 */
+	public Color getFontColor() {
+		TextProp tp = getPropVal(characterStyle, "font.color", parentParagraph);
+		return (tp == null) ? null
+	        : HSLFTextParagraph.getColorFromColorIndexStruct(tp.getValue(), parentParagraph.getSheet());
+	}
+
+	/**
+	 * Sets color of the text, as a int bgr.
+	 * (PowerPoint stores as BlueGreenRed, not the more
+	 *  usual RedGreenBlue)
+	 * @see java.awt.Color
+	 */
+	public void setFontColor(int bgr) {
+		setCharTextPropVal("font.color", bgr);
+	}
+
+	/**
+	 * Sets color of the text, as a java.awt.Color
+	 */
+	public void setFontColor(Color color) {
+		// In PowerPont RGB bytes are swapped, as BGR
+		int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB();
+		setFontColor(rgb);
+	}
+
+    protected void setFlag(int index, boolean value) {
+        BitMaskTextProp prop = (BitMaskTextProp)characterStyle.addWithName(CharFlagsTextProp.NAME);
+        prop.setSubValue(value, index);
+    }
+
+    public HSLFTextParagraph getTextParagraph() {
+        return parentParagraph;
+    }
+    
+    public TextCap getTextCap() {
+        return TextCap.NONE;
+    }
+
+    public boolean isSubscript() {
+        return false;
+    }
+
+    public boolean isSuperscript() {
+        return false;
+    }
+
+    public byte getPitchAndFamily() {
+        return 0;
+    }
+}
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java
new file mode 100644
index 0000000..55222cf
--- /dev/null
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextShape.java
@@ -0,0 +1,777 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import static org.apache.poi.hslf.record.RecordTypes.*;
+
+import java.awt.Rectangle;
+import java.awt.font.FontRenderContext;
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+import java.util.*;
+
+import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.exceptions.HSLFException;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.sl.draw.DrawFactory;
+import org.apache.poi.sl.draw.DrawTextShape;
+import org.apache.poi.sl.usermodel.*;
+import org.apache.poi.util.POILogger;
+
+/**
+ * A common superclass of all shapes that can hold text.
+ *
+ * @author Yegor Kozlov
+ */
+public abstract class HSLFTextShape extends HSLFSimpleShape implements TextShape<HSLFTextParagraph> {
+
+    /**
+     * How to anchor the text
+     */
+    /* package */ static final int AnchorTop = 0;
+    /* package */ static final int AnchorMiddle = 1;
+    /* package */ static final int AnchorBottom = 2;
+    /* package */ static final int AnchorTopCentered = 3;
+    /* package */ static final int AnchorMiddleCentered = 4;
+    /* package */ static final int AnchorBottomCentered = 5;
+    /* package */ static final int AnchorTopBaseline = 6;
+    /* package */ static final int AnchorBottomBaseline = 7;
+    /* package */ static final int AnchorTopCenteredBaseline = 8;
+    /* package */ static final int AnchorBottomCenteredBaseline = 9;
+
+    /**
+     * How to wrap the text
+     */
+    public static final int WrapSquare = 0;
+    public static final int WrapByPoints = 1;
+    public static final int WrapNone = 2;
+    public static final int WrapTopBottom = 3;
+    public static final int WrapThrough = 4;
+
+    /**
+     * TextRun object which holds actual text and format data
+     */
+    protected List<HSLFTextParagraph> _paragraphs = new ArrayList<HSLFTextParagraph>();
+
+    /**
+     * Escher container which holds text attributes such as
+     * TextHeaderAtom, TextBytesAtom ot TextCharsAtom, StyleTextPropAtom etc.
+     */
+    protected EscherTextboxWrapper _txtbox;
+
+    /**
+     * This setting is used for supporting a deprecated alignment
+     * 
+     * @see <a href=""></a>
+     */
+    boolean alignToBaseline = false;
+    
+    /**
+     * Used to calculate text bounds
+     */
+    protected static final FontRenderContext _frc = new FontRenderContext(null, true, true);
+
+    /**
+     * Create a TextBox object and initialize it from the supplied Record container.
+     *
+     * @param escherRecord       <code>EscherSpContainer</code> container which holds information about this shape
+     * @param parent    the parent of the shape
+     */
+   protected HSLFTextShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
+        super(escherRecord, parent);
+
+    }
+
+    /**
+     * Create a new TextBox. This constructor is used when a new shape is created.
+     *
+     * @param parent    the parent of this Shape. For example, if this text box is a cell
+     * in a table then the parent is Table.
+     */
+    public HSLFTextShape(ShapeContainer<HSLFShape> parent){
+        super(null, parent);
+        _escherContainer = createSpContainer(parent instanceof HSLFGroupShape);
+    }
+
+    /**
+     * Create a new TextBox. This constructor is used when a new shape is created.
+     *
+     */
+    public HSLFTextShape(){
+        this(null);
+    }
+
+    /**
+     * Set default properties for the  TextRun.
+     * Depending on the text and shape type the defaults are different:
+     *   TextBox: align=left, valign=top
+     *   AutoShape: align=center, valign=middle
+     *
+     */
+    protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){
+
+    }
+
+    /**
+     * When a textbox is added to  a sheet we need to tell upper-level
+     * <code>PPDrawing</code> about it.
+     *
+     * @param sh the sheet we are adding to
+     */
+    protected void afterInsert(HSLFSheet sh){
+        super.afterInsert(sh);
+
+        storeText();
+        
+        EscherTextboxWrapper _txtbox = getEscherTextboxWrapper();
+        if(_txtbox != null){
+            _escherContainer.addChildRecord(_txtbox.getEscherRecord());
+            
+            PPDrawing ppdrawing = sh.getPPDrawing();
+            ppdrawing.addTextboxWrapper(_txtbox);
+            // Ensure the escher layer knows about the added records
+            try {
+                _txtbox.writeOut(null);
+            } catch (IOException e){
+                throw new HSLFException(e);
+            }
+            if(getAnchor().equals(new Rectangle()) && !"".equals(getText())) resizeToFitText();
+        }
+        for (HSLFTextParagraph htp : _paragraphs) {
+            htp.setShapeId(getShapeId());
+        }
+        sh.onAddTextShape(this);
+    }
+
+    protected EscherTextboxWrapper getEscherTextboxWrapper(){
+        if(_txtbox != null) return _txtbox;
+        
+        EscherTextboxRecord textRecord = getEscherChild(EscherTextboxRecord.RECORD_ID);
+        if (textRecord == null) return null;
+        
+        HSLFSheet sheet = getSheet();
+        if (sheet != null) {
+            PPDrawing drawing = sheet.getPPDrawing();
+            if (drawing != null) {
+                EscherTextboxWrapper wrappers[] = drawing.getTextboxWrappers();
+                if (wrappers != null) {
+                    for (EscherTextboxWrapper w : wrappers) {
+                        // check for object identity
+                        if (textRecord == w.getEscherRecord()) {
+                            _txtbox = w;
+                            return _txtbox;
+                        }
+                    }
+                }
+            }
+        }
+        
+        _txtbox = new EscherTextboxWrapper(textRecord);
+        return _txtbox;
+    }
+
+    /**
+     * Adjust the size of the shape so it encompasses the text inside it.
+     *
+     * @return a <code>Rectangle2D</code> that is the bounds of this shape.
+     */
+    public Rectangle2D resizeToFitText(){
+        Rectangle2D anchor = getAnchor();
+        if(anchor.getWidth() == 0.) {
+            logger.log(POILogger.WARN, "Width of shape wasn't set. Defaulting to 200px");
+            anchor = new Rectangle2D.Double(anchor.getX(), anchor.getY(), 200, anchor.getHeight());
+            setAnchor(anchor);
+        }
+        double height = getTextHeight(); 
+        height += 1; // add a pixel to compensate rounding errors
+        
+        anchor.setRect(anchor.getX(), anchor.getY(), anchor.getWidth(), height);
+        setAnchor(anchor);
+        
+        return anchor;
+    }   
+    
+    /**
+    * Returns the type of the text, from the TextHeaderAtom.
+    * Possible values can be seen from TextHeaderAtom
+    * @see org.apache.poi.hslf.record.TextHeaderAtom
+    */
+    public int getRunType() {
+        getEscherTextboxWrapper();
+        if (_txtbox == null) return -1;
+        List<HSLFTextParagraph> paras = HSLFTextParagraph.findTextParagraphs(_txtbox, getSheet());
+        return (paras.isEmpty()) ? -1 : paras.get(0).getRunType();
+    }
+
+    /**
+    * Changes the type of the text. Values should be taken
+    *  from TextHeaderAtom. No checking is done to ensure you
+    *  set this to a valid value!
+    * @see org.apache.poi.hslf.record.TextHeaderAtom
+    */
+    public void setRunType(int type) {
+        getEscherTextboxWrapper();
+        if (_txtbox == null) return;
+        List<HSLFTextParagraph> paras = HSLFTextParagraph.findTextParagraphs(_txtbox, getSheet());
+        if (!paras.isEmpty()) {
+            paras.get(0).setRunType(type);
+        }
+    }
+    
+    /**
+     * Returns the type of vertical alignment for the text.
+     * One of the <code>Anchor*</code> constants defined in this class.
+     *
+     * @return the type of alignment
+     */
+    /* package */ int getAlignment(){
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__ANCHORTEXT);
+        int align = HSLFTextShape.AnchorTop;
+        if (prop == null){
+            /**
+             * If vertical alignment was not found in the shape properties then try to
+             * fetch the master shape and search for the align property there.
+             */
+            int type = getRunType();
+            if(getSheet() != null && getSheet().getMasterSheet() != null){
+                HSLFMasterSheet master = getSheet().getMasterSheet();
+                HSLFTextShape masterShape = master.getPlaceholderByTextType(type);
+                if(masterShape != null) align = masterShape.getAlignment();
+            } else {
+                //not found in the master sheet. Use the hardcoded defaults.
+                switch (type){
+                     case org.apache.poi.hslf.record.TextHeaderAtom.TITLE_TYPE:
+                     case org.apache.poi.hslf.record.TextHeaderAtom.CENTER_TITLE_TYPE:
+                         align = HSLFTextShape.AnchorMiddle;
+                         break;
+                     default:
+                         align = HSLFTextShape.AnchorTop;
+                         break;
+                 }
+            }
+        } else {
+            align = prop.getPropertyValue();
+        }
+
+        alignToBaseline = (align == AnchorBottomBaseline || align == AnchorBottomCenteredBaseline
+            || align == AnchorTopBaseline || align == AnchorTopCenteredBaseline);
+        
+        return align;
+    }
+
+    /**
+     * Sets the type of alignment for the text.
+     * One of the <code>Anchor*</code> constants defined in this class.
+     *
+     * @param align - the type of alignment
+     */
+    /* package */ void setAlignment(Boolean isCentered, VerticalAlignment vAlign) {
+        int align[];
+        switch (vAlign) {
+        case TOP:
+            align = new int[]{AnchorTop, AnchorTopCentered, AnchorTopBaseline, AnchorTopCenteredBaseline};
+            break;
+        default:
+        case MIDDLE:
+            align = new int[]{AnchorMiddle, AnchorMiddleCentered, AnchorMiddle, AnchorMiddleCentered};
+            break;
+        case BOTTOM:
+            align = new int[]{AnchorBottom, AnchorBottomCentered, AnchorBottomBaseline, AnchorBottomCenteredBaseline};
+            break;
+        }
+        
+        int align2 = align[(isCentered ? 1 : 0)+(alignToBaseline ? 2 : 0)];
+        
+        setEscherProperty(EscherProperties.TEXT__ANCHORTEXT, align2);
+    }
+    
+    @Override
+    public VerticalAlignment getVerticalAlignment() {
+        int va = getAlignment();
+        switch (va) {
+        case AnchorTop:
+        case AnchorTopCentered:
+        case AnchorTopBaseline:
+        case AnchorTopCenteredBaseline: return VerticalAlignment.TOP;
+        case AnchorBottom:
+        case AnchorBottomCentered:
+        case AnchorBottomBaseline:
+        case AnchorBottomCenteredBaseline: return VerticalAlignment.BOTTOM;
+        default:
+        case AnchorMiddle:
+        case AnchorMiddleCentered: return VerticalAlignment.MIDDLE;
+        }
+    }
+
+    /**
+     * @return true, if vertical alignment is relative to baseline
+     * this is only used for older versions less equals Office 2003 
+     */
+    public boolean isAlignToBaseline() {
+        getAlignment();
+        return alignToBaseline;
+    }
+
+    /**
+     * Sets the vertical alignment relative to the baseline
+     *
+     * @param alignToBaseline if true, vertical alignment is relative to baseline
+     */
+    public void setAlignToBaseline(boolean alignToBaseline) {
+        this.alignToBaseline = alignToBaseline;
+        setAlignment(isHorizontalCentered(), getVerticalAlignment());
+    }
+    
+    @Override
+    public boolean isHorizontalCentered() {
+        int va = getAlignment();
+        switch (va) {
+        case AnchorTopCentered:
+        case AnchorTopCenteredBaseline:
+        case AnchorBottomCentered:
+        case AnchorBottomCenteredBaseline:
+        case AnchorMiddleCentered:
+            return true;
+        default:
+            return false;
+        }
+    }
+    
+    public void setVerticalAlignment(VerticalAlignment vAlign) {
+        setAlignment(isHorizontalCentered(), vAlign);
+    }
+
+    /**
+     * Sets if the paragraphs are horizontal centered
+     *
+     * @param isCentered true, if the paragraphs are horizontal centered
+     * A {@code null} values unsets this property.
+     * 
+     * @see TextShape#isHorizontalCentered()
+     */
+    public void setHorizontalCentered(Boolean isCentered){
+        setAlignment(isCentered, getVerticalAlignment());
+    }
+
+    /**
+     * Returns the distance (in points) between the bottom of the text frame
+     * and the bottom of the inscribed rectangle of the shape that contains the text.
+     * Default value is 1/20 inch.
+     *
+     * @return the botom margin
+     */
+    public double getBottomInset(){
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTBOTTOM);
+        int val = prop == null ? EMU_PER_INCH/20 : prop.getPropertyValue();
+        return val/EMU_PER_POINT;
+    }
+
+    /**
+     * Sets the botom margin.
+     * @see #getBottomInset()
+     *
+     * @param margin    the bottom margin
+     */
+    public void setBottomInset(double margin){
+        setEscherProperty(EscherProperties.TEXT__TEXTBOTTOM, (int)(margin*EMU_PER_POINT));
+    }
+
+    /**
+     *  Returns the distance (in points) between the left edge of the text frame
+     *  and the left edge of the inscribed rectangle of the shape that contains
+     *  the text.
+     *  Default value is 1/10 inch.
+     *
+     * @return the left margin
+     */
+    public double getLeftInset(){
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTLEFT);
+        int val = prop == null ? EMU_PER_INCH/10 : prop.getPropertyValue();
+        return val/EMU_PER_POINT;
+    }
+
+    /**
+     * Sets the left margin.
+     * @see #getLeftInset()
+     *
+     * @param margin    the left margin
+     */
+    public void setLeftInset(double margin){
+        setEscherProperty(EscherProperties.TEXT__TEXTLEFT, (int)(margin*EMU_PER_POINT));
+    }
+
+    /**
+     *  Returns the distance (in points) between the right edge of the
+     *  text frame and the right edge of the inscribed rectangle of the shape
+     *  that contains the text.
+     *  Default value is 1/10 inch.
+     *
+     * @return the right margin
+     */
+    public double getRightInset(){
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTRIGHT);
+        int val = prop == null ? EMU_PER_INCH/10 : prop.getPropertyValue();
+        return val/EMU_PER_POINT;
+    }
+
+    /**
+     * Sets the right margin.
+     * @see #getRightInset()
+     *
+     * @param margin    the right margin
+     */
+    public void setRightInset(double margin){
+        setEscherProperty(EscherProperties.TEXT__TEXTRIGHT, (int)(margin*EMU_PER_POINT));
+    }
+
+     /**
+     *  Returns the distance (in points) between the top of the text frame
+     *  and the top of the inscribed rectangle of the shape that contains the text.
+     *  Default value is 1/20 inch.
+     *
+     * @return the top margin
+     */
+    public double getTopInset(){
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTTOP);
+        int val = prop == null ? EMU_PER_INCH/20 : prop.getPropertyValue();
+        return val/EMU_PER_POINT;
+    }
+
+   /**
+     * Sets the top margin.
+     * @see #getTopInset()
+     *
+     * @param margin    the top margin
+     */
+    public void setTopInset(double margin){
+        setEscherProperty(EscherProperties.TEXT__TEXTTOP, (int)(margin*EMU_PER_POINT));
+    }
+
+    @Override
+    public boolean getWordWrap(){
+        int ww = getWordWrapEx();
+        return (ww != WrapNone);
+    }
+
+    /**
+     * Returns the value indicating word wrap.
+     *
+     * @return the value indicating word wrap.
+     *  Must be one of the <code>Wrap*</code> constants defined in this class.
+     *
+     * @see <a href="https://msdn.microsoft.com/en-us/library/dd948168(v=office.12).aspx">MSOWRAPMODE</a>
+     */
+    public int getWordWrapEx() {
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__WRAPTEXT);
+        return prop == null ? WrapSquare : prop.getPropertyValue();
+    }
+
+    /**
+     *  Specifies how the text should be wrapped
+     *
+     * @param wrap  the value indicating how the text should be wrapped.
+     *  Must be one of the <code>Wrap*</code> constants defined in this class.
+     */
+    public void setWordWrap(int wrap){
+        setEscherProperty(EscherProperties.TEXT__WRAPTEXT, wrap);
+    }
+
+    /**
+     * @return id for the text.
+     */
+    public int getTextId(){
+        EscherOptRecord opt = getEscherOptRecord();
+        EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.TEXT__TEXTID);
+        return prop == null ? 0 : prop.getPropertyValue();
+    }
+
+    /**
+     * Sets text ID
+     *
+     * @param id of the text
+     */
+    public void setTextId(int id){
+        setEscherProperty(EscherProperties.TEXT__TEXTID, id);
+    }
+
+    /**
+      * @return the TextParagraphs for this text box
+      */
+    public List<HSLFTextParagraph> getTextParagraphs(){
+        if (!_paragraphs.isEmpty()) return _paragraphs;
+        
+        _txtbox = getEscherTextboxWrapper();
+        if (_txtbox == null) {
+            _paragraphs.addAll(HSLFTextParagraph.createEmptyParagraph());
+            _txtbox = _paragraphs.get(0).getTextboxWrapper();
+        } else {
+            _paragraphs = HSLFTextParagraph.findTextParagraphs(_txtbox, getSheet());
+            if (_paragraphs == null) {
+                // there are actually TextBoxRecords without extra data - see #54722
+                _paragraphs = HSLFTextParagraph.createEmptyParagraph(_txtbox);
+            }
+                
+            if (_paragraphs.isEmpty()) {
+                logger.log(POILogger.WARN, "TextRecord didn't contained any text lines");
+            }
+//            initParagraphsFromSheetRecords();
+//            if (_paragraphs.isEmpty()) {
+//                List<List<HSLFTextParagraph>> llhtp = HSLFTextParagraph.findTextParagraphs(_txtbox);
+//                if (!llhtp.isEmpty()) {
+//                    _paragraphs.addAll(llhtp.get(0));
+//                }
+//            }
+        }
+
+        for (HSLFTextParagraph p : _paragraphs) {
+            p.setParentShape(this);
+        }
+        
+        return _paragraphs;
+    }
+
+    public void setSheet(HSLFSheet sheet) {
+        _sheet = sheet;
+
+        // Initialize _txtrun object.
+        // (We can't do it in the constructor because the sheet
+        //  is not assigned then, it's only built once we have
+        //  all the records)
+        List<HSLFTextParagraph> paras = getTextParagraphs();
+        if (paras != null) {
+            for (HSLFTextParagraph htp : paras) {
+                // Supply the sheet to our child RichTextRuns
+                htp.supplySheet(_sheet);
+            }
+        }
+    }
+
+//    protected void initParagraphsFromSheetRecords(){
+//        EscherTextboxWrapper txtbox = getEscherTextboxWrapper();
+//        HSLFSheet sheet = getSheet();
+//
+//        if (sheet == null || txtbox == null) return;
+//        List<List<HSLFTextParagraph>> sheetRuns = _sheet.getTextParagraphs();
+//        if (sheetRuns == null) return;
+//
+//        _paragraphs.clear();
+//        OutlineTextRefAtom ota = (OutlineTextRefAtom)txtbox.findFirstOfType(OutlineTextRefAtom.typeID);
+//
+//        if (ota != null) {
+//            int idx = ota.getTextIndex();
+//            for (List<HSLFTextParagraph> r : sheetRuns) {
+//                if (r.isEmpty()) continue;
+//                int ridx = r.get(0).getIndex();
+//                if (ridx > idx) break;
+//                if (ridx == idx) _paragraphs.addAll(r);
+//            }
+//            if(_paragraphs.isEmpty()) {
+//                logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx);
+//            }
+//        } else {
+//            int shapeId = getShapeId();
+//            for (List<HSLFTextParagraph> r : sheetRuns) {
+//                if (r.isEmpty()) continue;
+//                if (r.get(0).getShapeId() == shapeId) _paragraphs.addAll(r);
+//            }
+//        }
+//
+//        // ensure the same references child records of TextRun - see #48916
+////        if(_txtrun != null) {
+////            for (int i = 0; i < child.length; i++) {
+////                for (Record r : _txtrun.getRecords()) {
+////                    if (child[i].getRecordType() == r.getRecordType()) {
+////                        child[i] = r;
+////                    }
+////                }
+////            }
+////        }
+//    }
+
+    /*
+        // 0xB acts like cariage return in page titles and like blank in the others
+        char replChr;
+        switch(tha == null ? -1 : tha.getTextType()) {
+            case -1:
+            case TextHeaderAtom.TITLE_TYPE:
+            case TextHeaderAtom.CENTER_TITLE_TYPE:
+                replChr = '\n';
+                break;
+            default:
+                replChr = ' ';
+                break;
+        }
+
+        // PowerPoint seems to store files with \r as the line break
+        // The messes things up on everything but a Mac, so translate
+        //  them to \n
+        String text = rawText.replace('\r','\n').replace('\u000b', replChr);
+     */
+    
+    /**
+     * Return <code>OEPlaceholderAtom</code>, the atom that describes a placeholder.
+     *
+     * @return <code>OEPlaceholderAtom</code> or <code>null</code> if not found
+     */
+    public OEPlaceholderAtom getPlaceholderAtom(){
+        return getClientDataRecord(OEPlaceholderAtom.typeID);
+    }
+
+    /**
+     *
+     * Assigns a hyperlink to this text shape
+     *
+     * @param linkId    id of the hyperlink, @see org.apache.poi.hslf.usermodel.SlideShow#addHyperlink(Hyperlink)
+     * @param      beginIndex   the beginning index, inclusive.
+     * @param      endIndex     the ending index, exclusive.
+     * @see org.apache.poi.hslf.usermodel.HSLFSlideShow#addHyperlink(HSLFHyperlink)
+     */
+    public void setHyperlink(int linkId, int beginIndex, int endIndex){
+        //TODO validate beginIndex and endIndex and throw IllegalArgumentException
+
+        InteractiveInfo info = new InteractiveInfo();
+        InteractiveInfoAtom infoAtom = info.getInteractiveInfoAtom();
+        infoAtom.setAction(org.apache.poi.hslf.record.InteractiveInfoAtom.ACTION_HYPERLINK);
+        infoAtom.setHyperlinkType(org.apache.poi.hslf.record.InteractiveInfoAtom.LINK_Url);
+        infoAtom.setHyperlinkID(linkId);
+
+        _txtbox.appendChildRecord(info);
+
+        TxInteractiveInfoAtom txiatom = new TxInteractiveInfoAtom();
+        txiatom.setStartIndex(beginIndex);
+        txiatom.setEndIndex(endIndex);
+        _txtbox.appendChildRecord(txiatom);
+
+    }
+
+    @Override
+    public boolean isPlaceholder() {
+        OEPlaceholderAtom oep = getPlaceholderAtom();
+        if (oep != null) return true;
+
+        //special case for files saved in Office 2007
+        RoundTripHFPlaceholder12 hldr = getClientDataRecord(RoundTripHFPlaceholder12.typeID);
+        if (hldr != null) return true;
+
+        return false;
+    }
+
+
+    @Override
+    public Iterator<HSLFTextParagraph> iterator() {
+        return _paragraphs.iterator();
+    }
+
+    @Override
+    public Insets2D getInsets() {
+        Insets2D insets = new Insets2D(getTopInset(), getLeftInset(), getBottomInset(), getRightInset());
+        return insets;
+    }
+
+    @Override
+    public double getTextHeight(){
+        DrawFactory drawFact = DrawFactory.getInstance(null);
+        DrawTextShape<HSLFTextShape> dts = drawFact.getDrawable(this);
+        return dts.getTextHeight();
+    }
+
+    @Override
+    public TextDirection getTextDirection() {
+        // TODO: determine vertical text setting
+        return TextDirection.HORIZONTAL;
+    }
+
+    /**
+     * Returns the raw text content of the shape. This hasn't had any
+     * changes applied to it, and so is probably unlikely to print
+     * out nicely.
+     */
+    public String getRawText() {
+        return HSLFTextParagraph.getRawText(getTextParagraphs());
+    }
+
+    /**
+     * Returns the text contained in this text frame, which has been made safe
+     * for printing and other use.
+     *
+     * @return the text string for this textbox.
+     */
+    public String getText() {
+        String rawText = getRawText();
+        return HSLFTextParagraph.toExternalString(rawText, getRunType());
+    }
+
+    
+    // Update methods follow
+
+      /**
+       * Adds the supplied text onto the end of the TextParagraphs,
+       * creating a new RichTextRun for it to sit in.
+       * 
+       * @param text the text string used by this object.
+       */
+      public HSLFTextRun appendText(String text, boolean newParagraph) {
+          // init paragraphs
+          List<HSLFTextParagraph> paras = getTextParagraphs();
+          return HSLFTextParagraph.appendText(paras, text, newParagraph);
+      }
+
+      /**
+       * Sets (overwrites) the current text.
+       * Uses the properties of the first paragraph / textrun
+       * 
+       * @param text the text string used by this object.
+       * 
+       * @return the last text run of the splitted text
+       */
+      public HSLFTextRun setText(String text) {
+          // init paragraphs
+          List<HSLFTextParagraph> paras = getTextParagraphs();
+          HSLFTextRun htr = HSLFTextParagraph.setText(paras, text);
+          setTextId(text.hashCode());
+          return htr;
+      }
+      
+      /**
+       * Saves the modified paragraphs/textrun to the records.
+       * Also updates the styles to the correct text length.
+       */
+      protected void storeText() {
+          List<HSLFTextParagraph> paras = getTextParagraphs();
+          HSLFTextParagraph.storeText(paras);
+      }
+      // Accesser methods follow
+
+    /**
+     * Returns the array of all hyperlinks in this text run
+     * 
+     * @return the array of all hyperlinks in this text run or <code>null</code>
+     *         if not found.
+     */
+    public List<HSLFHyperlink> getHyperlinks() {
+        return HSLFHyperlink.find(this);
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java
similarity index 66%
rename from src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java
rename to src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java
index 843f123..b1e38d9 100644
--- a/src/scratchpad/src/org/apache/poi/hslf/model/TitleMaster.java
+++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTitleMaster.java
@@ -15,54 +15,58 @@
    limitations under the License.
 ==================================================================== */
 
-package org.apache.poi.hslf.model;
+package org.apache.poi.hslf.usermodel;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.poi.hslf.model.textproperties.TextProp;
-import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.record.SlideAtom;
 
 /**
  * Title masters define the design template for slides with a Title Slide layout.
  *
  * @author Yegor Kozlov
  */
-public final class TitleMaster extends MasterSheet {
-    private TextRun[] _runs;
+public final class HSLFTitleMaster extends HSLFMasterSheet {
+    private final List<List<HSLFTextParagraph>> _paragraphs = new ArrayList<List<HSLFTextParagraph>>();
 
     /**
      * Constructs a TitleMaster
      *
      */
-    public TitleMaster(org.apache.poi.hslf.record.Slide record, int sheetNo) {
+    public HSLFTitleMaster(org.apache.poi.hslf.record.Slide record, int sheetNo) {
         super(record, sheetNo);
 
-        _runs = findTextRuns(getPPDrawing());
-        for (int i = 0; i < _runs.length; i++) _runs[i].setSheet(this);
+        for (List<HSLFTextParagraph> l : HSLFTextParagraph.findTextParagraphs(getPPDrawing(), this)) {
+            if (!_paragraphs.contains(l)) _paragraphs.add(l);
+        }
     }
 
     /**
      * Returns an array of all the TextRuns found
      */
-    public TextRun[] getTextRuns() {
-        return _runs;
+    public List<List<HSLFTextParagraph>> getTextParagraphs() {
+        return _paragraphs;
     }
 
     /**
      * Delegate the call to the underlying slide master.
      */
     public TextProp getStyleAttribute(int txtype, int level, String name, boolean isCharacter) {
-        MasterSheet master = getMasterSheet();
+        HSLFMasterSheet master = getMasterSheet();
         return master == null ? null : master.getStyleAttribute(txtype, level, name, isCharacter);
     }
 
     /**
      * Returns the slide master for this title master.
      */
-    public MasterSheet getMasterSheet(){
-        SlideMaster[] master = getSlideShow().getSlidesMasters();
+    public HSLFMasterSheet getMasterSheet(){
+        List<HSLFSlideMaster> master = getSlideShow().getSlideMasters();
         SlideAtom sa = ((org.apache.poi.hslf.record.Slide)getSheetContainer()).getSlideAtom();
         int masterId = sa.getMasterID();
-        for (int i = 0; i < master.length; i++) {
-            if (masterId == master[i]._getSheetNumber()) return master[i];
+        for (HSLFSlideMaster sm : master) {
+            if (masterId == sm._getSheetNumber()) return sm;
         }
         return null;
     }
diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java
deleted file mode 100644
index a02d82c..0000000
--- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java
+++ /dev/null
@@ -1,792 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.usermodel;
-
-import java.awt.Color;
-
-import org.apache.poi.hslf.model.MasterSheet;
-import org.apache.poi.hslf.model.Shape;
-import org.apache.poi.hslf.model.Sheet;
-import org.apache.poi.hslf.model.TextRun;
-import org.apache.poi.hslf.model.textproperties.BitMaskTextProp;
-import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.TextProp;
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.ColorSchemeAtom;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
-
-
-/**
- * Represents a run of text, all with the same style
- *
- */
-public final class RichTextRun {
-	protected POILogger logger = POILogFactory.getLogger(this.getClass());
-
-	/** The TextRun we belong to */
-	private TextRun parentRun;
-	/** The SlideShow we belong to */
-	private SlideShow slideShow;
-
-	/** Where in the parent TextRun we start from */
-	private int startPos;
-
-	/** How long a string (in the parent TextRun) we represent */
-	private int length;
-
-	private String _fontname;
-	/**
-	 * Our paragraph and character style.
-	 * Note - we may share these styles with other RichTextRuns
-	 */
-	private TextPropCollection paragraphStyle;
-	private TextPropCollection characterStyle;
-	private boolean sharingParagraphStyle;
-	private boolean sharingCharacterStyle;
-
-	/**
-	 * Create a new wrapper around a (currently not)
-	 *  rich text string
-	 * @param parent
-	 * @param startAt
-	 * @param len
-	 */
-	public RichTextRun(TextRun parent, int startAt, int len) {
-		this(parent, startAt, len, null, null, false, false);
-	}
-	/**
-	 * Create a new wrapper around a rich text string
-	 * @param parent The parent TextRun
-	 * @param startAt The start position of this run
-	 * @param len The length of this run
-	 * @param pStyle The paragraph style property collection
-	 * @param cStyle The character style property collection
-	 * @param pShared The paragraph styles are shared with other runs
-	 * @param cShared The character styles are shared with other runs
-	 */
-	public RichTextRun(TextRun parent, int startAt, int len,
-	TextPropCollection pStyle,  TextPropCollection cStyle,
-	boolean pShared, boolean cShared) {
-		parentRun = parent;
-		startPos = startAt;
-		length = len;
-		paragraphStyle = pStyle;
-		characterStyle = cStyle;
-		sharingParagraphStyle = pShared;
-		sharingCharacterStyle = cShared;
-	}
-
-	/**
-	 * Supply (normally default) textprops, and if they're shared,
-	 *  when a run gets them
-	 */
-	public void supplyTextProps(TextPropCollection pStyle,  TextPropCollection cStyle, boolean pShared, boolean cShared) {
-		if(paragraphStyle != null || characterStyle != null) {
-			throw new IllegalStateException("Can't call supplyTextProps if run already has some");
-		}
-		paragraphStyle = pStyle;
-		characterStyle = cStyle;
-		sharingParagraphStyle = pShared;
-		sharingCharacterStyle = cShared;
-	}
-	/**
-	 * Supply the SlideShow we belong to
-	 */
-	public void supplySlideShow(SlideShow ss) {
-		slideShow = ss;
-		if (_fontname != null) {
-			setFontName(_fontname);
-			_fontname = null;
-		}
-	}
-
-	/**
-	 * Get the length of the text
-	 */
-	public int getLength() {
-		return length;
-	}
-
-	/**
-	 * The beginning index, inclusive.
-	 *
-	 * @return the beginning index, inclusive.
-	 */
-	public int getStartIndex(){
-		return startPos;
-	}
-
-	/**
-	 *  The ending index, exclusive.
-	 *
-	 * @return the ending index, exclusive.
-	 */
-	public int getEndIndex(){
-		return startPos + length;
-	}
-
-	/**
-	 * Fetch the text, in output suitable form
-	 */
-	public String getText() {
-		return parentRun.getText().substring(startPos, startPos+length);
-	}
-	/**
-	 * Fetch the text, in raw storage form
-	 */
-	public String getRawText() {
-		return parentRun.getRawText().substring(startPos, startPos+length);
-	}
-
-	/**
-	 * Change the text
-	 */
-	public void setText(String text) {
-		String s = parentRun.normalize(text);
-		setRawText(s);
-	}
-
-	/**
-	 * Change the text
-	 */
-	public void setRawText(String text) {
-		length = text.length();
-		parentRun.changeTextInRichTextRun(this,text);
-	}
-
-	/**
-	 * Tells the RichTextRun its new position in the parent TextRun
-	 * @param startAt
-	 */
-	public void updateStartPosition(int startAt) {
-		startPos = startAt;
-	}
-
-
-	// --------------- Internal helpers on rich text properties -------
-
-	/**
-	 * Fetch the value of the given flag in the CharFlagsTextProp.
-	 * Returns false if the CharFlagsTextProp isn't present, since the
-	 *  text property won't be set if there's no CharFlagsTextProp.
-	 */
-	private boolean isCharFlagsTextPropVal(int index) {
-		return getFlag(true, index);
-	}
-
-	private boolean getFlag(boolean isCharacter, int index) {
-		TextPropCollection props;
-		String propname;
-		if (isCharacter){
-			props = characterStyle;
-			propname = CharFlagsTextProp.NAME;
-		} else {
-			props = paragraphStyle;
-			propname = ParagraphFlagsTextProp.NAME;
-		}
-
-		BitMaskTextProp prop = null;
-		if (props != null){
-			prop = (BitMaskTextProp)props.findByName(propname);
-		}
-		if (prop == null){
-			Sheet sheet = parentRun.getSheet();
-			if(sheet != null){
-				int txtype = parentRun.getRunType();
-				MasterSheet master = sheet.getMasterSheet();
-				if (master != null){
-					prop = (BitMaskTextProp)master.getStyleAttribute(txtype, getIndentLevel(), propname, isCharacter);
-				}
-			} else {
-				logger.log(POILogger.WARN, "MasterSheet is not available");
-			}
-		}
-
-		return prop == null ? false : prop.getSubValue(index);
-	}
-
-	/**
-	 * Set the value of the given flag in the CharFlagsTextProp, adding
-	 *  it if required.
-	 */
-	private void setCharFlagsTextPropVal(int index, boolean value) {
-		if(getFlag(true, index) != value) setFlag(true, index, value);
-	}
-
-	public void setFlag(boolean isCharacter, int index, boolean value) {
-		TextPropCollection props;
-		String propname;
-		if (isCharacter){
-			props = characterStyle;
-			propname = CharFlagsTextProp.NAME;
-		} else {
-			props = paragraphStyle;
-			propname = ParagraphFlagsTextProp.NAME;
-		}
-
-		// Ensure we have the StyleTextProp atom we're going to need
-		if(props == null) {
-			parentRun.ensureStyleAtomPresent();
-			props = isCharacter ? characterStyle : paragraphStyle;
-		}
-
-		BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(props, propname);
-		prop.setSubValue(value,index);
-	}
-
-	/**
-	 * Returns the named TextProp, either by fetching it (if it exists) or adding it
-	 *  (if it didn't)
-	 * @param textPropCol The TextPropCollection to fetch from / add into
-	 * @param textPropName The name of the TextProp to fetch/add
-	 */
-	private TextProp fetchOrAddTextProp(TextPropCollection textPropCol, String textPropName) {
-		// Fetch / Add the TextProp
-		TextProp tp = textPropCol.findByName(textPropName);
-		if(tp == null) {
-			tp = textPropCol.addWithName(textPropName);
-		}
-		return tp;
-	}
-
-	/**
-	 * Fetch the value of the given Character related TextProp.
-	 * Returns -1 if that TextProp isn't present.
-	 * If the TextProp isn't present, the value from the appropriate
-	 *  Master Sheet will apply.
-	 */
-	private int getCharTextPropVal(String propName) {
-		TextProp prop = null;
-		if (characterStyle != null){
-			prop = characterStyle.findByName(propName);
-		}
-
-		if (prop == null){
-			Sheet sheet = parentRun.getSheet();
-			int txtype = parentRun.getRunType();
-			MasterSheet master = sheet.getMasterSheet();
-			if (master != null)
-				prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, true);
-		}
-		return prop == null ? -1 : prop.getValue();
-	}
-	/**
-	 * Fetch the value of the given Paragraph related TextProp.
-	 * Returns -1 if that TextProp isn't present.
-	 * If the TextProp isn't present, the value from the appropriate
-	 *  Master Sheet will apply.
-	 */
-	private int getParaTextPropVal(String propName) {
-		TextProp prop = null;
-		boolean hardAttribute = false;
-		if (paragraphStyle != null){
-			prop = paragraphStyle.findByName(propName);
-
-			BitMaskTextProp maskProp = (BitMaskTextProp)paragraphStyle.findByName(ParagraphFlagsTextProp.NAME);
-			hardAttribute = maskProp != null && maskProp.getValue() == 0;
-		}
-		if (prop == null && !hardAttribute){
-			Sheet sheet = parentRun.getSheet();
-			int txtype = parentRun.getRunType();
-			MasterSheet master = sheet.getMasterSheet();
-			if (master != null)
-				prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false);
-		}
-
-		return prop == null ? -1 : prop.getValue();
-	}
-
-	/**
-	 * Sets the value of the given Character TextProp, add if required
-	 * @param propName The name of the Character TextProp
-	 * @param val The value to set for the TextProp
-	 */
-	public void setParaTextPropVal(String propName, int val) {
-		// Ensure we have the StyleTextProp atom we're going to need
-		if(paragraphStyle == null) {
-			parentRun.ensureStyleAtomPresent();
-			// paragraphStyle will now be defined
-		}
-
-        assert(paragraphStyle!=null);
-		TextProp tp = fetchOrAddTextProp(paragraphStyle, propName);
-		tp.setValue(val);
-	}
-	/**
-	 * Sets the value of the given Paragraph TextProp, add if required
-	 * @param propName The name of the Paragraph TextProp
-	 * @param val The value to set for the TextProp
-	 */
-	public void setCharTextPropVal(String propName, int val) {
-		// Ensure we have the StyleTextProp atom we're going to need
-		if(characterStyle == null) {
-			parentRun.ensureStyleAtomPresent();
-			// characterStyle will now be defined
-		}
-
-		assert(characterStyle!=null);
-		TextProp tp = fetchOrAddTextProp(characterStyle, propName);
-		tp.setValue(val);
-	}
-
-
-	// --------------- Friendly getters / setters on rich text properties -------
-
-	/**
-	 * Is the text bold?
-	 */
-	public boolean isBold() {
-		return isCharFlagsTextPropVal(CharFlagsTextProp.BOLD_IDX);
-	}
-
-	/**
-	 * Is the text bold?
-	 */
-	public void setBold(boolean bold) {
-		setCharFlagsTextPropVal(CharFlagsTextProp.BOLD_IDX, bold);
-	}
-
-	/**
-	 * Is the text italic?
-	 */
-	public boolean isItalic() {
-		return isCharFlagsTextPropVal(CharFlagsTextProp.ITALIC_IDX);
-	}
-
-	/**
-	 * Is the text italic?
-	 */
-	public void setItalic(boolean italic) {
-		setCharFlagsTextPropVal(CharFlagsTextProp.ITALIC_IDX, italic);
-	}
-
-	/**
-	 * Is the text underlined?
-	 */
-	public boolean isUnderlined() {
-		return isCharFlagsTextPropVal(CharFlagsTextProp.UNDERLINE_IDX);
-	}
-
-	/**
-	 * Is the text underlined?
-	 */
-	public void setUnderlined(boolean underlined) {
-		setCharFlagsTextPropVal(CharFlagsTextProp.UNDERLINE_IDX, underlined);
-	}
-
-	/**
-	 * Does the text have a shadow?
-	 */
-	public boolean isShadowed() {
-		return isCharFlagsTextPropVal(CharFlagsTextProp.SHADOW_IDX);
-	}
-
-	/**
-	 * Does the text have a shadow?
-	 */
-	public void setShadowed(boolean flag) {
-		setCharFlagsTextPropVal(CharFlagsTextProp.SHADOW_IDX, flag);
-	}
-
-	/**
-	 * Is this text embossed?
-	 */
-	 public boolean isEmbossed() {
-		return isCharFlagsTextPropVal(CharFlagsTextProp.RELIEF_IDX);
-	}
-
-	/**
-	 * Is this text embossed?
-	 */
-	 public void setEmbossed(boolean flag) {
-		setCharFlagsTextPropVal(CharFlagsTextProp.RELIEF_IDX, flag);
-	}
-
-	/**
-	 * Gets the strikethrough flag
-	 */
-	public boolean isStrikethrough() {
-		return isCharFlagsTextPropVal(CharFlagsTextProp.STRIKETHROUGH_IDX);
-	}
-
-	/**
-	 * Sets the strikethrough flag
-	 */
-	public void setStrikethrough(boolean flag) {
-		setCharFlagsTextPropVal(CharFlagsTextProp.STRIKETHROUGH_IDX, flag);
-	}
-
-	/**
-	 * Gets the subscript/superscript option
-	 *
-	 * @return the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript
-	 */
-	public int getSuperscript() {
-		int val = getCharTextPropVal("superscript");
-		return val == -1 ? 0 : val;
-	}
-
-	/**
-	 * Sets the subscript/superscript option
-	 *
-	 * @param val the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript
-	 */
-	public void setSuperscript(int val) {
-		setCharTextPropVal("superscript", val);
-	}
-
-	/**
-	 * Gets the font size
-	 */
-	public int getFontSize() {
-		return getCharTextPropVal("font.size");
-	}
-
-
-	/**
-	 * Sets the font size
-	 */
-	public void setFontSize(int fontSize) {
-		setCharTextPropVal("font.size", fontSize);
-	}
-
-	/**
-	 * Gets the font index
-	 */
-	public int getFontIndex() {
-		return getCharTextPropVal("font.index");
-	}
-
-	/**
-	 * Sets the font index
-	 */
-	public void setFontIndex(int idx) {
-		setCharTextPropVal("font.index", idx);
-	}
-
-
-	/**
-	 * Sets the font name to use
-	 */
-	public void setFontName(String fontName) {
-		if (slideShow == null) {
-			//we can't set font since slideshow is not assigned yet
-			_fontname = fontName;
-		} else {
-			// Get the index for this font (adding if needed)
-			int fontIdx = slideShow.getFontCollection().addFont(fontName);
-			setCharTextPropVal("font.index", fontIdx);
-		}
-	}
-
-	/**
-	 * Gets the font name
-	 */
-	public String getFontName() {
-		if (slideShow == null) {
-			return _fontname;
-		}
-		int fontIdx = getCharTextPropVal("font.index");
-		if(fontIdx == -1) { return null; }
-		return slideShow.getFontCollection().getFontWithId(fontIdx);
-	}
-
-	/**
-	 * @return font color as RGB value
-	 * @see java.awt.Color
-	 */
-	public Color getFontColor() {
-		int rgb = getCharTextPropVal("font.color");
-
-		int cidx = rgb >> 24;
-		if (rgb % 0x1000000 == 0){
-			ColorSchemeAtom ca = parentRun.getSheet().getColorScheme();
-			if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx);
-		}
-		Color tmp = new Color(rgb, true);
-		return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed());
-	}
-
-	/**
-	 * Sets color of the text, as a int bgr.
-	 * (PowerPoint stores as BlueGreenRed, not the more
-	 *  usual RedGreenBlue)
-	 * @see java.awt.Color
-	 */
-	public void setFontColor(int bgr) {
-		setCharTextPropVal("font.color", bgr);
-	}
-
-	/**
-	 * Sets color of the text, as a java.awt.Color
-	 */
-	public void setFontColor(Color color) {
-		// In PowerPont RGB bytes are swapped, as BGR
-		int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB();
-		setFontColor(rgb);
-	}
-
-	/**
-	 * Sets the type of horizontal alignment for the text.
-	 * One of the <code>Align*</code> constants defined in the <code>TextBox</code> class.
-	 *
-	 * @param align - the type of alignment
-	 */
-	public void setAlignment(int align) {
-		setParaTextPropVal("alignment", align);
-	}
-	/**
-	 * Returns the type of horizontal alignment for the text.
-	 * One of the <code>Align*</code> constants defined in the <code>TextBox</class> class.
-	 *
-	 * @return the type of alignment
-	 */
-	public int getAlignment() {
-		return getParaTextPropVal("alignment");
-	}
-
-	/**
-	 *
-	 * @return indentation level
-	 */
-	public int getIndentLevel() {
-		return paragraphStyle == null ? 0 : paragraphStyle.getReservedField();
-	}
-
-	/**
-	 * Sets indentation level
-	 *
-	 * @param level indentation level. Must be in the range [0, 4]
-	 */
-	public void setIndentLevel(int level) {
-		if(paragraphStyle != null ) paragraphStyle.setReservedField((short)level);
-	}
-
-	/**
-	 * Sets whether this rich text run has bullets
-	 */
-	public void setBullet(boolean flag) {
-		setFlag(false, ParagraphFlagsTextProp.BULLET_IDX, flag);
-	}
-
-	/**
-	 * Returns whether this rich text run has bullets
-	 */
-	public boolean isBullet() {
-		return getFlag(false, ParagraphFlagsTextProp.BULLET_IDX);
-	}
-
-	/**
-	 * Returns whether this rich text run has bullets
-	 */
-	public boolean isBulletHard() {
-		return getFlag(false, ParagraphFlagsTextProp.BULLET_IDX);
-	}
-
-	/**
-	 * Sets the bullet character
-	 */
-	public void setBulletChar(char c) {
-		setParaTextPropVal("bullet.char", c);
-	}
-
-	/**
-	 * Returns the bullet character
-	 */
-	public char getBulletChar() {
-		return (char)getParaTextPropVal("bullet.char");
-	}
-
-	/**
-	 * Sets the bullet offset
-	 */
-	public void setBulletOffset(int offset) {
-		setParaTextPropVal("bullet.offset", offset*Shape.MASTER_DPI/Shape.POINT_DPI);
-	}
-
-	/**
-	 * Returns the bullet offset
-	 */
-	public int getBulletOffset() {
-		return getParaTextPropVal("bullet.offset")*Shape.POINT_DPI/Shape.MASTER_DPI;
-	}
-
-	/**
-	 * Sets the text offset
-	 */
-	public void setTextOffset(int offset) {
-		setParaTextPropVal("text.offset", offset*Shape.MASTER_DPI/Shape.POINT_DPI);
-	}
-
-	/**
-	 * Returns the text offset
-	 */
-	public int getTextOffset() {
-		return getParaTextPropVal("text.offset")*Shape.POINT_DPI/Shape.MASTER_DPI;
-	}
-
-	/**
-	 * Sets the bullet size
-	 */
-	public void setBulletSize(int size) {
-		setParaTextPropVal("bullet.size", size);
-	}
-
-	/**
-	 * Returns the bullet size
-	 */
-	public int getBulletSize() {
-		return getParaTextPropVal("bullet.size");
-	}
-
-	/**
-	 * Sets the bullet color
-	 */
-	public void setBulletColor(Color color) {
-		int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB();
-		setParaTextPropVal("bullet.color", rgb);
-	}
-
-	/**
-	 * Returns the bullet color
-	 */
-	public Color getBulletColor() {
-		int rgb = getParaTextPropVal("bullet.color");
-		if(rgb == -1) return getFontColor();
-
-		int cidx = rgb >> 24;
-		if (rgb % 0x1000000 == 0){
-			ColorSchemeAtom ca = parentRun.getSheet().getColorScheme();
-			if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx);
-		}
-		Color tmp = new Color(rgb, true);
-		return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed());
-	}
-
-	/**
-	 * Sets the bullet font
-	 */
-	public void setBulletFont(int idx) {
-		setParaTextPropVal("bullet.font", idx);
-		setFlag(false, ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true);
-	}
-
-	/**
-	 * Returns the bullet font
-	 */
-	public int getBulletFont() {
-		return getParaTextPropVal("bullet.font");
-	}
-
-	/**
-	 * Sets the line spacing.
-	 * <p>
-	 * If linespacing >= 0, then linespacing is a percentage of normal line height.
-	 * If linespacing < 0, the absolute value of linespacing is the spacing in master coordinates.
-	 * </p>
-	 */
-	public void setLineSpacing(int val) {
-		setParaTextPropVal("linespacing", val);
-	}
-
-	/**
-	 * Returns the line spacing
-	 * <p>
-	 * If linespacing >= 0, then linespacing is a percentage of normal line height.
-	 * If linespacing < 0, the absolute value of linespacing is the spacing in master coordinates.
-	 * </p>
-	 *
-	 * @return the spacing between lines
-	 */
-	public int getLineSpacing() {
-		int val = getParaTextPropVal("linespacing");
-		return val == -1 ? 0 : val;
-	}
-
-	/**
-	 * Sets spacing before a paragraph.
-	 * <p>
-	 * If spacebefore >= 0, then spacebefore is a percentage of normal line height.
-	 * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates.
-	 * </p>
-	 */
-	public void setSpaceBefore(int val) {
-		setParaTextPropVal("spacebefore", val);
-	}
-
-	/**
-	 * Returns spacing before a paragraph
-	 * <p>
-	 * If spacebefore >= 0, then spacebefore is a percentage of normal line height.
-	 * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates.
-	 * </p>
-	 *
-	 * @return the spacing before a paragraph
-	 */
-	public int getSpaceBefore() {
-		int val = getParaTextPropVal("spacebefore");
-		return val == -1 ? 0 : val;
-	}
-
-	/**
-	 * Sets spacing after a paragraph.
-	 * <p>
-	 * If spaceafter >= 0, then spaceafter is a percentage of normal line height.
-	 * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates.
-	 * </p>
-	 */
-	public void setSpaceAfter(int val) {
-		setParaTextPropVal("spaceafter", val);
-	}
-
-	/**
-	 * Returns spacing after a paragraph
-	 * <p>
-	 * If spaceafter >= 0, then spaceafter is a percentage of normal line height.
-	 * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates.
-	 * </p>
-	 *
-	 * @return the spacing before a paragraph
-	 */
-	public int getSpaceAfter() {
-		int val = getParaTextPropVal("spaceafter");
-		return val == -1 ? 0 : val;
-	}
-	// --------------- Internal HSLF methods, not intended for end-user use! -------
-
-	/**
-	 * Internal Use Only - get the underlying paragraph style collection.
-	 * For normal use, use the friendly setters and getters
-	 */
-	public TextPropCollection _getRawParagraphStyle() { return paragraphStyle; }
-	/**
-	 * Internal Use Only - get the underlying character style collection.
-	 * For normal use, use the friendly setters and getters
-	 */
-	public TextPropCollection _getRawCharacterStyle() { return characterStyle; }
-	/**
-	 * Internal Use Only - are the Paragraph styles shared?
-	 */
-	public boolean _isParagraphStyleShared() { return sharingParagraphStyle; }
-	/**
-	 * Internal Use Only - are the Character styles shared?
-	 */
-	public boolean _isCharacterStyleShared() { return sharingCharacterStyle; }
-}
diff --git a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java
index f09f39f..30296cf 100644
--- a/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java
+++ b/src/scratchpad/testcases/org/apache/poi/TestPOIDocumentScratchpad.java
@@ -22,9 +22,10 @@
 
 
 import junit.framework.TestCase;
+
 import java.io.*;
 
-import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.hwpf.HWPFTestDataSamples;
 import org.apache.poi.poifs.filesystem.*;
 
@@ -47,7 +48,7 @@
 	 *  a Word Document for our testing
 	 */
 	public void setUp() throws Exception {
-		doc = new HSLFSlideShow(POIDataSamples.getSlideShowInstance().openResourceAsStream("basic_test_ppt_file.ppt"));
+		doc = new HSLFSlideShowImpl(POIDataSamples.getSlideShowInstance().openResourceAsStream("basic_test_ppt_file.ppt"));
 
 		doc2 = HWPFTestDataSamples.openSampleFile("test2.doc");
 	}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java b/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java
index 6740708..34d5aee 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/HSLFTestDataSamples.java
@@ -24,7 +24,8 @@
 import java.io.InputStream;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 
 public class HSLFTestDataSamples {
 
@@ -45,12 +46,12 @@
 	 * from a <tt>ByteArrayInputStream</tt>.<p/>
 	 * Useful for verifying that the serialisation round trip
 	 */
-	public static HSLFSlideShow writeOutAndReadBack(HSLFSlideShow original) {
+	public static HSLFSlideShowImpl writeOutAndReadBack(HSLFSlideShowImpl original) {
 		try {
 			ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
 			original.write(baos);
 			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-			return new HSLFSlideShow(bais);
+			return new HSLFSlideShowImpl(bais);
 		} catch (IOException e) {
 			throw new RuntimeException(e);
 		}
@@ -61,12 +62,12 @@
 	 * from a <tt>ByteArrayInputStream</tt>.<p/>
 	 * Useful for verifying that the serialisation round trip
 	 */
-	public static SlideShow writeOutAndReadBack(SlideShow original) {
+	public static HSLFSlideShow writeOutAndReadBack(HSLFSlideShow original) {
 		try {
 			ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
 			original.write(baos);
 			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
-			return new SlideShow(bais);
+			return new HSLFSlideShow(bais);
 		} catch (IOException e) {
 			throw new RuntimeException(e);
 		}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java
index da07810..ae43394 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestEncryptedFile.java
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.POIDataSamples;
 
 /**
@@ -32,28 +33,28 @@
     private static POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 
 	public void testLoadNonEncrypted() throws Exception {
-		HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
 
 		assertNotNull(hss);
 	}
 
 	public void testLoadEncrypted() throws Exception {
 		try {
-            new HSLFSlideShow(slTests.openResourceAsStream("Password_Protected-hello.ppt"));
+            new HSLFSlideShowImpl(slTests.openResourceAsStream("Password_Protected-hello.ppt"));
 			fail();
 		} catch(EncryptedPowerPointFileException e) {
 			// Good
 		}
 
 		try {
-            new HSLFSlideShow(slTests.openResourceAsStream("Password_Protected-np-hello.ppt"));
+            new HSLFSlideShowImpl(slTests.openResourceAsStream("Password_Protected-np-hello.ppt"));
 			fail();
 		} catch(EncryptedPowerPointFileException e) {
 			// Good
 		}
 
 		try {
-            new HSLFSlideShow(slTests.openResourceAsStream("Password_Protected-56-hello.ppt"));
+            new HSLFSlideShowImpl(slTests.openResourceAsStream("Password_Protected-56-hello.ppt"));
 			fail();
 		} catch(EncryptedPowerPointFileException e) {
 			// Good
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java
index 1398e74..a742528 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWrite.java
@@ -25,7 +25,8 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 
@@ -37,9 +38,9 @@
  */
 public final class TestReWrite extends TestCase {
 	// HSLFSlideShow primed on the test data
-	private HSLFSlideShow hssA;
-	private HSLFSlideShow hssB;
-	private HSLFSlideShow hssC;
+	private HSLFSlideShowImpl hssA;
+	private HSLFSlideShowImpl hssB;
+	private HSLFSlideShowImpl hssC;
 	// POIFS primed on the test data
 	private POIFSFileSystem pfsA;
 	private POIFSFileSystem pfsB;
@@ -50,20 +51,20 @@
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
         
 		pfsA = new POIFSFileSystem(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		hssA = new HSLFSlideShow(pfsA);
+		hssA = new HSLFSlideShowImpl(pfsA);
 
         pfsB = new POIFSFileSystem(slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt"));
-		hssB = new HSLFSlideShow(pfsB);
+		hssB = new HSLFSlideShowImpl(pfsB);
 
         pfsC = new POIFSFileSystem(slTests.openResourceAsStream("WithMacros.ppt"));
-		hssC = new HSLFSlideShow(pfsC);
+		hssC = new HSLFSlideShowImpl(pfsC);
     }
 
     public void testWritesOutTheSame() throws Exception {
     	assertWritesOutTheSame(hssA, pfsA);
     	assertWritesOutTheSame(hssB, pfsB);
     }
-    public void assertWritesOutTheSame(HSLFSlideShow hss, POIFSFileSystem pfs) throws Exception {
+    public void assertWritesOutTheSame(HSLFSlideShowImpl hss, POIFSFileSystem pfs) throws Exception {
 		// Write out to a byte array
 		ByteArrayOutputStream baos = new ByteArrayOutputStream();
 		hss.write(baos);
@@ -129,9 +130,9 @@
     	// We need to identify and fix that first
     	//assertSlideShowWritesOutTheSame(hssB, pfsB);
     }
-    public void assertSlideShowWritesOutTheSame(HSLFSlideShow hss, POIFSFileSystem pfs) throws Exception {
+    public void assertSlideShowWritesOutTheSame(HSLFSlideShowImpl hss, POIFSFileSystem pfs) throws Exception {
     	// Create a slideshow covering it
-    	SlideShow ss = new SlideShow(hss);
+    	HSLFSlideShow ss = new HSLFSlideShow(hss);
     	ss.getSlides();
     	ss.getNotes();
 
@@ -163,7 +164,7 @@
 	}
     
     public void test48593() throws Exception {
-		SlideShow slideShow = new SlideShow();
+		HSLFSlideShow slideShow = new HSLFSlideShow();
 		slideShow.createSlide();
 		slideShow = HSLFTestDataSamples.writeOutAndReadBack(slideShow);
 		slideShow.createSlide();
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java
index ae76116..50d2370 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestReWriteSanity.java
@@ -19,9 +19,12 @@
 
 
 import junit.framework.TestCase;
+
 import java.io.*;
 import java.util.*;
+
 import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.poifs.filesystem.*;
 import org.apache.poi.POIDataSamples;
 
@@ -33,14 +36,14 @@
  */
 public final class TestReWriteSanity extends TestCase {
 	// HSLFSlideShow primed on the test data
-	private HSLFSlideShow ss;
+	private HSLFSlideShowImpl ss;
 	// POIFS primed on the test data
 	private POIFSFileSystem pfs;
 
     public TestReWriteSanity() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 		pfs = new POIFSFileSystem(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss = new HSLFSlideShow(pfs);
+		ss = new HSLFSlideShowImpl(pfs);
     }
 
 	public void testUserEditAtomsRight() throws Exception {
@@ -52,7 +55,7 @@
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
 		// Create a new one from that
-		HSLFSlideShow wss = new HSLFSlideShow(bais);
+		HSLFSlideShowImpl wss = new HSLFSlideShowImpl(bais);
 
 		// Find the location of the PersistPtrIncrementalBlocks and
 		// UserEditAtoms
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java b/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java
index 5d509b6..d40a1e6 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/TestRecordCounts.java
@@ -19,7 +19,9 @@
 
 
 import junit.framework.TestCase;
+
 import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.POIDataSamples;
 
 /**
@@ -30,11 +32,11 @@
  */
 public final class TestRecordCounts extends TestCase {
 	// HSLFSlideShow primed on the test data
-	private HSLFSlideShow ss;
+	private HSLFSlideShowImpl ss;
 
 	public TestRecordCounts() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		ss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
 	}
 
 	public void testSheetsCount() {
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java
index 7fc234f..e17e2be 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TestExtractor.java
@@ -23,9 +23,9 @@
 
 import org.apache.poi.POIDataSamples;
 import org.apache.poi.POITestCase;
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.model.OLEShape;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hwpf.HWPFDocument;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
@@ -140,7 +140,7 @@
          POIFSFileSystem fs = new POIFSFileSystem(
              POIDataSamples.getSpreadSheetInstance().openResourceAsStream("excel_with_embeded.xls")
          );
-         HSLFSlideShow ss;
+         HSLFSlideShowImpl ss;
 
          DirectoryNode dirA = (DirectoryNode)
              fs.getRoot().getEntry("MBD0000A3B6");
@@ -151,14 +151,14 @@
          assertNotNull(dirB.getEntry("PowerPoint Document"));
 
          // Check the first file
-         ss = new HSLFSlideShow(dirA);
+         ss = new HSLFSlideShowImpl(dirA);
          ppe = new PowerPointExtractor(ss);
          assertEquals("Sample PowerPoint file\nThis is the 1st file\nNot much too it\n",
                  ppe.getText(true, false)
          );
 
          // And the second
-         ss = new HSLFSlideShow(dirB);
+         ss = new HSLFSlideShowImpl(dirB);
          ppe = new PowerPointExtractor(ss);
          assertEquals("Sample PowerPoint file\nThis is the 2nd file\nNot much too it either\n",
                  ppe.getText(true, false)
@@ -186,7 +186,7 @@
                  num_doc++;
              } else if ("Presentation".equals(name)) {
                  num_ppt++;
-                 SlideShow ppt = new SlideShow(data);
+                 HSLFSlideShow ppt = new HSLFSlideShow(data);
              }
          }
          assertEquals("Expected 2 embedded Word Documents", 2, num_doc);
@@ -241,8 +241,8 @@
        String  text;
 
        // With a header on the notes
-       HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("45537_Header.ppt"));
-       SlideShow ss = new SlideShow(hslf);
+       HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("45537_Header.ppt"));
+       HSLFSlideShow ss = new HSLFSlideShow(hslf);
        assertNotNull(ss.getNotesHeadersFooters());
        assertEquals("testdoc test phrase", ss.getNotesHeadersFooters().getHeaderText());
 
@@ -259,8 +259,8 @@
 
 
        // And with a footer, also on notes
-       hslf = new HSLFSlideShow(slTests.openResourceAsStream("45537_Footer.ppt"));
-       ss = new SlideShow(hslf);
+       hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("45537_Footer.ppt"));
+       ss = new HSLFSlideShow(hslf);
        assertNotNull(ss.getNotesHeadersFooters());
        assertEquals("testdoc test phrase", ss.getNotesHeadersFooters().getFooterText());
 
@@ -281,7 +281,7 @@
       String masterTitleText = "This is the Master Title";
       String masterRandomText = "This text comes from the Master Slide";
       String masterFooterText = "Footer from the master slide";
-      HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("WithMaster.ppt"));
+      HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("WithMaster.ppt"));
       
       ppe = new PowerPointExtractor(hslf);
       
@@ -309,7 +309,7 @@
        // Now with another file only containing master text
        // Will always show up
        String masterText = "Footer from the master slide";
-       HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("WithMaster.ppt"));
+       HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("WithMaster.ppt"));
        
        ppe = new PowerPointExtractor(hslf);
        
@@ -322,7 +322,7 @@
      * Bug #54880 Chinese text not extracted properly
      */
     public void testChineseText() throws Exception {
-       HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("54880_chinese.ppt"));
+       HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("54880_chinese.ppt"));
        ppe = new PowerPointExtractor(hslf);
        
        String text = ppe.getText();
@@ -360,7 +360,7 @@
 
        // Open via a HWPFDocument
        for(DirectoryNode dir : files) {
-          HSLFSlideShow slideshow = new HSLFSlideShow(dir);
+          HSLFSlideShowImpl slideshow = new HSLFSlideShowImpl(dir);
           PowerPointExtractor extractor = new PowerPointExtractor(slideshow);
           assertEquals(expectText, extractor.getText());
        }
@@ -369,20 +369,20 @@
     }
 
     public void testTable() throws Exception{
-        ppe = new PowerPointExtractor(slTests.openResourceAsStream("54111.ppt"));
-        String text = ppe.getText();
-        String target = "TH Cell 1\tTH Cell 2\tTH Cell 3\tTH Cell 4\n"+
-                         "Row 1, Cell 1\tRow 1, Cell 2\tRow 1, Cell 3\tRow 1, Cell 4\n"+   
-                         "Row 2, Cell 1\tRow 2, Cell 2\tRow 2, Cell 3\tRow 2, Cell 4\n"+
-                         "Row 3, Cell 1\tRow 3, Cell 2\tRow 3, Cell 3\tRow 3, Cell 4\n"+
-                         "Row 4, Cell 1\tRow 4, Cell 2\tRow 4, Cell 3\tRow 4, Cell 4\n"+ 
-                         "Row 5, Cell 1\tRow 5, Cell 2\tRow 5, Cell 3\tRow 5, Cell 4\n";
-        assertTrue(text.contains(target));
+//        ppe = new PowerPointExtractor(slTests.openResourceAsStream("54111.ppt"));
+//        String text = ppe.getText();
+//        String target = "TH Cell 1\tTH Cell 2\tTH Cell 3\tTH Cell 4\n"+
+//                         "Row 1, Cell 1\tRow 1, Cell 2\tRow 1, Cell 3\tRow 1, Cell 4\n"+   
+//                         "Row 2, Cell 1\tRow 2, Cell 2\tRow 2, Cell 3\tRow 2, Cell 4\n"+
+//                         "Row 3, Cell 1\tRow 3, Cell 2\tRow 3, Cell 3\tRow 3, Cell 4\n"+
+//                         "Row 4, Cell 1\tRow 4, Cell 2\tRow 4, Cell 3\tRow 4, Cell 4\n"+ 
+//                         "Row 5, Cell 1\tRow 5, Cell 2\tRow 5, Cell 3\tRow 5, Cell 4\n";
+//        assertTrue(text.contains(target));
 
         ppe = new PowerPointExtractor(slTests.openResourceAsStream("54722.ppt"));
-        text = ppe.getText();
+        String text = ppe.getText();
 
-        target = "this\tText\tis\twithin\ta\n"+
+        String target = "this\tText\tis\twithin\ta\n"+
                 "table\t1\t2\t3\t4";
         assertTrue(text.contains(target));
     }    
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java
index 71cd5f5..14301af 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/AllHSLFModelTests.java
@@ -29,13 +29,11 @@
     TestFreeform.class,
     TestHeadersFooters.class,
     TestHyperlink.class,
-    TestImagePainter.class,
     TestLine.class,
     TestMovieShape.class,
     TestOleEmbedding.class,
     TestPPFont.class,
     TestPPGraphics2D.class,
-    TestPicture.class,
     TestSetBoldItalic.class,
     TestShapes.class,
     TestSheet.class,
@@ -43,9 +41,7 @@
     TestSlideMaster.class,
     TestSlides.class,
     TestTable.class,
-    TestTextRun.class,
-    TestTextRunReWrite.class,
-    TestTextShape.class
+    TestTextRunReWrite.class
 })
 public class AllHSLFModelTests {
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java
index 41c5c58..92eca1a 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestBackground.java
@@ -32,9 +32,9 @@
 import org.apache.poi.ddf.EscherProperties;
 import org.apache.poi.ddf.EscherRecord;
 import org.apache.poi.ddf.EscherSimpleProperty;
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.record.Document;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.ShapeType;
 import org.junit.Test;
 
 
@@ -51,16 +51,16 @@
      */
     @Test
     public void defaults() {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        assertEquals(Fill.FILL_SOLID, ppt.getSlidesMasters()[0].getBackground().getFill().getFillType());
+        assertEquals(HSLFFill.FILL_SOLID, ppt.getSlideMasters().get(0).getBackground().getFill().getFillType());
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         assertTrue(slide.getFollowMasterBackground());
-        assertEquals(Fill.FILL_SOLID, slide.getBackground().getFill().getFillType());
+        assertEquals(HSLFFill.FILL_SOLID, slide.getBackground().getFill().getFillType());
 
-        Shape shape = new AutoShape(ShapeTypes.Rectangle);
-        assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType());
+        HSLFShape shape = new HSLFAutoShape(ShapeType.RECT);
+        assertEquals(HSLFFill.FILL_SOLID, shape.getFill().getFillType());
     }
 
     /**
@@ -68,31 +68,31 @@
      */
     @Test
     public void readBackground() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("backgrounds.ppt"));
-        Fill fill;
-        Shape shape;
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("backgrounds.ppt"));
+        HSLFFill fill;
+        HSLFShape shape;
 
-        Slide[] slide = ppt.getSlides();
+        List<HSLFSlide> slide = ppt.getSlides();
 
-        fill = slide[0].getBackground().getFill();
-        assertEquals(Fill.FILL_PICTURE, fill.getFillType());
-        shape = slide[0].getShapes()[0];
-        assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType());
+        fill = slide.get(0).getBackground().getFill();
+        assertEquals(HSLFFill.FILL_PICTURE, fill.getFillType());
+        shape = slide.get(0).getShapes().get(0);
+        assertEquals(HSLFFill.FILL_SOLID, shape.getFill().getFillType());
 
-        fill = slide[1].getBackground().getFill();
-        assertEquals(Fill.FILL_PATTERN, fill.getFillType());
-        shape = slide[1].getShapes()[0];
-        assertEquals(Fill.FILL_BACKGROUND, shape.getFill().getFillType());
+        fill = slide.get(1).getBackground().getFill();
+        assertEquals(HSLFFill.FILL_PATTERN, fill.getFillType());
+        shape = slide.get(1).getShapes().get(0);
+        assertEquals(HSLFFill.FILL_BACKGROUND, shape.getFill().getFillType());
 
-        fill = slide[2].getBackground().getFill();
-        assertEquals(Fill.FILL_TEXTURE, fill.getFillType());
-        shape = slide[2].getShapes()[0];
-        assertEquals(Fill.FILL_PICTURE, shape.getFill().getFillType());
+        fill = slide.get(2).getBackground().getFill();
+        assertEquals(HSLFFill.FILL_TEXTURE, fill.getFillType());
+        shape = slide.get(2).getShapes().get(0);
+        assertEquals(HSLFFill.FILL_PICTURE, shape.getFill().getFillType());
 
-        fill = slide[3].getBackground().getFill();
-        assertEquals(Fill.FILL_SHADE_CENTER, fill.getFillType());
-        shape = slide[3].getShapes()[0];
-        assertEquals(Fill.FILL_SHADE, shape.getFill().getFillType());
+        fill = slide.get(3).getBackground().getFill();
+        assertEquals(HSLFFill.FILL_SHADE_CENTER, fill.getFillType());
+        shape = slide.get(3).getShapes().get(0);
+        assertEquals(HSLFFill.FILL_SHADE, shape.getFill().getFillType());
     }
 
     /**
@@ -100,55 +100,55 @@
      */
     @Test
     public void backgroundPicture() throws Exception {
-        SlideShow ppt = new SlideShow();
-        Slide slide;
-        Fill fill;
-        Shape shape;
+        HSLFSlideShow ppt = new HSLFSlideShow();
+        HSLFSlide slide;
+        HSLFFill fill;
+        HSLFShape shape;
         int idx;
 
         //slide 1
         slide = ppt.createSlide();
         slide.setFollowMasterBackground(false);
         fill = slide.getBackground().getFill();
-        idx = ppt.addPicture(_slTests.readFile("tomcat.png"), Picture.PNG);
-        fill.setFillType(Fill.FILL_PICTURE);
+        idx = ppt.addPicture(_slTests.readFile("tomcat.png"), HSLFPictureShape.PNG);
+        fill.setFillType(HSLFFill.FILL_PICTURE);
         fill.setPictureData(idx);
 
-        shape = new AutoShape(ShapeTypes.Rectangle);
+        shape = new HSLFAutoShape(ShapeType.RECT);
         shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200));
         fill = shape.getFill();
-        fill.setFillType(Fill.FILL_SOLID);
+        fill.setFillType(HSLFFill.FILL_SOLID);
         slide.addShape(shape);
 
         //slide 2
         slide = ppt.createSlide();
         slide.setFollowMasterBackground(false);
         fill = slide.getBackground().getFill();
-        idx = ppt.addPicture(_slTests.readFile("tomcat.png"), Picture.PNG);
-        fill.setFillType(Fill.FILL_PATTERN);
+        idx = ppt.addPicture(_slTests.readFile("tomcat.png"), HSLFPictureShape.PNG);
+        fill.setFillType(HSLFFill.FILL_PATTERN);
         fill.setPictureData(idx);
         fill.setBackgroundColor(Color.green);
         fill.setForegroundColor(Color.red);
 
-        shape = new AutoShape(ShapeTypes.Rectangle);
+        shape = new HSLFAutoShape(ShapeType.RECT);
         shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200));
         fill = shape.getFill();
-        fill.setFillType(Fill.FILL_BACKGROUND);
+        fill.setFillType(HSLFFill.FILL_BACKGROUND);
         slide.addShape(shape);
 
         //slide 3
         slide = ppt.createSlide();
         slide.setFollowMasterBackground(false);
         fill = slide.getBackground().getFill();
-        idx = ppt.addPicture(_slTests.readFile("tomcat.png"), Picture.PNG);
-        fill.setFillType(Fill.FILL_TEXTURE);
+        idx = ppt.addPicture(_slTests.readFile("tomcat.png"), HSLFPictureShape.PNG);
+        fill.setFillType(HSLFFill.FILL_TEXTURE);
         fill.setPictureData(idx);
 
-        shape = new AutoShape(ShapeTypes.Rectangle);
+        shape = new HSLFAutoShape(ShapeType.RECT);
         shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200));
         fill = shape.getFill();
-        fill.setFillType(Fill.FILL_PICTURE);
-        idx = ppt.addPicture(_slTests.readFile("clock.jpg"), Picture.JPEG);
+        fill.setFillType(HSLFFill.FILL_PICTURE);
+        idx = ppt.addPicture(_slTests.readFile("clock.jpg"), HSLFPictureShape.JPEG);
         fill.setPictureData(idx);
         slide.addShape(shape);
 
@@ -156,14 +156,14 @@
         slide = ppt.createSlide();
         slide.setFollowMasterBackground(false);
         fill = slide.getBackground().getFill();
-        fill.setFillType(Fill.FILL_SHADE_CENTER);
+        fill.setFillType(HSLFFill.FILL_SHADE_CENTER);
         fill.setBackgroundColor(Color.white);
         fill.setForegroundColor(Color.darkGray);
 
-        shape = new AutoShape(ShapeTypes.Rectangle);
+        shape = new HSLFAutoShape(ShapeType.RECT);
         shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200));
         fill = shape.getFill();
-        fill.setFillType(Fill.FILL_SHADE);
+        fill.setFillType(HSLFFill.FILL_SHADE);
         fill.setBackgroundColor(Color.red);
         fill.setForegroundColor(Color.green);
         slide.addShape(shape);
@@ -173,45 +173,45 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        Slide[] slides = ppt.getSlides();
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        List<HSLFSlide> slides = ppt.getSlides();
 
-        fill = slides[0].getBackground().getFill();
-        assertEquals(Fill.FILL_PICTURE, fill.getFillType());
-        assertEquals(3, getFillPictureRefCount(slides[0].getBackground(), fill));
-        shape = slides[0].getShapes()[0];
-        assertEquals(Fill.FILL_SOLID, shape.getFill().getFillType());
+        fill = slides.get(0).getBackground().getFill();
+        assertEquals(HSLFFill.FILL_PICTURE, fill.getFillType());
+        assertEquals(3, getFillPictureRefCount(slides.get(0).getBackground(), fill));
+        shape = slides.get(0).getShapes().get(0);
+        assertEquals(HSLFFill.FILL_SOLID, shape.getFill().getFillType());
 
-        fill = slides[1].getBackground().getFill();
-        assertEquals(Fill.FILL_PATTERN, fill.getFillType());
-        shape = slides[1].getShapes()[0];
-        assertEquals(Fill.FILL_BACKGROUND, shape.getFill().getFillType());
+        fill = slides.get(1).getBackground().getFill();
+        assertEquals(HSLFFill.FILL_PATTERN, fill.getFillType());
+        shape = slides.get(1).getShapes().get(0);
+        assertEquals(HSLFFill.FILL_BACKGROUND, shape.getFill().getFillType());
 
-        fill = slides[2].getBackground().getFill();
-        assertEquals(Fill.FILL_TEXTURE, fill.getFillType());
-        assertEquals(3, getFillPictureRefCount(slides[2].getBackground(), fill));
-        shape = slides[2].getShapes()[0];
-        assertEquals(Fill.FILL_PICTURE, shape.getFill().getFillType());
+        fill = slides.get(2).getBackground().getFill();
+        assertEquals(HSLFFill.FILL_TEXTURE, fill.getFillType());
+        assertEquals(3, getFillPictureRefCount(slides.get(2).getBackground(), fill));
+        shape = slides.get(2).getShapes().get(0);
+        assertEquals(HSLFFill.FILL_PICTURE, shape.getFill().getFillType());
         assertEquals(1, getFillPictureRefCount(shape, fill));
 
-        fill = slides[3].getBackground().getFill();
-        assertEquals(Fill.FILL_SHADE_CENTER, fill.getFillType());
-        shape = slides[3].getShapes()[0];
-        assertEquals(Fill.FILL_SHADE, shape.getFill().getFillType());
+        fill = slides.get(3).getBackground().getFill();
+        assertEquals(HSLFFill.FILL_SHADE_CENTER, fill.getFillType());
+        shape = slides.get(3).getShapes().get(0);
+        assertEquals(HSLFFill.FILL_SHADE, shape.getFill().getFillType());
 
     }
 
-    private int getFillPictureRefCount(Shape shape, Fill fill) {
+    private int getFillPictureRefCount(HSLFShape shape, HSLFFill fill) {
         EscherOptRecord opt = shape.getEscherOptRecord();
-        EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
+        EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
         if(p != null) {
             int idx = p.getPropertyValue();
 
-            Sheet sheet = shape.getSheet();
-            SlideShow ppt = sheet.getSlideShow();
+            HSLFSheet sheet = shape.getSheet();
+            HSLFSlideShow ppt = sheet.getSlideShow();
             Document doc = ppt.getDocumentRecord();
             EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
-            EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
+            EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
             List<EscherRecord> lst = bstore.getChildRecords();
             return ((EscherBSERecord)lst.get(idx-1)).getRef();
         }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java
index 6ff4870..cdbf28c 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestFreeform.java
@@ -17,12 +17,13 @@
 
 package org.apache.poi.hslf.model;
 
-import java.awt.geom.Area;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.geom.Rectangle2D;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
-import junit.framework.TestCase;
+import java.awt.geom.*;
+
+import org.apache.poi.hslf.usermodel.HSLFFreeformShape;
+import org.junit.Test;
 
 /**
  * Test Freeform object.
@@ -32,8 +33,9 @@
  *
  * @author Yegor Kozlov
  */
-public final class TestFreeform extends TestCase {
+public final class TestFreeform {
 
+    @Test
     public void testClosedPath() {
 
         GeneralPath path1 = new GeneralPath();
@@ -43,29 +45,31 @@
         path1.lineTo(100, 200);
         path1.closePath();
 
-        Freeform p = new Freeform();
+        HSLFFreeformShape p = new HSLFFreeformShape();
         p.setPath(path1);
 
         java.awt.Shape path2 = p.getOutline();
         assertTrue(new Area(path1).equals(new Area(path2)));
     }
 
+    @Test
     public void testLine() {
 
         GeneralPath path1 = new GeneralPath(new Line2D.Double(100, 100, 200, 100));
 
-        Freeform p = new Freeform();
+        HSLFFreeformShape p = new HSLFFreeformShape();
         p.setPath(path1);
 
         java.awt.Shape path2 = p.getOutline();
         assertTrue(new Area(path1).equals(new Area(path2)));
     }
 
+    @Test
     public void testRectangle() {
 
         GeneralPath path1 = new GeneralPath(new Rectangle2D.Double(100, 100, 200, 50));
 
-        Freeform p = new Freeform();
+        HSLFFreeformShape p = new HSLFFreeformShape();
         p.setPath(path1);
 
         java.awt.Shape path2 = p.getOutline();
@@ -76,9 +80,10 @@
      * Avoid NPE in  Freeform.getOutline() if either GEOMETRY__VERTICES or
      * GEOMETRY__SEGMENTINFO is missing, see Bugzilla 54188
      */
+    @Test
     public void test54188() {
 
-        Freeform p = new Freeform();
+        HSLFFreeformShape p = new HSLFFreeformShape();
         GeneralPath path = (GeneralPath)p.getOutline();
         GeneralPath emptyPath = new GeneralPath();
         assertEquals(emptyPath.getBounds2D(), path.getBounds2D());
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java
index 1e86b8c..6a503fd 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHeadersFooters.java
@@ -17,23 +17,28 @@
 
 package org.apache.poi.hslf.model;
 
-import java.io.*;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.POIDataSamples;
+import static org.junit.Assert.*;
 
-import junit.framework.TestCase;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.usermodel.HSLFSlide;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.junit.Test;
 
 /**
  * Test {@link org.apache.poi.hslf.model.HeadersFooters} object
  */
-public final class TestHeadersFooters extends TestCase
+public final class TestHeadersFooters
 {
 
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
-    public void testRead() throws Exception
-    {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("headers_footers.ppt"));
+    @Test
+    public void testRead() throws Exception {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("headers_footers.ppt"));
 
         HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
         assertTrue(slideHdd.isFooterVisible());
@@ -53,9 +58,9 @@
         assertTrue(notesHdd.isUserDateVisible());
         assertNull(notesHdd.getDateTimeText());
 
-        Slide[] slide = ppt.getSlides();
+        List<HSLFSlide> slide = ppt.getSlides();
         //the first slide uses presentation-scope headers / footers
-        HeadersFooters hd1 = slide[0].getHeadersFooters();
+        HeadersFooters hd1 = slide.get(0).getHeadersFooters();
         assertEquals(slideHdd.isFooterVisible(), hd1.isFooterVisible());
         assertEquals(slideHdd.getFooterText(), hd1.getFooterText());
         assertEquals(slideHdd.isSlideNumberVisible(), hd1.isSlideNumberVisible());
@@ -65,7 +70,7 @@
         assertEquals(slideHdd.getDateTimeText(), hd1.getDateTimeText());
 
         //the first slide uses per-slide headers / footers
-        HeadersFooters hd2 = slide[1].getHeadersFooters();
+        HeadersFooters hd2 = slide.get(1).getHeadersFooters();
         assertEquals(true, hd2.isFooterVisible());
         assertEquals("per-slide footer", hd2.getFooterText());
         assertEquals(true, hd2.isUserDateVisible());
@@ -75,9 +80,9 @@
     /**
      * If Headers / Footers are not set, all the getters should return <code>false</code> or <code>null</code>
      */
-    public void testReadNoHeadersFooters() throws Exception
-    {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+    @Test
+    public void testReadNoHeadersFooters() throws Exception {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
 
         HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
         assertFalse(slideHdd.isFooterVisible());
@@ -97,9 +102,8 @@
         assertFalse(notesHdd.isUserDateVisible());
         assertNull(notesHdd.getDateTimeText());
 
-        Slide[] slide = ppt.getSlides();
-        for(int i=0 ; i < slide.length; i++){
-            HeadersFooters hd1 = slide[i].getHeadersFooters();
+        for(HSLFSlide s : ppt.getSlides()) {
+            HeadersFooters hd1 = s.getHeadersFooters();
             assertFalse(hd1.isFooterVisible());
             assertNull(hd1.getFooterText());
             assertFalse(hd1.isHeaderVisible());
@@ -112,9 +116,9 @@
     /**
      * Test extraction of headers / footers from PPTs saved in Office 2007
      */
-    public void testRead2007() throws Exception
-    {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("headers_footers_2007.ppt"));
+    @Test
+    public void testRead2007() throws Exception {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("headers_footers_2007.ppt"));
 
         HeadersFooters slideHdd = ppt.getSlideHeadersFooters();
         assertTrue(slideHdd.isFooterVisible());
@@ -137,9 +141,9 @@
         //assertEquals("08/12/08", notesHdd.getDateTimeText());
 
         //per-slide headers / footers
-        Slide[] slide = ppt.getSlides();
+        List<HSLFSlide> slide = ppt.getSlides();
         //the first slide uses presentation-scope headers / footers
-        HeadersFooters hd1 = slide[0].getHeadersFooters();
+        HeadersFooters hd1 = slide.get(0).getHeadersFooters();
         assertTrue(hd1.isFooterVisible());
         assertEquals("THE FOOTER TEXT", hd1.getFooterText());
         assertTrue(hd1.isSlideNumberVisible());
@@ -150,7 +154,7 @@
         assertEquals("Wednesday, August 06, 2008", hd1.getDateTimeText());
 
         //the second slide uses custom per-slide headers / footers
-        HeadersFooters hd2 = slide[1].getHeadersFooters();
+        HeadersFooters hd2 = slide.get(1).getHeadersFooters();
         assertTrue(hd2.isFooterVisible());
         assertEquals("THE FOOTER TEXT FOR SLIDE 2", hd2.getFooterText());
         assertTrue(hd2.isSlideNumberVisible());
@@ -161,7 +165,7 @@
         assertEquals("August 06, 2008", hd2.getDateTimeText());
 
         //the third slide uses per-slide headers / footers
-        HeadersFooters hd3 = slide[2].getHeadersFooters();
+        HeadersFooters hd3 = slide.get(2).getHeadersFooters();
         assertTrue(hd3.isFooterVisible());
         assertEquals("THE FOOTER TEXT", hd3.getFooterText());
         assertTrue(hd3.isSlideNumberVisible());
@@ -172,9 +176,9 @@
         assertEquals("Wednesday, August 06, 2008", hd3.getDateTimeText());
     }
 
-    public void testCreateSlideFooters() throws Exception
-    {
-        SlideShow ppt = new SlideShow();
+    @Test
+    public void testCreateSlideFooters() throws Exception {
+        HSLFSlideShow ppt = new HSLFSlideShow();
         HeadersFooters hdd = ppt.getSlideHeadersFooters();
         hdd.setFootersText("My slide footer");
         hdd.setSlideNumberVisible(true);
@@ -183,16 +187,16 @@
         ppt.write(out);
         byte[] b = out.toByteArray();
 
-        SlideShow ppt2 = new SlideShow(new ByteArrayInputStream(b));
+        HSLFSlideShow ppt2 = new HSLFSlideShow(new ByteArrayInputStream(b));
         HeadersFooters hdd2 = ppt2.getSlideHeadersFooters();
         assertTrue(hdd2.isSlideNumberVisible());
         assertTrue(hdd2.isFooterVisible());
         assertEquals("My slide footer", hdd2.getFooterText());
     }
 
-    public void testCreateNotesFooters() throws Exception
-    {
-        SlideShow ppt = new SlideShow();
+    @Test
+    public void testCreateNotesFooters() throws Exception {
+        HSLFSlideShow ppt = new HSLFSlideShow();
         HeadersFooters hdd = ppt.getNotesHeadersFooters();
         hdd.setFootersText("My notes footer");
         hdd.setHeaderText("My notes header");
@@ -202,7 +206,7 @@
         ppt.write(out);
         byte[] b = out.toByteArray();
 
-        SlideShow ppt2 = new SlideShow(new ByteArrayInputStream(b));
+        HSLFSlideShow ppt2 = new HSLFSlideShow(new ByteArrayInputStream(b));
         HeadersFooters hdd2 = ppt2.getNotesHeadersFooters();
         assertTrue(hdd2.isSlideNumberVisible());
         assertTrue(hdd2.isFooterVisible());
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java
index 6f9f9eb..5429b96 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestHyperlink.java
@@ -17,70 +17,68 @@
 
 package org.apache.poi.hslf.model;
 
-import junit.framework.TestCase;
+import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.getRawText;
+import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.toExternalString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
-import org.apache.poi.hslf.usermodel.SlideShow;
+import java.util.List;
+
 import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.usermodel.*;
+import org.junit.Test;
 
 /**
  * Test Hyperlink.
  *
  * @author Yegor Kozlov
  */
-public final class TestHyperlink extends TestCase {
+public final class TestHyperlink {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
+    @Test
     public void testTextRunHyperlinks() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("WithLinks.ppt"));
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("WithLinks.ppt"));
 
-        TextRun[] run;
-        Slide slide;
-        slide = ppt.getSlides()[0];
-        run = slide.getTextRuns();
-        for (int i = 0; i < run.length; i++) {
-            String text = run[i].getText();
-            if (text.equals(
-                    "This page has two links:\n" +
-                    "http://jakarta.apache.org/poi/\n" +
-                    "\n" +
-                    "http://slashdot.org/\n" +
-                    "\n" +
-                    "In addition, its notes has one link")){
+        HSLFSlide slide = ppt.getSlides().get(0);
+        List<HSLFTextParagraph> para = slide.getTextParagraphs().get(1);
+        
+        String rawText = toExternalString(getRawText(para), para.get(0).getRunType());
+        String expected =
+            "This page has two links:\n"+
+            "http://jakarta.apache.org/poi/\n"+
+            "\n"+
+            "http://slashdot.org/\n"+
+            "\n"+
+            "In addition, its notes has one link";
+        assertEquals(expected, rawText);
+        
+        List<HSLFHyperlink> links = HSLFHyperlink.find(para);
+        assertNotNull(links);
+        assertEquals(2, links.size());
 
-                Hyperlink[] links = run[i].getHyperlinks();
-                assertNotNull(links);
-                assertEquals(2, links.length);
+        assertEquals("http://jakarta.apache.org/poi/", links.get(0).getTitle());
+        assertEquals("http://jakarta.apache.org/poi/", links.get(0).getAddress());
+        assertEquals("http://jakarta.apache.org/poi/", rawText.substring(links.get(0).getStartIndex(), links.get(0).getEndIndex()-1));
 
-                assertEquals("http://jakarta.apache.org/poi/", links[0].getTitle());
-                assertEquals("http://jakarta.apache.org/poi/", links[0].getAddress());
-                assertEquals("http://jakarta.apache.org/poi/", text.substring(links[0].getStartIndex(), links[0].getEndIndex()-1));
+        assertEquals("http://slashdot.org/", links.get(1).getTitle());
+        assertEquals("http://slashdot.org/", links.get(1).getAddress());
+        assertEquals("http://slashdot.org/", rawText.substring(links.get(1).getStartIndex(), links.get(1).getEndIndex()-1));
 
-                assertEquals("http://slashdot.org/", links[1].getTitle());
-                assertEquals("http://slashdot.org/", links[1].getAddress());
-                assertEquals("http://slashdot.org/", text.substring(links[1].getStartIndex(), links[1].getEndIndex()-1));
+        slide = ppt.getSlides().get(1);
+        para = slide.getTextParagraphs().get(1);
+        rawText = toExternalString(getRawText(para), para.get(0).getRunType());
+        expected = 
+            "I have the one link:\n" +
+            "Jakarta HSSF";
+        assertEquals(expected, rawText);
 
-            }
-        }
+        links = HSLFHyperlink.find(para);
+        assertNotNull(links);
+        assertEquals(1, links.size());
 
-        slide = ppt.getSlides()[1];
-        run = slide.getTextRuns();
-        for (int i = 0; i < run.length; i++) {
-            String text = run[i].getText();
-            if (text.equals(
-                    "I have the one link:\n" +
-                    "Jakarta HSSF")){
-
-                Hyperlink[] links = run[i].getHyperlinks();
-                assertNotNull(links);
-                assertEquals(1, links.length);
-
-                assertEquals("http://jakarta.apache.org/poi/hssf/", links[0].getTitle());
-                assertEquals("http://jakarta.apache.org/poi/hssf/", links[0].getAddress());
-                assertEquals("Jakarta HSSF", text.substring(links[0].getStartIndex(), links[0].getEndIndex()-1));
-
-            }
-        }
-
+        assertEquals("http://jakarta.apache.org/poi/hssf/", links.get(0).getTitle());
+        assertEquals("http://jakarta.apache.org/poi/hssf/", links.get(0).getAddress());
+        assertEquals("Jakarta HSSF", rawText.substring(links.get(0).getStartIndex(), links.get(0).getEndIndex()-1));
     }
-
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java
deleted file mode 100644
index 9de8cad..0000000
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestImagePainter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import java.awt.Graphics2D;
-
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.blip.BitmapPainter;
-import org.apache.poi.hslf.blip.ImagePainter;
-import org.apache.poi.hslf.usermodel.PictureData;
-
-/**
- * Test Picture shape.
- *
- * @author Yegor Kozlov
- */
-public final class TestImagePainter extends TestCase {
-
-    private static class CustomImagePainter implements ImagePainter {
-        public CustomImagePainter() {
-            // no fields to initialise
-        }
-        public void paint(Graphics2D graphics, PictureData pict, Picture parent){
-            //do noting
-        }
-    }
-
-    public void testImagePainter() {
-
-        ImagePainter pntr = PictureData.getImagePainter(Picture.PNG);
-        assertTrue(PictureData.getImagePainter(Picture.PNG) instanceof BitmapPainter);
-        assertTrue(PictureData.getImagePainter(Picture.JPEG) instanceof BitmapPainter);
-        assertTrue(PictureData.getImagePainter(Picture.DIB) instanceof BitmapPainter);
-
-        PictureData.setImagePainter(Picture.WMF, new CustomImagePainter());
-        assertTrue(PictureData.getImagePainter(Picture.WMF) instanceof CustomImagePainter);
-    }
-}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java
index 735fa30..5d58b25 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestLine.java
@@ -19,21 +19,24 @@
 
 import java.awt.Color;
 
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlide;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
+import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
+import org.junit.Test;
 
 /**
  * Test Line shape.
  *
  * @author Yegor Kozlov
  */
-public final class TestLine extends TestCase {
+public final class TestLine {
 
+    @Test
     public void testCreateLines() {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
         slide.addTitle().setText("Lines tester");
 
@@ -44,31 +47,31 @@
          */
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(75, 200, 300, 0));
-        line.setLineStyle(Line.LINE_SIMPLE);
+        line.setLineCompound(LineCompound.SINGLE);
         line.setLineColor(Color.blue);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(75, 230, 300, 0));
-        line.setLineStyle(Line.LINE_DOUBLE);
+        line.setLineCompound(LineCompound.DOUBLE);
         line.setLineWidth(3.5);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(75, 260, 300, 0));
-        line.setLineStyle(Line.LINE_TRIPLE);
+        line.setLineCompound(LineCompound.TRIPLE);
         line.setLineWidth(6);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(75, 290, 300, 0));
-        line.setLineStyle(Line.LINE_THICKTHIN);
+        line.setLineCompound(LineCompound.THICK_THIN);
         line.setLineWidth(4.5);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(75, 320, 300, 0));
-        line.setLineStyle(Line.LINE_THINTHICK);
+        line.setLineCompound(LineCompound.THIN_THICK);
         line.setLineWidth(5.5);
         slide.addShape(line);
 
@@ -77,27 +80,27 @@
          */
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(450, 200, 300, 0));
-        line.setLineDashing(Line.PEN_SOLID);
+        line.setLineDashing(LineDash.SOLID);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(450, 230, 300, 0));
-        line.setLineDashing(Line.PEN_PS_DASH);
+        line.setLineDashing(LineDash.DASH);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(450, 260, 300, 0));
-        line.setLineDashing(Line.PEN_DOT);
+        line.setLineDashing(LineDash.DOT);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(450, 290, 300, 0));
-        line.setLineDashing(Line.PEN_DOTGEL);
+        line.setLineDashing(LineDash.DASH_DOT);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(450, 320, 300, 0));
-        line.setLineDashing(Line.PEN_LONGDASHDOTDOTGEL);
+        line.setLineDashing(LineDash.LG_DASH_DOT_DOT);
         slide.addShape(line);
 
         /**
@@ -105,22 +108,22 @@
          */
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(75, 400, 300, 0));
-        line.setLineDashing(Line.PEN_DASHDOT);
-        line.setLineStyle(Line.LINE_TRIPLE);
+        line.setLineDashing(LineDash.DASH_DOT);
+        line.setLineCompound(LineCompound.TRIPLE);
         line.setLineWidth(5.0);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(75, 430, 300, 0));
-        line.setLineDashing(Line.PEN_DASH);
-        line.setLineStyle(Line.LINE_THICKTHIN);
+        line.setLineDashing(LineDash.DASH);
+        line.setLineCompound(LineCompound.THICK_THIN);
         line.setLineWidth(4.0);
         slide.addShape(line);
 
         line = new Line();
         line.setAnchor(new java.awt.Rectangle(75, 460, 300, 0));
-        line.setLineDashing(Line.PEN_DOT);
-        line.setLineStyle(Line.LINE_DOUBLE);
+        line.setLineDashing(LineDash.DOT);
+        line.setLineCompound(LineCompound.DOUBLE);
         line.setLineWidth(8.0);
         slide.addShape(line);
     }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java
index 9460642..a83d820 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java
@@ -17,32 +17,34 @@
 
 package org.apache.poi.hslf.model;
 
+import static org.junit.Assert.*;
+
 import java.awt.geom.Rectangle2D;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.usermodel.SlideShow;
 import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.usermodel.*;
+import org.junit.Test;
 
 /**
  * Test <code>MovieShape</code> object.
  *
  * @author Yegor Kozlov
  */
-public final class TestMovieShape extends TestCase {
+public final class TestMovieShape {
 
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
+    @Test
     public void testCreate() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
         String path = "/test-movie.mpg";
         int movieIdx = ppt.addMovie(path, MovieShape.MOVIE_MPEG);
-        int thumbnailIdx = ppt.addPicture(_slTests.readFile("tomcat.png"), Picture.PNG);
+        int thumbnailIdx = ppt.addPicture(_slTests.readFile("tomcat.png"), HSLFPictureShape.PNG);
 
         MovieShape shape = new MovieShape(movieIdx, thumbnailIdx);
         shape.setAnchor(new Rectangle2D.Float(300,225,120,90));
@@ -56,9 +58,9 @@
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         ppt.write(out);
 
-        ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
-        slide = ppt.getSlides()[0];
-        shape = (MovieShape)slide.getShapes()[0];
+        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
+        slide = ppt.getSlides().get(0);
+        shape = (MovieShape)slide.getShapes().get(0);
         assertEquals(path, shape.getPath());
         assertFalse(shape.isAutoPlay());
     }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java
index 8ecb14f..f589491 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java
@@ -18,59 +18,54 @@
 package org.apache.poi.hslf.model;
 
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 
 import java.awt.geom.Rectangle2D;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.InputStream;
-
-import junit.framework.TestCase;
+import java.io.*;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.usermodel.ObjectData;
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.*;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hwpf.HWPFDocument;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.util.IOUtils;
+import org.junit.Test;
 
-public final class TestOleEmbedding extends TestCase {
+public final class TestOleEmbedding {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
     /**
      * Tests support for OLE objects.
      *
      * @throws Exception if an error occurs.
      */
+    @Test
     public void testOleEmbedding2003() throws Exception {
-        HSLFSlideShow slideShow = new HSLFSlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt"));
+        HSLFSlideShowImpl slideShow = new HSLFSlideShowImpl(_slTests.openResourceAsStream("ole2-embedding-2003.ppt"));
         // Placeholder EMFs for clients that don't support the OLE components.
-        PictureData[] pictures = slideShow.getPictures();
+        HSLFPictureData[] pictures = slideShow.getPictures();
         assertEquals("Should be two pictures", 2, pictures.length);
         //assertDigestEquals("Wrong data for picture 1", "8d1fbadf4814f321bb1ccdd056e3c788", pictures[0].getData());
         //assertDigestEquals("Wrong data for picture 2", "987a698e83559cf3d38a0deeba1cc63b", pictures[1].getData());
 
         // Actual embedded objects.
-        ObjectData[] objects = slideShow.getEmbeddedObjects();
+        HSLFObjectData[] objects = slideShow.getEmbeddedObjects();
         assertEquals("Should be two objects", 2, objects.length);
         //assertDigestEquals("Wrong data for objecs 1", "0d1fcc61a83de5c4894dc0c88e9a019d", objects[0].getData());
         //assertDigestEquals("Wrong data for object 2", "b323604b2003a7299c77c2693b641495", objects[1].getData());
     }
 
+    @Test
     public void testOLEShape() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt"));
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt"));
 
-        Slide slide = ppt.getSlides()[0];
-        Shape[] sh = slide.getShapes();
+        HSLFSlide slide = ppt.getSlides().get(0);
         int cnt = 0;
-        for (int i = 0; i < sh.length; i++) {
-            if(sh[i] instanceof OLEShape){
+        for (HSLFShape sh : slide.getShapes()) {
+            if(sh instanceof OLEShape){
                 cnt++;
-                OLEShape ole = (OLEShape)sh[i];
-                ObjectData data = ole.getObjectData();
+                OLEShape ole = (OLEShape)sh;
+                HSLFObjectData data = ole.getObjectData();
                 if("Worksheet".equals(ole.getInstanceName())){
                     //Voila! we created a workbook from the embedded OLE data
                     HSSFWorkbook wb = new HSSFWorkbook(data.getData());
@@ -81,6 +76,7 @@
                     assertEquals(2, sheet.getRow(2).getCell(0).getNumericCellValue(), 0);
                     assertEquals(3, sheet.getRow(3).getCell(0).getNumericCellValue(), 0);
                     assertEquals(8, sheet.getRow(5).getCell(0).getNumericCellValue(), 0);
+                    wb.close();
                 } else if ("Document".equals(ole.getInstanceName())){
                     //creating a HWPF document
                     HWPFDocument doc = new HWPFDocument(data.getData());
@@ -93,12 +89,13 @@
         assertEquals("Expected 2 OLE shapes", 2, cnt);
     }
     
+    @Test
     public void testEmbedding() throws Exception {
-    	HSLFSlideShow _hslfSlideShow = HSLFSlideShow.create();
-    	SlideShow ppt = new SlideShow(_hslfSlideShow);
+    	HSLFSlideShowImpl _hslfSlideShow = HSLFSlideShowImpl.create();
+    	HSLFSlideShow ppt = new HSLFSlideShow(_hslfSlideShow);
     	
     	File pict = POIDataSamples.getSlideShowInstance().getFile("clock.jpg");
-    	int pictId = ppt.addPicture(pict, Picture.JPEG);
+    	int pictId = ppt.addPicture(pict, HSLFPictureShape.JPEG);
     	
     	InputStream is = POIDataSamples.getSpreadSheetInstance().openResourceAsStream("Employee.xls");
     	POIFSFileSystem poiData1 = new POIFSFileSystem(is);
@@ -106,14 +103,14 @@
     	
     	int oleObjectId1 = ppt.addEmbed(poiData1);
     	
-    	Slide slide1 = ppt.createSlide();
+    	HSLFSlide slide1 = ppt.createSlide();
     	OLEShape oleShape1 = new OLEShape(pictId);
     	oleShape1.setObjectID(oleObjectId1);
     	slide1.addShape(oleShape1);
     	oleShape1.setAnchor(new Rectangle2D.Double(100,100,100,100));
     	
     	// add second slide with different order in object creation
-    	Slide slide2 = ppt.createSlide();
+    	HSLFSlide slide2 = ppt.createSlide();
     	OLEShape oleShape2 = new OLEShape(pictId);
 
         is = POIDataSamples.getSpreadSheetInstance().openResourceAsStream("SimpleWithImages.xls");
@@ -129,8 +126,8 @@
     	ByteArrayOutputStream bos = new ByteArrayOutputStream();
     	ppt.write(bos);
     	
-    	ppt = new SlideShow(new ByteArrayInputStream(bos.toByteArray()));
-    	OLEShape comp = (OLEShape)ppt.getSlides()[0].getShapes()[0];
+    	ppt = new HSLFSlideShow(new ByteArrayInputStream(bos.toByteArray()));
+    	OLEShape comp = (OLEShape)ppt.getSlides().get(0).getShapes().get(0);
     	byte compData[] = IOUtils.toByteArray(comp.getObjectData().getData());
     	
     	bos.reset();
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java
index aff848d..4c69862 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPFont.java
@@ -17,18 +17,22 @@
 
 package org.apache.poi.hslf.model;
 
-import junit.framework.TestCase;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.junit.Test;
+
 
 /**
  * Test adding fonts to the presenataion resources
  *
  * @author Yegor Kozlov
  */
-public final class TestPPFont extends TestCase{
+public final class TestPPFont {
 
+    @Test
     public void testCreate() {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
         assertEquals(1, ppt.getNumberOfFonts());
         assertEquals("Arial", ppt.getFont(0).getFontName());
 
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java
index b89383c..cd5c3f7 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPPGraphics2D.java
@@ -17,39 +17,44 @@
 
 package org.apache.poi.hslf.model;
 
-import junit.framework.TestCase;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.POIDataSamples;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.awt.*;
-import java.awt.Rectangle;
-import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.usermodel.*;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Test drawing shapes via Graphics2D
  *
  * @author Yegor Kozlov
  */
-public final class TestPPGraphics2D extends TestCase {
+public final class TestPPGraphics2D {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
-    private SlideShow ppt;
+    private HSLFSlideShow ppt;
 
-    protected void setUp() throws Exception {
-		ppt = new SlideShow(_slTests.openResourceAsStream("empty.ppt"));
+    @Before
+    public void setUp() throws Exception {
+		ppt = new HSLFSlideShow(_slTests.openResourceAsStream("empty.ppt"));
     }
 
+    @Test
     public void testGraphics() throws Exception {
     	// Starts off empty
-    	assertEquals(0, ppt.getSlides().length);
+    	assertTrue(ppt.getSlides().isEmpty());
 
     	// Add a slide
-        Slide slide = ppt.createSlide();
-    	assertEquals(1, ppt.getSlides().length);
+        HSLFSlide slide = ppt.createSlide();
+    	assertEquals(1, ppt.getSlides().size());
 
     	// Add some stuff into it
-        ShapeGroup group = new ShapeGroup();
+        HSLFGroupShape group = new HSLFGroupShape();
         Dimension pgsize = ppt.getPageSize();
         java.awt.Rectangle bounds = new java.awt.Rectangle(0, 0, (int)pgsize.getWidth(), (int)pgsize.getHeight());
         group.setAnchor(bounds);
@@ -73,18 +78,18 @@
         out.close();
 
         // And read it back in
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        assertEquals(1, ppt.getSlides().length);
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        assertEquals(1, ppt.getSlides().size());
 
-        slide = ppt.getSlides()[0];
-        Shape[] shape = slide.getShapes();
-        assertEquals(shape.length, 1); //group shape
+        slide = ppt.getSlides().get(0);
+        List<HSLFShape> shape = slide.getShapes();
+        assertEquals(shape.size(), 1); //group shape
 
-        assertTrue(shape[0] instanceof ShapeGroup); //group shape
+        assertTrue(shape.get(0) instanceof HSLFGroupShape); //group shape
 
-        group = (ShapeGroup)shape[0];
+        group = (HSLFGroupShape)shape.get(0);
         shape = group.getShapes();
-        assertEquals(shape.length, 3);
+        assertEquals(shape.size(), 3);
     }
 
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java
deleted file mode 100644
index 82614b9..0000000
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestPicture.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.imageio.ImageIO;
-
-import org.apache.poi.POIDataSamples;
-import org.apache.poi.ddf.EscherBSERecord;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.usermodel.PictureData;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.util.JvmBugs;
-import org.junit.Ignore;
-import org.junit.Test;
-
-/**
- * Test Picture shape.
- *
- * @author Yegor Kozlov
- */
-public final class TestPicture {
-    private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
-
-    /**
-     * Test that the reference count of a blip is incremented every time the picture is inserted.
-     * This is important when the same image appears multiple times in a slide show.
-     *
-     */
-    @Test
-    public void multiplePictures() throws Exception {
-        SlideShow ppt = new SlideShow();
-
-        Slide s = ppt.createSlide();
-        Slide s2 = ppt.createSlide();
-        Slide s3 = ppt.createSlide();
-
-        int idx = ppt.addPicture(_slTests.readFile("clock.jpg"), Picture.JPEG);
-        Picture pict = new Picture(idx);
-        Picture pict2 = new Picture(idx);
-        Picture pict3 = new Picture(idx);
-
-        pict.setAnchor(new Rectangle(10,10,100,100));
-        s.addShape(pict);
-        EscherBSERecord bse1 = pict.getEscherBSERecord();
-        assertEquals(1, bse1.getRef());
-
-        pict2.setAnchor(new Rectangle(10,10,100,100));
-        s2.addShape(pict2);
-        EscherBSERecord bse2 = pict.getEscherBSERecord();
-        assertSame(bse1, bse2);
-        assertEquals(2, bse1.getRef());
-
-        pict3.setAnchor(new Rectangle(10,10,100,100));
-        s3.addShape(pict3);
-        EscherBSERecord bse3 = pict.getEscherBSERecord();
-        assertSame(bse2, bse3);
-        assertEquals(3, bse1.getRef());
-    }
-
-    /**
-     * Picture#getEscherBSERecord threw NullPointerException if EscherContainerRecord.BSTORE_CONTAINER
-     * was not found. The correct behaviour is to return null.
-     */
-    @Test
-    public void bug46122() {
-        SlideShow ppt = new SlideShow();
-        Slide slide = ppt.createSlide();
-
-        Picture pict = new Picture(-1); //index to non-existing picture data
-        pict.setSheet(slide);
-        PictureData data = pict.getPictureData();
-        assertNull(data);
-
-        BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
-        Graphics2D graphics = img.createGraphics();
-        pict.draw(graphics);
-    }
-
-    @Test
-    public void macImages() throws Exception {
-        HSLFSlideShow hss = new HSLFSlideShow(_slTests.openResourceAsStream("53446.ppt"));
-
-        PictureData[] pictures = hss.getPictures();
-        assertEquals(15, pictures.length);
-
-        int[][] expectedSizes = {
-                null,           // WMF
-                { 427, 428 },   // PNG
-                { 371, 370 },   // PNG
-                { 288, 183 },   // PNG
-                { 285, 97 },    // PNG
-                { 288, 168 },   // PNG
-                null,           // WMF
-                null,           // WMF
-                { 199, 259 },   // PNG
-                { 432, 244 },   // PNG
-                { 261, 258 },   // PNG
-                null,           // WMF
-                null,           // WMF
-                null,           // WMF
-                null            // EMF
-        };
-
-        int i=0;
-        for (PictureData pd : pictures) {
-            BufferedImage image = ImageIO.read(new ByteArrayInputStream(pd.getData()));
-            switch (pd.getType()) {
-                case Picture.WMF:
-                case Picture.EMF:
-                    break;
-                default:
-                    assertNotNull(image);
-                    int[] dimensions = expectedSizes[i];
-                    assertEquals(dimensions[0], image.getWidth());
-                    assertEquals(dimensions[1], image.getHeight());
-                    break;
-            }
-            i++;
-        }
-    }
-    
-    @Test
-    public void bug54332() throws Exception {
-        HSLFSlideShow hss = new HSLFSlideShow(_slTests.openResourceAsStream("54332a.ppt")); // TIKA-1046
-
-        PictureData[] pictures = hss.getPictures();
-        assertEquals(1, pictures.length);
-        assertEquals(102352, pictures[0].getData().length);
-        
-        hss = new HSLFSlideShow(_slTests.openResourceAsStream("54332b.ppt")); // TIKA-1612
-        pictures = hss.getPictures();
-        assertEquals(1, pictures.length);
-        assertEquals(55830, pictures[0].getData().length);
-    }
-
-    @Test
-    @Ignore("Just for visual validation - antialiasing is different on various systems")
-    public void bug54541() throws Exception {
-//        InputStream xis = _slTests.openResourceAsStream("54542_cropped_bitmap.pptx");
-//        XMLSlideShow xss = new XMLSlideShow(xis);
-//        xis.close();
-//        
-//        Dimension xpg = xss.getPageSize();
-//        for(XSLFSlide slide : xss.getSlides()) {
-//            BufferedImage img = new BufferedImage(xpg.width, xpg.height, BufferedImage.TYPE_INT_RGB);
-//            Graphics2D graphics = img.createGraphics();
-//            fixFonts(graphics);
-//            slide.draw(graphics);
-//            ImageIO.write(img, "PNG", new File("testx.png"));
-//        }
-//
-//        System.out.println("########################");
-        
-        InputStream is = _slTests.openResourceAsStream("54541_cropped_bitmap.ppt");
-        SlideShow ss = new SlideShow(is);
-        is.close();
-        
-        Dimension pg = ss.getPageSize();
-        int i=1;
-        for(Slide slide : ss.getSlides()) {
-            BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB);
-            Graphics2D graphics = img.createGraphics();
-            fixFonts(graphics);
-            slide.draw(graphics);
-            ImageIO.write(img, "PNG", new File("test"+(i++)+".png"));
-        }
-    }
-    
-    @SuppressWarnings("unchecked")
-    private void fixFonts(Graphics2D graphics) {
-        if (!JvmBugs.hasLineBreakMeasurerBug()) return;
-        Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(TextPainter.KEY_FONTMAP);
-        if (fontMap == null) fontMap = new HashMap<String,String>();
-        fontMap.put("Calibri", "Lucida Sans");
-        fontMap.put("Cambria", "Lucida Bright");
-        graphics.setRenderingHint(TextPainter.KEY_FONTMAP, fontMap);        
-    }
-}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java
index 23b798f..e593eb8 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSetBoldItalic.java
@@ -17,45 +17,46 @@
 
 package org.apache.poi.hslf.model;
 
-import junit.framework.TestCase;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.HSLFSlideShow;
+import static org.junit.Assert.*;
 
-import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import org.apache.poi.hslf.usermodel.*;
+import org.junit.Test;
 
 /**
  * Test setting text properties of newly added TextBoxes
  *
  * @author Yegor Kozlov
  */
-public final class TestSetBoldItalic extends TestCase {
+public final class TestSetBoldItalic {
     /**
      * Verify that we can add TextBox shapes to a slide
      * and set some of the style attributes
      */
+    @Test
     public void testTextBoxWrite() throws Exception {
-        SlideShow ppt = new SlideShow();
-        Slide sl = ppt.createSlide();
-        RichTextRun rt;
+        HSLFSlideShow ppt = new HSLFSlideShow();
+        HSLFSlide sl = ppt.createSlide();
+        HSLFTextRun rt;
 
         String val = "Hello, World!";
 
         // Create a new textbox, and give it lots of properties
-        TextBox txtbox = new TextBox();
-        rt = txtbox.getTextRun().getRichTextRuns()[0];
+        HSLFTextBox txtbox = new HSLFTextBox();
+        rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
         txtbox.setText(val);
-        rt.setFontSize(42);
+        rt.setFontSize(42d);
         rt.setBold(true);
         rt.setItalic(true);
         rt.setUnderlined(false);
         sl.addShape(txtbox);
 
         // Check it before save
-        rt = txtbox.getTextRun().getRichTextRuns()[0];
-        assertEquals(val, rt.getText());
-        assertEquals(42, rt.getFontSize());
+        rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
+        assertEquals(val, rt.getRawText());
+        assertEquals(42, rt.getFontSize(), 0);
         assertTrue(rt.isBold());
         assertTrue(rt.isItalic());
 
@@ -64,15 +65,15 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        sl = ppt.getSlides()[0];
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        sl = ppt.getSlides().get(0);
 
-        txtbox = (TextBox)sl.getShapes()[0];
-        rt = txtbox.getTextRun().getRichTextRuns()[0];
+        txtbox = (HSLFTextBox)sl.getShapes().get(0);
+        rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
 
         // Check after save
-        assertEquals(val, rt.getText());
-        assertEquals(42, rt.getFontSize());
+        assertEquals(val, rt.getRawText());
+        assertEquals(42, rt.getFontSize(), 0);
         assertTrue(rt.isBold());
         assertTrue(rt.isItalic());
         assertFalse(rt.isUnderlined());
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java
index b3e4f6a..19f0d5b 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java
@@ -17,30 +17,19 @@
 
 package org.apache.poi.hslf.model;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Rectangle;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.awt.*;
+import java.awt.geom.Rectangle2D;
+import java.io.*;
 import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.ddf.EscherDgRecord;
-import org.apache.poi.ddf.EscherDggRecord;
-import org.apache.poi.ddf.EscherOptRecord;
-import org.apache.poi.ddf.EscherProperties;
-import org.apache.poi.ddf.EscherSimpleProperty;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.ddf.*;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.sl.usermodel.ShapeType;
+import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -52,17 +41,17 @@
 public final class TestShapes {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
-    private SlideShow ppt;
-    private SlideShow pptB;
+    private HSLFSlideShow ppt;
+    private HSLFSlideShow pptB;
 
     @Before
     public void setUp() throws Exception {
         InputStream is1 = null, is2 = null;
         try {
             is1 = _slTests.openResourceAsStream("empty.ppt");
-            ppt = new SlideShow(is1);
+            ppt = new HSLFSlideShow(is1);
             is2 = _slTests.openResourceAsStream("empty_textbox.ppt");
-            pptB = new SlideShow(is2);
+            pptB = new HSLFSlideShow(is2);
         } finally {
             is1.close();
             is2.close();
@@ -71,21 +60,21 @@
 
     @Test
     public void graphics() throws Exception {
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
         Line line = new Line();
         java.awt.Rectangle lineAnchor = new java.awt.Rectangle(100, 200, 50, 60);
         line.setAnchor(lineAnchor);
         line.setLineWidth(3);
-        line.setLineStyle(Line.PEN_DASH);
+        line.setLineDashing(LineDash.DASH);
         line.setLineColor(Color.red);
         slide.addShape(line);
 
-        AutoShape ellipse = new AutoShape(ShapeTypes.Ellipse);
+        HSLFAutoShape ellipse = new HSLFAutoShape(ShapeType.ELLIPSE);
         java.awt.Rectangle ellipseAnchor = new Rectangle(320, 154, 55, 111);
         ellipse.setAnchor(ellipseAnchor);
         ellipse.setLineWidth(2);
-        ellipse.setLineStyle(Line.PEN_SOLID);
+        ellipse.setLineDashing(LineDash.SOLID);
         ellipse.setLineColor(Color.green);
         ellipse.setFillColor(Color.lightGray);
         slide.addShape(ellipse);
@@ -96,18 +85,18 @@
 
         //read ppt from byte array
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        assertEquals(1, ppt.getSlides().length);
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        assertEquals(1, ppt.getSlides().size());
 
-        slide = ppt.getSlides()[0];
-        Shape[] shape = slide.getShapes();
-        assertEquals(2, shape.length);
+        slide = ppt.getSlides().get(0);
+        List<HSLFShape> shape = slide.getShapes();
+        assertEquals(2, shape.size());
 
-        assertTrue(shape[0] instanceof Line); //group shape
-        assertEquals(lineAnchor, shape[0].getAnchor()); //group shape
+        assertTrue(shape.get(0) instanceof Line); //group shape
+        assertEquals(lineAnchor, shape.get(0).getAnchor()); //group shape
 
-        assertTrue(shape[1] instanceof AutoShape); //group shape
-        assertEquals(ellipseAnchor, shape[1].getAnchor()); //group shape
+        assertTrue(shape.get(1) instanceof HSLFAutoShape); //group shape
+        assertEquals(ellipseAnchor, shape.get(1).getAnchor()); //group shape
     }
 
     /**
@@ -116,54 +105,96 @@
      */
     @Test
     public void textBoxRead() throws Exception {
-        ppt = new SlideShow(_slTests.openResourceAsStream("with_textbox.ppt"));
-        Slide sl = ppt.getSlides()[0];
-        Shape[] sh = sl.getShapes();
-        for (int i = 0; i < sh.length; i++) {
-            assertTrue(sh[i] instanceof TextBox);
-            TextBox txtbox = (TextBox)sh[i];
+        ppt = new HSLFSlideShow(_slTests.openResourceAsStream("with_textbox.ppt"));
+        HSLFSlide sl = ppt.getSlides().get(0);
+        for (HSLFShape sh : sl.getShapes()) {
+            assertTrue(sh instanceof HSLFTextBox);
+            HSLFTextBox txtbox = (HSLFTextBox)sh;
             String text = txtbox.getText();
             assertNotNull(text);
 
-            assertEquals(txtbox.getTextRun().getRichTextRuns().length, 1);
-            RichTextRun rt = txtbox.getTextRun().getRichTextRuns()[0];
+            assertEquals(txtbox.getTextParagraphs().get(0).getTextRuns().size(), 1);
+            HSLFTextRun rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
 
             if (text.equals("Hello, World!!!")){
-                assertEquals(32, rt.getFontSize());
+                assertEquals(32, rt.getFontSize(), 0);
                 assertTrue(rt.isBold());
                 assertTrue(rt.isItalic());
             } else if (text.equals("I am just a poor boy")){
-                assertEquals(44, rt.getFontSize());
+                assertEquals(44, rt.getFontSize(), 0);
                 assertTrue(rt.isBold());
             } else if (text.equals("This is Times New Roman")){
-                assertEquals(16, rt.getFontSize());
+                assertEquals(16, rt.getFontSize(), 0);
                 assertTrue(rt.isBold());
                 assertTrue(rt.isItalic());
                 assertTrue(rt.isUnderlined());
             } else if (text.equals("Plain Text")){
-                assertEquals(18, rt.getFontSize());
+                assertEquals(18, rt.getFontSize(), 0);
             }
         }
     }
 
+    @SuppressWarnings("unused")
+    @Test
+    public void testParagraphs() throws Exception {
+        HSLFSlideShow ppt = new HSLFSlideShow();
+        HSLFSlide slide = ppt.createSlide();
+        HSLFTextBox shape = new HSLFTextBox();
+        HSLFTextRun p1r1 = shape.setText("para 1 run 1. ");
+        HSLFTextRun p1r2 = shape.appendText("para 1 run 2.", false);
+        HSLFTextRun p2r1 = shape.appendText("para 2 run 1. ", true);
+        HSLFTextRun p2r2 = shape.appendText("para 2 run 2. ", false);
+        p1r1.setFontColor(Color.black);
+        p1r2.setFontColor(Color.red);
+        p2r1.setFontColor(Color.yellow);
+        p2r2.setStrikethrough(true);
+        // run 3 has same text properties as run 2 and will be merged when saving
+        HSLFTextRun p2r3 = shape.appendText("para 2 run 3.", false);
+        shape.setAnchor(new Rectangle2D.Double(100,100,100,10));
+        slide.addShape(shape);
+        shape.resizeToFitText();
+        
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ppt.write(bos);
+        
+        ppt = new HSLFSlideShow(new ByteArrayInputStream(bos.toByteArray()));
+        slide = ppt.getSlides().get(0);
+        HSLFTextBox tb = (HSLFTextBox)slide.getShapes().get(0);
+        List<HSLFTextParagraph> para = tb.getTextParagraphs();
+        HSLFTextRun tr = para.get(0).getTextRuns().get(0);
+        assertEquals("para 1 run 1. ", tr.getRawText());
+        assertEquals(Color.black, tr.getFontColor());
+        tr = para.get(0).getTextRuns().get(1);
+        assertEquals("para 1 run 2.\r",  tr.getRawText());
+        assertEquals(Color.red, tr.getFontColor());
+        tr = para.get(1).getTextRuns().get(0);
+        assertEquals("para 2 run 1. ", tr.getRawText());
+        assertEquals(Color.yellow, tr.getFontColor());
+        tr = para.get(1).getTextRuns().get(1);
+        assertEquals("para 2 run 2. para 2 run 3.", tr.getRawText());
+        assertEquals(Color.black, tr.getFontColor());
+        assertTrue(tr.isStrikethrough());
+    }
+        
+    
     /**
      * Verify that we can add TextBox shapes to a slide
      * and set some of the style attributes
      */
     @Test
     public void textBoxWriteBytes() throws Exception {
-        ppt = new SlideShow();
-        Slide sl = ppt.createSlide();
-        RichTextRun rt;
+        ppt = new HSLFSlideShow();
+        HSLFSlide sl = ppt.createSlide();
+        HSLFTextRun rt;
 
         String val = "Hello, World!";
 
         // Create a new textbox, and give it lots of properties
-        TextBox txtbox = new TextBox();
-        rt = txtbox.getTextRun().getRichTextRuns()[0];
+        HSLFTextBox txtbox = new HSLFTextBox();
+        rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
         txtbox.setText(val);
-        rt.setFontName("Arial");
-        rt.setFontSize(42);
+        rt.setFontFamily("Arial");
+        rt.setFontSize(42d);
         rt.setBold(true);
         rt.setItalic(true);
         rt.setUnderlined(false);
@@ -171,13 +202,13 @@
         sl.addShape(txtbox);
 
         // Check it before save
-        rt = txtbox.getTextRun().getRichTextRuns()[0];
-        assertEquals(val, rt.getText());
-        assertEquals(42, rt.getFontSize());
+        rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
+        assertEquals(val, rt.getRawText());
+        assertEquals(42, rt.getFontSize(), 0);
         assertTrue(rt.isBold());
         assertTrue(rt.isItalic());
         assertFalse(rt.isUnderlined());
-        assertEquals("Arial", rt.getFontName());
+        assertEquals("Arial", rt.getFontFamily());
         assertEquals(Color.red, rt.getFontColor());
 
         // Serialize and read again
@@ -185,19 +216,19 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        sl = ppt.getSlides()[0];
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        sl = ppt.getSlides().get(0);
 
-        txtbox = (TextBox)sl.getShapes()[0];
-        rt = txtbox.getTextRun().getRichTextRuns()[0];
+        txtbox = (HSLFTextBox)sl.getShapes().get(0);
+        rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
 
         // Check after save
-        assertEquals(val, rt.getText());
-        assertEquals(42, rt.getFontSize());
+        assertEquals(val, rt.getRawText());
+        assertEquals(42, rt.getFontSize(), 0);
         assertTrue(rt.isBold());
         assertTrue(rt.isItalic());
         assertFalse(rt.isUnderlined());
-        assertEquals("Arial", rt.getFontName());
+        assertEquals("Arial", rt.getFontFamily());
         assertEquals(Color.red, rt.getFontColor());
     }
 
@@ -206,13 +237,13 @@
      */
     @Test
     public void emptyTextBox() {
-    	assertEquals(2, pptB.getSlides().length);
-    	Slide s1 = pptB.getSlides()[0];
-    	Slide s2 = pptB.getSlides()[1];
+    	assertEquals(2, pptB.getSlides().size());
+    	HSLFSlide s1 = pptB.getSlides().get(0);
+    	HSLFSlide s2 = pptB.getSlides().get(1);
 
     	// Check we can get the shapes count
-    	assertEquals(2, s1.getShapes().length);
-    	assertEquals(2, s2.getShapes().length);
+    	assertEquals(2, s1.getShapes().size());
+    	assertEquals(2, s2.getShapes().size());
     }
 
     /**
@@ -230,21 +261,26 @@
     }
 
     private void textBoxSet(String filename) throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream(filename));
-        Slide[] sl = ppt.getSlides();
-        for (int k = 0; k < sl.length; k++) {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream(filename));
+        for (HSLFSlide sld : ppt.getSlides()) {
             ArrayList<String> lst1 = new ArrayList<String>();
-            TextRun[] txt = sl[k].getTextRuns();
-            for (int i = 0; i < txt.length; i++) {
-                lst1.add(txt[i].getText());
+            for (List<HSLFTextParagraph> txt : sld.getTextParagraphs()) {
+                for (HSLFTextParagraph p : txt) {
+                    for (HSLFTextRun r : p) {
+                        lst1.add(r.getRawText());
+                    }
+                }
             }
 
             ArrayList<String> lst2 = new ArrayList<String>();
-            Shape[] sh = sl[k].getShapes();
-            for (int i = 0; i < sh.length; i++) {
-                if (sh[i] instanceof TextShape){
-                    TextShape tbox = (TextShape)sh[i];
-                    lst2.add(tbox.getText());
+            for (HSLFShape sh : sld.getShapes()) {
+                if (sh instanceof HSLFTextShape){
+                    HSLFTextShape tbox = (HSLFTextShape)sh;
+                    for (HSLFTextParagraph p : tbox.getTextParagraphs()) {
+                        for (HSLFTextRun r : p) {
+                            lst2.add(r.getRawText());
+                        }
+                    }
                 }
             }
             assertTrue(lst1.containsAll(lst2));
@@ -257,18 +293,18 @@
      */
     @Test
     public void shapeGroup() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         Dimension pgsize = ppt.getPageSize();
 
-        ShapeGroup group = new ShapeGroup();
+        HSLFGroupShape group = new HSLFGroupShape();
 
         group.setAnchor(new Rectangle(0, 0, (int)pgsize.getWidth(), (int)pgsize.getHeight()));
         slide.addShape(group);
 
-        int idx = ppt.addPicture(_slTests.readFile("clock.jpg"), Picture.JPEG);
-        Picture pict = new Picture(idx, group);
+        int idx = ppt.addPicture(_slTests.readFile("clock.jpg"), HSLFPictureShape.JPEG);
+        HSLFPictureShape pict = new HSLFPictureShape(idx, group);
         pict.setAnchor(new Rectangle(0, 0, 200, 200));
         group.addShape(pict);
 
@@ -282,25 +318,25 @@
         out.close();
 
         ByteArrayInputStream is = new ByteArrayInputStream(out.toByteArray());
-        ppt = new SlideShow(is);
+        ppt = new HSLFSlideShow(is);
         is.close();
 
-        slide = ppt.getSlides()[0];
+        slide = ppt.getSlides().get(0);
 
-        Shape[] shape = slide.getShapes();
-        assertEquals(1, shape.length);
-        assertTrue(shape[0] instanceof ShapeGroup);
+        List<HSLFShape> shape = slide.getShapes();
+        assertEquals(1, shape.size());
+        assertTrue(shape.get(0) instanceof HSLFGroupShape);
 
-        group = (ShapeGroup)shape[0];
-        Shape[] grshape = group.getShapes();
-        assertEquals(2, grshape.length);
-        assertTrue(grshape[0] instanceof Picture);
-        assertTrue(grshape[1] instanceof Line);
+        group = (HSLFGroupShape)shape.get(0);
+        List<HSLFShape> grshape = group.getShapes();
+        assertEquals(2, grshape.size());
+        assertTrue(grshape.get(0) instanceof HSLFPictureShape);
+        assertTrue(grshape.get(1) instanceof Line);
 
-        pict = (Picture)grshape[0];
+        pict = (HSLFPictureShape)grshape.get(0);
         assertEquals(new Rectangle(0, 0, 200, 200), pict.getAnchor());
 
-        line = (Line)grshape[1];
+        line = (Line)grshape.get(1);
         assertEquals(new Rectangle(300, 300, 500, 0), line.getAnchor());
     }
 
@@ -310,48 +346,48 @@
     @Test
     public void removeShapes() throws IOException {
         String file = "with_textbox.ppt";
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream(file));
-        Slide sl = ppt.getSlides()[0];
-        Shape[] sh = sl.getShapes();
-        assertEquals("expected four shaped in " + file, 4, sh.length);
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream(file));
+        HSLFSlide sl = ppt.getSlides().get(0);
+        List<HSLFShape> sh = sl.getShapes();
+        assertEquals("expected four shaped in " + file, 4, sh.size());
         //remove all
-        for (int i = 0; i < sh.length; i++) {
-            boolean ok = sl.removeShape(sh[i]);
+        for (int i = 0; i < sh.size(); i++) {
+            boolean ok = sl.removeShape(sh.get(i));
             assertTrue("Failed to delete shape #" + i, ok);
         }
         //now Slide.getShapes() should return an empty array
-        assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().length);
+        assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().size());
 
         //serialize and read again. The file should be readable and contain no shapes
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
-        sl = ppt.getSlides()[0];
-        assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().length);
+        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
+        sl = ppt.getSlides().get(0);
+        assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().size());
     }
 
     @Test
     public void lineWidth() {
-        SimpleShape sh = new AutoShape(ShapeTypes.RightTriangle);
+        HSLFSimpleShape sh = new HSLFAutoShape(ShapeType.RT_TRIANGLE);
 
         EscherOptRecord opt = sh.getEscherOptRecord();
-        EscherSimpleProperty prop = SimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH);
+        EscherSimpleProperty prop = HSLFSimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH);
         assertNull(prop);
-        assertEquals(SimpleShape.DEFAULT_LINE_WIDTH, sh.getLineWidth(), 0);
+        assertEquals(HSLFSimpleShape.DEFAULT_LINE_WIDTH, sh.getLineWidth(), 0);
 
         sh.setLineWidth(1.0);
-        prop = SimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH);
+        prop = HSLFSimpleShape.getEscherProperty(opt, EscherProperties.LINESTYLE__LINEWIDTH);
         assertNotNull(prop);
         assertEquals(1.0, sh.getLineWidth(), 0);
     }
 
     @Test
     public void shapeId() {
-        SlideShow ppt = new SlideShow();
-        Slide slide = ppt.createSlide();
-        Shape shape = null;
+        HSLFSlideShow ppt = new HSLFSlideShow();
+        HSLFSlide slide = ppt.createSlide();
+        HSLFShape shape = null;
 
         //EscherDgg is a document-level record which keeps track of the drawing groups
         EscherDggRecord dgg = ppt.getDocumentRecord().getPPDrawingGroup().getEscherDggRecord();
@@ -399,25 +435,25 @@
 
     @Test
     public void lineColor() throws IOException {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("51731.ppt"));
-        Shape[] shape = ppt.getSlides()[0].getShapes();
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("51731.ppt"));
+        List<HSLFShape> shape = ppt.getSlides().get(0).getShapes();
 
-        assertEquals(4, shape.length);
+        assertEquals(4, shape.size());
 
-        TextShape sh1 = (TextShape)shape[0];
+        HSLFTextShape sh1 = (HSLFTextShape)shape.get(0);
         assertEquals("Hello Apache POI", sh1.getText());
         assertNull(sh1.getLineColor());
 
-        TextShape sh2 = (TextShape)shape[1];
+        HSLFTextShape sh2 = (HSLFTextShape)shape.get(1);
         assertEquals("Why are you showing this border?", sh2.getText());
         assertNull(sh2.getLineColor());
 
-        TextShape sh3 = (TextShape)shape[2];
+        HSLFTextShape sh3 = (HSLFTextShape)shape.get(2);
         assertEquals("Text in a black border", sh3.getText());
         assertEquals(Color.black, sh3.getLineColor());
         assertEquals(0.75, sh3.getLineWidth(), 0);
 
-        TextShape sh4 = (TextShape)shape[3];
+        HSLFTextShape sh4 = (HSLFTextShape)shape.get(3);
         assertEquals("Border width is 5 pt", sh4.getText());
         assertEquals(Color.black, sh4.getLineColor());
         assertEquals(5.0, sh4.getLineWidth(), 0);
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
index 4bed9ee..a5e9084 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSheet.java
@@ -17,14 +17,17 @@
 
 package org.apache.poi.hslf.model;
 
-import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
+import java.util.List;
+
+import org.apache.poi.POIDataSamples;
 import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException;
 import org.apache.poi.hslf.record.ColorSchemeAtom;
 import org.apache.poi.hslf.record.PPDrawing;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.usermodel.*;
+import org.junit.Test;
 
 /**
  * Test common functionality of the <code>Sheet</code> object.
@@ -32,17 +35,18 @@
  *
  * @author Yegor Kozlov
  */
-public final class TestSheet extends TestCase {
+public final class TestSheet {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
     /**
      * For each ppt in the test directory check that all sheets are properly initialized
      */
+    @Test
     public void testSheet() throws Exception {
         String[] tests = {"SampleShow.ppt", "backgrounds.ppt", "text_shapes.ppt", "pictures.ppt"};
         for (String file : tests) {
             try {
-                SlideShow ppt = new SlideShow(_slTests.openResourceAsStream(file));
+                HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream(file));
                 doSlideShow(ppt);
             } catch (EncryptedPowerPointFileException e){
                 ; //skip encrypted ppt
@@ -50,21 +54,20 @@
         }
     }
 
-    private void doSlideShow(SlideShow ppt) {
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            verify(slide[i]);
+    private void doSlideShow(HSLFSlideShow ppt) {
+        for (HSLFSlide slide : ppt.getSlides()) {
+            verify(slide);
 
-            Notes notes = slide[i].getNotesSheet();
+            HSLFNotes notes = slide.getNotes();
             if(notes != null) verify(notes);
 
-            MasterSheet master = slide[i].getMasterSheet();
+            HSLFMasterSheet master = slide.getMasterSheet();
             assertNotNull(master);
             verify(master);
         }
     }
 
-    private void verify(Sheet sheet){
+    private void verify(HSLFSheet sheet){
         assertNotNull(sheet.getSlideShow());
 
         ColorSchemeAtom colorscheme = sheet.getColorScheme();
@@ -73,29 +76,28 @@
         PPDrawing ppdrawing = sheet.getPPDrawing();
         assertNotNull(ppdrawing);
 
-        Background background = sheet.getBackground();
+        HSLFBackground background = sheet.getBackground();
         assertNotNull(background);
 
         assertTrue(sheet._getSheetNumber() != 0);
         assertTrue(sheet._getSheetRefId() != 0);
 
-        TextRun[] txt = sheet.getTextRuns();
-        if (txt == null) {
-            throw new AssertionFailedError("no text runs");
-        }
-        for (int i = 0; i < txt.length; i++) {
-            assertNotNull(txt[i].getSheet());
+        List<List<HSLFTextParagraph>> txt = sheet.getTextParagraphs();
+        // assertTrue("no text runs", txt != null && !txt.isEmpty());
+        // backgrounds.ppt has no texts
+        for (List<HSLFTextParagraph> t : txt) {
+            for (HSLFTextParagraph tp : t) {
+                assertNotNull(tp.getSheet());
+            }
         }
 
-        Shape[] shape = sheet.getShapes();
-        if (shape == null) {
-            throw new AssertionFailedError("no shapes");
-        }
-        for (int i = 0; i < shape.length; i++) {
-            assertNotNull(shape[i].getSpContainer());
-            assertNotNull(shape[i].getSheet());
-            assertNotNull(shape[i].getShapeName());
-            assertNotNull(shape[i].getAnchor());
+        List<HSLFShape> shape = sheet.getShapes();
+        assertTrue("no shapes", shape != null && !shape.isEmpty());
+        for (HSLFShape s : shape) {
+            assertNotNull(s.getSpContainer());
+            assertNotNull(s.getSheet());
+            assertNotNull(s.getShapeName());
+            assertNotNull(s.getAnchor());
         }
     }
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java
index 71c95f8..57f6f5a 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideChangeNotes.java
@@ -18,30 +18,33 @@
 package org.apache.poi.hslf.model;
 
 
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
 
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.record.SlideAtom;
-import org.apache.poi.hslf.usermodel.SlideShow;
 import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.record.SlideAtom;
+import org.apache.poi.hslf.usermodel.*;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests that changing a slide's idea of what notes sheet is its works right
  *
  * @author Nick Burch (nick at torchbox dot com)
  */
-public final class TestSlideChangeNotes extends TestCase {
+public final class TestSlideChangeNotes {
 	// SlideShow primed on the test data
-	private SlideShow ss;
+	private HSLFSlideShow ss;
 
-	public TestSlideChangeNotes() throws Exception {
+	@Before
+	public void init() throws Exception {
         POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
-		HSLFSlideShow hss = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss = new SlideShow(hss);
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss = new HSLFSlideShow(hss);
 	}
 
+	@Test
 	public void testSetToNone() {
-		Slide slideOne = ss.getSlides()[0];
+		HSLFSlide slideOne = ss.getSlides().get(0);
 		SlideAtom sa = slideOne.getSlideRecord().getSlideAtom();
 
 		slideOne.setNotes(null);
@@ -49,9 +52,10 @@
 		assertEquals(0, sa.getNotesID());
 	}
 
+	@Test
 	public void testSetToSomething() {
-		Slide slideOne = ss.getSlides()[0];
-		Notes notesOne = ss.getNotes()[1];
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		HSLFNotes notesOne = ss.getNotes().get(1);
 		SlideAtom sa = slideOne.getSlideRecord().getSlideAtom();
 
 		slideOne.setNotes(notesOne);
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java
index 45c3c0c..cd46ef9 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlideMaster.java
@@ -17,64 +17,66 @@
 
 package org.apache.poi.hslf.model;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.util.List;
 
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.POIDataSamples;
 import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
 import org.apache.poi.hslf.record.Environment;
 import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.usermodel.*;
+import org.junit.Test;
 
 /**
  * Tests for SlideMaster
  *
  * @author Yegor Kozlov
  */
-public final class TestSlideMaster extends TestCase{
+public final class TestSlideMaster {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
     /**
      * The reference ppt has two masters.
      * Check we can read their attributes.
      */
+    @Test
     public void testSlideMaster() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
 
         Environment env = ppt.getDocumentRecord().getEnvironment();
 
-        SlideMaster[] master = ppt.getSlidesMasters();
-        assertEquals(2, master.length);
+        List<HSLFSlideMaster> master = ppt.getSlideMasters();
+        assertEquals(2, master.size());
 
         //character attributes
-        assertEquals(40, master[0].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.size", true).getValue());
-        assertEquals(48, master[1].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.size", true).getValue());
+        assertEquals(40, master.get(0).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.size", true).getValue());
+        assertEquals(48, master.get(1).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.size", true).getValue());
 
-        int font1 = master[0].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.index", true).getValue();
-        int font2 = master[1].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.index", true).getValue();
+        int font1 = master.get(0).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.index", true).getValue();
+        int font2 = master.get(1).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "font.index", true).getValue();
         assertEquals("Arial", env.getFontCollection().getFontWithId(font1));
         assertEquals("Georgia", env.getFontCollection().getFontWithId(font2));
 
-        CharFlagsTextProp prop1 = (CharFlagsTextProp)master[0].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "char_flags", true);
+        CharFlagsTextProp prop1 = (CharFlagsTextProp)master.get(0).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "char_flags", true);
         assertEquals(false, prop1.getSubValue(CharFlagsTextProp.BOLD_IDX));
         assertEquals(false, prop1.getSubValue(CharFlagsTextProp.ITALIC_IDX));
         assertEquals(true, prop1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX));
 
-        CharFlagsTextProp prop2 = (CharFlagsTextProp)master[1].getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "char_flags", true);
+        CharFlagsTextProp prop2 = (CharFlagsTextProp)master.get(1).getStyleAttribute(TextHeaderAtom.TITLE_TYPE, 0, "char_flags", true);
         assertEquals(false, prop2.getSubValue(CharFlagsTextProp.BOLD_IDX));
         assertEquals(true, prop2.getSubValue(CharFlagsTextProp.ITALIC_IDX));
         assertEquals(false, prop2.getSubValue(CharFlagsTextProp.UNDERLINE_IDX));
 
         //now paragraph attributes
-        assertEquals(0x266B, master[0].getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.char", false).getValue());
-        assertEquals(0x2022, master[1].getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.char", false).getValue());
+        assertEquals(0x266B, master.get(0).getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.char", false).getValue());
+        assertEquals(0x2022, master.get(1).getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.char", false).getValue());
 
-        int b1 = master[0].getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.font", false).getValue();
-        int b2 = master[1].getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.font", false).getValue();
+        int b1 = master.get(0).getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.font", false).getValue();
+        int b2 = master.get(1).getStyleAttribute(TextHeaderAtom.BODY_TYPE, 0, "bullet.font", false).getValue();
         assertEquals("Arial", env.getFontCollection().getFontWithId(b1));
         assertEquals("Georgia", env.getFontCollection().getFontWithId(b2));
     }
@@ -82,19 +84,20 @@
     /**
      * Test we can read default text attributes for a title master sheet
      */
+    @Test
     public void testTitleMasterTextAttributes() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
-        TitleMaster[] master = ppt.getTitleMasters();
-        assertEquals(1, master.length);
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
+        List<HSLFTitleMaster> master = ppt.getTitleMasters();
+        assertEquals(1, master.size());
 
-        assertEquals(32, master[0].getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "font.size", true).getValue());
-        CharFlagsTextProp prop1 = (CharFlagsTextProp)master[0].getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "char_flags", true);
+        assertEquals(32, master.get(0).getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "font.size", true).getValue());
+        CharFlagsTextProp prop1 = (CharFlagsTextProp)master.get(0).getStyleAttribute(TextHeaderAtom.CENTER_TITLE_TYPE, 0, "char_flags", true);
         assertEquals(true, prop1.getSubValue(CharFlagsTextProp.BOLD_IDX));
         assertEquals(false, prop1.getSubValue(CharFlagsTextProp.ITALIC_IDX));
         assertEquals(true, prop1.getSubValue(CharFlagsTextProp.UNDERLINE_IDX));
 
-        assertEquals(20, master[0].getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "font.size", true).getValue());
-        CharFlagsTextProp prop2 = (CharFlagsTextProp)master[0].getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "char_flags", true);
+        assertEquals(20, master.get(0).getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "font.size", true).getValue());
+        CharFlagsTextProp prop2 = (CharFlagsTextProp)master.get(0).getStyleAttribute(TextHeaderAtom.CENTRE_BODY_TYPE, 0, "char_flags", true);
         assertEquals(true, prop2.getSubValue(CharFlagsTextProp.BOLD_IDX));
         assertEquals(false, prop2.getSubValue(CharFlagsTextProp.ITALIC_IDX));
         assertEquals(false, prop2.getSubValue(CharFlagsTextProp.UNDERLINE_IDX));
@@ -103,25 +106,25 @@
     /**
      * Slide 3 has title layout and follows the TitleMaster. Verify that.
      */
+    @Test
     public void testTitleMaster() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
-        Slide slide = ppt.getSlides()[2];
-        MasterSheet masterSheet = slide.getMasterSheet();
-        assertTrue(masterSheet instanceof TitleMaster);
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
+        HSLFSlide slide = ppt.getSlides().get(2);
+        HSLFMasterSheet masterSheet = slide.getMasterSheet();
+        assertTrue(masterSheet instanceof HSLFTitleMaster);
 
-        TextRun[] txt = slide.getTextRuns();
-        for (int i = 0; i < txt.length; i++) {
-            RichTextRun rt = txt[i].getRichTextRuns()[0];
-            switch(txt[i].getRunType()){
+        for (List<HSLFTextParagraph> txt : slide.getTextParagraphs()) {
+            HSLFTextRun rt = txt.get(0).getTextRuns().get(0);
+            switch(txt.get(0).getRunType()){
                 case TextHeaderAtom.CENTER_TITLE_TYPE:
-                    assertEquals("Arial", rt.getFontName());
-                    assertEquals(32, rt.getFontSize());
+                    assertEquals("Arial", rt.getFontFamily());
+                    assertEquals(32, rt.getFontSize(), 0);
                     assertEquals(true, rt.isBold());
                     assertEquals(true, rt.isUnderlined());
                     break;
                 case TextHeaderAtom.CENTRE_BODY_TYPE:
-                    assertEquals("Courier New", rt.getFontName());
-                    assertEquals(20, rt.getFontSize());
+                    assertEquals("Courier New", rt.getFontFamily());
+                    assertEquals(20, rt.getFontSize(), 0);
                     assertEquals(true, rt.isBold());
                     assertEquals(false, rt.isUnderlined());
                     break;
@@ -132,47 +135,47 @@
     /**
      * If a style attribute is not set ensure it is read from the master
      */
+    @Test
     public void testMasterAttributes() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
-        Slide[] slide = ppt.getSlides();
-        assertEquals(3, slide.length);
-        TextRun[] trun;
-
-        trun = slide[0].getTextRuns();
-        for (int i = 0; i < trun.length; i++) {
-            if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){
-                RichTextRun rt = trun[i].getRichTextRuns()[0];
-                assertEquals(40, rt.getFontSize());
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
+        List<HSLFSlide> slide = ppt.getSlides();
+        assertEquals(3, slide.size());
+        for (List<HSLFTextParagraph> tparas : slide.get(0).getTextParagraphs()) {
+            HSLFTextParagraph tpara = tparas.get(0);
+            if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){
+                HSLFTextRun rt = tpara.getTextRuns().get(0);
+                assertEquals(40, rt.getFontSize(), 0);
                 assertEquals(true, rt.isUnderlined());
-                assertEquals("Arial", rt.getFontName());
-            } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){
-                RichTextRun rt;
-                rt = trun[i].getRichTextRuns()[0];
-                assertEquals(0, rt.getIndentLevel());
-                assertEquals(32, rt.getFontSize());
-                assertEquals("Arial", rt.getFontName());
+                assertEquals("Arial", rt.getFontFamily());
+            } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){
+                HSLFTextRun rt = tpara.getTextRuns().get(0);
+                assertEquals(0, tpara.getIndentLevel());
+                assertEquals(32, rt.getFontSize(), 0);
+                assertEquals("Arial", rt.getFontFamily());
 
-                rt = trun[i].getRichTextRuns()[1];
-                assertEquals(1, rt.getIndentLevel());
-                assertEquals(28, rt.getFontSize());
-                assertEquals("Arial", rt.getFontName());
+                tpara = tparas.get(1);
+                rt = tpara.getTextRuns().get(0);
+                assertEquals(1, tpara.getIndentLevel());
+                assertEquals(28, rt.getFontSize(), 0);
+                assertEquals("Arial", rt.getFontFamily());
 
             }
         }
 
-        trun = slide[1].getTextRuns();
-        for (int i = 0; i < trun.length; i++) {
-            if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){
-                RichTextRun rt = trun[i].getRichTextRuns()[0];
-                assertEquals(48, rt.getFontSize());
+        ;
+        for (List<HSLFTextParagraph> tparas : slide.get(1).getTextParagraphs()) {
+            HSLFTextParagraph tpara = tparas.get(0);
+            if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){
+                HSLFTextRun rt = tpara.getTextRuns().get(0);
+                assertEquals(48, rt.getFontSize(), 0);
                 assertEquals(true, rt.isItalic());
-                assertEquals("Georgia", rt.getFontName());
-            } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){
-                RichTextRun rt;
-                rt = trun[i].getRichTextRuns()[0];
-                assertEquals(0, rt.getIndentLevel());
-                assertEquals(32, rt.getFontSize());
-                assertEquals("Courier New", rt.getFontName());
+                assertEquals("Georgia", rt.getFontFamily());
+            } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){
+                HSLFTextRun rt;
+                rt = tpara.getTextRuns().get(0);
+                assertEquals(0, tpara.getIndentLevel());
+                assertEquals(32, rt.getFontSize(), 0);
+                assertEquals("Courier New", rt.getFontFamily());
             }
         }
 
@@ -181,20 +184,21 @@
     /**
      * Check we can dynamically assign a slide master to a slide.
      */
+    @Test
     public void testChangeSlideMaster() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
-        SlideMaster[] master = ppt.getSlidesMasters();
-        Slide[] slide = ppt.getSlides();
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
+        List<HSLFSlideMaster> master = ppt.getSlideMasters();
+        List<HSLFSlide> slide = ppt.getSlides();
         int sheetNo;
 
         //each slide uses its own master
-        assertEquals(slide[0].getMasterSheet()._getSheetNumber(), master[0]._getSheetNumber());
-        assertEquals(slide[1].getMasterSheet()._getSheetNumber(), master[1]._getSheetNumber());
+        assertEquals(slide.get(0).getMasterSheet()._getSheetNumber(), master.get(0)._getSheetNumber());
+        assertEquals(slide.get(1).getMasterSheet()._getSheetNumber(), master.get(1)._getSheetNumber());
 
         //all slides use the first master slide
-        sheetNo = master[0]._getSheetNumber();
-        for (int i = 0; i < slide.length; i++) {
-            slide[i].setMasterSheet(master[0]);
+        sheetNo = master.get(0)._getSheetNumber();
+        for (HSLFSlide s : slide) {
+            s.setMasterSheet(master.get(0));
         }
 
         ByteArrayOutputStream out;
@@ -203,11 +207,11 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        master = ppt.getSlidesMasters();
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        master = ppt.getSlideMasters();
         slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            assertEquals(sheetNo, slide[i].getMasterSheet()._getSheetNumber());
+        for (HSLFSlide s : slide) {
+            assertEquals(sheetNo, s.getMasterSheet()._getSheetNumber());
         }
     }
 
@@ -215,33 +219,23 @@
      * Varify we can read attrubutes for different identtation levels.
      * (typical for the "bullted body" placeholder)
      */
+    @Test
     public void testIndentation() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
-        Slide slide = ppt.getSlides()[0];
-        TextRun[] trun;
-
-        trun = slide.getTextRuns();
-        for (int i = 0; i < trun.length; i++) {
-            if (trun[i].getRunType() == TextHeaderAtom.TITLE_TYPE){
-                RichTextRun rt = trun[i].getRichTextRuns()[0];
-                assertEquals(40, rt.getFontSize());
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("slide_master.ppt"));
+        HSLFSlide slide = ppt.getSlides().get(0);
+        
+        for (List<HSLFTextParagraph> tparas : slide.getTextParagraphs()) {
+            HSLFTextParagraph tpara = tparas.get(0);
+            if (tpara.getRunType() == TextHeaderAtom.TITLE_TYPE){
+                HSLFTextRun rt = tpara.getTextRuns().get(0);
+                assertEquals(40, rt.getFontSize(), 0);
                 assertEquals(true, rt.isUnderlined());
-                assertEquals("Arial", rt.getFontName());
-            } else if (trun[i].getRunType() == TextHeaderAtom.BODY_TYPE){
-                RichTextRun[] rt = trun[i].getRichTextRuns();
-                for (int j = 0; j < rt.length; j++) {
-                    int indent = rt[j].getIndentLevel();
-                    switch (indent){
-                        case 0:
-                            assertEquals(32, rt[j].getFontSize());
-                            break;
-                        case 1:
-                            assertEquals(28, rt[j].getFontSize());
-                            break;
-                        case 2:
-                            assertEquals(24, rt[j].getFontSize());
-                            break;
-                    }
+                assertEquals("Arial", rt.getFontFamily());
+            } else if (tpara.getRunType() == TextHeaderAtom.BODY_TYPE){
+                int indents[] = { 32, 28, 24 };
+                for (HSLFTextRun rt : tpara.getTextRuns()) {
+                    int indent = tpara.getIndentLevel();
+                    assertEquals(indents[indent], rt.getFontSize(), 0);
                 }
             }
         }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java
index 11889f4..a84caef 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestSlides.java
@@ -17,13 +17,15 @@
 
 package org.apache.poi.hslf.model;
 
-import junit.framework.TestCase;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.POIDataSamples;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
-import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.usermodel.*;
+import org.junit.Test;
 
 /**
  * Test adding new slides to a ppt.
@@ -32,18 +34,19 @@
  *  stuff does
  * @author Yegor Kozlov
  */
-public final class TestSlides extends TestCase {
+public final class TestSlides {
 
     /**
      * Add 1 slide to an empty ppt.
      * @throws Exception
      */
+    @Test
     public void testAddSlides1() throws Exception {
-        SlideShow ppt = new SlideShow(new HSLFSlideShow( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") ));
-        assertTrue(ppt.getSlides().length == 0);
+        HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") ));
+        assertTrue(ppt.getSlides().isEmpty());
 
-        Slide s1 = ppt.createSlide();
-        assertTrue(ppt.getSlides().length == 1);
+        HSLFSlide s1 = ppt.createSlide();
+        assertEquals(1, ppt.getSlides().size());
         assertEquals(3, s1._getSheetRefId());
         assertEquals(256, s1._getSheetNumber());
         assertEquals(1, s1.getSlideNumber());
@@ -53,61 +56,63 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        assertTrue(ppt.getSlides().length == 1);
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        assertEquals(1, ppt.getSlides().size());
     }
 
     /**
      * Add 2 slides to an empty ppt
      * @throws Exception
      */
+    @Test
     public void testAddSlides2() throws Exception {
-        SlideShow ppt = new SlideShow(new HSLFSlideShow( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") ));
-        assertTrue(ppt.getSlides().length == 0);
+        HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") ));
+        assertTrue(ppt.getSlides().isEmpty());
 
-        Slide s1 = ppt.createSlide();
-        assertTrue(ppt.getSlides().length == 1);
+        HSLFSlide s1 = ppt.createSlide();
+        assertEquals(1, ppt.getSlides().size());
         assertEquals(3, s1._getSheetRefId());
         assertEquals(256, s1._getSheetNumber());
         assertEquals(1, s1.getSlideNumber());
 
-        Slide s2 = ppt.createSlide();
-        assertTrue(ppt.getSlides().length == 2);
+        HSLFSlide s2 = ppt.createSlide();
+        assertEquals(2, ppt.getSlides().size());
         assertEquals(4, s2._getSheetRefId());
         assertEquals(257, s2._getSheetNumber());
         assertEquals(2, s2.getSlideNumber());
 
         //serialize and read again
-         ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        assertTrue(ppt.getSlides().length == 2);
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        assertEquals(2, ppt.getSlides().size());
     }
 
     /**
      * Add 3 slides to an empty ppt
      * @throws Exception
      */
+    @Test
     public void testAddSlides3() throws Exception {
-        SlideShow ppt = new SlideShow(new HSLFSlideShow( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") ));
-        assertTrue(ppt.getSlides().length == 0);
+        HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl( TestSlides.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt") ));
+        assertTrue(ppt.getSlides().isEmpty());
 
-        Slide s1 = ppt.createSlide();
-        assertTrue(ppt.getSlides().length == 1);
+        HSLFSlide s1 = ppt.createSlide();
+        assertEquals(1, ppt.getSlides().size());
         assertEquals(3, s1._getSheetRefId());
         assertEquals(256, s1._getSheetNumber());
         assertEquals(1, s1.getSlideNumber());
 
-        Slide s2 = ppt.createSlide();
-        assertTrue(ppt.getSlides().length == 2);
+        HSLFSlide s2 = ppt.createSlide();
+        assertEquals(2, ppt.getSlides().size());
         assertEquals(4, s2._getSheetRefId());
         assertEquals(257, s2._getSheetNumber());
         assertEquals(2, s2.getSlideNumber());
 
-        Slide s3 = ppt.createSlide();
-        assertTrue(ppt.getSlides().length == 3);
+        HSLFSlide s3 = ppt.createSlide();
+        assertEquals(3, ppt.getSlides().size());
         assertEquals(5, s3._getSheetRefId());
         assertEquals(258, s3._getSheetNumber());
         assertEquals(3, s3.getSlideNumber());
@@ -118,18 +123,18 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        assertTrue(ppt.getSlides().length == 3);
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        assertEquals(3, ppt.getSlides().size());
 
         // Check IDs are still right
-        s1 = ppt.getSlides()[0];
+        s1 = ppt.getSlides().get(0);
         assertEquals(256, s1._getSheetNumber());
         assertEquals(3, s1._getSheetRefId());
-        s2 = ppt.getSlides()[1];
+        s2 = ppt.getSlides().get(1);
         assertEquals(257, s2._getSheetNumber());
         assertEquals(4, s2._getSheetRefId());
-        s3 = ppt.getSlides()[2];;
-        assertTrue(ppt.getSlides().length == 3);
+        s3 = ppt.getSlides().get(2);;
+        assertEquals(3, ppt.getSlides().size());
         assertEquals(258, s3._getSheetNumber());
         assertEquals(5, s3._getSheetRefId());
     }
@@ -137,25 +142,26 @@
     /**
      * Add slides to ppt which already has two slides
      */
+    @Test
     public void testAddSlides2to3() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-        SlideShow ppt = new SlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+        HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
 
-        assertTrue(ppt.getSlides().length == 2);
+        assertEquals(2, ppt.getSlides().size());
 
         // First slide is 256 / 4
-        Slide s1 = ppt.getSlides()[0];
+        HSLFSlide s1 = ppt.getSlides().get(0);
         assertEquals(256, s1._getSheetNumber());
         assertEquals(4, s1._getSheetRefId());
 
         // Last slide is 257 / 6
-        Slide s2 = ppt.getSlides()[1];
+        HSLFSlide s2 = ppt.getSlides().get(1);
         assertEquals(257, s2._getSheetNumber());
         assertEquals(6, s2._getSheetRefId());
 
         // Add another slide, goes in at the end
-        Slide s3 = ppt.createSlide();
-        assertTrue(ppt.getSlides().length == 3);
+        HSLFSlide s3 = ppt.createSlide();
+        assertEquals(3, ppt.getSlides().size());
         assertEquals(258, s3._getSheetNumber());
         assertEquals(8, s3._getSheetRefId());
 
@@ -165,19 +171,19 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
-        assertTrue(ppt.getSlides().length == 3);
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
+        assertEquals(3, ppt.getSlides().size());
 
 
         // Check IDs are still right
-        s1 = ppt.getSlides()[0];
+        s1 = ppt.getSlides().get(0);
         assertEquals(256, s1._getSheetNumber());
         assertEquals(4, s1._getSheetRefId());
-        s2 = ppt.getSlides()[1];
+        s2 = ppt.getSlides().get(1);
         assertEquals(257, s2._getSheetNumber());
         assertEquals(6, s2._getSheetRefId());
-        s3 = ppt.getSlides()[2];;
-        assertTrue(ppt.getSlides().length == 3);
+        s3 = ppt.getSlides().get(2);
+        assertEquals(3, ppt.getSlides().size());
         assertEquals(258, s3._getSheetNumber());
         assertEquals(8, s3._getSheetRefId());
     }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java
index 1740b46..fb49dbb 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java
@@ -17,17 +17,27 @@
 
 package org.apache.poi.hslf.model;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-import junit.framework.TestCase;
+import java.util.List;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.extractor.PowerPointExtractor;
 import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFShape;
+import org.apache.poi.hslf.usermodel.HSLFSlide;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFTable;
+import org.apache.poi.hslf.usermodel.HSLFTableCell;
+import org.apache.poi.sl.usermodel.Shape;
+import org.apache.poi.sl.usermodel.Slide;
+import org.apache.poi.sl.usermodel.SlideShow;
+import org.apache.poi.sl.usermodel.TableShape;
 import org.junit.Test;
 
 /**
@@ -35,26 +45,27 @@
  *
  * @author Yegor Kozlov
  */
-public final class TestTable extends TestCase {
+public final class TestTable {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
     /**
      * Test that ShapeFactory works properly and returns <code>Table</code>
      */
+    @Test
     public void testShapeFactory() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
 
-        Table tbl = new Table(2, 5);
+        HSLFTable tbl = new HSLFTable(2, 5);
         slide.addShape(tbl);
 
-        TableCell cell = tbl.getCell(0, 0);
+        HSLFTableCell cell = tbl.getCell(0, 0);
         //table cells have type=TextHeaderAtom.OTHER_TYPE, see bug #46033
-        assertEquals(TextHeaderAtom.OTHER_TYPE, cell.getTextRun().getRunType());
+        assertEquals(TextHeaderAtom.OTHER_TYPE, cell.getTextParagraphs().get(0).getRunType());
 
-        assertTrue(slide.getShapes()[0] instanceof Table);
-        Table tbl2 = (Table)slide.getShapes()[0];
+        assertTrue(slide.getShapes().get(0) instanceof HSLFTable);
+        HSLFTable tbl2 = (HSLFTable)slide.getShapes().get(0);
         assertEquals(tbl.getNumberOfColumns(), tbl2.getNumberOfColumns());
         assertEquals(tbl.getNumberOfRows(), tbl2.getNumberOfRows());
 
@@ -62,10 +73,10 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
-        slide = ppt.getSlides()[0];
-        assertTrue(slide.getShapes()[0] instanceof Table);
-        Table tbl3 = (Table)slide.getShapes()[0];
+        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
+        slide = ppt.getSlides().get(0);
+        assertTrue(slide.getShapes().get(0) instanceof HSLFTable);
+        HSLFTable tbl3 = (HSLFTable)slide.getShapes().get(0);
         assertEquals(tbl.getNumberOfColumns(), tbl3.getNumberOfColumns());
         assertEquals(tbl.getNumberOfRows(), tbl3.getNumberOfRows());
     }
@@ -73,34 +84,36 @@
     /**
      * Error constructing Table when rownum=1
      */
+    @Test
     public void test45889(){
-        SlideShow ppt = new SlideShow();
-        Slide slide = ppt.createSlide();
-        Shape[] shapes;
-        Table tbl1 = new Table(1, 5);
+        HSLFSlideShow ppt = new HSLFSlideShow();
+        HSLFSlide slide = ppt.createSlide();
+        List<HSLFShape> shapes;
+        HSLFTable tbl1 = new HSLFTable(1, 5);
         assertEquals(5, tbl1.getNumberOfColumns());
         assertEquals(1, tbl1.getNumberOfRows());
         slide.addShape(tbl1);
 
         shapes = slide.getShapes();
-        assertEquals(1, shapes.length);
+        assertEquals(1, shapes.size());
 
-        Table tbl2 = (Table)shapes[0];
+        HSLFTable tbl2 = (HSLFTable)shapes.get(0);
         assertSame(tbl1.getSpContainer(), tbl2.getSpContainer());
 
         assertEquals(tbl1.getNumberOfColumns(), tbl2.getNumberOfColumns());
         assertEquals(tbl1.getNumberOfRows(), tbl2.getNumberOfRows());
     }
 
+    @Test
     public void testIllegalCOnstruction(){
         try {
-            new Table(0, 5);
+            new HSLFTable(0, 5);
             fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1");
         } catch (IllegalArgumentException e){
 
         }
         try {
-            new Table(5, 0);
+            new HSLFTable(5, 0);
             fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1");
         } catch (IllegalArgumentException e){
 
@@ -113,23 +126,24 @@
      */
     @Test
     public void test57820() throws Exception {
-        SlideShow ppt = new SlideShow(new HSLFSlideShow(_slTests.openResourceAsStream("bug57820-initTableNullRefrenceException.ppt")));
+        SlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug57820-initTableNullRefrenceException.ppt"));
 
-        Slide[] slides = ppt.getSlides();
-        assertEquals(1, slides.length);
+        List<? extends Slide<?,?,?>> slides = ppt.getSlides();
+        assertEquals(1, slides.size());
 
-        Shape[] shapes = slides[0].getShapes(); //throws NullPointerException
+        List<? extends Shape> shapes = slides.get(0).getShapes(); //throws NullPointerException
 
-        Table tbl = null;
-        for(int idx = 0; idx < shapes.length; idx++) {
-            if(shapes[idx] instanceof Table) {
-                tbl = (Table)shapes[idx];
+        TableShape tbl = null;
+        for(Shape s : shapes) {
+            if(s instanceof TableShape) {
+                tbl = (TableShape)s;
                 break;
             }
         }
 
         assertNotNull(tbl);
 
-        assertEquals(-1, tbl.getAnchor().y);
+        // handling changed in common sl, so it evaluates to 0 now
+        assertEquals(0, tbl.getAnchor().getY(), 0);
     }
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java
deleted file mode 100644
index a82e551..0000000
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRun.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-
-import java.awt.*;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.TextBytesAtom;
-import org.apache.poi.hslf.record.TextCharsAtom;
-import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.POIDataSamples;
-
-/**
- * Tests for TextRuns
- *
- * @author Nick Burch (nick at torchbox dot com)
- */
-public final class TestTextRun extends TestCase {
-    private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
-
-	// SlideShow primed on the test data
-	private SlideShow ss;
-	private SlideShow ssRich;
-
-	protected void setUp() throws IOException {
-
-		// Basic (non rich) test file
-		ss = new SlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-
-		// Rich test file
-		ssRich = new SlideShow(_slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
-	}
-
-	/**
-	 * Test to ensure that getting the text works correctly
-	 */
-	public void testGetText() {
-		Slide slideOne = ss.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-
-		assertEquals(2, textRuns.length);
-
-		// Get text works with \n
-		assertEquals("This is a test title", textRuns[0].getText());
-		assertEquals("This is a test subtitle\nThis is on page 1", textRuns[1].getText());
-
-		// Raw text has \r instead
-		assertEquals("This is a test title", textRuns[0].getRawText());
-		assertEquals("This is a test subtitle\rThis is on page 1", textRuns[1].getRawText());
-
-
-		// Now check on a rich text run
-		Slide slideOneR = ssRich.getSlides()[0];
-		TextRun[] textRunsR = slideOneR.getTextRuns();
-
-		assertEquals(2, textRunsR.length);
-		assertEquals("This is a title, it\u2019s in black", textRunsR[0].getText());
-		assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", textRunsR[1].getText());
-		assertEquals("This is a title, it\u2019s in black", textRunsR[0].getRawText());
-		assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", textRunsR[1].getRawText());
-	}
-
-	/**
-	 * Test to ensure changing non rich text bytes->bytes works correctly
-	 */
-	public void testSetText() {
-		Slide slideOne = ss.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-		TextRun run = textRuns[0];
-
-		// Check current text
-		assertEquals("This is a test title", run.getText());
-
-		// Change
-		String changeTo = "New test title";
-		run.setText(changeTo);
-		assertEquals(changeTo, run.getText());
-
-		// Ensure trailing \n's are NOT stripped, it is legal to set a text with a trailing '\r'
-		run.setText(changeTo + "\n");
-		assertEquals(changeTo + "\n", run.getText());
-	}
-
-	/**
-	 * Test to ensure that changing non rich text between bytes and
-	 *  chars works correctly
-	 */
-	public void testAdvancedSetText() {
-		Slide slideOne = ss.getSlides()[0];
-		TextRun run = slideOne.getTextRuns()[0];
-
-		TextHeaderAtom tha = run._headerAtom;
-		TextBytesAtom tba = run._byteAtom;
-		TextCharsAtom tca = run._charAtom;
-
-		// Bytes -> Bytes
-		assertNull(tca);
-		assertNotNull(tba);
-		assertFalse(run._isUnicode);
-		assertEquals("This is a test title", run.getText());
-
-		String changeBytesOnly = "New Test Title";
-		run.setText(changeBytesOnly);
-		tba = run._byteAtom;
-		tca = run._charAtom;
-
-		assertEquals(changeBytesOnly, run.getText());
-		assertFalse(run._isUnicode);
-		assertNull(tca);
-		assertNotNull(tba);
-
-		// Bytes -> Chars
-		assertNull(tca);
-		assertNotNull(tba);
-		assertFalse(run._isUnicode);
-		assertEquals(changeBytesOnly, run.getText());
-
-		String changeByteChar = "This is a test title with a '\u0121' g with a dot";
-		run.setText(changeByteChar);
-		tba = run._byteAtom;
-		tca = run._charAtom;
-
-		assertEquals(changeByteChar, run.getText());
-		assertTrue(run._isUnicode);
-		assertNotNull(tca);
-		assertNull(tba);
-
-		// Chars -> Chars
-		assertNull(tba);
-		assertNotNull(tca);
-		assertTrue(run._isUnicode);
-		assertEquals(changeByteChar, run.getText());
-
-		String changeCharChar = "This is a test title with a '\u0147' N with a hat";
-		run.setText(changeCharChar);
-		tba = run._byteAtom;
-		tca = run._charAtom;
-
-		assertEquals(changeCharChar, run.getText());
-		assertTrue(run._isUnicode);
-		assertNotNull(tca);
-		assertNull(tba);
-	}
-
-	/**
-	 * Tests to ensure that non rich text has the right default rich text run
-	 *  set up for it
-	 */
-	public void testGetRichTextNonRich() {
-		Slide slideOne = ss.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-
-		assertEquals(2, textRuns.length);
-
-		TextRun trA = textRuns[0];
-		TextRun trB = textRuns[1];
-
-		assertEquals(1, trA.getRichTextRuns().length);
-		assertEquals(1, trB.getRichTextRuns().length);
-
-		RichTextRun rtrA = trA.getRichTextRuns()[0];
-		RichTextRun rtrB = trB.getRichTextRuns()[0];
-
-		assertEquals(trA.getText(), rtrA.getText());
-		assertEquals(trB.getText(), rtrB.getText());
-
-		assertNull(rtrA._getRawCharacterStyle());
-		assertNull(rtrA._getRawParagraphStyle());
-		assertNull(rtrB._getRawCharacterStyle());
-		assertNull(rtrB._getRawParagraphStyle());
-	}
-
-	/**
-	 * Tests to ensure that the rich text runs are built up correctly
-	 */
-	public void testGetRichText() {
-		Slide slideOne = ssRich.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-
-		assertEquals(2, textRuns.length);
-
-		TextRun trA = textRuns[0];
-		TextRun trB = textRuns[1];
-
-		assertEquals(1, trA.getRichTextRuns().length);
-		assertEquals(3, trB.getRichTextRuns().length);
-
-		RichTextRun rtrA = trA.getRichTextRuns()[0];
-		RichTextRun rtrB = trB.getRichTextRuns()[0];
-		RichTextRun rtrC = trB.getRichTextRuns()[1];
-		RichTextRun rtrD = trB.getRichTextRuns()[2];
-
-		assertEquals(trA.getText(), rtrA.getText());
-
-		assertEquals(trB.getText().substring(0, 30), rtrB.getText());
-		assertEquals(trB.getText().substring(30,58), rtrC.getText());
-		assertEquals(trB.getText().substring(58,82), rtrD.getText());
-
-		assertNull(rtrA._getRawCharacterStyle());
-		assertNull(rtrA._getRawParagraphStyle());
-		assertNotNull(rtrB._getRawCharacterStyle());
-		assertNotNull(rtrB._getRawParagraphStyle());
-		assertNotNull(rtrC._getRawCharacterStyle());
-		assertNotNull(rtrC._getRawParagraphStyle());
-		assertNotNull(rtrD._getRawCharacterStyle());
-		assertNotNull(rtrD._getRawParagraphStyle());
-
-		// Same paragraph styles
-		assertEquals(rtrB._getRawParagraphStyle(), rtrC._getRawParagraphStyle());
-		assertEquals(rtrB._getRawParagraphStyle(), rtrD._getRawParagraphStyle());
-
-		// Different char styles
-		assertFalse( rtrB._getRawCharacterStyle().equals( rtrC._getRawCharacterStyle() ));
-		assertFalse( rtrB._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() ));
-		assertFalse( rtrC._getRawCharacterStyle().equals( rtrD._getRawCharacterStyle() ));
-	}
-
-	/**
-	 * Tests to ensure that setting the text where the text isn't rich,
-	 *  ensuring that everything stays with the same default styling
-	 */
-	public void testSetTextWhereNotRich() {
-		Slide slideOne = ss.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-		TextRun trB = textRuns[1];
-		assertEquals(1, trB.getRichTextRuns().length);
-
-		RichTextRun rtrB = trB.getRichTextRuns()[0];
-		assertEquals(trB.getText(), rtrB.getText());
-		assertNull(rtrB._getRawCharacterStyle());
-		assertNull(rtrB._getRawParagraphStyle());
-
-		// Change text via normal
-		trB.setText("Test Foo Test");
-		rtrB = trB.getRichTextRuns()[0];
-		assertEquals("Test Foo Test", trB.getText());
-		assertEquals("Test Foo Test", rtrB.getText());
-		assertNull(rtrB._getRawCharacterStyle());
-		assertNull(rtrB._getRawParagraphStyle());
-	}
-
-	/**
-	 * Tests to ensure that setting the text where the text is rich
-	 *  sets everything to the same styling
-	 */
-	public void testSetTextWhereRich() {
-		Slide slideOne = ssRich.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-		TextRun trB = textRuns[1];
-		assertEquals(3, trB.getRichTextRuns().length);
-
-		RichTextRun rtrB = trB.getRichTextRuns()[0];
-		RichTextRun rtrC = trB.getRichTextRuns()[1];
-		RichTextRun rtrD = trB.getRichTextRuns()[2];
-		TextPropCollection tpBP = rtrB._getRawParagraphStyle();
-		TextPropCollection tpBC = rtrB._getRawCharacterStyle();
-		TextPropCollection tpCP = rtrC._getRawParagraphStyle();
-		TextPropCollection tpCC = rtrC._getRawCharacterStyle();
-		TextPropCollection tpDP = rtrD._getRawParagraphStyle();
-		TextPropCollection tpDC = rtrD._getRawCharacterStyle();
-
-		assertEquals(trB.getText().substring(0, 30), rtrB.getText());
-		assertNotNull(tpBP);
-		assertNotNull(tpBC);
-		assertNotNull(tpCP);
-		assertNotNull(tpCC);
-		assertNotNull(tpDP);
-		assertNotNull(tpDC);
-		assertTrue(tpBP.equals(tpCP));
-		assertTrue(tpBP.equals(tpDP));
-		assertTrue(tpCP.equals(tpDP));
-		assertFalse(tpBC.equals(tpCC));
-		assertFalse(tpBC.equals(tpDC));
-		assertFalse(tpCC.equals(tpDC));
-
-		// Change text via normal
-		trB.setText("Test Foo Test");
-
-		// Ensure now have first style
-		assertEquals(1, trB.getRichTextRuns().length);
-		rtrB = trB.getRichTextRuns()[0];
-		assertEquals("Test Foo Test", trB.getText());
-		assertEquals("Test Foo Test", rtrB.getText());
-		assertNotNull(rtrB._getRawCharacterStyle());
-		assertNotNull(rtrB._getRawParagraphStyle());
-		assertEquals( tpBP, rtrB._getRawParagraphStyle() );
-		assertEquals( tpBC, rtrB._getRawCharacterStyle() );
-	}
-
-	/**
-	 * Test to ensure the right stuff happens if we change the text
-	 *  in a rich text run, that doesn't happen to actually be rich
-	 */
-	public void testChangeTextInRichTextRunNonRich() {
-		Slide slideOne = ss.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-		TextRun trB = textRuns[1];
-		assertEquals(1, trB.getRichTextRuns().length);
-
-		RichTextRun rtrB = trB.getRichTextRuns()[0];
-		assertEquals(trB.getText(), rtrB.getText());
-		assertNull(rtrB._getRawCharacterStyle());
-		assertNull(rtrB._getRawParagraphStyle());
-
-		// Change text via rich
-		rtrB.setText("Test Test Test");
-		assertEquals("Test Test Test", trB.getText());
-		assertEquals("Test Test Test", rtrB.getText());
-
-		// Will now have dummy props
-		assertNotNull(rtrB._getRawCharacterStyle());
-		assertNotNull(rtrB._getRawParagraphStyle());
-	}
-
-	/**
-	 * Tests to ensure changing the text within rich text runs works
-	 *  correctly
-	 */
-	public void testChangeTextInRichTextRun() {
-		Slide slideOne = ssRich.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-		TextRun trB = textRuns[1];
-		assertEquals(3, trB.getRichTextRuns().length);
-
-		// We start with 3 text runs, each with their own set of styles,
-		//  but all sharing the same paragraph styles
-		RichTextRun rtrB = trB.getRichTextRuns()[0];
-		RichTextRun rtrC = trB.getRichTextRuns()[1];
-		RichTextRun rtrD = trB.getRichTextRuns()[2];
-		TextPropCollection tpBP = rtrB._getRawParagraphStyle();
-		TextPropCollection tpBC = rtrB._getRawCharacterStyle();
-		TextPropCollection tpCP = rtrC._getRawParagraphStyle();
-		TextPropCollection tpCC = rtrC._getRawCharacterStyle();
-		TextPropCollection tpDP = rtrD._getRawParagraphStyle();
-		TextPropCollection tpDC = rtrD._getRawCharacterStyle();
-
-		// Check text and stylings
-		assertEquals(trB.getText().substring(0, 30), rtrB.getText());
-		assertNotNull(tpBP);
-		assertNotNull(tpBC);
-		assertNotNull(tpCP);
-		assertNotNull(tpCC);
-		assertNotNull(tpDP);
-		assertNotNull(tpDC);
-		assertTrue(tpBP.equals(tpCP));
-		assertTrue(tpBP.equals(tpDP));
-		assertTrue(tpCP.equals(tpDP));
-		assertFalse(tpBC.equals(tpCC));
-		assertFalse(tpBC.equals(tpDC));
-		assertFalse(tpCC.equals(tpDC));
-
-		// Check text in the rich runs
-		assertEquals("This is the subtitle, in bold\n", rtrB.getText());
-		assertEquals("This bit is blue and italic\n", rtrC.getText());
-		assertEquals("This bit is red (normal)", rtrD.getText());
-
-		String newBText = "New Subtitle, will still be bold\n";
-		String newCText = "New blue and italic text\n";
-		String newDText = "Funky new normal red text";
-		rtrB.setText(newBText);
-		rtrC.setText(newCText);
-		rtrD.setText(newDText);
-		assertEquals(newBText, rtrB.getText());
-		assertEquals(newCText, rtrC.getText());
-		assertEquals(newDText, rtrD.getText());
-
-		assertEquals(newBText + newCText + newDText, trB.getText());
-
-		// The styles should have been updated for the new sizes
-		assertEquals(newBText.length(), tpBC.getCharactersCovered());
-		assertEquals(newCText.length(), tpCC.getCharactersCovered());
-		assertEquals(newDText.length()+1, tpDC.getCharactersCovered()); // Last one is always one larger
-
-		assertEquals(
-				newBText.length() + newCText.length() + newDText.length(),
-				tpBP.getCharactersCovered()
-		);
-
-		// Paragraph style should be sum of text length
-		assertEquals(newBText.length() + newCText.length() + newDText.length(), tpBP.getCharactersCovered());
-
-		// Check stylings still as expected
-		TextPropCollection ntpBC = rtrB._getRawCharacterStyle();
-		TextPropCollection ntpCC = rtrC._getRawCharacterStyle();
-		TextPropCollection ntpDC = rtrD._getRawCharacterStyle();
-		assertEquals(tpBC.getTextPropList(), ntpBC.getTextPropList());
-		assertEquals(tpCC.getTextPropList(), ntpCC.getTextPropList());
-		assertEquals(tpDC.getTextPropList(), ntpDC.getTextPropList());
-	}
-
-
-	/**
-	 * Test case for Bug 41015.
-	 *
-	 * In some cases RichTextRun.getText() threw StringIndexOutOfBoundsException because
-	 * of the wrong list of potential paragraph properties defined in StyleTextPropAtom.
-	 *
-	 */
-	public void testBug41015() throws IOException {
-		RichTextRun[] rt;
-
-		SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("bug-41015.ppt"));
-		Slide sl = ppt.getSlides()[0];
-		TextRun[] txt = sl.getTextRuns();
-		assertEquals(2, txt.length);
-
-		rt = txt[0].getRichTextRuns();
-		assertEquals(1, rt.length);
-		assertEquals(0, rt[0].getIndentLevel());
-		assertEquals("sdfsdfsdf", rt[0].getText());
-
-		rt = txt[1].getRichTextRuns();
-		assertEquals(2, rt.length);
-		assertEquals(0, rt[0].getIndentLevel());
-		assertEquals("Sdfsdfsdf\n" +
-				"Dfgdfg\n" +
-				"Dfgdfgdfg\n", rt[0].getText());
-		assertEquals(1, rt[1].getIndentLevel());
-		assertEquals("Sdfsdfs\n" +
-				"Sdfsdf\n", rt[1].getText());
-	}
-
-	/**
-	 * Test creation of TextRun objects.
-	 */
-	public void testAddTextRun() {
-		SlideShow ppt = new SlideShow();
-		Slide slide = ppt.createSlide();
-
-		assertNull(slide.getTextRuns());
-
-		TextBox shape1 = new TextBox();
-		TextRun run1 = shape1.getTextRun();
-		assertSame(run1, shape1.createTextRun());
-		run1.setText("Text 1");
-		slide.addShape(shape1);
-
-		//The array of Slide's text runs must be updated when new text shapes are added.
-		TextRun[] runs = slide.getTextRuns();
-		assertNotNull(runs);
-		assertSame(run1, runs[0]);
-
-		TextBox shape2 = new TextBox();
-		TextRun run2 = shape2.getTextRun();
-		assertSame(run2, shape2.createTextRun());
-		run2.setText("Text 2");
-		slide.addShape(shape2);
-
-		runs = slide.getTextRuns();
-		assertEquals(2, runs.length);
-
-		assertSame(run1, runs[0]);
-		assertSame(run2, runs[1]);
-
-		//as getShapes()
-		Shape[] sh = slide.getShapes();
-		assertEquals(2, sh.length);
-		assertTrue(sh[0] instanceof TextBox);
-		TextBox box1 = (TextBox)sh[0];
-		assertSame(run1, box1.getTextRun());
-		TextBox box2 = (TextBox)sh[1];
-		assertSame(run2, box2.getTextRun());
-
-		//test Table - a complex group of shapes containing text objects
-		Slide slide2 = ppt.createSlide();
-		assertNull(slide2.getTextRuns());
-		Table table = new Table(2, 2);
-		slide2.addShape(table);
-		runs = slide2.getTextRuns();
-		assertNotNull(runs);
-		assertEquals(4, runs.length);
-	}
-
-    public void test48916() throws IOException {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("SampleShow.ppt"));
-        for(Slide slide : ppt.getSlides()){
-            for(Shape sh : slide.getShapes()){
-                if(sh instanceof TextShape){
-                    TextShape tx = (TextShape)sh;
-                    TextRun run = tx.getTextRun();
-                    //verify that records cached in  TextRun and EscherTextboxWrapper are the same
-                    Record[] runChildren = run.getRecords();
-                    Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords();
-                    assertEquals(runChildren.length, txboxChildren.length);
-                    for(int i=0; i < txboxChildren.length; i++){
-                        assertSame(txboxChildren[i], runChildren[i]);
-                    }
-                    //caused NPE prior to fix of Bugzilla #48916 
-                    run.getRichTextRuns()[0].setBold(true);
-                    run.getRichTextRuns()[0].setFontColor(Color.RED);
-                }
-            }
-        }
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        ppt.write(out);
-        ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
-        for(Slide slide : ppt.getSlides()){
-            for(Shape sh : slide.getShapes()){
-                if(sh instanceof TextShape){
-                    TextShape tx = (TextShape)sh;
-                    TextRun run = tx.getTextRun();
-                    RichTextRun rt = run.getRichTextRuns()[0];
-                    assertTrue(rt.isBold());
-                    assertEquals(rt.getFontColor(), Color.RED);
-                }
-            }
-        }
-
-    }
-
-    public void test52244() throws IOException {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("52244.ppt"));
-        Slide slide = ppt.getSlides()[0];
-        TextRun[] runs = slide.getTextRuns();
-
-        assertEquals("Arial", runs[0].getRichTextRuns()[0].getFontName());
-        assertEquals(36, runs[0].getRichTextRuns()[0].getFontSize());
-
-        assertEquals("Arial", runs[1].getRichTextRuns()[0].getFontName());
-        assertEquals(24, runs[1].getRichTextRuns()[0].getFontSize());
-
-        assertEquals("Arial", runs[2].getRichTextRuns()[0].getFontName());
-        assertEquals(32, runs[2].getRichTextRuns()[0].getFontSize());
-
-    }
-
-}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java
index db55a2c..85070a3 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextRunReWrite.java
@@ -17,15 +17,18 @@
 
 package org.apache.poi.hslf.model;
 
+import static org.junit.Assert.assertEquals;
 
-import junit.framework.TestCase;
-import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.List;
 
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.usermodel.RichTextRun;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.poifs.filesystem.*;
 import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.usermodel.*;
+import org.apache.poi.poifs.filesystem.DocumentEntry;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests that if we load something up, get a TextRun, set the text
@@ -34,54 +37,59 @@
  *
  * @author Nick Burch (nick at torchbox dot com)
  */
-public final class TestTextRunReWrite extends TestCase {
+public final class TestTextRunReWrite {
 	// HSLFSlideShow primed on the test data
-	private HSLFSlideShow hss;
+	private HSLFSlideShowImpl hss;
 	// HSLFSlideShow primed on the test data
-	private SlideShow ss;
+	private HSLFSlideShow ss;
 	// POIFS primed on the test data
 	private POIFSFileSystem pfs;
 
 	/**
 	 * Load up a test PPT file with rich data
 	 */
+	@Before
     public void setUp() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 		String filename = "Single_Coloured_Page_With_Fonts_and_Alignments.ppt";
 		pfs = new POIFSFileSystem(slTests.openResourceAsStream(filename));
-		hss = new HSLFSlideShow(pfs);
-		ss = new SlideShow(hss);
+		hss = new HSLFSlideShowImpl(pfs);
+		ss = new HSLFSlideShow(hss);
     }
 
-    public void testWritesOutTheSameNonRich() throws Exception {
-    	// Grab the first text run on the first sheet
-    	TextRun tr1 = ss.getSlides()[0].getTextRuns()[0];
-    	TextRun tr2 = ss.getSlides()[0].getTextRuns()[1];
-
+    @Test
+	public void testWritesOutTheSameNonRich() throws Exception {
     	// Ensure the text lengths are as we'd expect to start with
-    	assertEquals(1, ss.getSlides().length);
-    	assertEquals(2, ss.getSlides()[0].getTextRuns().length);
-    	assertEquals(30, tr1.getText().length());
-    	assertEquals(179, tr2.getText().length());
+    	assertEquals(1, ss.getSlides().size());
+    	assertEquals(2, ss.getSlides().get(0).getTextParagraphs().size());
 
-    	assertEquals(1, tr1.getRichTextRuns().length);
-    	assertEquals(30, tr1.getRichTextRuns()[0].getLength());
-    	assertEquals(30, tr1.getRichTextRuns()[0].getText().length());
-    	assertEquals(31, tr1.getRichTextRuns()[0]._getRawCharacterStyle().getCharactersCovered());
-    	assertEquals(31, tr1.getRichTextRuns()[0]._getRawParagraphStyle().getCharactersCovered());
+        // Grab the first text run on the first sheet
+        List<HSLFTextParagraph> tr1 = ss.getSlides().get(0).getTextParagraphs().get(0);
+        List<HSLFTextParagraph> tr2 = ss.getSlides().get(0).getTextParagraphs().get(1);
+    	
+    	
+    	assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
+    	assertEquals(179, HSLFTextParagraph.getRawText(tr2).length());
+
+    	assertEquals(1, tr1.size());
+    	assertEquals(30, HSLFTextParagraph.getText(tr1).length());
+    	assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
+    	assertEquals(31, tr1.get(0).getTextRuns().get(0).getCharacterStyle().getCharactersCovered());
+    	assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered());
 
     	// Set the text to be as it is now
-    	tr1.setText( tr1.getText() );
+    	HSLFTextParagraph.setText(tr1, HSLFTextParagraph.getRawText(tr1));
+    	tr1 = ss.getSlides().get(0).getTextParagraphs().get(0);
 
     	// Check the text lengths are still right
-    	assertEquals(30, tr1.getText().length());
-    	assertEquals(179, tr2.getText().length());
+    	assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
+    	assertEquals(179, HSLFTextParagraph.getRawText(tr2).length());
 
-    	assertEquals(1, tr1.getRichTextRuns().length);
-    	assertEquals(30, tr1.getRichTextRuns()[0].getLength());
-    	assertEquals(30, tr1.getRichTextRuns()[0].getText().length());
-    	assertEquals(31, tr1.getRichTextRuns()[0]._getRawCharacterStyle().getCharactersCovered());
-    	assertEquals(31, tr1.getRichTextRuns()[0]._getRawParagraphStyle().getCharactersCovered());
+        assertEquals(1, tr1.size());
+        assertEquals(30, HSLFTextParagraph.getText(tr1).length());
+        assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
+        assertEquals(31, tr1.get(0).getTextRuns().get(0).getCharacterStyle().getCharactersCovered());
+        assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered());
 
 
 		// Write the slideshow out to a byte array
@@ -110,35 +118,35 @@
 		}
 	}
 
+    @Test
     public void testWritesOutTheSameRich() throws Exception {
     	// Grab the first text run on the first sheet
-    	TextRun tr1 = ss.getSlides()[0].getTextRuns()[0];
+    	List<HSLFTextParagraph> tr1 = ss.getSlides().get(0).getTextParagraphs().get(0);
 
     	// Get the first rich text run
-    	RichTextRun rtr1 = tr1.getRichTextRuns()[0];
+    	HSLFTextRun rtr1 = tr1.get(0).getTextRuns().get(0);
 
 
     	// Check that the text sizes are as expected
-    	assertEquals(1, tr1.getRichTextRuns().length);
-    	assertEquals(30, tr1.getText().length());
-    	assertEquals(30, tr1.getRichTextRuns()[0].getText().length());
+    	assertEquals(1, tr1.get(0).getTextRuns().size());
+        assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
     	assertEquals(30, rtr1.getLength());
-    	assertEquals(30, rtr1.getText().length());
-    	assertEquals(31, rtr1._getRawCharacterStyle().getCharactersCovered());
-    	assertEquals(31, rtr1._getRawParagraphStyle().getCharactersCovered());
+    	assertEquals(30, rtr1.getRawText().length());
+    	assertEquals(31, rtr1.getCharacterStyle().getCharactersCovered());
+    	assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered());
 
     	// Set the text to be as it is now
-    	rtr1.setText( rtr1.getText() );
-    	rtr1 = tr1.getRichTextRuns()[0];
+    	rtr1.setText( rtr1.getRawText() );
+    	rtr1 = tr1.get(0).getTextRuns().get(0);
 
     	// Check that the text sizes are still as expected
-    	assertEquals(1, tr1.getRichTextRuns().length);
-    	assertEquals(30, tr1.getText().length());
-    	assertEquals(30, tr1.getRichTextRuns()[0].getText().length());
+    	assertEquals(1, tr1.get(0).getTextRuns().size());
+    	assertEquals(30, HSLFTextParagraph.getRawText(tr1).length());
+    	assertEquals(30, tr1.get(0).getTextRuns().get(0).getRawText().length());
     	assertEquals(30, rtr1.getLength());
-    	assertEquals(30, rtr1.getText().length());
-    	assertEquals(31, rtr1._getRawCharacterStyle().getCharactersCovered());
-    	assertEquals(31, rtr1._getRawParagraphStyle().getCharactersCovered());
+    	assertEquals(30, rtr1.getRawText().length());
+    	assertEquals(31, rtr1.getCharacterStyle().getCharactersCovered());
+    	assertEquals(31, tr1.get(0).getParagraphStyle().getCharactersCovered());
 
 
 		// Write the slideshow out to a byte array
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java
deleted file mode 100644
index 8d6324f..0000000
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTextShape.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-
-package org.apache.poi.hslf.model;
-
-import junit.framework.TestCase;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.POIDataSamples;
-
-/**
- * Verify behavior of <code>TextShape</code> and its sub-classes
- *
- * @author Yegor Kozlov
- */
-public final class TestTextShape extends TestCase {
-    private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
-
-    public void testCreateAutoShape(){
-        TextShape shape = new AutoShape(ShapeTypes.Trapezoid);
-        assertNull(shape.getTextRun());
-        assertNull(shape.getText());
-        assertNull(shape.getEscherTextboxWrapper());
-
-        TextRun run = shape.createTextRun();
-        assertNotNull(run);
-        assertNotNull(shape.getTextRun());
-        assertNotNull(shape.getEscherTextboxWrapper());
-        assertEquals("", shape.getText());
-        assertSame(run, shape.createTextRun());
-        assertEquals(-1, run.getIndex());
-    }
-
-    public void testCreateTextBox(){
-        TextShape shape = new TextBox();
-        TextRun run = shape.getTextRun();
-        assertNotNull(run);
-        assertNotNull(shape.getText());
-        assertNotNull(shape.getEscherTextboxWrapper());
-
-        assertSame(run, shape.createTextRun());
-        assertNotNull(shape.getTextRun());
-        assertNotNull(shape.getEscherTextboxWrapper());
-        assertEquals("", shape.getText());
-
-    }
-
-    /**
-     * Verify we can get text from TextShape in the following cases:
-     *  - placeholders
-     *  - normal TextBox object
-     *  - text in auto-shapes
-     */
-    public void testRead() throws IOException {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("text_shapes.ppt"));
-
-        List<String> lst1 = new ArrayList<String>();
-        Slide slide = ppt.getSlides()[0];
-        Shape[] shape = slide.getShapes();
-        for (int i = 0; i < shape.length; i++) {
-            assertTrue("Expected TextShape but found " + shape[i].getClass().getName(), shape[i] instanceof TextShape);
-            TextShape tx = (TextShape)shape[i];
-            TextRun run = tx.getTextRun();
-            assertNotNull(run);
-            int runType = run.getRunType();
-
-            int type = shape[i].getShapeType();
-            switch (type){
-                case ShapeTypes.TextBox:
-                    assertEquals("Text in a TextBox", run.getText());
-                    break;
-                case ShapeTypes.Rectangle:
-                    if(runType == TextHeaderAtom.OTHER_TYPE)
-                        assertEquals("Rectangle", run.getText());
-                    else if(runType == TextHeaderAtom.TITLE_TYPE)
-                        assertEquals("Title Placeholder", run.getText());
-                    break;
-                case ShapeTypes.Octagon:
-                    assertEquals("Octagon", run.getText());
-                    break;
-                case ShapeTypes.Ellipse:
-                    assertEquals("Ellipse", run.getText());
-                    break;
-                case ShapeTypes.RoundRectangle:
-                    assertEquals("RoundRectangle", run.getText());
-                    break;
-                default:
-                    fail("Unexpected shape: " + shape[i].getShapeName());
-
-            }
-            lst1.add(run.getText());
-        }
-
-        List<String> lst2 = new ArrayList<String>();
-        TextRun[] run = slide.getTextRuns();
-        for (int i = 0; i < run.length; i++) {
-            lst2.add(run[i].getText());
-        }
-
-        assertTrue(lst1.containsAll(lst2));
-    }
-
-    public void testReadWrite() throws IOException {
-        SlideShow ppt = new SlideShow();
-        Slide slide =  ppt.createSlide();
-
-        TextShape shape1 = new TextBox();
-        TextRun run1 = shape1.createTextRun();
-        run1.setText("Hello, World!");
-        slide.addShape(shape1);
-
-        shape1.moveTo(100, 100);
-
-        TextShape shape2 = new AutoShape(ShapeTypes.Arrow);
-        TextRun run2 = shape2.createTextRun();
-        run2.setText("Testing TextShape");
-        slide.addShape(shape2);
-        shape2.moveTo(300, 300);
-
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        ppt.write(out);
-        out.close();
-
-        ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
-        slide = ppt.getSlides()[0];
-        Shape[] shape = slide.getShapes();
-
-        assertTrue(shape[0] instanceof TextShape);
-        shape1 = (TextShape)shape[0];
-        assertEquals(ShapeTypes.TextBox, shape1.getShapeType());
-        assertEquals("Hello, World!", shape1.getTextRun().getText());
-
-        assertTrue(shape[1] instanceof TextShape);
-        shape1 = (TextShape)shape[1];
-        assertEquals(ShapeTypes.Arrow, shape1.getShapeType());
-        assertEquals("Testing TextShape", shape1.getTextRun().getText());
-    }
-
-    public void testMargins() throws IOException {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("text-margins.ppt"));
-
-        Slide slide = ppt.getSlides()[0];
-
-        Map<String, TextShape> map = new HashMap<String, TextShape>();
-        Shape[] shape = slide.getShapes();
-        for (int i = 0; i < shape.length; i++) {
-            if(shape[i] instanceof TextShape){
-                TextShape tx = (TextShape)shape[i];
-                map.put(tx.getText(), tx);
-            }
-        }
-
-        TextShape tx;
-
-        tx = map.get("TEST1");
-        assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.39, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-
-        tx = map.get("TEST2");
-        assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.39, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-
-        tx = map.get("TEST3");
-        assertEquals(0.39, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.1, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-
-        tx = map.get("TEST4");
-        assertEquals(0.1, tx.getMarginLeft()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.39, tx.getMarginRight()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.05, tx.getMarginTop()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-        assertEquals(0.05, tx.getMarginBottom()*Shape.EMU_PER_POINT/Shape.EMU_PER_INCH, 0.01);
-    }
-
-    public void test52599() throws IOException {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("52599.ppt"));
-
-        Slide slide = ppt.getSlides()[0];
-        Shape[] sh = slide.getShapes();
-        assertEquals(3, sh.length);
-
-        TextShape sh0 = (TextShape)sh[0];
-        assertEquals(null, sh0.getText());
-        assertEquals(null, sh0.getTextRun());
-
-        TextShape sh1 = (TextShape)sh[1];
-        assertEquals(null, sh1.getText());
-        assertEquals(null, sh1.getTextRun());
-
-        TextShape sh2 = (TextShape)sh[2];
-        assertEquals("this box should be shown just once", sh2.getText());
-        assertEquals(-1, sh2.getTextRun().getIndex());
-    }
-}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java
deleted file mode 100644
index 7db3ca6..0000000
--- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TextPainterTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.hslf.model;
-
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextCharsAtom;
-import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.hslf.usermodel.SlideShow;
-import org.apache.poi.hssf.usermodel.DummyGraphics2d;
-import org.junit.Test;
-
-
-public class TextPainterTest {
-    @Test
-    public void testTextPainter() {
-        TextShape shape = new Polygon();
-        TextPainter painter = new TextPainter(shape);
-        painter.getAttributedString(new TextRun(null, new TextCharsAtom(), null));
-        painter.paint(new DummyGraphics2d());
-        painter.getTextElements((float)1.0, null);
-    }
-
-    @Test
-    public void testTextPainterWithText() {
-        TextShape shape = new Polygon();
-        TextPainter painter = new TextPainter(shape);
-        TextCharsAtom tca = new TextCharsAtom();
-        tca.setText("some text to read");
-        TextRun txrun = new TextRun(new TextHeaderAtom(), tca, new StyleTextPropAtom(10));
-        Slide sheet = new Slide(1, 1, 1);
-        sheet.setSlideShow(new SlideShow());
-        txrun.setSheet(sheet);
-
-        painter.getAttributedString(txrun, new DummyGraphics2d());
-        painter.paint(new DummyGraphics2d());
-        painter.getTextElements((float)1.0, null);
-    }
-}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java
index 05478e3..f7ee1f9 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestCurrentUserAtom.java
@@ -24,8 +24,8 @@
 import java.io.InputStream;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.poifs.filesystem.DocumentEntry;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.junit.Test;
@@ -72,7 +72,7 @@
 		new CurrentUserAtom(fs);
 		assertTrue(true); // not yet failed
 		
-		new HSLFSlideShow(fs);
+		new HSLFSlideShowImpl(fs);
 	}
 
 	@Test
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java
index 114a41d..8018ba3 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocument.java
@@ -19,7 +19,7 @@
 
 import junit.framework.TestCase;
 
-import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.poifs.filesystem.*;
 import org.apache.poi.POIDataSamples;
 
@@ -30,14 +30,14 @@
  */
 public final class TestDocument extends TestCase {
 	// HSLFSlideShow primed on the test data
-	private HSLFSlideShow ss;
+	private HSLFSlideShowImpl ss;
 	// POIFS primed on the test data
 	private POIFSFileSystem pfs;
 
 	public TestDocument() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 		pfs = new POIFSFileSystem(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss = new HSLFSlideShow(pfs);
+		ss = new HSLFSlideShowImpl(pfs);
 	}
 
 	private Document getDocRecord() {
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java
index d9e3717..7176c50 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestDocumentEncryption.java
@@ -33,11 +33,8 @@
 import org.apache.poi.hpsf.PropertySet;

 import org.apache.poi.hpsf.PropertySetFactory;

 import org.apache.poi.hpsf.SummaryInformation;

-import org.apache.poi.hslf.HSLFSlideShow;

 import org.apache.poi.hslf.exceptions.EncryptedPowerPointFileException;

-import org.apache.poi.hslf.model.Slide;

-import org.apache.poi.hslf.usermodel.PictureData;

-import org.apache.poi.hslf.usermodel.SlideShow;

+import org.apache.poi.hslf.usermodel.*;

 import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;

 import org.apache.poi.poifs.crypt.CryptoFunctions;

 import org.apache.poi.poifs.crypt.EncryptionInfo;

@@ -71,8 +68,8 @@
         for (String pptFile : encPpts) {

             try {

                 NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);

-                HSLFSlideShow hss = new HSLFSlideShow(fs);

-                new SlideShow(hss);

+                HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs);

+                new HSLFSlideShow(hss);

                 fs.close();

             } catch (EncryptedPowerPointFileException e) {

                 fail(pptFile+" can't be decrypted");

@@ -85,9 +82,9 @@
         String pptFile = "cryptoapi-proc2356.ppt";

         Biff8EncryptionKey.setCurrentUserPassword("crypto");

         NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);

-        HSLFSlideShow hss = new HSLFSlideShow(fs);

+        HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs);

         // need to cache data (i.e. read all data) before changing the key size

-        PictureData picsExpected[] = hss.getPictures();

+        HSLFPictureData picsExpected[] = hss.getPictures();

         hss.getDocumentSummaryInformation();

         EncryptionInfo ei = hss.getDocumentEncryptionAtom().getEncryptionInfo();

         ((CryptoAPIEncryptionHeader)ei.getHeader()).setKeySize(0x78);

@@ -97,8 +94,8 @@
         fs.close();

         

         fs = new NPOIFSFileSystem(new ByteArrayInputStream(bos.toByteArray()));

-        hss = new HSLFSlideShow(fs);

-        PictureData picsActual[] = hss.getPictures();

+        hss = new HSLFSlideShowImpl(fs);

+        HSLFPictureData picsActual[] = hss.getPictures();

         fs.close();

         

         assertEquals(picsExpected.length, picsActual.length);

@@ -112,7 +109,7 @@
         /* documents with multiple edits need to be normalized for encryption */

         String pptFile = "57272_corrupted_usereditatom.ppt";

         NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile(pptFile), true);

-        HSLFSlideShow hss = new HSLFSlideShow(fs);

+        HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs);

         hss.normalizeRecords();

         

         // normalized ppt

@@ -128,7 +125,7 @@
         // decrypted

         ByteArrayInputStream bis = new ByteArrayInputStream(encrypted.toByteArray());

         fs = new NPOIFSFileSystem(bis);

-        hss = new HSLFSlideShow(fs);

+        hss = new HSLFSlideShowImpl(fs);

         Biff8EncryptionKey.setCurrentUserPassword(null);

         ByteArrayOutputStream actual = new ByteArrayOutputStream();

         hss.write(actual);

@@ -143,11 +140,12 @@
         // http://blogs.msdn.com/b/openspecification/archive/2009/05/08/dominic-salemno.aspx

         Biff8EncryptionKey.setCurrentUserPassword("crypto");

         NPOIFSFileSystem fs = new NPOIFSFileSystem(slTests.getFile("cryptoapi-proc2356.ppt"));

-        HSLFSlideShow hss = new HSLFSlideShow(fs);

-        SlideShow ss = new SlideShow(hss);

+        HSLFSlideShowImpl hss = new HSLFSlideShowImpl(fs);

+        HSLFSlideShow ss = new HSLFSlideShow(hss);

         

-        Slide slide = ss.getSlides()[0];

-        assertEquals("Dominic Salemno", slide.getTextRuns()[0].getText());

+        HSLFSlide slide = ss.getSlides().get(0);

+        String rawText = HSLFTextParagraph.getRawText(slide.getTextParagraphs().get(0));

+        assertEquals("Dominic Salemno", rawText);

 

         String picCmp[][] = {

             {"0","nKsDTKqxTCR8LFkVVWlP9GSTvZ0="},

@@ -160,9 +158,9 @@
         };

         

         MessageDigest md = CryptoFunctions.getMessageDigest(HashAlgorithm.sha1);

-        PictureData pd[] = hss.getPictures();

+        HSLFPictureData pd[] = hss.getPictures();

         int i = 0;

-        for (PictureData p : pd) {

+        for (HSLFPictureData p : pd) {

             byte hash[] = md.digest(p.getData());

             assertEquals(Integer.parseInt(picCmp[i][0]), p.getOffset());

             assertEquals(picCmp[i][1], Base64.encodeBase64String(hash));

diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java
index fff9d72..de5ee42 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExHyperlink.java
@@ -25,8 +25,8 @@
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.POIDataSamples;
 
 /**
@@ -99,8 +99,8 @@
 
 	public void testRealFile() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("WithLinks.ppt"));
-		SlideShow ss = new SlideShow(hss);
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("WithLinks.ppt"));
+		HSLFSlideShow ss = new HSLFSlideShow(hss);
 
 		// Get the document
 		Document doc = ss.getDocumentRecord();
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java
index d3739ec..bf596fa 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestExObjList.java
@@ -20,8 +20,8 @@
 
 import junit.framework.TestCase;
 
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.POIDataSamples;
 
 /**
@@ -32,8 +32,8 @@
 public class TestExObjList extends TestCase {
 	public void testRealFile() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("WithLinks.ppt"));
-		SlideShow ss = new SlideShow(hss);
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("WithLinks.ppt"));
+		HSLFSlideShow ss = new HSLFSlideShow(hss);
 
 		// Get the document
 		Document doc = ss.getDocumentRecord();
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java
index 8481cbc..67bbd03 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestRecordContainer.java
@@ -20,7 +20,7 @@
 
 import junit.framework.TestCase;
 
-import org.apache.poi.hslf.HSLFSlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
 import org.apache.poi.POIDataSamples;
 
 /**
@@ -149,7 +149,7 @@
 
 		// Find a real RecordContainer record
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
 
 		Record[] r = hss.getRecords();
 		for(int i=0; i<r.length; i++) {
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java
index 26e608b..447a764 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSlideAtom.java
@@ -24,7 +24,7 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.hslf.record.SlideAtom.SSlideLayoutAtom;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
 
 /**
  * Tests that SlideAtom works properly
@@ -77,16 +77,16 @@
 	}
 	
 	public void testSSSlideInfoAtom() throws Exception {
-		SlideShow ss = new SlideShow();
-		org.apache.poi.hslf.model.Slide	slide1 = ss.createSlide(), slide2 = ss.createSlide();
+		HSLFSlideShow ss = new HSLFSlideShow();
+		org.apache.poi.hslf.usermodel.HSLFSlide	slide1 = ss.createSlide(), slide2 = ss.createSlide();
 		slide2.setHidden(true);
 
 		ByteArrayOutputStream bos = new ByteArrayOutputStream(4096);
 		ss.write(bos);
 		ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
-		ss = new SlideShow(bis);
-		slide1 = ss.getSlides()[0];
-		slide2 = ss.getSlides()[1];
+		ss = new HSLFSlideShow(bis);
+		slide1 = ss.getSlides().get(0);
+		slide2 = ss.getSlides().get(1);
 		assertFalse(slide1.getHidden());
 		assertTrue(slide2.getHidden());
 	}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSound.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSound.java
index 630b355..e31ae98 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSound.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestSound.java
@@ -22,7 +22,7 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
 
 /**
  * Tests Sound-related records: SoundCollection(2020), Sound(2022) and
@@ -34,7 +34,7 @@
 	public void testRealFile() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 
-		SlideShow ppt = new SlideShow(slTests.openResourceAsStream("sound.ppt"));
+		HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("sound.ppt"));
 
 		// Get the document
 		Document doc = ppt.getDocumentRecord();
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java
index 665c86e..e868aa6 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestStyleTextPropAtom.java
@@ -17,25 +17,22 @@
 
 package org.apache.poi.hslf.record;
 
-import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.*;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.util.LinkedList;
+import java.util.List;
 
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp;
-import org.apache.poi.hslf.model.textproperties.TextProp;
-import org.apache.poi.hslf.model.textproperties.TextPropCollection;
+import org.apache.poi.hslf.model.textproperties.*;
 import org.apache.poi.util.HexDump;
+import org.junit.Test;
 
 /**
  * Tests that StyleTextPropAtom works properly
  *
  * @author Nick Burch (nick at torchbox dot com)
  */
-public final class TestStyleTextPropAtom extends TestCase {
+public final class TestStyleTextPropAtom {
     /** From a real file: a paragraph with 4 different styles */
     private static final byte[] data_a = new byte[] {
       0, 0, 0xA1-256, 0x0F, 0x2A, 0, 0, 0,
@@ -140,6 +137,7 @@
     };
     private static final int data_d_text_len = 0xA0-1;
 
+    @Test
     public void testRecordType() {
         StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
@@ -150,6 +148,7 @@
     }
 
 
+    @Test
     public void testCharacterStyleCounts() {
         StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
@@ -164,6 +163,7 @@
         assertEquals(5, stpb.getCharacterStyles().size());
     }
 
+    @Test
     public void testParagraphStyleCounts() {
         StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
@@ -179,6 +179,7 @@
     }
 
 
+    @Test
     public void testCharacterStyleLengths() {
         StyleTextPropAtom stpa = new StyleTextPropAtom(data_a,0,data_a.length);
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
@@ -188,7 +189,7 @@
         stpb.setParentTextSize(data_b_text_len);
 
         // 54 chars, 21 + 17 + 16
-        LinkedList<TextPropCollection> a_ch_l = stpa.getCharacterStyles();
+        List<TextPropCollection> a_ch_l = stpa.getCharacterStyles();
         TextPropCollection a_ch_1 = a_ch_l.get(0);
         TextPropCollection a_ch_2 = a_ch_l.get(1);
         TextPropCollection a_ch_3 = a_ch_l.get(2);
@@ -197,7 +198,7 @@
         assertEquals(16, a_ch_3.getCharactersCovered());
 
         // 179 chars, 30 + 28 + 25
-        LinkedList<TextPropCollection> b_ch_l = stpb.getCharacterStyles();
+        List<TextPropCollection> b_ch_l = stpb.getCharacterStyles();
         TextPropCollection b_ch_1 = b_ch_l.get(0);
         TextPropCollection b_ch_2 = b_ch_l.get(1);
         TextPropCollection b_ch_3 = b_ch_l.get(2);
@@ -209,11 +210,12 @@
     }
 
 
+    @Test
     public void testCharacterPropOrdering() {
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
         stpb.setParentTextSize(data_b_text_len);
 
-        LinkedList<TextPropCollection> b_ch_l = stpb.getCharacterStyles();
+        List<TextPropCollection> b_ch_l = stpb.getCharacterStyles();
         TextPropCollection b_ch_1 = b_ch_l.get(0);
         TextPropCollection b_ch_2 = b_ch_l.get(1);
         TextPropCollection b_ch_3 = b_ch_l.get(2);
@@ -256,11 +258,12 @@
         assertEquals(24, tp_4_3.getValue());
     }
 
+    @Test
     public void testParagraphProps() {
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
         stpb.setParentTextSize(data_b_text_len);
 
-        LinkedList<TextPropCollection> b_p_l = stpb.getParagraphStyles();
+        List<TextPropCollection> b_p_l = stpb.getParagraphStyles();
         TextPropCollection b_p_1 = b_p_l.get(0);
         TextPropCollection b_p_2 = b_p_l.get(1);
         TextPropCollection b_p_3 = b_p_l.get(2);
@@ -300,11 +303,12 @@
         assertEquals(80, tp_4_2.getValue());
     }
 
+    @Test
     public void testCharacterProps() {
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
         stpb.setParentTextSize(data_b_text_len);
 
-        LinkedList<TextPropCollection> b_ch_l = stpb.getCharacterStyles();
+        List<TextPropCollection> b_ch_l = stpb.getCharacterStyles();
         TextPropCollection b_ch_1 = b_ch_l.get(0);
         TextPropCollection b_ch_2 = b_ch_l.get(1);
         TextPropCollection b_ch_3 = b_ch_l.get(2);
@@ -371,17 +375,19 @@
         assertEquals(0x0003, cf_4_1.getValue());
     }
 
+    @SuppressWarnings("unused")
+    @Test
     public void testFindAddTextProp() {
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
         stpb.setParentTextSize(data_b_text_len);
 
-        LinkedList<TextPropCollection> b_p_l = stpb.getParagraphStyles();
+        List<TextPropCollection> b_p_l = stpb.getParagraphStyles();
         TextPropCollection b_p_1 = b_p_l.get(0);
         TextPropCollection b_p_2 = b_p_l.get(1);
         TextPropCollection b_p_3 = b_p_l.get(2);
         TextPropCollection b_p_4 = b_p_l.get(3);
 
-        LinkedList<TextPropCollection> b_ch_l = stpb.getCharacterStyles();
+        List<TextPropCollection> b_ch_l = stpb.getCharacterStyles();
         TextPropCollection b_ch_1 = b_ch_l.get(0);
         TextPropCollection b_ch_2 = b_ch_l.get(1);
         TextPropCollection b_ch_3 = b_ch_l.get(2);
@@ -425,13 +431,14 @@
      * Try to recreate an existing StyleTextPropAtom (a) from the empty
      *  constructor, and setting the required properties
      */
+    @Test
     public void testCreateAFromScatch() throws Exception {
         // Start with an empty one
         StyleTextPropAtom stpa = new StyleTextPropAtom(54);
 
         // Don't need to touch the paragraph styles
         // Add two more character styles
-        LinkedList<TextPropCollection> cs = stpa.getCharacterStyles();
+        List<TextPropCollection> cs = stpa.getCharacterStyles();
 
         // First char style is boring, and 21 long
         TextPropCollection tpca = cs.get(0);
@@ -462,13 +469,14 @@
      * Try to recreate an existing StyleTextPropAtom (b) from the empty
      *  constructor, and setting the required properties
      */
+    @Test
     public void testCreateBFromScatch() throws Exception {
         // Start with an empty one
         StyleTextPropAtom stpa = new StyleTextPropAtom(data_b_text_len);
 
 
         // Need 4 paragraph styles
-        LinkedList<TextPropCollection> ps = stpa.getParagraphStyles();
+        List<TextPropCollection> ps = stpa.getParagraphStyles();
 
         // First is 30 long, left aligned, normal spacing
         TextPropCollection tppa = ps.get(0);
@@ -503,7 +511,7 @@
 
 
         // Now do 4 character styles
-        LinkedList<TextPropCollection> cs = stpa.getCharacterStyles();
+        List<TextPropCollection> cs = stpa.getCharacterStyles();
 
         // First is 30 long, bold and font size
         TextPropCollection tpca = cs.get(0);
@@ -568,16 +576,16 @@
         // Compare in detail to b
         StyleTextPropAtom stpb = new StyleTextPropAtom(data_b,0,data_b.length);
         stpb.setParentTextSize(data_b_text_len);
-        LinkedList<TextPropCollection> psb = stpb.getParagraphStyles();
-        LinkedList<TextPropCollection> csb = stpb.getCharacterStyles();
+        List<TextPropCollection> psb = stpb.getParagraphStyles();
+        List<TextPropCollection> csb = stpb.getCharacterStyles();
 
         assertEquals(psb.size(), ps.size());
         assertEquals(csb.size(), cs.size());
 
         // Ensure Paragraph Character styles match
         for(int z=0; z<2; z++) {
-            LinkedList<TextPropCollection> lla = cs;
-            LinkedList<TextPropCollection> llb = csb;
+            List<TextPropCollection> lla = cs;
+            List<TextPropCollection> llb = csb;
             int upto = 5;
             if(z == 1) {
                 lla = ps;
@@ -632,32 +640,46 @@
         }
     }
 
+    @Test
     public void testWriteA() {
         doReadWrite(data_a, -1);
     }
 
+    @Test
     public void testLoadWriteA() {
         doReadWrite(data_b, data_b_text_len);
     }
 
 
+    @Test
     public void testWriteB() {
         doReadWrite(data_b, -1);
     }
 
+    @Test
     public void testLoadWriteB() {
         doReadWrite(data_b, data_b_text_len);
     }
 
+    @Test
     public void testLoadWriteC() {
-        doReadWrite(data_c, data_c_text_len);
+        // BitMaskTextProperties will sanitize the output
+        byte expected[] = data_c.clone();
+        expected[56] = 0;
+        expected[68] = 0;
+        doReadWrite(data_c, expected, data_c_text_len);
     }
 
+    @Test
     public void testLoadWriteD() {
         doReadWrite(data_d, data_d_text_len);
     }
 
     protected void doReadWrite(byte[] data, int textlen) {
+        doReadWrite(data, data, textlen);
+    }
+    
+    protected void doReadWrite(byte[] data, byte[] expected, int textlen) {
         StyleTextPropAtom stpb = new StyleTextPropAtom(data, 0,data.length);
         if(textlen != -1) stpb.setParentTextSize(textlen);
 
@@ -669,15 +691,16 @@
         }
         byte[] bytes = out.toByteArray();
 
-        assertEquals(data.length, bytes.length);
+        assertEquals(expected.length, bytes.length);
         try {
-            assertArrayEquals(data, bytes);
+            assertArrayEquals(expected, bytes);
         } catch (Throwable e){
             //print hex dump if failed
-            assertEquals(HexDump.toHex(data), HexDump.toHex(bytes));
+            assertEquals(HexDump.toHex(expected), HexDump.toHex(bytes));
         }
     }
 
+    @Test
     public void testNotEnoughDataProp() {
         // We don't have enough data in the record to cover
         //  all the properties the mask says we have
@@ -691,16 +714,17 @@
     /**
      * Check the test data for Bug 40143.
      */
-    public void testBug40143() {
+   @Test
+   public void testBug40143() {
         StyleTextPropAtom atom = new StyleTextPropAtom(data_d, 0, data_d.length);
         atom.setParentTextSize(data_d_text_len);
 
-        TextPropCollection prprops = atom.getParagraphStyles().getFirst();
+        TextPropCollection prprops = atom.getParagraphStyles().get(0);
         assertEquals(data_d_text_len+1, prprops.getCharactersCovered());
         assertEquals(1, prprops.getTextPropList().size()); //1 property found
         assertEquals(1, prprops.findByName("alignment").getValue());
 
-        TextPropCollection chprops = atom.getCharacterStyles().getFirst();
+        TextPropCollection chprops = atom.getCharacterStyles().get(0);
         assertEquals(data_d_text_len+1, chprops.getCharactersCovered());
         assertEquals(5, chprops.getTextPropList().size()); //5 properties found
         assertEquals(1, chprops.findByName("char_flags").getValue());
@@ -713,13 +737,15 @@
     /**
      * Check the test data for Bug 42677.
      */
+     @Test
      public void test42677() {
         int length = 18;
-        byte[] data = {0x00, 0x00, (byte)0xA1, 0x0F, 0x28, 0x00, 0x00, 0x00,
-                       0x13, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xF1 , 0x20 , 0x00, 0x00 , 0x00 , 0x00 ,
-                       0x22 , 0x20 , 0x00 , 0x00 , 0x64 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xFF ,
-                       0x00 , 0x00 , 0x13 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x63 , 0x00 ,
-                       0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x0F , 0x00
+        byte[] data = {
+            0x00, 0x00, (byte)0xA1, 0x0F, 0x28, 0x00, 0x00, 0x00,
+            0x13, 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xF1 , 0x20 , 0x00, 0x00 , 0x00 , 0x00 ,
+            0x22 , 0x20 , 0x00 , 0x00 , 0x64 , 0x00 , 0x00 , 0x00 , 0x00 , (byte)0xFF ,
+            0x00 , 0x00 , 0x13 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x63 , 0x00 ,
+            0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x0F , 0x00
         };
         doReadWrite(data, length);
 
@@ -737,6 +763,7 @@
      *   00 00 00 01 18 00 00 01 18 01 00 00 00 01 1C 00 00 01 1C
      * </StyleTextPropAtom>
      */
+     @Test
     public void test45815() {
         int length = 19;
         byte[] data = {
@@ -752,7 +779,13 @@
                 0x01, 0x18, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x00,
                 0x01, 0x1C
         };
-        doReadWrite(data, length);
+
+        // changed original data: ... 0x41 and 0x06 don't match
+        // the bitmask text properties will sanitize the bytes and thus the bytes differ
+        byte[] exptected = data.clone();
+        exptected[18] = 0;
+        
+        doReadWrite(data, exptected, length);
     }
 
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTextSpecInfoAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTextSpecInfoAtom.java
index 6a40736..593f116 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTextSpecInfoAtom.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTextSpecInfoAtom.java
@@ -42,14 +42,14 @@
 
     public void testRead() {
         TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length);
-        TextSpecInfoAtom.TextSpecInfoRun[] run = spec.getTextSpecInfoRuns();
+        TextSpecInfoRun[] run = spec.getTextSpecInfoRuns();
         assertEquals(5, run.length);
 
-        assertEquals(10, run[0].length());
-        assertEquals(1, run[1].length());
-        assertEquals(70, run[2].length());
-        assertEquals(9, run[3].length());
-        assertEquals(32, run[4].length());
+        assertEquals(10, run[0].getLength());
+        assertEquals(1, run[1].getLength());
+        assertEquals(70, run[2].getLength());
+        assertEquals(9, run[3].getLength());
+        assertEquals(32, run[4].getLength());
 
     }
 
@@ -66,10 +66,10 @@
         TextSpecInfoAtom spec = new TextSpecInfoAtom(data_1, 0, data_1.length);
         spec.reset(32);  //length of the parent text
 
-        TextSpecInfoAtom.TextSpecInfoRun[] run = spec.getTextSpecInfoRuns();
+        TextSpecInfoRun[] run = spec.getTextSpecInfoRuns();
         assertEquals(1, run.length);
 
-        assertEquals(32, run[0].length());
+        assertEquals(32, run[0].getLength());
 
         //serialize and read again
         ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -77,9 +77,9 @@
 
         byte[] result = out.toByteArray();
         TextSpecInfoAtom spec2 = new TextSpecInfoAtom(result, 0, result.length);
-        TextSpecInfoAtom.TextSpecInfoRun[] run2 = spec2.getTextSpecInfoRuns();
+        TextSpecInfoRun[] run2 = spec2.getTextSpecInfoRuns();
         assertEquals(1, run2.length);
 
-        assertEquals(32, run2[0].length());
+        assertEquals(32, run2[0].getLength());
     }
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTxMasterStyleAtom.java b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTxMasterStyleAtom.java
index 52bf6b2..cd4b54d 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTxMasterStyleAtom.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/record/TestTxMasterStyleAtom.java
@@ -25,7 +25,7 @@
 
 import org.apache.poi.hslf.model.textproperties.TextProp;
 import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.usermodel.SlideShow;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
 
 
 /**
@@ -36,10 +36,10 @@
  * @author Yegor Kozlov
  */
 public final class TestTxMasterStyleAtom extends TestCase {
-    protected SlideShow _ppt;
+    protected HSLFSlideShow _ppt;
 
     public void setUp() {
-        _ppt = new SlideShow();
+        _ppt = new HSLFSlideShow();
     }
 
     public void testDefaultStyles()  {
@@ -84,13 +84,13 @@
         TextProp prop;
 
         //paragraph styles
-        props = txmaster.getParagraphStyles()[0];
+        props = txmaster.getParagraphStyles().get(0);
 
         prop = props.findByName("alignment");
         assertEquals(1, prop.getValue()); //title has center alignment
 
         //character styles
-        props = txmaster.getCharacterStyles()[0];
+        props = txmaster.getCharacterStyles().get(0);
 
         prop = props.findByName("font.color");
         assertEquals(0x3000000, prop.getValue());
@@ -110,27 +110,27 @@
         TextPropCollection props;
         TextProp prop;
 
-        TextPropCollection[] prstyles = txmaster.getParagraphStyles();
-        TextPropCollection[] chstyles = txmaster.getCharacterStyles();
+        List<TextPropCollection> prstyles = txmaster.getParagraphStyles();
+        List<TextPropCollection> chstyles = txmaster.getCharacterStyles();
         assertEquals("TxMasterStyleAtom for TextHeaderAtom.BODY_TYPE " +
-                "must contain styles for 5 indentation levels", 5, prstyles.length);
+                "must contain styles for 5 indentation levels", 5, prstyles.size());
         assertEquals("TxMasterStyleAtom for TextHeaderAtom.BODY_TYPE " +
-                "must contain styles for 5 indentation levels", 5, chstyles.length);
+                "must contain styles for 5 indentation levels", 5, chstyles.size());
 
         //paragraph styles
-        props = prstyles[0];
+        props = prstyles.get(0);
 
         prop = props.findByName("alignment");
         assertEquals(0, prop.getValue());
 
 
-        for (int i = 0; i < prstyles.length; i++) {
-            assertNotNull("text.offset is null for indentation level " + i, prstyles[i].findByName("text.offset"));
-            assertNotNull("bullet.offset is null for indentation level " + i, prstyles[i].findByName("bullet.offset"));
+        for (int i = 0; i < prstyles.size(); i++) {
+            assertNotNull("text.offset is null for indentation level " + i, prstyles.get(i).findByName("text.offset"));
+            assertNotNull("bullet.offset is null for indentation level " + i, prstyles.get(i).findByName("bullet.offset"));
         }
 
         //character styles
-        props = chstyles[0];
+        props = chstyles.get(0);
 
         prop = props.findByName("font.color");
         assertEquals(0x1000000, prop.getValue());
@@ -150,13 +150,13 @@
         TextProp prop;
 
         //paragraph styles
-        props = txmaster.getParagraphStyles()[0];
+        props = txmaster.getParagraphStyles().get(0);
 
         prop = props.findByName("alignment");
         assertEquals(0, prop.getValue());
 
         //character styles
-        props = txmaster.getCharacterStyles()[0];
+        props = txmaster.getCharacterStyles().get(0);
 
         prop = props.findByName("font.color");
         assertEquals(0x1000000, prop.getValue());
@@ -176,13 +176,13 @@
         TextProp prop;
 
         //paragraph styles
-        props = txmaster.getParagraphStyles()[0];
+        props = txmaster.getParagraphStyles().get(0);
 
         prop = props.findByName("alignment");
         assertEquals(0, prop.getValue()); //title has center alignment
 
         //character styles
-        props = txmaster.getCharacterStyles()[0];
+        props = txmaster.getCharacterStyles().get(0);
 
         prop = props.findByName("font.color");
         assertEquals(0x1000000, prop.getValue());
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/AllHSLFUserModelTests.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/AllHSLFUserModelTests.java
index bc6b6cd..0354d9b 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/AllHSLFUserModelTests.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/AllHSLFUserModelTests.java
@@ -37,7 +37,10 @@
     TestSheetText.class,
     TestSlideOrdering.class,
     TestSoundData.class,
-    TestFontRendering.class
+    TestFontRendering.class,
+    TestPicture.class,
+    TestTextRun.class,
+    TestTextShape.class
 })
 public class AllHSLFUserModelTests {
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java
index b78ecb2..800df62 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestAddingSlides.java
@@ -20,15 +20,12 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.util.List;
 
 import junit.framework.TestCase;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordTypes;
-import org.apache.poi.hslf.record.UserEditAtom;
-import org.apache.poi.hslf.record.Document;
-import org.apache.poi.hslf.model.*;
+
 import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.record.*;
 
 /**
  * Tests that SlideShow adds additional sheets properly
@@ -37,31 +34,31 @@
  */
 public final class TestAddingSlides extends TestCase {
 	// An empty SlideShow
-	private HSLFSlideShow hss_empty;
-	private SlideShow ss_empty;
+	private HSLFSlideShowImpl hss_empty;
+	private HSLFSlideShow ss_empty;
 
 	// A SlideShow with one slide
-	private HSLFSlideShow hss_one;
-	private SlideShow ss_one;
+	private HSLFSlideShowImpl hss_one;
+	private HSLFSlideShow ss_one;
 
 	// A SlideShow with two slides
-	private HSLFSlideShow hss_two;
-	private SlideShow ss_two;
+	private HSLFSlideShowImpl hss_two;
+	private HSLFSlideShow ss_two;
 
 	/**
 	 * Create/open the slideshows
 	 */
 	public void setUp() throws Exception {
-		hss_empty = HSLFSlideShow.create();
-		ss_empty = new SlideShow(hss_empty);
+		hss_empty = HSLFSlideShowImpl.create();
+		ss_empty = new HSLFSlideShow(hss_empty);
 
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 
-		hss_one = new HSLFSlideShow(slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
-		ss_one = new SlideShow(hss_one);
+		hss_one = new HSLFSlideShowImpl(slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
+		ss_one = new HSLFSlideShow(hss_one);
 
-		hss_two = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss_two = new SlideShow(hss_two);
+		hss_two = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss_two = new HSLFSlideShow(hss_two);
 	}
 
 	/**
@@ -69,7 +66,7 @@
 	 */
 	public void testAddSlideToEmpty() throws Exception {
 		// Doesn't have any slides
-		assertEquals(0, ss_empty.getSlides().length);
+		assertEquals(0, ss_empty.getSlides().size());
 
 		// Should only have a master SLWT
 		assertEquals(1, ss_empty.getDocumentRecord().getSlideListWithTexts().length);
@@ -86,8 +83,8 @@
        assertNotNull(usredit);
 
 		// Add one
-		Slide slide = ss_empty.createSlide();
-		assertEquals(1, ss_empty.getSlides().length);
+		HSLFSlide slide = ss_empty.createSlide();
+		assertEquals(1, ss_empty.getSlides().size());
 		assertEquals(256, slide._getSheetNumber());
 		assertEquals(3, slide._getSheetRefId());
 		assertEquals(1, slide.getSlideNumber());
@@ -98,17 +95,17 @@
 		hss_empty.write(baos);
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-		HSLFSlideShow hss_read = new HSLFSlideShow(bais);
-		SlideShow ss_read = new SlideShow(hss_read);
+		HSLFSlideShowImpl hss_read = new HSLFSlideShowImpl(bais);
+		HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
 
 		// Check it now has a slide
-		assertEquals(1, ss_read.getSlides().length);
+		assertEquals(1, ss_read.getSlides().size());
 
 		// Check it now has two SLWTs
 		assertEquals(2, ss_empty.getDocumentRecord().getSlideListWithTexts().length);
 
 		// And check it's as expected
-		slide = ss_read.getSlides()[0];
+		slide = ss_read.getSlides().get(0);
 		assertEquals(256, slide._getSheetNumber());
 		assertEquals(3, slide._getSheetRefId());
 		assertEquals(1, slide.getSlideNumber());
@@ -119,8 +116,8 @@
 	 */
 	public void testAddSlideToExisting() throws Exception {
 		// Has one slide
-		assertEquals(1, ss_one.getSlides().length);
-		Slide s1 = ss_one.getSlides()[0];
+		assertEquals(1, ss_one.getSlides().size());
+		HSLFSlide s1 = ss_one.getSlides().get(0);
 
 		// Should have two SLTWs
 		assertEquals(2, ss_one.getDocumentRecord().getSlideListWithTexts().length);
@@ -131,8 +128,8 @@
 		assertEquals(1, s1.getSlideNumber());
 
 		// Add a second one
-		Slide s2 = ss_one.createSlide();
-		assertEquals(2, ss_one.getSlides().length);
+		HSLFSlide s2 = ss_one.createSlide();
+		assertEquals(2, ss_one.getSlides().size());
 		assertEquals(257, s2._getSheetNumber());
 		assertEquals(4, s2._getSheetRefId());
 		assertEquals(2, s2.getSlideNumber());
@@ -142,18 +139,18 @@
 		hss_one.write(baos);
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-		HSLFSlideShow hss_read = new HSLFSlideShow(bais);
-		SlideShow ss_read = new SlideShow(hss_read);
+		HSLFSlideShowImpl hss_read = new HSLFSlideShowImpl(bais);
+		HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
 
 		// Check it now has two slides
-		assertEquals(2, ss_read.getSlides().length);
+		assertEquals(2, ss_read.getSlides().size());
 
 		// Should still have two SLTWs
 		assertEquals(2, ss_read.getDocumentRecord().getSlideListWithTexts().length);
 
 		// And check it's as expected
-		s1 = ss_read.getSlides()[0];
-		s2 = ss_read.getSlides()[1];
+		s1 = ss_read.getSlides().get(0);
+		s2 = ss_read.getSlides().get(1);
 		assertEquals(256, s1._getSheetNumber());
 		assertEquals(3, s1._getSheetRefId());
 		assertEquals(1, s1.getSlideNumber());
@@ -166,7 +163,8 @@
 	 * Test adding a slide to an existing slideshow,
 	 *  with two slides already
 	 */
-	public void testAddSlideToExisting2() throws Exception {
+	@SuppressWarnings("unused")
+    public void testAddSlideToExisting2() throws Exception {
         //grab UserEditAtom
         UserEditAtom usredit = null;
         Record[] _records = hss_two.getRecords();
@@ -179,9 +177,9 @@
        assertNotNull(usredit);
 
 		// Has two slides
-		assertEquals(2, ss_two.getSlides().length);
-		Slide s1 = ss_two.getSlides()[0];
-		Slide s2 = ss_two.getSlides()[1];
+		assertEquals(2, ss_two.getSlides().size());
+		HSLFSlide s1 = ss_two.getSlides().get(0);
+		HSLFSlide s2 = ss_two.getSlides().get(1);
 
 		// Check slide 1 is as expected
 		assertEquals(256, s1._getSheetNumber());
@@ -193,8 +191,8 @@
 		assertEquals(2, s2.getSlideNumber());
 
 		// Add a third one
-		Slide s3 = ss_two.createSlide();
-		assertEquals(3, ss_two.getSlides().length);
+		HSLFSlide s3 = ss_two.createSlide();
+		assertEquals(3, ss_two.getSlides().size());
 		assertEquals(258, s3._getSheetNumber());
 		assertEquals(8, s3._getSheetRefId()); // lots of notes before us
 		assertEquals(3, s3.getSlideNumber());
@@ -205,16 +203,16 @@
 		hss_two.write(baos);
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-		HSLFSlideShow hss_read = new HSLFSlideShow(bais);
-		SlideShow ss_read = new SlideShow(hss_read);
+		HSLFSlideShowImpl hss_read = new HSLFSlideShowImpl(bais);
+		HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
 
 		// Check it now has three slides
-		assertEquals(3, ss_read.getSlides().length);
+		assertEquals(3, ss_read.getSlides().size());
 
 		// And check it's as expected
-		s1 = ss_read.getSlides()[0];
-		s2 = ss_read.getSlides()[1];
-		s3 = ss_read.getSlides()[2];
+		s1 = ss_read.getSlides().get(0);
+		s2 = ss_read.getSlides().get(1);
+		s3 = ss_read.getSlides().get(2);
 		assertEquals(256, s1._getSheetNumber());
 		assertEquals(4, s1._getSheetRefId());
 		assertEquals(1, s1.getSlideNumber());
@@ -230,12 +228,12 @@
      * Test SlideShow#removeSlide
      */
     public void testRemoving() throws Exception {
-        SlideShow ppt = new SlideShow();
-        Slide slide1 = ppt.createSlide();
-        Slide slide2 = ppt.createSlide();
+        HSLFSlideShow ppt = new HSLFSlideShow();
+        HSLFSlide slide1 = ppt.createSlide();
+        HSLFSlide slide2 = ppt.createSlide();
 
-        Slide[] s1 = ppt.getSlides();
-        assertEquals(2, s1.length);
+        List<HSLFSlide> s1 = ppt.getSlides();
+        assertEquals(2, s1.size());
         try {
             ppt.removeSlide(-1);
             fail("expected exception");
@@ -252,42 +250,42 @@
 
         assertEquals(1, slide1.getSlideNumber());
 
-        Slide removedSlide = ppt.removeSlide(0);
-        Slide[] s2 = ppt.getSlides();
-        assertEquals(1, s2.length);
+        HSLFSlide removedSlide = ppt.removeSlide(0);
+        List<HSLFSlide> s2 = ppt.getSlides();
+        assertEquals(1, s2.size());
         assertSame(slide1, removedSlide);
-        assertSame(slide2, s2[0]);
+        assertSame(slide2, s2.get(0));
 
         assertEquals(0, slide2.getSlideNumber());
 
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         ppt.write(out);
 
-        ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
+        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
 
-        Slide[] s3 = ppt.getSlides();
-        assertEquals(1, s3.length);
+        List<HSLFSlide> s3 = ppt.getSlides();
+        assertEquals(1, s3.size());
     }
 
 
     public void test47261() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-        SlideShow ppt = new SlideShow(slTests.openResourceAsStream("47261.ppt"));
-        Slide[] slides = ppt.getSlides();
+        HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("47261.ppt"));
+        List<HSLFSlide> slides = ppt.getSlides();
         Document doc = ppt.getDocumentRecord();
         assertNotNull(doc.getSlideSlideListWithText());
-        assertEquals(14, ppt.getSlides().length);
-        int notesId = slides[0].getSlideRecord().getSlideAtom().getNotesID();
+        assertEquals(14, ppt.getSlides().size());
+        int notesId = slides.get(0).getSlideRecord().getSlideAtom().getNotesID();
         assertTrue(notesId > 0);
         assertNotNull(doc.getNotesSlideListWithText());
         assertEquals(14, doc.getNotesSlideListWithText().getSlideAtomsSets().length);
 
         //remove all slides, corresponding notes should be removed too
-        for (int i = 0; i < slides.length; i++) {
+        for (int i = slides.size(); i > 0; i--) {
             ppt.removeSlide(0);
         }
-        assertEquals(0, ppt.getSlides().length);
-        assertEquals(0, ppt.getNotes().length);
+        assertEquals(0, ppt.getSlides().size());
+        assertEquals(0, ppt.getNotes().size());
         assertNull(doc.getSlideSlideListWithText());
         assertNull(doc.getNotesSlideListWithText());
 
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
index 67d250a..b7dba80 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestBugs.java
@@ -17,15 +17,11 @@
 
 package org.apache.poi.hslf.usermodel;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.awt.Color;
+import java.awt.Rectangle;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -41,32 +37,17 @@
 import org.apache.poi.ddf.EscherColorRef;
 import org.apache.poi.ddf.EscherOptRecord;
 import org.apache.poi.ddf.EscherProperties;
-import org.apache.poi.hslf.HSLFSlideShow;
 import org.apache.poi.hslf.HSLFTestDataSamples;
 import org.apache.poi.hslf.exceptions.OldPowerPointFormatException;
-import org.apache.poi.hslf.model.AutoShape;
-import org.apache.poi.hslf.model.Background;
-import org.apache.poi.hslf.model.Fill;
-import org.apache.poi.hslf.model.HeadersFooters;
-import org.apache.poi.hslf.model.MasterSheet;
-import org.apache.poi.hslf.model.Notes;
-import org.apache.poi.hslf.model.Picture;
-import org.apache.poi.hslf.model.Shape;
-import org.apache.poi.hslf.model.ShapeGroup;
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.SlideMaster;
-import org.apache.poi.hslf.model.TextBox;
-import org.apache.poi.hslf.model.TextRun;
-import org.apache.poi.hslf.model.TextShape;
-import org.apache.poi.hslf.model.TitleMaster;
-import org.apache.poi.hslf.record.Document;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.SlideListWithText;
+import org.apache.poi.hslf.model.*;
+import org.apache.poi.hslf.model.textproperties.TextPropCollection;
+import org.apache.poi.hslf.model.textproperties.TextPropCollection.TextPropType;
+import org.apache.poi.hslf.record.*;
 import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
-import org.apache.poi.hslf.record.TextHeaderAtom;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.StringUtil;
-import org.apache.poi.util.Units;
+import org.apache.poi.poifs.filesystem.DocumentEntry;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
+import org.apache.poi.util.*;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -83,17 +64,17 @@
      */
     @Test
     public void bug41384() throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("41384.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("41384.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
         assertTrue("No Exceptions while reading file", true);
 
-        assertEquals(1, ppt.getSlides().length);
+        assertEquals(1, ppt.getSlides().size());
 
-        PictureData[] pict = ppt.getPictureData();
+        HSLFPictureData[] pict = ppt.getPictureData();
         assertEquals(2, pict.length);
-        assertEquals(Picture.JPEG, pict[0].getType());
-        assertEquals(Picture.JPEG, pict[1].getType());
+        assertEquals(HSLFPictureShape.JPEG, pict[0].getType());
+        assertEquals(HSLFPictureShape.JPEG, pict[1].getType());
     }
 
     /**
@@ -102,27 +83,27 @@
      */
     @Test
     public void bug42474_1() throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42474-1.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42474-1.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
         assertTrue("No Exceptions while reading file", true);
-        assertEquals(2, ppt.getSlides().length);
+        assertEquals(2, ppt.getSlides().size());
 
-        TextRun txrun;
-        Notes notes;
+        List<HSLFTextParagraph> txrun;
+        HSLFNotes notes;
 
-        notes = ppt.getSlides()[0].getNotesSheet();
+        notes = ppt.getSlides().get(0).getNotes();
         assertNotNull(notes);
-        txrun = notes.getTextRuns()[0];
-        assertEquals("Notes-1", txrun.getRawText());
-        assertEquals(false, txrun.getRichTextRuns()[0].isBold());
+        txrun = notes.getTextParagraphs().get(0);
+        assertEquals("Notes-1", HSLFTextParagraph.getRawText(txrun));
+        assertEquals(false, txrun.get(0).getTextRuns().get(0).isBold());
 
         //notes for the second slide are in bold
-        notes = ppt.getSlides()[1].getNotesSheet();
+        notes = ppt.getSlides().get(1).getNotes();
         assertNotNull(notes);
-        txrun = notes.getTextRuns()[0];
-        assertEquals("Notes-2", txrun.getRawText());
-        assertEquals(true, txrun.getRichTextRuns()[0].isBold());
+        txrun = notes.getTextParagraphs().get(0);
+        assertEquals("Notes-2", HSLFTextParagraph.getRawText(txrun));
+        assertEquals(true, txrun.get(0).getTextRuns().get(0).isBold());
 
     }
 
@@ -131,9 +112,9 @@
      */
     @Test
     public void bug42474_2() throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42474-2.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42474-2.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
 
         //map slide number and starting phrase of its notes
         Map<Integer, String> notesMap = new HashMap<Integer, String>();
@@ -143,13 +124,12 @@
         notesMap.put(Integer.valueOf(7), "Although multiply and square root are easier");
         notesMap.put(Integer.valueOf(8), "The bus Z is split into Z_H and Z_L");
 
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            Integer slideNumber = Integer.valueOf(slide[i].getSlideNumber());
-            Notes notes = slide[i].getNotesSheet();
+        for (HSLFSlide slide : ppt.getSlides()) {
+            Integer slideNumber = Integer.valueOf(slide.getSlideNumber());
+            HSLFNotes notes = slide.getNotes();
             if (notesMap.containsKey(slideNumber)){
                 assertNotNull(notes);
-                String text = notes.getTextRuns()[0].getRawText();
+                String text = HSLFTextParagraph.getRawText(notes.getTextParagraphs().get(0));
                 String startingPhrase = notesMap.get(slideNumber);
                 assertTrue("Notes for slide " + slideNumber + " must start with " +
                         startingPhrase , text.startsWith(startingPhrase));
@@ -162,18 +142,16 @@
      */
     @Test
     public void bug42485 () throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42485.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42485.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
-        Shape[] shape = ppt.getSlides()[0].getShapes();
-        for (int i = 0; i < shape.length; i++) {
-            if(shape[i] instanceof ShapeGroup){
-                ShapeGroup  group = (ShapeGroup)shape[i];
-                Shape[] sh = group.getShapes();
-                for (int j = 0; j < sh.length; j++) {
-                    if( sh[j] instanceof TextBox){
-                        TextBox txt = (TextBox)sh[j];
-                        assertNotNull(txt.getTextRun());
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
+        for (HSLFShape shape : ppt.getSlides().get(0).getShapes()) {
+            if(shape instanceof HSLFGroupShape){
+                HSLFGroupShape group = (HSLFGroupShape)shape;
+                for (HSLFShape sh : group.getShapes()) {
+                    if(sh instanceof HSLFTextBox){
+                        HSLFTextBox txt = (HSLFTextBox)sh;
+                        assertNotNull(txt.getTextParagraphs());
                     }
                 }
             }
@@ -185,17 +163,15 @@
      */
     @Test
     public void bug42484 () throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42485.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42485.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
-        Shape[] shape = ppt.getSlides()[0].getShapes();
-        for (int i = 0; i < shape.length; i++) {
-            if(shape[i] instanceof ShapeGroup){
-                ShapeGroup  group = (ShapeGroup)shape[i];
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
+        for (HSLFShape shape : ppt.getSlides().get(0).getShapes()) {
+            if(shape instanceof HSLFGroupShape){
+                HSLFGroupShape  group = (HSLFGroupShape)shape;
                 assertNotNull(group.getAnchor());
-                Shape[] sh = group.getShapes();
-                for (int j = 0; j < sh.length; j++) {
-                    assertNotNull(sh[j].getAnchor());
+                for (HSLFShape sh : group.getShapes()) {
+                    assertNotNull(sh.getAnchor());
                 }
             }
         }
@@ -207,33 +183,33 @@
      */
     @Test
     public void bug41381() throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("alterman_security.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("alterman_security.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
         assertTrue("No Exceptions while reading file", true);
 
-        assertEquals(1, ppt.getSlidesMasters().length);
-        assertEquals(1, ppt.getTitleMasters().length);
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            MasterSheet master = slide[i].getMasterSheet();
-            if (i == 0) assertTrue(master instanceof TitleMaster); //the first slide follows TitleMaster
-            else assertTrue(master instanceof SlideMaster);
+        assertEquals(1, ppt.getSlideMasters().size());
+        assertEquals(1, ppt.getTitleMasters().size());
+        boolean isFirst = true;
+        for (HSLFSlide slide : ppt.getSlides()) {
+            HSLFMasterSheet master = slide.getMasterSheet();
+            // the first slide follows TitleMaster
+            assertTrue(isFirst ? master instanceof HSLFTitleMaster : master instanceof HSLFSlideMaster);
+            isFirst = false;
         }
     }
 
     /**
      * Bug 42486:  Failure parsing a seemingly valid PPT
      */
+    @SuppressWarnings("unused")
     @Test
     public void bug42486 () throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42486.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42486.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            @SuppressWarnings("unused")
-            Shape[] shape = slide[i].getShapes();
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
+        for (HSLFSlide slide : ppt.getSlides()) {
+            List<HSLFShape> shape = slide.getShapes();
         }
         assertTrue("No Exceptions while reading file", true);
 
@@ -244,20 +220,17 @@
      */
     @Test
     public void bug42524 () throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42486.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42486.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
         //walk down the tree and see if there were no errors while reading
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            Shape[] shape = slide[i].getShapes();
-            for (int j = 0; j < shape.length; j++) {
-                assertNotNull(shape[j].getShapeName());
-                if (shape[j] instanceof ShapeGroup){
-                    ShapeGroup group = (ShapeGroup)shape[j];
-                    Shape[] comps = group.getShapes();
-                    for (int k = 0; k < comps.length; k++) {
-                        assertNotNull(comps[k].getShapeName());
+        for (HSLFSlide slide : ppt.getSlides()) {
+            for (HSLFShape shape : slide.getShapes()) {
+                assertNotNull(shape.getShapeName());
+                if (shape instanceof HSLFGroupShape){
+                    HSLFGroupShape group = (HSLFGroupShape)shape;
+                    for (HSLFShape comps : group.getShapes()) {
+                        assertNotNull(comps.getShapeName());
                    }
                 }
             }
@@ -270,30 +243,26 @@
     /**
      * Bug 42520:  NPE in Picture.getPictureData()
      */
+    @SuppressWarnings("unused")
     @Test
     public void bug42520 () throws Exception {
-        HSLFSlideShow hslf = new HSLFSlideShow(_slTests.openResourceAsStream("42520.ppt"));
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(_slTests.openResourceAsStream("42520.ppt"));
 
-        SlideShow ppt = new SlideShow(hslf);
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
 
         //test case from the bug report
-        ShapeGroup shapeGroup = (ShapeGroup)ppt.getSlides()[11].getShapes()[10];
-        Picture picture = (Picture)shapeGroup.getShapes()[0];
+        HSLFGroupShape shapeGroup = (HSLFGroupShape)ppt.getSlides().get(11).getShapes().get(10);
+        HSLFPictureShape picture = (HSLFPictureShape)shapeGroup.getShapes().get(0);
         picture.getPictureData();
 
         //walk down the tree and see if there were no errors while reading
-        Slide[] slide = ppt.getSlides();
-        for (int i = 0; i < slide.length; i++) {
-            Shape[] shape = slide[i].getShapes();
-            for (int j = 0; j < shape.length; j++) {
-              if (shape[j] instanceof ShapeGroup){
-                    ShapeGroup group = (ShapeGroup)shape[j];
-                    Shape[] comps = group.getShapes();
-                    for (int k = 0; k < comps.length; k++) {
-                        Shape comp = comps[k];
-                        if (comp instanceof Picture){
-                            @SuppressWarnings("unused")
-                            PictureData pict = ((Picture)comp).getPictureData();
+        for (HSLFSlide slide : ppt.getSlides()) {
+            for (HSLFShape shape : slide.getShapes()) {
+              if (shape instanceof HSLFGroupShape){
+                    HSLFGroupShape group = (HSLFGroupShape)shape;
+                    for (HSLFShape comp : group.getShapes()) {
+                        if (comp instanceof HSLFPictureShape){
+                            HSLFPictureData pict = ((HSLFPictureShape)comp).getPictureData();
                         }
                     }
                 }
@@ -310,14 +279,14 @@
      */
     @Test
     public void bug38256 () throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("38256.ppt"));
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("38256.ppt"));
 
         assertTrue("No Exceptions while reading file", true);
 
-        Slide[] slide = ppt.getSlides();
-        assertEquals(1, slide.length);
-        TextRun[] runs = slide[0].getTextRuns();
-        assertEquals(4, runs.length);
+        List<HSLFSlide> slide = ppt.getSlides();
+        assertEquals(1, slide.size());
+        List<List<HSLFTextParagraph>> paras = slide.get(0).getTextParagraphs();
+        assertEquals(4, paras.size());
 
         Set<String> txt = new HashSet<String>();
         txt.add("\u201CHAPPY BIRTHDAY SCOTT\u201D");
@@ -325,8 +294,8 @@
         txt.add("PS Nobody is allowed to hassle Scott TODAY\u2026");
         txt.add("Drinks will be in the Boardroom at 5pm today to celebrate Scott\u2019s B\u2019Day\u2026  See you all there!");
 
-        for (int i = 0; i < runs.length; i++) {
-            String text = runs[i].getRawText();
+        for (List<HSLFTextParagraph> para : paras) {
+            String text = HSLFTextParagraph.getRawText(para);
             assertTrue(text, txt.contains(text));
         }
 
@@ -337,39 +306,37 @@
      * ( also fixed followup: getTextRuns() returns no text )
      */
     @Test
-    public void bug43781 () throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("43781.ppt"));
+    public void bug43781() throws Exception {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("43781.ppt"));
 
         assertTrue("No Exceptions while reading file", true);
 
         // Check the first slide
-        Slide slide = ppt.getSlides()[0];
-        TextRun[] slTr = slide.getTextRuns();
+        HSLFSlide slide = ppt.getSlides().get(0);
+        List<List<HSLFTextParagraph>> slTr = slide.getTextParagraphs();
         
-        // Has two text runs, one from slide text, one from drawing
-        assertEquals(2, slTr.length);
-        assertEquals(false, slTr[0].isDrawingBased());
-        assertEquals(true, slTr[1].isDrawingBased());
-        assertEquals("First run", slTr[0].getText());
-        assertEquals("Second run", slTr[1].getText());
+        // Has 3 text paragraphs, two from slide text (empty title / filled body), one from drawing
+        assertEquals(3, slTr.size());
+        assertFalse(slTr.get(0).get(0).isDrawingBased());
+        assertFalse(slTr.get(1).get(0).isDrawingBased());
+        assertTrue(slTr.get(2).get(0).isDrawingBased());
+        assertEquals("", HSLFTextParagraph.getRawText(slTr.get(0)));
+        assertEquals("First run", HSLFTextParagraph.getRawText(slTr.get(1)));
+        assertEquals("Second run", HSLFTextParagraph.getRawText(slTr.get(2)));
 
         // Check the shape based text runs
-        List<TextRun> lst = new ArrayList<TextRun>();
-        Shape[] shape = slide.getShapes();
-        for (int i = 0; i < shape.length; i++) {
-            if( shape[i] instanceof TextShape){
-                TextRun textRun = ((TextShape)shape[i]).getTextRun();
-                if(textRun != null) {
-                    lst.add(textRun);
-                }
+        List<HSLFTextParagraph> lst = new ArrayList<HSLFTextParagraph>();
+        for (HSLFShape shape : slide.getShapes()) {
+            if (shape instanceof HSLFTextShape){
+                List<HSLFTextParagraph> textRun = ((HSLFTextShape)shape).getTextParagraphs();
+                lst.addAll(textRun);
             }
 
         }
-        // There should be only one shape based one found
-        assertEquals(1, lst.size());
         
-        // And it should be the second one
-        assertEquals("Second run", lst.get(0).getText());
+        // There are two shapes in the ppt
+        assertEquals(2, lst.size());
+        assertEquals("First runSecond run", HSLFTextParagraph.getRawText(lst));
     }
 
     /**
@@ -377,17 +344,17 @@
      */
     @Test
     public void bug44296  () throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("44296.ppt"));
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("44296.ppt"));
 
-        Slide slide = ppt.getSlides()[0];
+        HSLFSlide slide = ppt.getSlides().get(0);
 
-        Background b = slide.getBackground();
-        Fill f = b.getFill();
-        assertEquals(Fill.FILL_PICTURE, f.getFillType());
+        HSLFBackground b = slide.getBackground();
+        HSLFFill f = b.getFill();
+        assertEquals(HSLFFill.FILL_PICTURE, f.getFillType());
 
-        PictureData pict = f.getPictureData();
+        HSLFPictureData pict = f.getPictureData();
         assertNotNull(pict);
-        assertEquals(Picture.JPEG, pict.getType());
+        assertEquals(HSLFPictureShape.JPEG, pict.getType());
     }
 
     /**
@@ -396,7 +363,7 @@
     @Test
     public void bug44770() throws Exception {
         try {
-             new SlideShow(_slTests.openResourceAsStream("44770.ppt"));
+             new HSLFSlideShow(_slTests.openResourceAsStream("44770.ppt"));
         } catch (RuntimeException e) {
             if (e.getMessage().equals("Couldn't instantiate the class for type with id 1036 on class class org.apache.poi.hslf.record.PPDrawing")) {
                 throw new AssertionFailedError("Identified bug 44770");
@@ -410,18 +377,18 @@
      */
     @Test
     public void bug41071() throws Exception {
-        SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("41071.ppt"));
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("41071.ppt"));
 
-        Slide slide = ppt.getSlides()[0];
-        Shape[] sh = slide.getShapes();
-        assertEquals(1, sh.length);
-        assertTrue(sh[0] instanceof TextShape);
-        TextShape tx = (TextShape)sh[0];
-        assertEquals("Fundera, planera och involvera.", tx.getTextRun().getText());
+        HSLFSlide slide = ppt.getSlides().get(0);
+        List<HSLFShape> sh = slide.getShapes();
+        assertEquals(1, sh.size());
+        assertTrue(sh.get(0) instanceof HSLFTextShape);
+        HSLFTextShape tx = (HSLFTextShape)sh.get(0);
+        assertEquals("Fundera, planera och involvera.", HSLFTextParagraph.getRawText(tx.getTextParagraphs()));
 
-        TextRun[] run = slide.getTextRuns();
-        assertEquals(1, run.length);
-        assertEquals("Fundera, planera och involvera.", run[0].getText());
+        List<List<HSLFTextParagraph>> run = slide.getTextParagraphs();
+        assertEquals(3, run.size());
+        assertEquals("Fundera, planera och involvera.", HSLFTextParagraph.getRawText(run.get(2)));
     }
 
     /**
@@ -431,10 +398,10 @@
     @Test(expected=OldPowerPointFormatException.class)
     public void bug41711() throws Exception {
     	// New file is fine
-        new SlideShow(_slTests.openResourceAsStream("SampleShow.ppt"));
+        new HSLFSlideShow(_slTests.openResourceAsStream("SampleShow.ppt"));
 
         // PowerPoint 95 gives an old format exception
-    	new SlideShow(_slTests.openResourceAsStream("PPT95.ppt"));
+    	new HSLFSlideShow(_slTests.openResourceAsStream("PPT95.ppt"));
     }
     
     /**
@@ -442,12 +409,12 @@
      */
     @Test
     public void bug49648() throws Exception {
-       SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("49648.ppt"));
-       for(Slide slide : ppt.getSlides()) {
-          for(TextRun run : slide.getTextRuns()) {
-             String text = run.getRawText();
+       HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("49648.ppt"));
+       for(HSLFSlide slide : ppt.getSlides()) {
+          for(List<HSLFTextParagraph> run : slide.getTextParagraphs()) {
+             String text = HSLFTextParagraph.getRawText(run);
              text.replace("{txtTot}", "With \u0123\u1234\u5678 unicode");
-             run.setRawText(text);
+             HSLFTextParagraph.setText(run, text);
           }
        }
     }
@@ -458,10 +425,10 @@
     @Test
     public void bug41246a() throws Exception {
         InputStream fis = _slTests.openResourceAsStream("41246-1.ppt");
-        HSLFSlideShow hslf = new HSLFSlideShow(fis);
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(fis);
         fis.close();
 
-        SlideShow ppt = new SlideShow(hslf);
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
         assertTrue("No Exceptions while reading file", true);
 
         ppt = HSLFTestDataSamples.writeOutAndReadBack(ppt);
@@ -471,10 +438,10 @@
     @Test
     public void bug41246b() throws Exception {
         InputStream fis = _slTests.openResourceAsStream("41246-2.ppt");
-        HSLFSlideShow hslf = new HSLFSlideShow(fis);
+        HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(fis);
         fis.close();
 
-        SlideShow ppt = new SlideShow(hslf);
+        HSLFSlideShow ppt = new HSLFSlideShow(hslf);
         assertTrue("No Exceptions while reading file", true);
 
         ppt = HSLFTestDataSamples.writeOutAndReadBack(ppt);
@@ -487,14 +454,14 @@
     @Test
     public void bug45776() throws Exception {
         InputStream is = _slTests.openResourceAsStream("45776.ppt");
-        SlideShow ppt = new SlideShow(new HSLFSlideShow(is));
+        HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl(is));
         is.close();
 
         // get slides
-        for (Slide slide : ppt.getSlides()) {
-            for (Shape shape : slide.getShapes()) {
-                if (!(shape instanceof TextBox)) continue;
-                TextBox tb = (TextBox) shape;
+        for (HSLFSlide slide : ppt.getSlides()) {
+            for (HSLFShape shape : slide.getShapes()) {
+                if (!(shape instanceof HSLFTextBox)) continue;
+                HSLFTextBox tb = (HSLFTextBox) shape;
                 // work with TextBox
                 String str = tb.getText();
 
@@ -502,9 +469,9 @@
                 str = str.replace("$$DATE$$", new Date().toString());
                 tb.setText(str);
                 
-                TextRun tr = tb.getTextRun();
-                assertEquals(str.length()+1,tr.getStyleTextPropAtom().getParagraphStyles().getFirst().getCharactersCovered());
-                assertEquals(str.length()+1,tr.getStyleTextPropAtom().getCharacterStyles().getFirst().getCharactersCovered());
+                List<HSLFTextParagraph> tr = tb.getTextParagraphs();
+                assertEquals(str.length()+1,tr.get(0).getParagraphStyle().getCharactersCovered());
+                assertEquals(str.length()+1,tr.get(0).getTextRuns().get(0).getCharacterStyle().getCharactersCovered());
             }
         }
     }
@@ -513,12 +480,12 @@
     public void bug55732() throws Exception {
         File file = _slTests.getFile("bug55732.ppt");
         
-        HSLFSlideShow ss = new HSLFSlideShow(file.getAbsolutePath());
-        SlideShow _show = new SlideShow(ss);
-        Slide[] _slides = _show.getSlides();
+        HSLFSlideShowImpl ss = new HSLFSlideShowImpl(file.getAbsolutePath());
+        HSLFSlideShow _show = new HSLFSlideShow(ss);
+        List<HSLFSlide> _slides = _show.getSlides();
 
         /* Iterate over slides and extract text */
-        for( Slide slide : _slides ) {
+        for( HSLFSlide slide : _slides ) {
             HeadersFooters hf = slide.getHeadersFooters();
             /*boolean visible =*/ hf.isHeaderVisible(); // exception happens here
         }
@@ -529,10 +496,10 @@
     public void bug56260() throws Exception {
         File file = _slTests.getFile("56260.ppt");
         
-        HSLFSlideShow ss = new HSLFSlideShow(file.getAbsolutePath());
-        SlideShow _show = new SlideShow(ss);
-        Slide[] _slides = _show.getSlides();
-        assertEquals(13, _slides.length);
+        HSLFSlideShowImpl ss = new HSLFSlideShowImpl(file.getAbsolutePath());
+        HSLFSlideShow _show = new HSLFSlideShow(ss);
+        List<HSLFSlide> _slides = _show.getSlides();
+        assertEquals(13, _slides.size());
         
         // Check the number of TextHeaderAtoms on Slide 1
         Document dr = _show.getDocumentRecord();
@@ -553,22 +520,22 @@
         // Check the number of text runs based on the slide (not textbox)
         // Will have skipped the empty one
         int str = 0;
-        for (TextRun tr : _slides[0].getTextRuns()) {
-            if (! tr.isDrawingBased()) str++;
+        for (List<HSLFTextParagraph> tr : _slides.get(0).getTextParagraphs()) {
+            if (! tr.get(0).isDrawingBased()) str++;
         }
-        assertEquals(1, str);
+        assertEquals(2, str);
     }
     
     @Test
     public void bug37625() throws IOException {
         InputStream inputStream = new FileInputStream(_slTests.getFile("37625.ppt"));
         try {
-            SlideShow slideShow = new SlideShow(inputStream);
-            assertEquals(29, slideShow.getSlides().length);
+            HSLFSlideShow slideShow = new HSLFSlideShow(inputStream);
+            assertEquals(29, slideShow.getSlides().size());
             
-            SlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow);
+            HSLFSlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow);
             assertNotNull(slideBack);
-            assertEquals(29, slideBack.getSlides().length);
+            assertEquals(29, slideBack.getSlides().size());
         } finally {
             inputStream.close();
         }
@@ -578,12 +545,12 @@
     public void bug57272() throws Exception {
         InputStream inputStream = new FileInputStream(_slTests.getFile("57272_corrupted_usereditatom.ppt"));
         try {
-            SlideShow slideShow = new SlideShow(inputStream);
-            assertEquals(6, slideShow.getSlides().length);
+            HSLFSlideShow slideShow = new HSLFSlideShow(inputStream);
+            assertEquals(6, slideShow.getSlides().size());
 
-            SlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow);
+            HSLFSlideShow slideBack = HSLFTestDataSamples.writeOutAndReadBack(slideShow);
             assertNotNull(slideBack);
-            assertEquals(6, slideBack.getSlides().length);
+            assertEquals(6, slideBack.getSlides().size());
         } finally {
             inputStream.close();
         }
@@ -593,10 +560,10 @@
     public void bug49541() throws Exception {
         InputStream inputStream = new FileInputStream(_slTests.getFile("49541_symbol_map.ppt"));
         try {
-            SlideShow slideShow = new SlideShow(inputStream);
-            Slide slide = slideShow.getSlides()[0];
-            ShapeGroup sg = (ShapeGroup)slide.getShapes()[0];
-            TextBox tb = (TextBox)sg.getShapes()[0];
+            HSLFSlideShow slideShow = new HSLFSlideShow(inputStream);
+            HSLFSlide slide = slideShow.getSlides().get(0);
+            HSLFGroupShape sg = (HSLFGroupShape)slide.getShapes().get(0);
+            HSLFTextBox tb = (HSLFTextBox)sg.getShapes().get(0);
             String text = StringUtil.mapMsCodepointString(tb.getText());
             assertEquals("\u226575 years", text);
         } finally {
@@ -608,7 +575,7 @@
     public void bug47261() throws Exception {
         InputStream inputStream = new FileInputStream(_slTests.getFile("bug47261.ppt"));
         try {
-            SlideShow slideShow = new SlideShow(inputStream);
+            HSLFSlideShow slideShow = new HSLFSlideShow(inputStream);
             slideShow.removeSlide(0);
             slideShow.createSlide();
             ByteArrayOutputStream bos = new ByteArrayOutputStream();
@@ -622,8 +589,8 @@
     public void bug56240() throws Exception {
         InputStream inputStream = new FileInputStream(_slTests.getFile("bug56240.ppt"));
         try {
-            SlideShow slideShow = new SlideShow(inputStream);
-            int slideCnt = slideShow.getSlides().length;
+            HSLFSlideShow slideShow = new HSLFSlideShow(inputStream);
+            int slideCnt = slideShow.getSlides().size();
             assertEquals(105, slideCnt);
             ByteArrayOutputStream bos = new ByteArrayOutputStream();
             slideShow.write(bos);
@@ -637,10 +604,10 @@
     public void bug46441() throws Exception {
         InputStream inputStream = new FileInputStream(_slTests.getFile("bug46441.ppt"));
         try {
-            SlideShow slideShow = new SlideShow(inputStream);
-            AutoShape as = (AutoShape)slideShow.getSlides()[0].getShapes()[0];
+            HSLFSlideShow slideShow = new HSLFSlideShow(inputStream);
+            HSLFAutoShape as = (HSLFAutoShape)slideShow.getSlides().get(0).getShapes().get(0);
             EscherOptRecord opt = as.getEscherOptRecord();
-            EscherArrayProperty ep = Shape.getEscherProperty(opt, EscherProperties.FILL__SHADECOLORS);
+            EscherArrayProperty ep = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__SHADECOLORS);
             double exp[][] = {
                 // r, g, b, position
                 { 94, 158, 255, 0 },
@@ -653,7 +620,7 @@
             for (byte data[] : ep) {
                 EscherColorRef ecr = new EscherColorRef(data, 0, 4);
                 int rgb[] = ecr.getRGB();
-                double pos = Units.fixedPointToDecimal(LittleEndian.getInt(data, 4));
+                double pos = Units.fixedPointToDouble(LittleEndian.getInt(data, 4));
                 assertEquals((int)exp[i][0], rgb[0]);
                 assertEquals((int)exp[i][1], rgb[1]);
                 assertEquals((int)exp[i][2], rgb[2]);
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java
index eb84e77..cb51595 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestCounts.java
@@ -18,9 +18,10 @@
 package org.apache.poi.hslf.usermodel;
 
 
+import java.util.List;
+
 import junit.framework.TestCase;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.*;
+
 import org.apache.poi.POIDataSamples;
 
 /**
@@ -30,48 +31,48 @@
  */
 public final class TestCounts extends TestCase {
 	// SlideShow primed on the test data
-	private SlideShow ss;
+	private HSLFSlideShow ss;
 
 	public TestCounts() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss = new SlideShow(hss);
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss = new HSLFSlideShow(hss);
 	}
 
 	public void testSheetsCount() {
-		Slide[] slides = ss.getSlides();
+		List<HSLFSlide> slides = ss.getSlides();
 		// Two sheets - master sheet is separate
-		assertEquals(2, slides.length);
+		assertEquals(2, slides.size());
 
 		// They are slides 1+2
-		assertEquals(1, slides[0].getSlideNumber());
-		assertEquals(2, slides[1].getSlideNumber());
+		assertEquals(1, slides.get(0).getSlideNumber());
+		assertEquals(2, slides.get(1).getSlideNumber());
 
 		// The ref IDs are 4 and 6
-		assertEquals(4, slides[0]._getSheetRefId());
-		assertEquals(6, slides[1]._getSheetRefId());
+		assertEquals(4, slides.get(0)._getSheetRefId());
+		assertEquals(6, slides.get(1)._getSheetRefId());
 
 		// These are slides 1+2 -> 256+257
-		assertEquals(256, slides[0]._getSheetNumber());
-		assertEquals(257, slides[1]._getSheetNumber());
+		assertEquals(256, slides.get(0)._getSheetNumber());
+		assertEquals(257, slides.get(1)._getSheetNumber());
 	}
 
 	public void testNotesCount() {
-		Notes[] notes = ss.getNotes();
+		List<HSLFNotes> notes = ss.getNotes();
 		// Two sheets -> two notes
 		// Note: there are also notes on the slide master
 		//assertEquals(3, notes.length); // When we do slide masters
-		assertEquals(2, notes.length);
+		assertEquals(2, notes.size());
 
 		// First is for master
-		//assertEquals(-2147483648, notes[0]._getSheetNumber());  // When we do slide masters
+		//assertEquals(-2147483648, notes.get(0)._getSheetNumber());  // When we do slide masters
 
 		// Next two are for the two slides
-		assertEquals(256, notes[0]._getSheetNumber());
-		assertEquals(257, notes[1]._getSheetNumber());
+		assertEquals(256, notes.get(0)._getSheetNumber());
+		assertEquals(257, notes.get(1)._getSheetNumber());
 
 		// They happen to go between the two slides in Ref terms
-		assertEquals(5, notes[0]._getSheetRefId());
-		assertEquals(7, notes[1]._getSheetRefId());
+		assertEquals(5, notes.get(0)._getSheetRefId());
+		assertEquals(7, notes.get(1)._getSheetRefId());
 	}
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java
index a6fa770..cc78643 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java
@@ -17,30 +17,22 @@
 

 package org.apache.poi.hslf.usermodel;

 

-import static org.junit.Assert.assertTrue;

+import static org.junit.Assert.*;

 import static org.junit.Assume.assumeTrue;

 

-import java.awt.Color;

-import java.awt.Dimension;

-import java.awt.Font;

-import java.awt.Graphics2D;

-import java.awt.GraphicsEnvironment;

-import java.awt.RenderingHints;

+import java.awt.*;

 import java.awt.geom.AffineTransform;

 import java.awt.geom.Rectangle2D;

 import java.awt.image.BufferedImage;

 import java.awt.image.DataBufferByte;

 import java.io.File;

 import java.io.InputStream;

-import java.util.Arrays;

-import java.util.HashMap;

-import java.util.Map;

+import java.util.*;

 

 import javax.imageio.ImageIO;

 

 import org.apache.poi.POIDataSamples;

-import org.apache.poi.hslf.model.Slide;

-import org.apache.poi.hslf.model.TextPainter;

+import org.apache.poi.sl.draw.Drawable;

 import org.apache.poi.util.TempFile;

 import org.junit.Ignore;

 import org.junit.Test;

@@ -51,7 +43,7 @@
 public class TestFontRendering {

     private static POIDataSamples slTests = POIDataSamples.getSlideShowInstance();

 

-    @Ignore("This fails on some systems because fonts are rendered slightly different")

+    // @Ignore2("This fails on some systems because fonts are rendered slightly different")

     @Test

     public void bug55902mixedFontWithChineseCharacters() throws Exception {

         // font files need to be downloaded first via

@@ -82,12 +74,12 @@
         }

         

         InputStream is = slTests.openResourceAsStream("bug55902-mixedFontChineseCharacters.ppt");

-        SlideShow ss = new SlideShow(is);

+        HSLFSlideShow ss = new HSLFSlideShow(is);

         is.close();

         

         Dimension pgsize = ss.getPageSize();

         

-        Slide slide = ss.getSlides()[0];

+        HSLFSlide slide = ss.getSlides().get(0);

         

         // render it

         double zoom = 1;

@@ -96,8 +88,8 @@
         

         BufferedImage imgActual = new BufferedImage((int)Math.ceil(pgsize.width*zoom), (int)Math.ceil(pgsize.height*zoom), BufferedImage.TYPE_3BYTE_BGR);

         Graphics2D graphics = imgActual.createGraphics();

-        graphics.setRenderingHint(TextPainter.KEY_FONTFALLBACK, fallbackMap);

-        graphics.setRenderingHint(TextPainter.KEY_FONTMAP, fontMap);

+        graphics.setRenderingHint(Drawable.FONT_FALLBACK, fallbackMap);

+        graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);

         graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

         graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

         graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);

@@ -117,7 +109,7 @@
         if(!Arrays.equals(expectedData, actualData)) {

             ImageIO.write(imgActual, "PNG", TempFile.createTempFile("TestFontRendering", ".png"));

         }

-        assertTrue("Expected to have matching raster-arrays, but found differences, size " + expectedData.length + " and " + actualData.length, 

-                Arrays.equals(expectedData, actualData));

+        

+        assertArrayEquals("Expected to have matching raster-arrays, but found differences", expectedData, actualData);

     }

 }

diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java
index ce68b7a..1cb9c7d 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestMostRecentRecords.java
@@ -19,6 +19,7 @@
 
 
 import junit.framework.TestCase;
+
 import org.apache.poi.hslf.*;
 import org.apache.poi.hslf.record.*;
 import org.apache.poi.POIDataSamples;
@@ -30,14 +31,14 @@
  */
 public final class TestMostRecentRecords extends TestCase {
 	// HSLFSlideShow primed on the test data
-	private HSLFSlideShow hss;
+	private HSLFSlideShowImpl hss;
 	// SlideShow primed on the test data
-	private SlideShow ss;
+	private HSLFSlideShow ss;
 
 	public TestMostRecentRecords() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss = new SlideShow(hss);
+		hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss = new HSLFSlideShow(hss);
 	}
 
 	public void testCount() {
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java
index 3def468..8713c09 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNotesText.java
@@ -19,6 +19,7 @@
 
 
 import junit.framework.TestCase;
+
 import org.apache.poi.hslf.*;
 import org.apache.poi.hslf.model.*;
 import org.apache.poi.POIDataSamples;
@@ -30,30 +31,30 @@
  */
 public final class TestNotesText extends TestCase {
 	// SlideShow primed on the test data
-	private SlideShow ss;
+	private HSLFSlideShow ss;
 
 	public TestNotesText() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss = new SlideShow(hss);
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss = new HSLFSlideShow(hss);
 	}
 
 	public void testNotesOne() {
-		Notes notes = ss.getNotes()[0];
+		HSLFNotes notes = ss.getNotes().get(0);
 
 		String[] expectText = new String[] {"These are the notes for page 1"};
-		assertEquals(expectText.length, notes.getTextRuns().length);
+		assertEquals(expectText.length, notes.getTextParagraphs().size());
 		for(int i=0; i<expectText.length; i++) {
-			assertEquals(expectText[i], notes.getTextRuns()[i].getText());
+			assertEquals(expectText[i], HSLFTextParagraph.getRawText(notes.getTextParagraphs().get(i)));
 		}
 	}
 
 	public void testNotesTwo() {
-		Notes notes = ss.getNotes()[1];
+		HSLFNotes notes = ss.getNotes().get(1);
 		String[] expectText = new String[] {"These are the notes on page two, again lacking formatting"};
-		assertEquals(expectText.length, notes.getTextRuns().length);
+		assertEquals(expectText.length, notes.getTextParagraphs().size());
 		for(int i=0; i<expectText.length; i++) {
-			assertEquals(expectText[i], notes.getTextRuns()[i].getText());
+			assertEquals(expectText[i], HSLFTextParagraph.getRawText(notes.getTextParagraphs().get(i)));
 		}
 	}
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java
index e7fec8a..e54da29 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList.java
@@ -19,19 +19,16 @@
 
 package org.apache.poi.hslf.usermodel;
 
+import static org.junit.Assert.*;
+
 import java.util.List;
 
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.TextRun;
+import org.apache.poi.POIDataSamples;
 import org.apache.poi.hslf.model.textproperties.TextPFException9;
 import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.EscherTextboxWrapper;
-import org.apache.poi.hslf.record.StyleTextProp9Atom;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum;
-import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.sl.usermodel.AutoNumberingScheme;
+import org.junit.Test;
 
 
 /**
@@ -39,22 +36,21 @@
  * 
  * @author Alex Nikiforov [mailto:anikif@gmail.com]
  */
-public final class TestNumberedList extends TestCase {
+public final class TestNumberedList {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
-	protected void setUp() throws Exception {
-	}
-
-	public void testNumberedList() throws Exception {
-		SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("numbers.ppt"));
+    @Test
+    public void testNumberedList() throws Exception {
+		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers.ppt"));
 		assertTrue("No Exceptions while reading file", true);
 
-		final Slide[] slides = ppt.getSlides();
-		assertEquals(2, slides.length);
-		checkSlide0(slides[0]);
-		checkSlide1(slides[1]);
+		final List<HSLFSlide> slides = ppt.getSlides();
+		assertEquals(2, slides.size());
+		checkSlide0(slides.get(0));
+		checkSlide1(slides.get(1));
 	}
-	private void checkSlide0(final Slide s) {
+
+    private void checkSlide0(final HSLFSlide s) {
 		final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo();
 		assertNotNull(numberedListArray);
 		assertEquals(1, numberedListArray.length);//Just one text box here
@@ -66,31 +62,37 @@
 		assertTrue(4 == autoNumbers[0].getAutoNumberStartNumber());
 		assertNull(autoNumbers[1].getAutoNumberStartNumber());
 		assertTrue(3 == autoNumbers[2].getAutoNumberStartNumber());
-		assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbers[0].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbers[0].getAutoNumberScheme());
 		assertNull(autoNumbers[1].getAutoNumberScheme());
-		assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaLcParenRight == autoNumbers[2].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.alphaLcParenRight == autoNumbers[2].getAutoNumberScheme());
 			
-		TextRun[] textRuns = s.getTextRuns();
-		assertEquals(2, textRuns.length);
+		List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
+		assertEquals(2, textParass.size());
 
-		RichTextRun textRun = textRuns[0].getRichTextRuns()[0];
-		assertEquals("titTe", textRun.getRawText());
-		assertEquals(1, textRuns[0].getRichTextRuns().length);
-		assertFalse(textRun.isBullet());
+		List<HSLFTextParagraph> textParas = textParass.get(0);
+		assertEquals("titTe", HSLFTextParagraph.getRawText(textParas));
+		assertEquals(1, textParas.size());
+		assertFalse(textParas.get(0).isBullet());
 
-		assertEquals("This is a text placeholder that \rfollows the design pattern\rJust a test\rWithout any paragraph\rSecond paragraph first line c) ;\rSecond paragraph second line d) . \r", textRuns[1].getRawText());
+		String expected =
+	        "This is a text placeholder that \r" +
+	        "follows the design pattern\r" +
+	        "Just a test\rWithout any paragraph\r" +
+	        "Second paragraph first line c) ;\r" +
+	        "Second paragraph second line d) . \r";
+		assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1)));
 		
 		final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
-		assertEquals(textRuns.length, styleAtoms.length);
+		assertEquals(textParass.size(), styleAtoms.length);
 		final EscherTextboxWrapper wrapper =  styleAtoms[1];
 		final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom();
 		final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles();
-		final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]);
-		assertEquals(60, props[0].getCharactersCovered());
-		assertEquals(34, props[1].getCharactersCovered());
-		assertEquals(68, props[2].getCharactersCovered());
+		assertEquals(60, textProps.get(0).getCharactersCovered());
+		assertEquals(34, textProps.get(1).getCharactersCovered());
+		assertEquals(68, textProps.get(2).getCharactersCovered());
 	}
-	private void checkSlide1(final Slide s) {
+
+    private void checkSlide1(final HSLFSlide s) {
 		final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo();
 		assertNotNull(numberedListArray);
 		assertEquals(1, numberedListArray.length);//Just one text box here
@@ -102,29 +104,34 @@
 		assertTrue(9 == autoNumbers[0].getAutoNumberStartNumber());
 		assertNull(autoNumbers[1].getAutoNumberStartNumber());
 		assertTrue(3 == autoNumbers[2].getAutoNumberStartNumber());
-		assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicParenRight == autoNumbers[0].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.arabicParenRight == autoNumbers[0].getAutoNumberScheme());
 		assertNull(autoNumbers[1].getAutoNumberScheme());
-		assertTrue(TextAutoNumberSchemeEnum.ANM_AlphaUcPeriod == autoNumbers[2].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.alphaUcPeriod == autoNumbers[2].getAutoNumberScheme());
 
-		final TextRun[] textRuns = s.getTextRuns();
-		assertEquals(2, textRuns.length);
+		final List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
+		assertEquals(2, textParass.size());
 
-		RichTextRun textRun = textRuns[0].getRichTextRuns()[0];
-		assertEquals("Second Slide Title", textRun.getRawText());
-		assertEquals(1, textRuns[0].getRichTextRuns().length);
-		assertFalse(textRun.isBullet());
+		List<HSLFTextParagraph> textParas = textParass.get(0);
+		assertEquals("Second Slide Title", HSLFTextParagraph.getRawText(textParas));
+		assertEquals(1, textParas.size());
+		assertFalse(textParas.get(0).isBullet());
 
-		assertEquals("This is a text placeholder that \rfollows the design pattern\rJust a test\rWithout any paragraph\rSecond paragraph first line c) ;\rSecond paragraph second line d) . \r", textRuns[1].getRawText());
+		String expected =
+	        "This is a text placeholder that \r" +
+	        "follows the design pattern\r" +
+	        "Just a test\rWithout any paragraph\r" +
+	        "Second paragraph first line c) ;\r" +
+	        "Second paragraph second line d) . \r";		        
+		assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1)));
 		
 		final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
-		assertEquals(textRuns.length, styleAtoms.length);
+		assertEquals(textParass.size(), styleAtoms.length);
 		final EscherTextboxWrapper wrapper =  styleAtoms[1];
 		final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom();
 		final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles();
 		
-		final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]);
-		assertEquals(33, props[0].getCharactersCovered());
-		assertEquals(61, props[1].getCharactersCovered());
-		assertEquals(68, props[2].getCharactersCovered());
+		assertEquals(33, textProps.get(0).getCharactersCovered());
+		assertEquals(61, textProps.get(1).getCharactersCovered());
+		assertEquals(68, textProps.get(2).getCharactersCovered());
 	}
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java
index 264a90b..297f57c 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList2.java
@@ -19,19 +19,16 @@
 
 package org.apache.poi.hslf.usermodel;
 
+import static org.junit.Assert.*;
+
 import java.util.List;
 
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.TextRun;
+import org.apache.poi.POIDataSamples;
 import org.apache.poi.hslf.model.textproperties.TextPFException9;
 import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.EscherTextboxWrapper;
-import org.apache.poi.hslf.record.StyleTextProp9Atom;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum;
-import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.sl.usermodel.AutoNumberingScheme;
+import org.junit.Test;
 
 
 /**
@@ -42,22 +39,20 @@
  * 
  * @author Alex Nikiforov [mailto:anikif@gmail.com]
  */
-public final class TestNumberedList2 extends TestCase {
+public final class TestNumberedList2 {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
-	protected void setUp() throws Exception {
-	}
-
+    @Test
 	public void testNumberedList() throws Exception {
-		SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("numbers2.ppt"));
+		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers2.ppt"));
 		assertTrue("No Exceptions while reading file", true);
 
-		final Slide[] slides = ppt.getSlides();
-		assertEquals(2, slides.length);
-		checkSlide0(slides[0]);
-		checkSlide1(slides[1]);
+		final List<HSLFSlide> slides = ppt.getSlides();
+		assertEquals(2, slides.size());
+		checkSlide0(slides.get(0));
+		checkSlide1(slides.get(1));
 	}
-	private void checkSlide0(final Slide s) {
+	private void checkSlide0(final HSLFSlide s) {
 		final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo();
 		assertNotNull(numberedListArray);
 		assertEquals(2, numberedListArray.length);
@@ -68,29 +63,33 @@
 		final TextPFException9[] autoNumbersOfTextBox0 = numberedListInfoForTextBox0.getAutoNumberTypes();
 		assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getfBulletHasAutoNumber());
 		assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getAutoNumberStartNumber());//Default value = 1 will be used 
-		assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
 		final TextPFException9[] autoNumbersOfTextBox1 = numberedListInfoForTextBox1.getAutoNumberTypes();
 		assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox1[0].getfBulletHasAutoNumber());
 		assertEquals(Short.valueOf((short)6), autoNumbersOfTextBox1[0].getAutoNumberStartNumber());//Default value = 1 will be used 
-		assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox1[0].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox1[0].getAutoNumberScheme());
 
 		
-		TextRun[] textRuns = s.getTextRuns();
-		assertEquals(2, textRuns.length);
+		List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
+		assertEquals(2, textParass.size());
 
-		RichTextRun textRun = textRuns[0].getRichTextRuns()[0];
-		assertEquals("List Item One\rList Item Two\rList Item Three", textRun.getRawText());
-		assertEquals(1, textRuns[0].getRichTextRuns().length);
-		assertTrue(textRun.isBullet());
+		List<HSLFTextParagraph> textParas = textParass.get(0);
+		assertEquals("List Item One\rList Item Two\rList Item Three", HSLFTextParagraph.getRawText(textParas));
+		assertEquals(3, textParas.size());
+		assertTrue(textParas.get(0).isBullet());
 
-		assertEquals("A numbered list may start at any number \rThis would be used as a continuation list on another page\rThis list should start with #6", textRuns[1].getRawText());
+		String expected =
+	        "A numbered list may start at any number \r" +
+	        "This would be used as a continuation list on another page\r" +
+            "This list should start with #6";
+		assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1)));
 		
 		final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
-		assertEquals(textRuns.length, styleAtoms.length);
+		assertEquals(textParass.size(), styleAtoms.length);
 		checkSingleRunWrapper(44, styleAtoms[0]);
 		checkSingleRunWrapper(130, styleAtoms[1]);
 	}
-	private void checkSlide1(final Slide s) {
+	private void checkSlide1(final HSLFSlide s) {
 		final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo();
 		assertNotNull(numberedListArray);
 		assertEquals(1, numberedListArray.length);
@@ -99,21 +98,23 @@
 		final TextPFException9[] autoNumbersOfTextBox = numberedListInfoForTextBox.getAutoNumberTypes();
 		assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox[0].getfBulletHasAutoNumber());
 		assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox[0].getAutoNumberStartNumber());//Default value = 1 will be used 
-		assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox[0].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox[0].getAutoNumberScheme());
 			
-		TextRun[] textRuns = s.getTextRuns();
-		assertEquals(3, textRuns.length);
+		List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
+		assertEquals(3, textParass.size());
 
-		RichTextRun textRun = textRuns[0].getRichTextRuns()[0];
-		assertEquals("Bulleted list\rMore bullets", textRun.getRawText());
-		assertEquals(1, textRuns[0].getRichTextRuns().length);
-		assertTrue(textRun.isBullet());
+		List<HSLFTextParagraph> textParas = textParass.get(0);
+		assertEquals("Bulleted list\rMore bullets", HSLFTextParagraph.getRawText(textParas));
+		assertEquals(2, textParas.size());
+		assertTrue(textParas.get(0).isBullet());
 
-		assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", textRuns[1].getRawText());
-		assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", textRuns[2].getRawText());
+		String expected = "Numbered list between two bulleted lists\rSecond numbered list item";
+		assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(1)));
+		expected = "Second bulleted list \u2013 should appear after numbered list\rMore bullets";
+		assertEquals(expected, HSLFTextParagraph.getRawText(textParass.get(2)));
 		
 		final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
-		assertEquals(textRuns.length, styleAtoms.length);
+		assertEquals(textParass.size(), styleAtoms.length);
 		checkSingleRunWrapper(27, styleAtoms[0]);
 		checkSingleRunWrapper(67, styleAtoms[1]);
 		checkSingleRunWrapper(70, styleAtoms[2]);
@@ -122,7 +123,6 @@
 		final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom();
 		final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles();
 		assertEquals(1, textProps.size());
-		final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]);
-		assertEquals(exceptedLength, props[0].getCharactersCovered());
+		assertEquals(exceptedLength, textProps.get(0).getCharactersCovered());
 	}
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java
index b10bccd..70b712b 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestNumberedList3.java
@@ -19,19 +19,16 @@
 
 package org.apache.poi.hslf.usermodel;
 
+import static org.junit.Assert.*;
+
 import java.util.List;
 
-import junit.framework.TestCase;
-
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.TextRun;
+import org.apache.poi.POIDataSamples;
 import org.apache.poi.hslf.model.textproperties.TextPFException9;
 import org.apache.poi.hslf.model.textproperties.TextPropCollection;
-import org.apache.poi.hslf.record.EscherTextboxWrapper;
-import org.apache.poi.hslf.record.StyleTextProp9Atom;
-import org.apache.poi.hslf.record.StyleTextPropAtom;
-import org.apache.poi.hslf.record.TextAutoNumberSchemeEnum;
-import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.sl.usermodel.AutoNumberingScheme;
+import org.junit.Test;
 
 
 /**
@@ -42,22 +39,20 @@
  * 
  * @author Alex Nikiforov [mailto:anikif@gmail.com]
  */
-public final class TestNumberedList3 extends TestCase {
+public final class TestNumberedList3 {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
-	protected void setUp() throws Exception {
-	}
-
-	public void testNumberedList() throws Exception {
-		SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("numbers3.ppt"));
+    @Test
+    public void testNumberedList() throws Exception {
+		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("numbers3.ppt"));
 		assertTrue("No Exceptions while reading file", true);
 
-		final Slide[] slides = ppt.getSlides();
-		assertEquals(1, slides.length);
-		final Slide slide = slides[0];
+		final List<HSLFSlide> slides = ppt.getSlides();
+		assertEquals(1, slides.size());
+		final HSLFSlide slide = slides.get(0);
 		checkSlide(slide);
 	}
-	private void checkSlide(final Slide s) {
+	private void checkSlide(final HSLFSlide s) {
 		final StyleTextProp9Atom[] numberedListArray = s.getNumberedListInfo();
 		assertNotNull(numberedListArray);
 		assertEquals(1, numberedListArray.length);
@@ -66,37 +61,38 @@
 		final TextPFException9[] autoNumbersOfTextBox0 = numberedListInfoForTextBox.getAutoNumberTypes();
 		assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getfBulletHasAutoNumber());
 		assertEquals(Short.valueOf((short)1), autoNumbersOfTextBox0[0].getAutoNumberStartNumber());//Default value = 1 will be used 
-		assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
 		
-		final TextRun[] textRuns = s.getTextRuns();
-		assertEquals(3, textRuns.length);
-		assertEquals("Bulleted list\rMore bullets\rNo bullets here", textRuns[0].getRawText());
-		assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", textRuns[1].getRawText());
-		assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", textRuns[2].getRawText());
-		assertEquals(2, textRuns[0].getRichTextRuns().length);
-		assertEquals(1, textRuns[1].getRichTextRuns().length);
-		assertEquals(1, textRuns[2].getRichTextRuns().length);
-		assertNull(textRuns[0].getStyleTextProp9Atom());
-		assertNotNull(textRuns[1].getStyleTextProp9Atom());
-		assertNull(textRuns[2].getStyleTextProp9Atom());
-		final TextPFException9[] autoNumbers = textRuns[1].getStyleTextProp9Atom().getAutoNumberTypes();
+		final List<List<HSLFTextParagraph>> textParass = s.getTextParagraphs();
+		assertEquals(3, textParass.size());
+		assertEquals("Bulleted list\rMore bullets\rNo bullets here", HSLFTextParagraph.getRawText(textParass.get(0)));
+		assertEquals("Numbered list between two bulleted lists\rSecond numbered list item", HSLFTextParagraph.getRawText(textParass.get(1)));
+		assertEquals("Second bulleted list \u2013 should appear after numbered list\rMore bullets", HSLFTextParagraph.getRawText(textParass.get(2)));
+		assertEquals(3, textParass.get(0).size());
+		assertEquals(2, textParass.get(1).size());
+		assertEquals(2, textParass.get(2).size());
+		assertNull(textParass.get(0).get(0).getStyleTextProp9Atom());
+		assertNotNull(textParass.get(1).get(0).getStyleTextProp9Atom());
+		assertNull(textParass.get(2).get(0).getStyleTextProp9Atom());
+		final TextPFException9[] autoNumbers = textParass.get(1).get(0).getStyleTextProp9Atom().getAutoNumberTypes();
 		assertEquals(1, autoNumbers.length);
 		assertEquals(Short.valueOf((short)1), autoNumbers[0].getfBulletHasAutoNumber());
 		assertEquals(Short.valueOf((short)1), autoNumbers[0].getAutoNumberStartNumber());//Default value = 1 will be used 
-		assertTrue(TextAutoNumberSchemeEnum.ANM_ArabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
+		assertTrue(AutoNumberingScheme.arabicPeriod == autoNumbersOfTextBox0[0].getAutoNumberScheme());
 		
-		final List<TextPropCollection> textProps = textRuns[1].getStyleTextPropAtom().getCharacterStyles();
-		assertEquals(1, textProps.size());
-		final TextPropCollection textProp = textProps.get(0);
-		assertEquals(67, textProp.getCharactersCovered());
+		int chCovered = 0;
+		for (HSLFTextParagraph htp : textParass.get(1)) {
+    		for (HSLFTextRun htr : htp.getTextRuns()) {
+    		    TextPropCollection textProp = htr.getCharacterStyle();
+    		    chCovered += textProp.getCharactersCovered();
+    		}
+		}
+		assertEquals(67, chCovered);
 		
-		
-		RichTextRun textRun = textRuns[0].getRichTextRuns()[0];
-		assertTrue(textRun.isBullet());
-
+		assertTrue(textParass.get(0).get(0).isBullet());
 		
 		final EscherTextboxWrapper[] styleAtoms = s.getTextboxWrappers();
-		assertEquals(textRuns.length, styleAtoms.length);
+		assertEquals(textParass.size(), styleAtoms.length);
 		checkSingleRunWrapper(43, styleAtoms[0]);
 		checkSingleRunWrapper(67, styleAtoms[1]);
 	}
@@ -104,7 +100,6 @@
 		final StyleTextPropAtom styleTextPropAtom = wrapper.getStyleTextPropAtom();
 		final List<TextPropCollection> textProps = styleTextPropAtom.getCharacterStyles();
 		assertEquals(1, textProps.size());
-		final TextPropCollection[] props = (TextPropCollection[]) textProps.toArray(new TextPropCollection[textProps.size()]);
-		assertEquals(exceptedLength, props[0].getCharactersCovered());
+		assertEquals(exceptedLength, textProps.get(0).getCharactersCovered());
 	}
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java
new file mode 100644
index 0000000..5ede8b0
--- /dev/null
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java
@@ -0,0 +1,201 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import static org.junit.Assert.*;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.lang.reflect.Constructor;
+import java.util.*;
+
+import javax.imageio.ImageIO;
+
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.ddf.EscherBSERecord;
+import org.apache.poi.hssf.usermodel.DummyGraphics2d;
+import org.apache.poi.sl.draw.Drawable;
+import org.apache.poi.sl.usermodel.Slide;
+import org.apache.poi.sl.usermodel.SlideShow;
+import org.apache.poi.util.JvmBugs;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * Test Picture shape.
+ *
+ * @author Yegor Kozlov
+ */
+public final class TestPicture {
+    private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
+
+    /**
+     * Test that the reference count of a blip is incremented every time the picture is inserted.
+     * This is important when the same image appears multiple times in a slide show.
+     *
+     */
+    @Test
+    public void multiplePictures() throws Exception {
+        HSLFSlideShow ppt = new HSLFSlideShow();
+
+        HSLFSlide s = ppt.createSlide();
+        HSLFSlide s2 = ppt.createSlide();
+        HSLFSlide s3 = ppt.createSlide();
+
+        int idx = ppt.addPicture(_slTests.readFile("clock.jpg"), HSLFPictureShape.JPEG);
+        HSLFPictureShape pict = new HSLFPictureShape(idx);
+        HSLFPictureShape pict2 = new HSLFPictureShape(idx);
+        HSLFPictureShape pict3 = new HSLFPictureShape(idx);
+
+        pict.setAnchor(new Rectangle(10,10,100,100));
+        s.addShape(pict);
+        EscherBSERecord bse1 = pict.getEscherBSERecord();
+        assertEquals(1, bse1.getRef());
+
+        pict2.setAnchor(new Rectangle(10,10,100,100));
+        s2.addShape(pict2);
+        EscherBSERecord bse2 = pict.getEscherBSERecord();
+        assertSame(bse1, bse2);
+        assertEquals(2, bse1.getRef());
+
+        pict3.setAnchor(new Rectangle(10,10,100,100));
+        s3.addShape(pict3);
+        EscherBSERecord bse3 = pict.getEscherBSERecord();
+        assertSame(bse2, bse3);
+        assertEquals(3, bse1.getRef());
+    }
+
+    /**
+     * Picture#getEscherBSERecord threw NullPointerException if EscherContainerRecord.BSTORE_CONTAINER
+     * was not found. The correct behaviour is to return null.
+     */
+    @Test
+    public void bug46122() {
+        HSLFSlideShow ppt = new HSLFSlideShow();
+        HSLFSlide slide = ppt.createSlide();
+
+        HSLFPictureShape pict = new HSLFPictureShape(-1); //index to non-existing picture data
+        pict.setSheet(slide);
+        HSLFPictureData data = pict.getPictureData();
+        assertNull(data);
+
+        BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
+        Graphics2D graphics = img.createGraphics();
+        pict.draw(graphics);
+    }
+
+    @Test
+    public void macImages() throws Exception {
+        HSLFSlideShowImpl hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("53446.ppt"));
+
+        HSLFPictureData[] pictures = hss.getPictures();
+        assertEquals(15, pictures.length);
+
+        int[][] expectedSizes = {
+                null,           // WMF
+                { 427, 428 },   // PNG
+                { 371, 370 },   // PNG
+                { 288, 183 },   // PNG
+                { 285, 97 },    // PNG
+                { 288, 168 },   // PNG
+                null,           // WMF
+                null,           // WMF
+                { 199, 259 },   // PNG
+                { 432, 244 },   // PNG
+                { 261, 258 },   // PNG
+                null,           // WMF
+                null,           // WMF
+                null,           // WMF
+                null            // EMF
+        };
+
+        for (int i = 0; i < pictures.length; i++) {
+            BufferedImage image = ImageIO.read(new ByteArrayInputStream(pictures[i].getData()));
+
+            if (pictures[i].getType() != HSLFPictureShape.WMF && pictures[i].getType() != HSLFPictureShape.EMF) {
+                assertNotNull(image);
+
+                int[] dimensions = expectedSizes[i];
+                assertEquals(dimensions[0], image.getWidth());
+                assertEquals(dimensions[1], image.getHeight());
+            }
+        }
+    }
+
+    @Test
+    @Ignore("Just for visual validation - antialiasing is different on various systems")
+    public void bug54541() throws Exception {
+        String files[] = {
+//            "sample_pptx_grouping_issues.pptx",
+//            "54542_cropped_bitmap.pptx",
+//            "54541_cropped_bitmap.ppt",
+//            "54541_cropped_bitmap2.ppt",
+            "alterman_security.ppt",
+//            "alterman_security3.pptx",
+        };
+        
+        BitSet pages = new BitSet();
+        pages.set(2);
+        
+        for (String file : files) {
+            InputStream is = _slTests.openResourceAsStream(file);
+            SlideShow ss;
+            if (file.endsWith("pptx")) {
+                Class<?> cls = Class.forName("org.apache.poi.xslf.usermodel.XMLSlideShow");
+                Constructor<?> ct = cls.getDeclaredConstructor(InputStream.class);
+                ss = (SlideShow)ct.newInstance(is);
+            } else {
+                ss = new HSLFSlideShow(is);
+            }
+            is.close();
+            
+            boolean debugOut = false;
+            Dimension pg = ss.getPageSize();
+            for (Slide<?,?,?> slide : ss.getSlides()) {
+                int slideNo = slide.getSlideNumber();
+                if (!pages.get(slideNo-1)) {
+                    if (pages.nextSetBit(slideNo-1) == -1) break; else continue;
+                }
+                if (debugOut) {
+                    DummyGraphics2d graphics = new DummyGraphics2d();
+                    slide.draw(graphics);
+                } else {
+                    BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_ARGB);
+                    Graphics2D graphics = img.createGraphics();
+                    fixFonts(graphics);
+                    slide.draw(graphics);
+                    graphics.setColor(Color.BLACK);
+                    graphics.setStroke(new BasicStroke(1));
+                    graphics.drawRect(0, 0, (int)pg.getWidth()-1, (int)pg.getHeight()-1);
+                    ImageIO.write(img, "PNG", new File(file.replaceFirst(".pptx?", "-")+slideNo+".png"));
+                }
+            }
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void fixFonts(Graphics2D graphics) {
+        if (!JvmBugs.hasLineBreakMeasurerBug()) return;
+        Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(Drawable.FONT_MAP);
+        if (fontMap == null) fontMap = new HashMap<String,String>();
+        fontMap.put("Calibri", "Lucida Sans");
+        fontMap.put("Cambria", "Lucida Bright");
+        graphics.setRenderingHint(Drawable.FONT_MAP, fontMap);        
+    }
+}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
index 45d0390..61c3091 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java
@@ -22,20 +22,12 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.net.URL;
+import java.util.List;
 
 import junit.framework.TestCase;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.blip.DIB;
-import org.apache.poi.hslf.blip.EMF;
-import org.apache.poi.hslf.blip.JPEG;
-import org.apache.poi.hslf.blip.PICT;
-import org.apache.poi.hslf.blip.PNG;
-import org.apache.poi.hslf.blip.WMF;
-import org.apache.poi.hslf.model.Picture;
-import org.apache.poi.hslf.model.Shape;
-import org.apache.poi.hslf.model.Slide;
+import org.apache.poi.hslf.blip.*;
 
 /**
  * Test adding/reading pictures
@@ -51,12 +43,12 @@
      * Test read/write Macintosh PICT
      */
     public void testPICT() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         byte[] src_bytes = slTests.readFile("cow.pict");
-        int idx = ppt.addPicture(src_bytes, Picture.PICT);
-        Picture pict = new Picture(idx);
+        int idx = ppt.addPicture(src_bytes, HSLFPictureShape.PICT);
+        HSLFPictureShape pict = new HSLFPictureShape(idx);
         assertEquals(idx, pict.getPictureIndex());
         slide.addShape(pict);
 
@@ -65,21 +57,21 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
 
         //make sure we can read this picture shape and it refers to the correct picture data
-        Shape[] sh = ppt.getSlides()[0].getShapes();
-        assertEquals(1, sh.length);
-        pict = (Picture)sh[0];
+        List<HSLFShape> sh = ppt.getSlides().get(0).getShapes();
+        assertEquals(1, sh.size());
+        pict = (HSLFPictureShape)sh.get(0);
         assertEquals(idx, pict.getPictureIndex());
 
         //check picture data
-        PictureData[] pictures = ppt.getPictureData();
+        HSLFPictureData[] pictures = ppt.getPictureData();
         //the Picture shape refers to the PictureData object in the Presentation
         assertEquals(pict.getPictureData(), pictures[0]);
 
         assertEquals(1, pictures.length);
-        assertEquals(Picture.PICT, pictures[0].getType());
+        assertEquals(HSLFPictureShape.PICT, pictures[0].getType());
         assertTrue(pictures[0] instanceof PICT);
         //compare the content of the initial file with what is stored in the PictureData
         byte[] ppt_bytes = pictures[0].getData();
@@ -96,12 +88,12 @@
      * Test read/write WMF
      */
     public void testWMF() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         byte[] src_bytes = slTests.readFile("santa.wmf");
-        int idx = ppt.addPicture(src_bytes, Picture.WMF);
-        Picture pict = new Picture(idx);
+        int idx = ppt.addPicture(src_bytes, HSLFPictureShape.WMF);
+        HSLFPictureShape pict = new HSLFPictureShape(idx);
         assertEquals(idx, pict.getPictureIndex());
         slide.addShape(pict);
 
@@ -110,21 +102,21 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
 
         //make sure we can read this picture shape and it refers to the correct picture data
-        Shape[] sh = ppt.getSlides()[0].getShapes();
-        assertEquals(1, sh.length);
-        pict = (Picture)sh[0];
+        List<HSLFShape> sh = ppt.getSlides().get(0).getShapes();
+        assertEquals(1, sh.size());
+        pict = (HSLFPictureShape)sh.get(0);
         assertEquals(idx, pict.getPictureIndex());
 
         //check picture data
-        PictureData[] pictures = ppt.getPictureData();
+        HSLFPictureData[] pictures = ppt.getPictureData();
         //the Picture shape refers to the PictureData object in the Presentation
         assertEquals(pict.getPictureData(), pictures[0]);
 
         assertEquals(1, pictures.length);
-        assertEquals(Picture.WMF, pictures[0].getType());
+        assertEquals(HSLFPictureShape.WMF, pictures[0].getType());
         assertTrue(pictures[0] instanceof WMF);
         //compare the content of the initial file with what is stored in the PictureData
         byte[] ppt_bytes = pictures[0].getData();
@@ -141,13 +133,13 @@
      * Test read/write EMF
      */
     public void testEMF() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         byte[] src_bytes = slTests.readFile("wrench.emf");
-        int idx = ppt.addPicture(src_bytes, Picture.EMF);
+        int idx = ppt.addPicture(src_bytes, HSLFPictureShape.EMF);
 
-        Picture pict = new Picture(idx);
+        HSLFPictureShape pict = new HSLFPictureShape(idx);
         assertEquals(idx, pict.getPictureIndex());
         slide.addShape(pict);
 
@@ -156,21 +148,21 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
 
         //make sure we can get this picture shape and it refers to the correct picture data
-        Shape[] sh = ppt.getSlides()[0].getShapes();
-        assertEquals(1, sh.length);
-        pict = (Picture)sh[0];
+        List<HSLFShape> sh = ppt.getSlides().get(0).getShapes();
+        assertEquals(1, sh.size());
+        pict = (HSLFPictureShape)sh.get(0);
         assertEquals(idx, pict.getPictureIndex());
 
         //check picture data
-        PictureData[] pictures = ppt.getPictureData();
+        HSLFPictureData[] pictures = ppt.getPictureData();
         //the Picture shape refers to the PictureData object in the Presentation
         assertEquals(pict.getPictureData(), pictures[0]);
 
         assertEquals(1, pictures.length);
-        assertEquals(Picture.EMF, pictures[0].getType());
+        assertEquals(HSLFPictureShape.EMF, pictures[0].getType());
         assertTrue(pictures[0] instanceof EMF);
         //compare the content of the initial file with what is stored in the PictureData
         byte[] ppt_bytes = pictures[0].getData();
@@ -181,12 +173,12 @@
      * Test read/write PNG
      */
     public void testPNG() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         byte[] src_bytes = slTests.readFile("tomcat.png");
-        int idx = ppt.addPicture(src_bytes, Picture.PNG);
-        Picture pict = new Picture(idx);
+        int idx = ppt.addPicture(src_bytes, HSLFPictureShape.PNG);
+        HSLFPictureShape pict = new HSLFPictureShape(idx);
         assertEquals(idx, pict.getPictureIndex());
         slide.addShape(pict);
 
@@ -195,21 +187,21 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
 
         //make sure we can read this picture shape and it refers to the correct picture data
-        Shape[] sh = ppt.getSlides()[0].getShapes();
-        assertEquals(1, sh.length);
-        pict = (Picture)sh[0];
+        List<HSLFShape> sh = ppt.getSlides().get(0).getShapes();
+        assertEquals(1, sh.size());
+        pict = (HSLFPictureShape)sh.get(0);
         assertEquals(idx, pict.getPictureIndex());
 
         //check picture data
-        PictureData[] pictures = ppt.getPictureData();
+        HSLFPictureData[] pictures = ppt.getPictureData();
         //the Picture shape refers to the PictureData object in the Presentation
         assertEquals(pict.getPictureData(), pictures[0]);
 
         assertEquals(1, pictures.length);
-        assertEquals(Picture.PNG, pictures[0].getType());
+        assertEquals(HSLFPictureShape.PNG, pictures[0].getType());
         assertTrue(pictures[0] instanceof PNG);
         //compare the content of the initial file with what is stored in the PictureData
         byte[] ppt_bytes = pictures[0].getData();
@@ -220,13 +212,13 @@
      * Test read/write JPEG
      */
     public void testJPEG() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         byte[] src_bytes = slTests.readFile("clock.jpg");
-        int idx = ppt.addPicture(src_bytes, Picture.JPEG);
+        int idx = ppt.addPicture(src_bytes, HSLFPictureShape.JPEG);
 
-        Picture pict = new Picture(idx);
+        HSLFPictureShape pict = new HSLFPictureShape(idx);
         assertEquals(idx, pict.getPictureIndex());
         slide.addShape(pict);
 
@@ -235,21 +227,21 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
 
         //make sure we can read this picture shape and it refers to the correct picture data
-        Shape[] sh = ppt.getSlides()[0].getShapes();
-        assertEquals(1, sh.length);
-        pict = (Picture)sh[0];
+        List<HSLFShape> sh = ppt.getSlides().get(0).getShapes();
+        assertEquals(1, sh.size());
+        pict = (HSLFPictureShape)sh.get(0);
         assertEquals(idx, pict.getPictureIndex());
 
         //check picture data
-        PictureData[] pictures = ppt.getPictureData();
+        HSLFPictureData[] pictures = ppt.getPictureData();
         //the Picture shape refers to the PictureData object in the Presentation
         assertEquals(pict.getPictureData(), pictures[0]);
 
         assertEquals(1, pictures.length);
-        assertEquals(Picture.JPEG, pictures[0].getType());
+        assertEquals(HSLFPictureShape.JPEG, pictures[0].getType());
         assertTrue(pictures[0] instanceof JPEG);
         //compare the content of the initial file with what is stored in the PictureData
         byte[] ppt_bytes = pictures[0].getData();
@@ -260,12 +252,12 @@
      * Test read/write DIB
      */
     public void testDIB() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         byte[] src_bytes = slTests.readFile("clock.dib");
-        int idx = ppt.addPicture(src_bytes, Picture.DIB);
-        Picture pict = new Picture(idx);
+        int idx = ppt.addPicture(src_bytes, HSLFPictureShape.DIB);
+        HSLFPictureShape pict = new HSLFPictureShape(idx);
         assertEquals(idx, pict.getPictureIndex());
         slide.addShape(pict);
 
@@ -274,21 +266,21 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())));
+        ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray())));
 
         //make sure we can read this picture shape and it refers to the correct picture data
-        Shape[] sh = ppt.getSlides()[0].getShapes();
-        assertEquals(1, sh.length);
-        pict = (Picture)sh[0];
+        List<HSLFShape> sh = ppt.getSlides().get(0).getShapes();
+        assertEquals(1, sh.size());
+        pict = (HSLFPictureShape)sh.get(0);
         assertEquals(idx, pict.getPictureIndex());
 
         //check picture data
-        PictureData[] pictures = ppt.getPictureData();
+        HSLFPictureData[] pictures = ppt.getPictureData();
         //the Picture shape refers to the PictureData object in the Presentation
         assertEquals(pict.getPictureData(), pictures[0]);
 
         assertEquals(1, pictures.length);
-        assertEquals(Picture.DIB, pictures[0].getType());
+        assertEquals(HSLFPictureShape.DIB, pictures[0].getType());
         assertTrue(pictures[0] instanceof DIB);
         //compare the content of the initial file with what is stored in the PictureData
         byte[] ppt_bytes = pictures[0].getData();
@@ -301,34 +293,34 @@
     public void testReadPictures() throws Exception {
 
         byte[] src_bytes, ppt_bytes, b1, b2;
-        Picture pict;
-        PictureData pdata;
+        HSLFPictureShape pict;
+        HSLFPictureData pdata;
 
-        SlideShow ppt = new SlideShow(slTests.openResourceAsStream("pictures.ppt"));
-        Slide[] slides = ppt.getSlides();
-        PictureData[] pictures = ppt.getPictureData();
+        HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("pictures.ppt"));
+        List<HSLFSlide> slides = ppt.getSlides();
+        HSLFPictureData[] pictures = ppt.getPictureData();
         assertEquals(5, pictures.length);
 
-        pict = (Picture)slides[0].getShapes()[0]; //the first slide contains JPEG
+        pict = (HSLFPictureShape)slides.get(0).getShapes().get(0); //the first slide contains JPEG
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof JPEG);
-        assertEquals(Picture.JPEG, pdata.getType());
+        assertEquals(HSLFPictureShape.JPEG, pdata.getType());
         src_bytes = pdata.getData();
         ppt_bytes = slTests.readFile("clock.jpg");
         assertArrayEquals(src_bytes, ppt_bytes);
 
-        pict = (Picture)slides[1].getShapes()[0]; //the second slide contains PNG
+        pict = (HSLFPictureShape)slides.get(1).getShapes().get(0); //the second slide contains PNG
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof PNG);
-        assertEquals(Picture.PNG, pdata.getType());
+        assertEquals(HSLFPictureShape.PNG, pdata.getType());
         src_bytes = pdata.getData();
         ppt_bytes = slTests.readFile("tomcat.png");
         assertArrayEquals(src_bytes, ppt_bytes);
 
-        pict = (Picture)slides[2].getShapes()[0]; //the third slide contains WMF
+        pict = (HSLFPictureShape)slides.get(2).getShapes().get(0); //the third slide contains WMF
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof WMF);
-        assertEquals(Picture.WMF, pdata.getType());
+        assertEquals(HSLFPictureShape.WMF, pdata.getType());
         src_bytes = pdata.getData();
         ppt_bytes = slTests.readFile("santa.wmf");
         assertEquals(src_bytes.length, ppt_bytes.length);
@@ -339,10 +331,10 @@
         System.arraycopy(ppt_bytes, 22, b2, 0, b2.length);
         assertArrayEquals(b1, b2);
 
-        pict = (Picture)slides[3].getShapes()[0]; //the forth slide contains PICT
+        pict = (HSLFPictureShape)slides.get(3).getShapes().get(0); //the forth slide contains PICT
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof PICT);
-        assertEquals(Picture.PICT, pdata.getType());
+        assertEquals(HSLFPictureShape.PICT, pdata.getType());
         src_bytes = pdata.getData();
         ppt_bytes = slTests.readFile("cow.pict");
         assertEquals(src_bytes.length, ppt_bytes.length);
@@ -353,10 +345,10 @@
         System.arraycopy(ppt_bytes, 512, b2, 0, b2.length);
         assertArrayEquals(b1, b2);
 
-        pict = (Picture)slides[4].getShapes()[0]; //the fifth slide contains EMF
+        pict = (HSLFPictureShape)slides.get(4).getShapes().get(0); //the fifth slide contains EMF
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof EMF);
-        assertEquals(Picture.EMF, pdata.getType());
+        assertEquals(HSLFPictureShape.EMF, pdata.getType());
         src_bytes = pdata.getData();
         ppt_bytes = slTests.readFile("wrench.emf");
         assertArrayEquals(src_bytes, ppt_bytes);
@@ -368,33 +360,33 @@
 	 *  crazy pictures of type 0, we do our best.
 	 */
 	public void testZeroPictureType() throws Exception {
-		HSLFSlideShow hslf = new HSLFSlideShow(slTests.openResourceAsStream("PictureTypeZero.ppt"));
+		HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(slTests.openResourceAsStream("PictureTypeZero.ppt"));
 
 		// Should still have 2 real pictures
 		assertEquals(2, hslf.getPictures().length);
 		// Both are real pictures, both WMF
-		assertEquals(Picture.WMF, hslf.getPictures()[0].getType());
-		assertEquals(Picture.WMF, hslf.getPictures()[1].getType());
+		assertEquals(HSLFPictureShape.WMF, hslf.getPictures()[0].getType());
+		assertEquals(HSLFPictureShape.WMF, hslf.getPictures()[1].getType());
 
 		// Now test what happens when we use the SlideShow interface
-		SlideShow ppt = new SlideShow(hslf);
-        Slide[] slides = ppt.getSlides();
-        PictureData[] pictures = ppt.getPictureData();
-        assertEquals(12, slides.length);
+		HSLFSlideShow ppt = new HSLFSlideShow(hslf);
+        List<HSLFSlide> slides = ppt.getSlides();
+        HSLFPictureData[] pictures = ppt.getPictureData();
+        assertEquals(12, slides.size());
         assertEquals(2, pictures.length);
 
-		Picture pict;
-		PictureData pdata;
+		HSLFPictureShape pict;
+		HSLFPictureData pdata;
 
-        pict = (Picture)slides[0].getShapes()[1]; // 2nd object on 1st slide
+        pict = (HSLFPictureShape)slides.get(0).getShapes().get(1); // 2nd object on 1st slide
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof WMF);
-        assertEquals(Picture.WMF, pdata.getType());
+        assertEquals(HSLFPictureShape.WMF, pdata.getType());
 
-        pict = (Picture)slides[0].getShapes()[2]; // 3rd object on 1st slide
+        pict = (HSLFPictureShape)slides.get(0).getShapes().get(2); // 3rd object on 1st slide
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof WMF);
-        assertEquals(Picture.WMF, pdata.getType());
+        assertEquals(HSLFPictureShape.WMF, pdata.getType());
 	}
 
     /**
@@ -404,42 +396,42 @@
 	public void disabled_testZeroPictureLength() throws Exception {
         // take the data from www instead of test directory
         URL url = new URL("http://www.cs.sfu.ca/~anoop/courses/CMPT-882-Fall-2002/chris.ppt");
-		HSLFSlideShow hslf = new HSLFSlideShow(url.openStream());
+		HSLFSlideShowImpl hslf = new HSLFSlideShowImpl(url.openStream());
 
 		// Should still have 2 real pictures
 		assertEquals(2, hslf.getPictures().length);
 		// Both are real pictures, both WMF
-		assertEquals(Picture.WMF, hslf.getPictures()[0].getType());
-		assertEquals(Picture.WMF, hslf.getPictures()[1].getType());
+		assertEquals(HSLFPictureShape.WMF, hslf.getPictures()[0].getType());
+		assertEquals(HSLFPictureShape.WMF, hslf.getPictures()[1].getType());
 
 		// Now test what happens when we use the SlideShow interface
-		SlideShow ppt = new SlideShow(hslf);
-        Slide[] slides = ppt.getSlides();
-        PictureData[] pictures = ppt.getPictureData();
-        assertEquals(27, slides.length);
+		HSLFSlideShow ppt = new HSLFSlideShow(hslf);
+        List<HSLFSlide> slides = ppt.getSlides();
+        HSLFPictureData[] pictures = ppt.getPictureData();
+        assertEquals(27, slides.size());
         assertEquals(2, pictures.length);
 
-		Picture pict;
-		PictureData pdata;
+		HSLFPictureShape pict;
+		HSLFPictureData pdata;
 
-        pict = (Picture)slides[6].getShapes()[13];
+        pict = (HSLFPictureShape)slides.get(6).getShapes().get(13);
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof WMF);
-        assertEquals(Picture.WMF, pdata.getType());
+        assertEquals(HSLFPictureShape.WMF, pdata.getType());
 
-        pict = (Picture)slides[7].getShapes()[13];
+        pict = (HSLFPictureShape)slides.get(7).getShapes().get(13);
         pdata = pict.getPictureData();
         assertTrue(pdata instanceof WMF);
-        assertEquals(Picture.WMF, pdata.getType());
+        assertEquals(HSLFPictureShape.WMF, pdata.getType());
 
         //add a new picture, it should be correctly appended to the Pictures stream
         ByteArrayOutputStream out = new ByteArrayOutputStream();
-        for(PictureData p : pictures) p.write(out);
+        for(HSLFPictureData p : pictures) p.write(out);
         out.close();
 
         int streamSize = out.size();
 
-        PictureData data = PictureData.create(Picture.JPEG);
+        HSLFPictureData data = HSLFPictureData.create(HSLFPictureShape.JPEG);
         data.setData(new byte[100]);
         int offset = hslf.addPicture(data);
         assertEquals(streamSize, offset);
@@ -448,20 +440,20 @@
     }
 
     public void testGetPictureName() throws Exception {
-        SlideShow ppt = new SlideShow(slTests.openResourceAsStream("ppt_with_png.ppt"));
-        Slide slide = ppt.getSlides()[0];
+        HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("ppt_with_png.ppt"));
+        HSLFSlide slide = ppt.getSlides().get(0);
 
-        Picture p = (Picture)slide.getShapes()[0]; //the first slide contains JPEG
+        HSLFPictureShape p = (HSLFPictureShape)slide.getShapes().get(0); //the first slide contains JPEG
         assertEquals("test", p.getPictureName());
     }
 
     public void testSetPictureName() throws Exception {
-        SlideShow ppt = new SlideShow();
+        HSLFSlideShow ppt = new HSLFSlideShow();
 
-        Slide slide = ppt.createSlide();
+        HSLFSlide slide = ppt.createSlide();
         byte[] img = slTests.readFile("tomcat.png");
-        int idx = ppt.addPicture(img, Picture.PNG);
-        Picture pict = new Picture(idx);
+        int idx = ppt.addPicture(img, HSLFPictureShape.PNG);
+        HSLFPictureShape pict = new HSLFPictureShape(idx);
         pict.setPictureName("tomcat.png");
         slide.addShape(pict);
 
@@ -470,9 +462,9 @@
         ppt.write(out);
         out.close();
 
-        ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
+        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
 
-        Picture p = (Picture)ppt.getSlides()[0].getShapes()[0];
+        HSLFPictureShape p = (HSLFPictureShape)ppt.getSlides().get(0).getShapes().get(0);
         assertEquals("tomcat.png", p.getPictureName());
     }
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java
index ef8280d..c8a3d37 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestReOrderingSlides.java
@@ -18,55 +18,58 @@
 package org.apache.poi.hslf.usermodel;
 
 
+import static org.junit.Assert.assertEquals;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 
-import junit.framework.TestCase;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.*;
 import org.apache.poi.POIDataSamples;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests that SlideShow can re-order slides properly
  *
  * @author Nick Burch (nick at torchbox dot com)
  */
-public final class TestReOrderingSlides extends TestCase {
+public final class TestReOrderingSlides {
 	// A SlideShow with one slide
-	private HSLFSlideShow hss_one;
-	private SlideShow ss_one;
+	private HSLFSlideShowImpl hss_one;
+	private HSLFSlideShow ss_one;
 
 	// A SlideShow with two slides
-	private HSLFSlideShow hss_two;
-	private SlideShow ss_two;
+	private HSLFSlideShowImpl hss_two;
+	private HSLFSlideShow ss_two;
 
 	// A SlideShow with three slides
-	private HSLFSlideShow hss_three;
-	private SlideShow ss_three;
+	private HSLFSlideShowImpl hss_three;
+	private HSLFSlideShow ss_three;
 
 	/**
 	 * Create/open the slideshows
 	 */
+	@Before
 	public void setUp() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 
-		hss_one = new HSLFSlideShow(slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
-		ss_one = new SlideShow(hss_one);
+		hss_one = new HSLFSlideShowImpl(slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
+		ss_one = new HSLFSlideShow(hss_one);
 
-		hss_two = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss_two = new SlideShow(hss_two);
+		hss_two = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss_two = new HSLFSlideShow(hss_two);
 
-		hss_three = new HSLFSlideShow(slTests.openResourceAsStream("incorrect_slide_order.ppt"));
-		ss_three = new SlideShow(hss_three);
+		hss_three = new HSLFSlideShowImpl(slTests.openResourceAsStream("incorrect_slide_order.ppt"));
+		ss_three = new HSLFSlideShow(hss_three);
 	}
 
 	/**
 	 * Test that we can "re-order" a slideshow with only 1 slide on it
 	 */
+	@Test
 	public void testReOrder1() throws Exception {
 		// Has one slide
-		assertEquals(1, ss_one.getSlides().length);
-		Slide s1 = ss_one.getSlides()[0];
+		assertEquals(1, ss_one.getSlides().size());
+		HSLFSlide s1 = ss_one.getSlides().get(0);
 
 		// Check slide 1 is as expected
 		assertEquals(256, s1._getSheetNumber());
@@ -81,14 +84,14 @@
 		hss_one.write(baos);
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-		HSLFSlideShow hss_read = new HSLFSlideShow(bais);
-		SlideShow ss_read = new SlideShow(hss_read);
+		HSLFSlideShowImpl hss_read = new HSLFSlideShowImpl(bais);
+		HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
 
 		// Check it still has 1 slide
-		assertEquals(1, ss_read.getSlides().length);
+		assertEquals(1, ss_read.getSlides().size());
 
 		// And check it's as expected
-		s1 = ss_read.getSlides()[0];
+		s1 = ss_read.getSlides().get(0);
 		assertEquals(256, s1._getSheetNumber());
 		assertEquals(3, s1._getSheetRefId());
 		assertEquals(1, s1.getSlideNumber());
@@ -98,11 +101,12 @@
 	 * Test doing a dummy re-order on a slideshow with
 	 *  two slides in it
 	 */
+    @Test
 	public void testReOrder2() throws Exception {
 		// Has two slides
-		assertEquals(2, ss_two.getSlides().length);
-		Slide s1 = ss_two.getSlides()[0];
-		Slide s2 = ss_two.getSlides()[1];
+		assertEquals(2, ss_two.getSlides().size());
+		HSLFSlide s1 = ss_two.getSlides().get(0);
+		HSLFSlide s2 = ss_two.getSlides().get(1);
 
 		// Check slide 1 is as expected
 		assertEquals(256, s1._getSheetNumber());
@@ -121,15 +125,15 @@
 		hss_two.write(baos);
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-		HSLFSlideShow hss_read = new HSLFSlideShow(bais);
-		SlideShow ss_read = new SlideShow(hss_read);
+		HSLFSlideShowImpl hss_read = new HSLFSlideShowImpl(bais);
+		HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
 
 		// Check it still has 2 slides
-		assertEquals(2, ss_read.getSlides().length);
+		assertEquals(2, ss_read.getSlides().size());
 
 		// And check it's as expected
-		s1 = ss_read.getSlides()[0];
-		s2 = ss_read.getSlides()[1];
+		s1 = ss_read.getSlides().get(0);
+		s2 = ss_read.getSlides().get(1);
 		assertEquals(256, s1._getSheetNumber());
 		assertEquals(4, s1._getSheetRefId());
 		assertEquals(1, s1.getSlideNumber());
@@ -141,11 +145,12 @@
 	/**
 	 * Test re-ordering slides in a slideshow with 2 slides on it
 	 */
+    @Test
 	public void testReOrder2swap() throws Exception {
 		// Has two slides
-		assertEquals(2, ss_two.getSlides().length);
-		Slide s1 = ss_two.getSlides()[0];
-		Slide s2 = ss_two.getSlides()[1];
+		assertEquals(2, ss_two.getSlides().size());
+		HSLFSlide s1 = ss_two.getSlides().get(0);
+		HSLFSlide s2 = ss_two.getSlides().get(1);
 
 		// Check slide 1 is as expected
 		assertEquals(256, s1._getSheetNumber());
@@ -164,15 +169,15 @@
 		hss_two.write(baos);
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-		HSLFSlideShow hss_read = new HSLFSlideShow(bais);
-		SlideShow ss_read = new SlideShow(hss_read);
+		HSLFSlideShowImpl hss_read = new HSLFSlideShowImpl(bais);
+		HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
 
 		// Check it still has 2 slides
-		assertEquals(2, ss_read.getSlides().length);
+		assertEquals(2, ss_read.getSlides().size());
 
 		// And check it's as expected
-		s1 = ss_read.getSlides()[0];
-		s2 = ss_read.getSlides()[1];
+		s1 = ss_read.getSlides().get(0);
+		s2 = ss_read.getSlides().get(1);
 		assertEquals(257, s1._getSheetNumber());
 		assertEquals(6, s1._getSheetRefId());
 		assertEquals(1, s1.getSlideNumber());
@@ -185,12 +190,13 @@
 	 * Test doing a dummy re-order on a slideshow with
 	 *  three slides in it
 	 */
+    @Test
 	public void testReOrder3() throws Exception {
 		// Has three slides
-		assertEquals(3, ss_three.getSlides().length);
-		Slide s1 = ss_three.getSlides()[0];
-		Slide s2 = ss_three.getSlides()[1];
-		Slide s3 = ss_three.getSlides()[2];
+		assertEquals(3, ss_three.getSlides().size());
+		HSLFSlide s1 = ss_three.getSlides().get(0);
+		HSLFSlide s2 = ss_three.getSlides().get(1);
+		HSLFSlide s3 = ss_three.getSlides().get(2);
 
 		// Check slide 1 is as expected
 		assertEquals(256, s1._getSheetNumber());
@@ -213,16 +219,16 @@
 		hss_three.write(baos);
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-		HSLFSlideShow hss_read = new HSLFSlideShow(bais);
-		SlideShow ss_read = new SlideShow(hss_read);
+		HSLFSlideShowImpl hss_read = new HSLFSlideShowImpl(bais);
+		HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
 
 		// Check it still has 3 slides
-		assertEquals(3, ss_read.getSlides().length);
+		assertEquals(3, ss_read.getSlides().size());
 
 		// And check it's as expected
-		s1 = ss_read.getSlides()[0];
-		s2 = ss_read.getSlides()[1];
-		s3 = ss_read.getSlides()[2];
+		s1 = ss_read.getSlides().get(0);
+		s2 = ss_read.getSlides().get(1);
+		s3 = ss_read.getSlides().get(2);
 
 		assertEquals(256, s1._getSheetNumber());
 		assertEquals(3, s1._getSheetRefId());
@@ -238,12 +244,13 @@
 	/**
 	 * Test re-ordering slides in a slideshow with 3 slides on it
 	 */
+    @Test
 	public void testReOrder3swap() throws Exception {
 		// Has three slides
-		assertEquals(3, ss_three.getSlides().length);
-		Slide s1 = ss_three.getSlides()[0];
-		Slide s2 = ss_three.getSlides()[1];
-		Slide s3 = ss_three.getSlides()[2];
+		assertEquals(3, ss_three.getSlides().size());
+		HSLFSlide s1 = ss_three.getSlides().get(0);
+		HSLFSlide s2 = ss_three.getSlides().get(1);
+		HSLFSlide s3 = ss_three.getSlides().get(2);
 
 		// Check slide 1 is as expected
 		assertEquals(256, s1._getSheetNumber());
@@ -262,25 +269,37 @@
 		// (1 -> 2, 2 -> 3)
 		ss_three.reorderSlide(3, 1);
 
+		// refresh the slides
+		s1 = ss_three.getSlides().get(0);
+        s2 = ss_three.getSlides().get(1);
+        s3 = ss_three.getSlides().get(2);
+		
+		assertEquals(1, s1.getSlideNumber());
+        assertEquals(2, s2.getSlideNumber());
+        assertEquals(3, s3.getSlideNumber());
+        
+        assertEquals("Slide 3", ((HSLFTextShape)s1.getShapes().get(0)).getText());
+        assertEquals("Slide 1", ((HSLFTextShape)s3.getShapes().get(0)).getText());
+
 		// Write out, and read back in
 		ByteArrayOutputStream baos = new ByteArrayOutputStream();
 		hss_three.write(baos);
 		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-		HSLFSlideShow hss_read = new HSLFSlideShow(bais);
-		SlideShow ss_read = new SlideShow(hss_read);
+		HSLFSlideShowImpl hss_read = new HSLFSlideShowImpl(bais);
+		HSLFSlideShow ss_read = new HSLFSlideShow(hss_read);
 
 		// Check it still has 3 slides
-		assertEquals(3, ss_read.getSlides().length);
+		assertEquals(3, ss_read.getSlides().size());
 
 		// And check it's as expected
-		Slide _s1 = ss_read.getSlides()[0];
-		Slide _s2 = ss_read.getSlides()[1];
-		Slide _s3 = ss_read.getSlides()[2];
+		HSLFSlide _s1 = ss_read.getSlides().get(0);
+		HSLFSlide _s2 = ss_read.getSlides().get(1);
+		HSLFSlide _s3 = ss_read.getSlides().get(2);
 
         // 1 --> 3
-        assertEquals(s1._getSheetNumber(), _s3._getSheetNumber());
-		assertEquals(s1._getSheetRefId(), _s3._getSheetRefId());
+        assertEquals(s1._getSheetNumber(), _s1._getSheetNumber());
+		assertEquals(s1._getSheetRefId(), _s1._getSheetRefId());
 		assertEquals(1, s1.getSlideNumber());
 
         // 2nd slide is not updated
@@ -289,8 +308,8 @@
 		assertEquals(2, s2.getSlideNumber());
 
         // 3 --> 1
-        assertEquals(s3._getSheetNumber(), _s1._getSheetNumber());
-        assertEquals(s3._getSheetRefId(), _s1._getSheetRefId());
+        assertEquals(s3._getSheetNumber(), _s3._getSheetNumber());
+        assertEquals(s3._getSheetRefId(), _s3._getSheetRefId());
 		assertEquals(3, s3.getSlideNumber());
 	}
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java
index 5475dae..cbaa02e 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRecordSetup.java
@@ -17,13 +17,12 @@
 
 package org.apache.poi.hslf.usermodel;
 
+import static org.junit.Assert.assertEquals;
 
-import junit.framework.TestCase;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.record.ParentAwareRecord;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.RecordContainer;
 import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.record.*;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests that the record setup done by SlideShow
@@ -32,17 +31,20 @@
  *
  * @author Nick Burch (nick at torchbox dot com)
  */
-public final class TestRecordSetup extends TestCase {
+public final class TestRecordSetup {
 	// SlideShow primed on the test data
-	private SlideShow ss;
-	private HSLFSlideShow hss;
+	@SuppressWarnings("unused")
+    private HSLFSlideShow ss;
+	private HSLFSlideShowImpl hss;
 
-	public TestRecordSetup() throws Exception {
+	@Before
+	public void init() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss = new SlideShow(hss);
+		hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss = new HSLFSlideShow(hss);
 	}
 
+	@Test
 	public void testHandleParentAwareRecords() {
 		Record[] records = hss.getRecords();
 		for(int i=0; i<records.length; i++) {
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java
index a71b72a..ce49cd5 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java
@@ -17,89 +17,93 @@
 
 package org.apache.poi.hslf.usermodel;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
+import static org.junit.Assert.*;
+import static org.apache.poi.POITestCase.assertContains;
+
+import java.io.*;
+import java.util.List;
 
 import org.apache.poi.POIDataSamples;
-import org.apache.poi.POITestCase;
-import org.apache.poi.hslf.HSLFSlideShow;
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.TextBox;
-import org.apache.poi.hslf.model.TextRun;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.hslf.record.SlideListWithText;
+import org.apache.poi.hslf.record.*;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.util.IOUtils;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Test that the friendly getters and setters on RichTextRun
  *  behave as expected.
  * (model.TestTextRun tests the other functionality)
  */
-public final class TestRichTextRun extends POITestCase {
-   private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
+public final class TestRichTextRun {
+    private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
-   // SlideShow primed on the test data
-   private SlideShow ss;
-   private SlideShow ssRichA;
-   private SlideShow ssRichB;
-   private SlideShow ssRichC;
-   private SlideShow ssChinese;
-   private HSLFSlideShow hss;
-   private HSLFSlideShow hssRichA;
-   private HSLFSlideShow hssRichB;
-   private HSLFSlideShow hssRichC;
-   private HSLFSlideShow hssChinese;
-   private static String filenameC;
+    // SlideShow primed on the test data
+    private HSLFSlideShow ss;
+    private HSLFSlideShow ssRichA;
+    private HSLFSlideShow ssRichB;
+    private HSLFSlideShow ssRichC;
+    private HSLFSlideShow ssChinese;
+    private HSLFSlideShowImpl hss;
+    private HSLFSlideShowImpl hssRichA;
+    private HSLFSlideShowImpl hssRichB;
+    private HSLFSlideShowImpl hssRichC;
+    private HSLFSlideShowImpl hssChinese;
+    private static String filenameC;
 
-   protected void setUp() throws Exception {
-      // Basic (non rich) test file
-      hss = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-      ss = new SlideShow(hss);
+    @Before
+    public void setUp() throws Exception {
+        // Basic (non rich) test file
+        hss = new HSLFSlideShowImpl(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+        ss = new HSLFSlideShow(hss);
 
-		// Rich test file A
-		hssRichA = new HSLFSlideShow(_slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
-		ssRichA = new SlideShow(hssRichA);
-
-		// Rich test file B
-		hssRichB = new HSLFSlideShow(_slTests.openResourceAsStream("Single_Coloured_Page_With_Fonts_and_Alignments.ppt"));
-		ssRichB = new SlideShow(hssRichB);
-
-		// Rich test file C - has paragraph styles that run out before
-		//   the character ones do
-		filenameC = "ParagraphStylesShorterThanCharStyles.ppt";
-        hssRichC = new HSLFSlideShow(_slTests.openResourceAsStream(filenameC));
-		ssRichC = new SlideShow(hssRichC);
-		
-		// Rich test file with Chinese + English text in it
-      hssChinese = new HSLFSlideShow(_slTests.openResourceAsStream("54880_chinese.ppt"));
-      ssChinese = new SlideShow(hssChinese);
-	}
+        // Rich test file A
+        hssRichA = new HSLFSlideShowImpl(_slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
+        ssRichA = new HSLFSlideShow(hssRichA);
+        
+        // Rich test file B
+        hssRichB = new HSLFSlideShowImpl(_slTests.openResourceAsStream("Single_Coloured_Page_With_Fonts_and_Alignments.ppt"));
+        ssRichB = new HSLFSlideShow(hssRichB);
+        
+        // Rich test file C - has paragraph styles that run out before
+        //   the character ones do
+        filenameC = "ParagraphStylesShorterThanCharStyles.ppt";
+        hssRichC = new HSLFSlideShowImpl(_slTests.openResourceAsStream(filenameC));
+        ssRichC = new HSLFSlideShow(hssRichC);
+        
+        // Rich test file with Chinese + English text in it
+        hssChinese = new HSLFSlideShowImpl(_slTests.openResourceAsStream("54880_chinese.ppt"));
+        ssChinese = new HSLFSlideShow(hssChinese);
+    }
 
 	/**
 	 * Test the stuff about getting/setting bold
 	 *  on a non rich text run
 	 */
+    @Test
 	public void testBoldNonRich() {
-		Slide slideOne = ss.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-		RichTextRun rtr = textRuns[0].getRichTextRuns()[0];
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
+		List<HSLFTextParagraph> textParas = textParass.get(0);
+		HSLFTextRun rtr = textParas.get(0).getTextRuns().get(0);
 
-		assertNull(rtr._getRawCharacterStyle());
-		assertNull(rtr._getRawParagraphStyle());
+		assertNotNull(rtr.getCharacterStyle());
+		assertNotNull(textParas.get(0).getParagraphStyle());
 		assertFalse(rtr.isBold());
 
 		// Now set it to not bold
 		rtr.setBold(false);
-		//setting bold=false doesn't change the internal state
-		assertNull(rtr._getRawCharacterStyle());
-		assertNull(rtr._getRawParagraphStyle());
+		// in Pre 3.12: setting bold=false doesn't change the internal state
+		// now: also allow explicitly disable styles and there aren't any non rich text runs anymore
+		assertNotNull(rtr.getCharacterStyle());
+		assertNotNull(textParas.get(0).getParagraphStyle());
 
 		assertFalse(rtr.isBold());
 
 		// And now make it bold
 		rtr.setBold(true);
-		assertNotNull(rtr._getRawCharacterStyle());
-		assertNotNull(rtr._getRawParagraphStyle());
+		assertNotNull(rtr.getCharacterStyle());
+        assertNotNull(textParas.get(0).getParagraphStyle());
 		assertTrue(rtr.isBold());
 	}
 
@@ -107,140 +111,141 @@
 	 * Test the stuff about getting/setting bold
 	 *  on a rich text run
 	 */
+    @Test
 	public void testBoldRich() {
-		Slide slideOneR = ssRichA.getSlides()[0];
-		TextRun[] textRunsR = slideOneR.getTextRuns();
-		RichTextRun[] rtrs = textRunsR[1].getRichTextRuns();
-		assertEquals(3, rtrs.length);
+		HSLFSlide slideOneR = ssRichA.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParass = slideOneR.getTextParagraphs();
+		List<HSLFTextParagraph> textParas = textParass.get(1);
+		assertEquals(3, textParas.size());
 
-		assertTrue(rtrs[0].isBold());
-		assertFalse(rtrs[1].isBold());
-		assertFalse(rtrs[2].isBold());
+		assertTrue(textParas.get(0).getTextRuns().get(0).isBold());
+		assertFalse(textParas.get(1).getTextRuns().get(0).isBold());
+		assertFalse(textParas.get(2).getTextRuns().get(0).isBold());
 
-		rtrs[0].setBold(true);
-		rtrs[1].setBold(true);
+		textParas.get(0).getTextRuns().get(0).setBold(true);
+		textParas.get(1).getTextRuns().get(0).setBold(true);
 
-		assertTrue(rtrs[0].isBold());
-		assertTrue(rtrs[1].isBold());
+		assertTrue(textParas.get(0).getTextRuns().get(0).isBold());
+		assertTrue(textParas.get(1).getTextRuns().get(0).isBold());
 
-		rtrs[0].setBold(false);
-		rtrs[1].setBold(false);
+		textParas.get(0).getTextRuns().get(0).setBold(false);
+		textParas.get(1).getTextRuns().get(0).setBold(false);
 
-		assertFalse(rtrs[0].isBold());
-		assertFalse(rtrs[1].isBold());
+		assertFalse(textParas.get(0).getTextRuns().get(0).isBold());
+		assertFalse(textParas.get(1).getTextRuns().get(0).isBold());
 	}
 
 	/**
 	 * Tests getting and setting the font size on rich and non
 	 *  rich text runs
 	 */
+    @Test
 	public void testFontSize() {
 
-		Slide slideOne = ss.getSlides()[0];
-		TextRun[] textRuns = slideOne.getTextRuns();
-		RichTextRun rtr = textRuns[0].getRichTextRuns()[0];
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
+		HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0);
 
-		Slide slideOneR = ssRichB.getSlides()[0];
-		TextRun[] textRunsR = slideOneR.getTextRuns();
-		RichTextRun rtrRa = textRunsR[0].getRichTextRuns()[0];
-		RichTextRun rtrRb = textRunsR[1].getRichTextRuns()[0];
-		RichTextRun rtrRc = textRunsR[1].getRichTextRuns()[3];
+		HSLFSlide slideOneR = ssRichB.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParassR = slideOneR.getTextParagraphs();
+		HSLFTextRun rtrRa = textParassR.get(0).get(0).getTextRuns().get(0);
+		HSLFTextRun rtrRb = textParassR.get(1).get(0).getTextRuns().get(0);
+		HSLFTextRun rtrRc = textParassR.get(1).get(3).getTextRuns().get(0);
 
 		String defaultFont = "Arial";
 
 		// Start off with rich one
 		// First run has defaults
-		assertEquals(44, rtrRa.getFontSize());
-		assertEquals(defaultFont, rtrRa.getFontName());
+		assertEquals(44, rtrRa.getFontSize(), 0);
+		assertEquals(defaultFont, rtrRa.getFontFamily());
 
 		// Second is size 20, default font
-		assertEquals(20, rtrRb.getFontSize());
-		assertEquals(defaultFont, rtrRb.getFontName());
+		assertEquals(20, rtrRb.getFontSize(), 0);
+		assertEquals(defaultFont, rtrRb.getFontFamily());
 		// Third is size 24, alt font
-		assertEquals(24, rtrRc.getFontSize());
-		assertEquals("Times New Roman", rtrRc.getFontName());
+		assertEquals(24, rtrRc.getFontSize(), 0);
+		assertEquals("Times New Roman", rtrRc.getFontFamily());
 
 		// Change 2nd to different size and font
 		assertEquals(2, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR
-		rtrRb.setFontSize(18);
-		rtrRb.setFontName("Courier");
+		rtrRb.setFontSize(18d);
+		rtrRb.setFontFamily("Courier");
 		assertEquals(3, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR + Courier
-		assertEquals(18, rtrRb.getFontSize());
-		assertEquals("Courier", rtrRb.getFontName());
+		assertEquals(18, rtrRb.getFontSize(), 0);
+		assertEquals("Courier", rtrRb.getFontFamily());
 
 
 		// Now do non rich one
-		assertEquals(44, rtr.getFontSize());
-		assertEquals(defaultFont, rtr.getFontName());
+		assertEquals(44, rtr.getFontSize(), 0);
+		assertEquals(defaultFont, rtr.getFontFamily());
 		assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default
-		assertNull(rtr._getRawCharacterStyle());
-		assertNull(rtr._getRawParagraphStyle());
+		assertNotNull(rtr.getCharacterStyle());
+		assertNotNull(rtr.getTextParagraph().getParagraphStyle());
 
 		// Change Font size
-		rtr.setFontSize(99);
-		assertEquals(99, rtr.getFontSize());
-		assertEquals(defaultFont, rtr.getFontName());
-		assertNotNull(rtr._getRawCharacterStyle());
-		assertNotNull(rtr._getRawParagraphStyle());
+		rtr.setFontSize(99d);
+		assertEquals(99, rtr.getFontSize(), 0);
+		assertEquals(defaultFont, rtr.getFontFamily());
+		assertNotNull(rtr.getCharacterStyle());
+		assertNotNull(rtr.getTextParagraph().getParagraphStyle());
 		assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default
 
 		// Change Font size and name
-		rtr.setFontSize(25);
-		rtr.setFontName("Times New Roman");
-		assertEquals(25, rtr.getFontSize());
-		assertEquals("Times New Roman", rtr.getFontName());
-		assertNotNull(rtr._getRawCharacterStyle());
-		assertNotNull(rtr._getRawParagraphStyle());
+		rtr.setFontSize(25d);
+		rtr.setFontFamily("Times New Roman");
+		assertEquals(25, rtr.getFontSize(), 0);
+		assertEquals("Times New Roman", rtr.getFontFamily());
+		assertNotNull(rtr.getCharacterStyle());
+		assertNotNull(rtr.getTextParagraph().getParagraphStyle());
 		assertEquals(2, ss.getFontCollection().getChildRecords().length);
 	}
 
+    @Test
 	public void testChangeWriteRead() throws Exception {
-		HSLFSlideShow[] h = new HSLFSlideShow[] { hss, hssRichA, hssRichB };
-		Slide[] s = new Slide[] { ss.getSlides()[0], ssRichA.getSlides()[0], ssRichB.getSlides()[0] };
-
-		for(int i=0; i<h.length; i++) {
+		for(HSLFSlideShow h : new HSLFSlideShow[] { ss, ssRichA, ssRichB }) {
 			// Change
-			Slide slideOne = s[i];
-			TextRun[] textRuns = slideOne.getTextRuns();
-			RichTextRun rtr = textRuns[0].getRichTextRuns()[0];
-
+			HSLFSlide slideOne = h.getSlides().get(0);
+			List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
+			HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0);
+			
 			rtr.setBold(true);
-			rtr.setFontSize(18);
-			rtr.setFontName("Courier");
+			rtr.setFontSize(18d);
+			rtr.setFontFamily("Courier");
+            HSLFTextParagraph.storeText(textParass.get(0));
 
 			// Check it took those
-			assertEquals(true, rtr.isBold());
-			assertEquals(18, rtr.getFontSize());
-			assertEquals("Courier", rtr.getFontName());
+			assertTrue(rtr.isBold());
+			assertEquals(18., rtr.getFontSize(), 0);
+			assertEquals("Courier", rtr.getFontFamily());
 
 			// Write out and back in
 			ByteArrayOutputStream baos = new ByteArrayOutputStream();
-			h[i].write(baos);
+			h.write(baos);
 			ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
 
-			HSLFSlideShow readHSLF = new HSLFSlideShow(bais);
-			SlideShow readS = new SlideShow(readHSLF);
+			HSLFSlideShowImpl readHSLF = new HSLFSlideShowImpl(bais);
+			HSLFSlideShow readS = new HSLFSlideShow(readHSLF);
 
 			// Tweak existing one again, to ensure really worked
 			rtr.setBold(false);
-			rtr.setFontSize(17);
-			rtr.setFontName("CourierZZ");
+			rtr.setFontSize(17d);
+			rtr.setFontFamily("CourierZZ");
 
 			// Check it took those changes
-			assertEquals(false, rtr.isBold());
-			assertEquals(17, rtr.getFontSize());
-			assertEquals("CourierZZ", rtr.getFontName());
+			assertFalse(rtr.isBold());
+			assertEquals(17., rtr.getFontSize(), 0);
+			assertEquals("CourierZZ", rtr.getFontFamily());
 
 
 			// Now, look at the one we changed, wrote out, and read back in
 			// Ensure it does contain our original modifications
-			Slide slideOneRR = readS.getSlides()[0];
-			TextRun[] textRunsRR = slideOneRR.getTextRuns();
-			RichTextRun rtrRRa = textRunsRR[0].getRichTextRuns()[0];
+			HSLFSlide slideOneRR = readS.getSlides().get(0);
+			List<List<HSLFTextParagraph>> textParassRR = slideOneRR.getTextParagraphs();
+			HSLFTextRun rtrRRa = textParassRR.get(0).get(0).getTextRuns().get(0);
 
-			assertEquals(true, rtrRRa.isBold());
-			assertEquals(18, rtrRRa.getFontSize());
-			assertEquals("Courier", rtrRRa.getFontName());
+			assertTrue(rtrRRa.isBold());
+			assertEquals(18., rtrRRa.getFontSize(), 0);
+			assertEquals("Courier", rtrRRa.getFontFamily());
 		}
 	}
 
@@ -248,16 +253,17 @@
 	 * Test that we can do the right things when the paragraph styles
 	 *  run out before the character styles do
 	 */
+    @Test
 	public void testParagraphStylesShorterTheCharStyles() {
 		// Check we have the right number of sheets
-		Slide[] slides = ssRichC.getSlides();
-		assertEquals(14, slides.length);
+		List<HSLFSlide> slides = ssRichC.getSlides();
+		assertEquals(14, slides.size());
 
 		// Check the number of text runs on interesting sheets
-		Slide slideThreeC = ssRichC.getSlides()[2];
-		Slide slideSevenC = ssRichC.getSlides()[6];
-		assertEquals(3, slideThreeC.getTextRuns().length);
-		assertEquals(5, slideSevenC.getTextRuns().length);
+		HSLFSlide slideThreeC = ssRichC.getSlides().get(2);
+		HSLFSlide slideSevenC = ssRichC.getSlides().get(6);
+		assertEquals(4, slideThreeC.getTextParagraphs().size());
+		assertEquals(5, slideSevenC.getTextParagraphs().size());
 
 		// On slide three, we should have:
 		// TR:
@@ -269,32 +275,20 @@
 		//   Illustrative Example
 		//   .
 
-		TextRun[] s3tr = slideThreeC.getTextRuns();
-		RichTextRun[] s3rtr0 = s3tr[0].getRichTextRuns();
-		RichTextRun[] s3rtr1 = s3tr[1].getRichTextRuns();
-		RichTextRun[] s3rtr2 = s3tr[2].getRichTextRuns();
+        List<List<HSLFTextParagraph>> s3tr = slideThreeC.getTextParagraphs();
+		List<HSLFTextRun> s3rtr0 = s3tr.get(0).get(0).getTextRuns();
+		List<HSLFTextRun> s3rtr1 = s3tr.get(2).get(0).getTextRuns();
+		List<HSLFTextRun> s3rtr2 = s3tr.get(3).get(0).getTextRuns();
 
-		assertEquals(2, s3rtr0.length);
-		assertEquals(1, s3rtr1.length);
-		assertEquals(2, s3rtr2.length);
+		assertEquals(2, s3rtr0.size());
+		assertEquals(1, s3rtr1.size());
+		assertEquals(2, s3rtr2.size());
 
-		assertEquals("You are an important supplier of various items that I need", s3rtr0[0].getText());
-		assertEquals("", s3rtr0[1].getText());
-		assertEquals("Source: Internal focus groups", s3rtr1[0].getText());
-		assertEquals("Illustrative Example", s3rtr2[0].getText());
-		assertEquals("", s3rtr2[1].getText());
-
-		assertTrue(s3rtr0[0]._isParagraphStyleShared());
-		assertTrue(s3rtr0[1]._isParagraphStyleShared());
-		assertFalse(s3rtr1[0]._isParagraphStyleShared());
-		assertTrue(s3rtr2[0]._isParagraphStyleShared());
-		assertTrue(s3rtr2[1]._isParagraphStyleShared());
-
-		assertFalse(s3rtr0[0]._isCharacterStyleShared());
-		assertFalse(s3rtr0[1]._isCharacterStyleShared());
-		assertFalse(s3rtr1[0]._isCharacterStyleShared());
-		assertFalse(s3rtr2[0]._isCharacterStyleShared());
-		assertFalse(s3rtr2[1]._isCharacterStyleShared());
+		assertEquals("You are an important supplier of various items that I need", s3rtr0.get(0).getRawText());
+		assertEquals("", s3rtr0.get(1).getRawText());
+		assertEquals("Source: Internal focus groups", s3rtr1.get(0).getRawText());
+		assertEquals("Illustrative Example", s3rtr2.get(0).getRawText());
+		assertEquals("", s3rtr2.get(1).getRawText());
 
 		// On slide seven, we have:
 		// TR:
@@ -303,26 +297,14 @@
 		//  <ps>(text a)</ps><ps>(text a)(text b)</ps>
 		// TR:
 		//  (text)
-		TextRun[] s7tr = slideSevenC.getTextRuns();
-		RichTextRun[] s7rtr0 = s7tr[0].getRichTextRuns();
-		RichTextRun[] s7rtr1 = s7tr[1].getRichTextRuns();
-		RichTextRun[] s7rtr2 = s7tr[2].getRichTextRuns();
+		List<List<HSLFTextParagraph>> s7tr = slideSevenC.getTextParagraphs();
+		List<HSLFTextParagraph> s7rtr0 = s7tr.get(0);
+		List<HSLFTextParagraph> s7rtr1 = s7tr.get(1);
+		List<HSLFTextParagraph> s7rtr2 = s7tr.get(2);
 
-		assertEquals(1, s7rtr0.length);
-		assertEquals(3, s7rtr1.length);
-		assertEquals(1, s7rtr2.length);
-
-		assertFalse(s7rtr0[0]._isParagraphStyleShared());
-		assertFalse(s7rtr1[0]._isParagraphStyleShared());
-		assertTrue(s7rtr1[1]._isParagraphStyleShared());
-		assertTrue(s7rtr1[2]._isParagraphStyleShared());
-		assertFalse(s7rtr2[0]._isParagraphStyleShared());
-
-		assertFalse(s7rtr0[0]._isCharacterStyleShared());
-		assertTrue(s7rtr1[0]._isCharacterStyleShared());
-		assertTrue(s7rtr1[1]._isCharacterStyleShared());
-		assertFalse(s7rtr1[2]._isCharacterStyleShared());
-		assertFalse(s7rtr2[0]._isCharacterStyleShared());
+		assertEquals(1, s7rtr0.size());
+		assertEquals(8, s7rtr1.size());
+		assertEquals(1, s7rtr2.size());
 	}
 
 	/**
@@ -330,39 +312,44 @@
 	 *  run out before the character styles do, when we tweak something
 	 *  and write back out.
 	 */
-	public void testParagraphStylesShorterTheCharStylesWrite() throws Exception {
+    @Test
+	@SuppressWarnings("unused")
+    public void testParagraphStylesShorterTheCharStylesWrite() throws Exception {
 		assertMatchesSLTWC(ssRichC);
 		assertMatchesFileC(ssRichC);
 
-		Slide slideSevenC = ssRichC.getSlides()[6];
-		TextRun[] s7tr = slideSevenC.getTextRuns();
-		RichTextRun[] s7rtr0 = s7tr[0].getRichTextRuns();
-		RichTextRun[] s7rtr1 = s7tr[1].getRichTextRuns();
-		RichTextRun[] s7rtr2 = s7tr[2].getRichTextRuns();
+		HSLFSlide slideSevenC = ssRichC.getSlides().get(6);
+		List<List<HSLFTextParagraph>> s7tr = slideSevenC.getTextParagraphs();
+		List<HSLFTextRun> s7rtr0 = s7tr.get(0).get(0).getTextRuns();
+		List<HSLFTextRun> s7rtr1 = s7tr.get(1).get(0).getTextRuns();
+		List<HSLFTextRun> s7rtr2 = s7tr.get(2).get(0).getTextRuns();
 
 		String oldText;
 
 		// Reset the text on the last run
 		// Need to ensure it's a run that really has styles!
-		oldText = s7rtr2[0].getRawText();
-		s7rtr2[0].setText( oldText );
-		assertEquals(oldText, s7rtr2[0].getText());
-		assertEquals(oldText, s7tr[2].getText());
-		assertEquals(oldText.length() + 1, s7rtr2[0]._getRawCharacterStyle().getCharactersCovered());
-		assertEquals(oldText.length() + 1, s7rtr2[0]._getRawParagraphStyle().getCharactersCovered());
+		oldText = s7rtr2.get(0).getRawText();
+		s7rtr2.get(0).setText( oldText );
+		HSLFTextParagraph.storeText(s7tr.get(2));
+		assertEquals(oldText, s7rtr2.get(0).getRawText());
+		assertEquals(oldText, HSLFTextParagraph.getRawText(s7tr.get(2)));
+		assertEquals(oldText.length() + 1, s7rtr2.get(0).getCharacterStyle().getCharactersCovered());
+		assertEquals(oldText.length() + 1, s7rtr2.get(0).getTextParagraph().getParagraphStyle().getCharactersCovered());
 		assertMatchesSLTWC(ssRichC);
 		assertMatchesFileC(ssRichC);
 
 		// Reset the text on a shared paragraph
-		oldText = s7rtr1[2].getRawText();
-		s7rtr1[2].setText( oldText );
-		assertEquals(oldText, s7rtr1[2].getText());
-		assertEquals(oldText.length() + 1, s7rtr1[2]._getRawCharacterStyle().getCharactersCovered());
+		oldText = s7rtr1.get(0).getRawText();
+		s7rtr1.get(0).setText( oldText );
+        HSLFTextParagraph.storeText(s7tr.get(1));
+		assertEquals(oldText, s7rtr1.get(0).getRawText());
+		assertEquals(oldText.length(), s7rtr1.get(0).getCharacterStyle().getCharactersCovered());
 		assertMatchesSLTWC(ssRichC);
 		assertMatchesFileC(ssRichC);
 
 		// Reset the text on a shared paragraph+character
-		s7rtr1[1].setText( s7rtr1[1].getRawText() );
+		s7rtr1.get(0).setText( s7rtr1.get(0).getRawText() );
+		HSLFTextParagraph.storeText(s7tr.get(1));
 		assertMatchesSLTWC(ssRichC);
 		assertMatchesFileC(ssRichC);
 	}
@@ -374,9 +361,9 @@
 	 *  contents.
 	 * @param s
 	 */
-	private void assertMatchesSLTWC(SlideShow s) throws Exception {
+	private void assertMatchesSLTWC(HSLFSlideShow s) throws Exception {
 		// Grab a new copy of slideshow C
-		SlideShow refC = new SlideShow(_slTests.openResourceAsStream(filenameC));
+		HSLFSlideShow refC = new HSLFSlideShow(_slTests.openResourceAsStream(filenameC));
 
 		// Write out the 2nd SLWT in the active document
 		SlideListWithText refSLWT = refC.getDocumentRecord().getSlideListWithTexts()[1];
@@ -394,53 +381,43 @@
 
 			byte[] r_rb = writeRecord(ref_r);
 			byte[] s_rb = writeRecord(s_r);
-			assertEquals(r_rb.length, s_rb.length);
-			for(int j=0; j<r_rb.length; j++) {
-				assertEquals(r_rb[j],s_rb[j]);
-			}
+			assertArrayEquals(r_rb, s_rb);
 		}
 
 		// Check the bytes are the same
-		assertEquals(raw_slwt.length, s_slwt.length);
-		for(int i=0; i<raw_slwt.length; i++) {
-			assertEquals(raw_slwt[i], s_slwt[i]);
-		}
+		assertArrayEquals(raw_slwt, s_slwt);
 	}
 
 	/**
 	 * Checks that the supplied slideshow still matches the bytes
 	 *  of slideshow c
 	 */
-	private static void assertMatchesFileC(SlideShow s) throws Exception {
-		if (true) { // TODO - test is disabled, pending fix of bug #39800
-			// System.err.println("Skipping test, as would be marked as failed due to bug #39800"); //
-			return;
-		}
-if(false) {
+	private static void assertMatchesFileC(HSLFSlideShow s) throws Exception {
 		// Grab the bytes of the file
-		FileInputStream fin = new FileInputStream(filenameC);
-		ByteArrayOutputStream fb = new ByteArrayOutputStream();
-		byte[] b = new byte[4096];
-		int read = 0;
-		while(read != -1) {
-			read = fin.read(b);
-			if(read > 0) {
-				fb.write(b, 0, read);
-			}
-		}
-		byte[] raw_file = fb.toByteArray();
+	    NPOIFSFileSystem fs = new NPOIFSFileSystem(_slTests.getFile(filenameC));
+	    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+	    InputStream is = fs.createDocumentInputStream("PowerPoint Document");
+	    IOUtils.copy(is, baos);
+	    is.close();
+	    fs.close();
+	    byte[] raw_file = baos.toByteArray();
 
 		// Now write out the slideshow
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
+		baos.reset();
 		s.write(baos);
+		fs = new NPOIFSFileSystem(new ByteArrayInputStream(baos.toByteArray()));
+		baos.reset();
+		is = fs.createDocumentInputStream("PowerPoint Document");
+        IOUtils.copy(is, baos);
+        is.close();
+        fs.close();		
 		byte[] raw_ss = baos.toByteArray();
-
+		
+		// different paragraph mask, because of sanitizing
+		raw_ss[169030] = 0x0a;
+		
 		// Ensure they're the same
-		assertEquals(raw_file.length, raw_ss.length);
-		for(int i=0; i<raw_file.length; i++) {
-			assertEquals(raw_file[i], raw_ss[i]);
-		}
-}
+		assertArrayEquals(raw_file, raw_ss);
 	}
 
 	private byte[] writeRecord(Record r) throws Exception {
@@ -449,15 +426,13 @@
 		return baos.toByteArray();
 	}
 
+    @Test
 	public void testIndentationLevel() throws Exception {
-		SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt"));
-		Slide[] sl = ppt.getSlides();
-		for (int i = 0; i < sl.length; i++) {
-			TextRun[] txt = sl[i].getTextRuns();
-			for (int j = 0; j < txt.length; j++) {
-				RichTextRun[] rt = txt[j].getRichTextRuns();
-				for (int k = 0; k < rt.length; k++) {
-					int indent = rt[k].getIndentLevel();
+		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ParagraphStylesShorterThanCharStyles.ppt"));
+		for (HSLFSlide sl : ppt.getSlides()) {
+			for (List<HSLFTextParagraph> txt : sl.getTextParagraphs()) {
+				for (HSLFTextParagraph p : txt) {
+					int indent = p.getIndentLevel();
 					assertTrue(indent >= 0 && indent <= 4 );
 				}
 
@@ -465,79 +440,85 @@
 		}
 	}
 
+    @Test
 	public void testReadParagraphStyles() throws Exception {
-		SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("bullets.ppt"));
+		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt"));
 		assertTrue("No Exceptions while reading file", true);
 
-		RichTextRun rt;
-		TextRun[] txt;
-		Slide[] slide = ppt.getSlides();
-		assertEquals(2, slide.length);
+		HSLFTextParagraph rt;
+		List<List<HSLFTextParagraph>> txt;
+		List<HSLFSlide> slide = ppt.getSlides();
+		assertEquals(2, slide.size());
 
-		txt = slide[0].getTextRuns();
-		assertEquals(2, txt.length);
+		txt = slide.get(0).getTextParagraphs();
+		assertEquals(2, txt.size());
 
-		assertEquals("Title text", txt[0].getRawText());
-		assertEquals(1, txt[0].getRichTextRuns().length);
-		rt = txt[0].getRichTextRuns()[0];
+		assertEquals("Title text", HSLFTextParagraph.getRawText(txt.get(0)));
+		assertEquals(1, txt.get(0).size());
+		rt = txt.get(0).get(0);
 		assertFalse(rt.isBullet());
 
-		assertEquals(
-				"This is a text placeholder that \r" +
-				"follows the design pattern\r" +
-				"Defined in the slide master\r" +
-				"and has bullets by default", txt[1].getRawText());
-		assertEquals(1, txt[1].getRichTextRuns().length);
-		rt = txt[1].getRichTextRuns()[0];
-		assertEquals('\u2022', rt.getBulletChar());
+		String expected =
+	        "This is a text placeholder that \r" +
+            "follows the design pattern\r" +
+            "Defined in the slide master\r" +
+            "and has bullets by default";
+		assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(1)));
+		assertEquals(4, txt.get(1).size());
+		rt = txt.get(1).get(0);
+		assertEquals('\u2022', (char)rt.getBulletChar());
 		assertTrue(rt.isBullet());
 
 
-		txt = slide[1].getTextRuns();
-		assertEquals(2, txt.length);
+		txt = slide.get(1).getTextParagraphs();
+		assertEquals(2, txt.size());
 
-		assertEquals(
-				"I\u2019m a text box\r" +
-				"With bullets\r" +
-				"That follow the design pattern\r" +
-				"From the slide master", txt[0].getRawText());
-		assertEquals(1, txt[0].getRichTextRuns().length);
-		rt = txt[0].getRichTextRuns()[0];
+		expected =
+	        "I\u2019m a text box\r" +
+            "With bullets\r" +
+            "That follow the design pattern\r" +
+            "From the slide master";
+		assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(0)));
+		assertEquals(4, txt.get(0).size());
+		rt = txt.get(0).get(0);
 		assertTrue(rt.isBullet());
-		assertEquals('\u2022', rt.getBulletChar());
+		assertEquals('\u2022', (char)rt.getBulletChar());
 
-		assertEquals(
-				"I\u2019m a text box with user-defined\r" +
-				"bullet character", txt[1].getRawText());
-		assertEquals(1, txt[1].getRichTextRuns().length);
-		rt = txt[1].getRichTextRuns()[0];
+		expected =
+            "I\u2019m a text box with user-defined\r" +
+            "bullet character";
+        assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(1)));
+		assertEquals(2, txt.get(1).size());
+		rt = txt.get(1).get(0);
 		assertTrue(rt.isBullet());
-		assertEquals('\u263A', rt.getBulletChar());
+		assertEquals('\u263A', (char)rt.getBulletChar());
 	}
 
+    @Test
 	public void testSetParagraphStyles() throws Exception {
-		SlideShow ppt = new SlideShow();
+		HSLFSlideShow ppt = new HSLFSlideShow();
 
-		Slide slide = ppt.createSlide();
+		HSLFSlide slide = ppt.createSlide();
 
-		TextBox shape = new TextBox();
-		RichTextRun rt = shape.getTextRun().getRichTextRuns()[0];
+		HSLFTextBox shape = new HSLFTextBox();
 		shape.setText(
 				"Hello, World!\r" +
 				"This should be\r" +
 				"Multiline text");
-		rt.setFontSize(42);
+        HSLFTextParagraph rt = shape.getTextParagraphs().get(0);
+        HSLFTextRun tr = rt.getTextRuns().get(0);
+		tr.setFontSize(42d);
 		rt.setBullet(true);
-		rt.setTextOffset(50);
-		rt.setBulletOffset(0);
+		rt.setLeftMargin(50d);
+		rt.setIndent(0d);
 		rt.setBulletChar('\u263A');
 		slide.addShape(shape);
 
-		assertEquals(42, rt.getFontSize());
+		assertEquals(42.0, tr.getFontSize(), 0);
 		assertEquals(true, rt.isBullet());
-		assertEquals(50, rt.getTextOffset());
-		assertEquals(0, rt.getBulletOffset());
-		assertEquals('\u263A', rt.getBulletChar());
+		assertEquals(50.0, rt.getLeftMargin(), 0);
+		assertEquals(0, rt.getIndent(), 0);
+		assertEquals('\u263A', (char)rt.getBulletChar());
 
 		shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300));
 		slide.addShape(shape);
@@ -547,116 +528,130 @@
 		ppt.write(out);
 		out.close();
 
-		ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
-		slide = ppt.getSlides()[0];
-		shape = (TextBox)slide.getShapes()[0];
-		rt = shape.getTextRun().getRichTextRuns()[0];
-		assertEquals(42, rt.getFontSize());
+		ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
+		slide = ppt.getSlides().get(0);
+		shape = (HSLFTextBox)slide.getShapes().get(0);
+		rt = shape.getTextParagraphs().get(0);
+		tr = rt.getTextRuns().get(0);
+		assertEquals(42.0, tr.getFontSize(), 0);
 		assertEquals(true, rt.isBullet());
-		assertEquals(50, rt.getTextOffset());
-		assertEquals(0, rt.getBulletOffset());
-		assertEquals('\u263A', rt.getBulletChar());
+		assertEquals(50.0, rt.getLeftMargin(), 0);
+		assertEquals(0, rt.getIndent(), 0);
+		assertEquals('\u263A', (char)rt.getBulletChar());
 	}
 
+    @Test
 	public void testAddText() throws Exception {
-		SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("bullets.ppt"));
+		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bullets.ppt"));
 		assertTrue("No Exceptions while reading file", true);
 
-		RichTextRun rt;
-		TextRun[] txt;
-		Slide[] slides = ppt.getSlides();
+		HSLFTextParagraph rt;
+		HSLFTextRun tr;
+		List<List<HSLFTextParagraph>> txt;
+		List<HSLFSlide> slides = ppt.getSlides();
 
-		assertEquals(2, slides.length);
-		txt = slides[0].getTextRuns();
-		assertEquals(2, txt.length);
+		assertEquals(2, slides.size());
+		txt = slides.get(0).getTextParagraphs();
+		assertEquals(2, txt.size());
 
-		assertEquals("Title text", txt[0].getRawText());
-		assertEquals(1, txt[0].getRichTextRuns().length);
-		rt = txt[0].getRichTextRuns()[0];
+		assertEquals("Title text", HSLFTextParagraph.getRawText(txt.get(0)));
+		assertEquals(1, txt.get(0).size());
+		rt = txt.get(0).get(0);
 		assertFalse(rt.isBullet());
 
 		// Add some new text
-		txt[0].appendText("Foo! I'm new!");
-		assertEquals(2, txt[0].getRichTextRuns().length);
+		HSLFTextParagraph.appendText(txt.get(0), "Foo! I'm new!", true);
+		assertEquals(2, txt.get(0).size());
 
-		rt = txt[0].getRichTextRuns()[0];
-		assertFalse(rt.isBold());
-		assertEquals("Title text", rt.getText());
-		rt = txt[0].getRichTextRuns()[1];
-		assertFalse(rt.isBold());
-		assertEquals("Foo! I'm new!", rt.getText());
-		rt.setBold(true);
+		rt = txt.get(0).get(0);
+		tr = rt.getTextRuns().get(0);
+		assertFalse(tr.isBold());
+		assertEquals("Title text\r", tr.getRawText());
+		rt = txt.get(0).get(1);
+		tr = rt.getTextRuns().get(0);
+		assertFalse(tr.isBold());
+		assertEquals("Foo! I'm new!", tr.getRawText());
+		tr.setBold(true);
+		HSLFTextParagraph.storeText(txt.get(0));
 
-		// And some more
-		txt[0].appendText("Me too!");
-		assertEquals(3, txt[0].getRichTextRuns().length);
-		rt = txt[0].getRichTextRuns()[0];
-		assertFalse(rt.isBold());
-		assertEquals("Title text", rt.getText());
-		rt = txt[0].getRichTextRuns()[1];
-		assertTrue(rt.isBold());
-		assertEquals("Foo! I'm new!", rt.getText());
-		rt = txt[0].getRichTextRuns()[2];
-		assertFalse(rt.isBold());
-		assertEquals("Me too!", rt.getText());
+		// And some more, attributes will be copied from previous run
+		HSLFTextParagraph.appendText(txt.get(0), "Me too!", true);
+		HSLFTextParagraph.storeText(txt.get(0));
+		assertEquals(3, txt.get(0).size());
+		rt = txt.get(0).get(0);
+		tr = rt.getTextRuns().get(0);
+		assertFalse(tr.isBold());
+		assertEquals("Title text\r", tr.getRawText());
+		rt = txt.get(0).get(1);
+		tr = rt.getTextRuns().get(0);
+		assertTrue(tr.isBold());
+		assertEquals("Foo! I'm new!\r", tr.getRawText());
+		rt = txt.get(0).get(2);
+		tr = rt.getTextRuns().get(0);
+		assertTrue(tr.isBold());
+		assertEquals("Me too!", tr.getRawText());
 
 		// Save and re-open
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		ppt.write(out);
 		out.close();
 
-		ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray()));
+		ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
 		slides = ppt.getSlides();
 
-		assertEquals(2, slides.length);
+		assertEquals(2, slides.size());
 
-		txt = slides[0].getTextRuns();
-		assertEquals(2, txt.length);
-		assertEquals(3, txt[0].getRichTextRuns().length);
-		rt = txt[0].getRichTextRuns()[0];
-		assertFalse(rt.isBold());
-		assertEquals("Title text", rt.getText());
-		rt = txt[0].getRichTextRuns()[1];
-		assertTrue(rt.isBold());
-		assertEquals("Foo! I'm new!", rt.getText());
-		rt = txt[0].getRichTextRuns()[2];
-		assertFalse(rt.isBold());
-		assertEquals("Me too!", rt.getText());
+		txt = slides.get(0).getTextParagraphs();
+		assertEquals(2, txt.size());
+		assertEquals(3, txt.get(0).size());
+		rt = txt.get(0).get(0);
+		tr = rt.getTextRuns().get(0);
+		assertFalse(tr.isBold());
+		assertEquals("Title text\r", tr.getRawText());
+		rt = txt.get(0).get(1);
+		tr = rt.getTextRuns().get(0);
+		assertTrue(tr.isBold());
+		assertEquals("Foo! I'm new!\r", tr.getRawText());
+		rt = txt.get(0).get(2);
+		tr = rt.getTextRuns().get(0);
+		assertTrue(tr.isBold());
+		assertEquals("Me too!", tr.getRawText());
 
 //		FileOutputStream fout = new FileOutputStream("/tmp/foo.ppt");
 //		ppt.write(fout);
 	}
 	
+    @Test
 	public void testChineseParagraphs() throws Exception {
-      RichTextRun[] rts;
-      RichTextRun rt;
-      TextRun[] txt;
-      Slide[] slides = ssChinese.getSlides();
+      List<HSLFTextRun> rts;
+      HSLFTextRun rt;
+      List<List<HSLFTextParagraph>> txt;
+      List<HSLFSlide> slides = ssChinese.getSlides();
 
       // One slide
-      assertEquals(1, slides.length);
+      assertEquals(1, slides.size());
       
       // One block of text within that
-      txt = slides[0].getTextRuns();
-      assertEquals(1, txt.length);
+      txt = slides.get(0).getTextParagraphs();
+      assertEquals(1, txt.size());
       
       // One rich block of text in that - text is all the same style
       // TODO Is this completely correct?
-      rts = txt[0].getRichTextRuns();
-      assertEquals(1, rts.length);
-      rt = rts[0];
+      rts = txt.get(0).get(0).getTextRuns();
+      assertEquals(1, rts.size());
+      rt = rts.get(0);
       
       // Check we can get the english text out of that
-      String text = rt.getText();
+      String text = rt.getRawText();
       assertContains(text, "Single byte");
       // And the chinese
-      assertContains(text, "\uff8a\uff9d\uff76\uff78");
+      assertContains(txt.get(0).get(3).getTextRuns().get(0).getRawText(), "\uff8a\uff9d\uff76\uff78");
       
       // It isn't bold or italic
       assertFalse(rt.isBold());
       assertFalse(rt.isItalic());
       
       // Font is Calibri
-      assertEquals("Calibri", rt.getFontName());
+      assertEquals("Calibri", rt.getFontFamily());
 	}
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java
index cb27d3e..9c8f3e1 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSheetText.java
@@ -17,44 +17,50 @@
 
 package org.apache.poi.hslf.usermodel;
 
+import static org.junit.Assert.assertEquals;
 
-import junit.framework.TestCase;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.*;
+import java.util.List;
+
 import org.apache.poi.POIDataSamples;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests that SlideShow returns Sheets which have the right text in them
  *
  * @author Nick Burch (nick at torchbox dot com)
  */
-public final class TestSheetText extends TestCase {
+public final class TestSheetText {
 	// SlideShow primed on the test data
-	private SlideShow ss;
+	private HSLFSlideShow ss;
 
-	public TestSheetText() throws Exception {
+	@Before
+	public void init() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ss = new SlideShow(hss);
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ss = new HSLFSlideShow(hss);
 	}
 
+	@Test
 	public void testSheetOne() {
-		Sheet slideOne = ss.getSlides()[0];
+		HSLFSheet slideOne = ss.getSlides().get(0);
 
-		String[] expectText = new String[] {"This is a test title","This is a test subtitle\nThis is on page 1"};
-		assertEquals(expectText.length, slideOne.getTextRuns().length);
-		for(int i=0; i<expectText.length; i++) {
-			assertEquals(expectText[i], slideOne.getTextRuns()[i].getText());
+		String[] expectText = new String[] {"This is a test title","This is a test subtitle\rThis is on page 1"};
+		assertEquals(expectText.length, slideOne.getTextParagraphs().size());
+		int i = 0;
+		for(List<HSLFTextParagraph> textParas : slideOne.getTextParagraphs()) {
+			assertEquals(expectText[i++], HSLFTextParagraph.getRawText(textParas));
 		}
 	}
 
 	public void testSheetTwo() {
-		Sheet slideTwo = ss.getSlides()[1];
-		String[] expectText = new String[] {"This is the title on page 2","This is page two\nIt has several blocks of text\nNone of them have formatting"};
-		assertEquals(expectText.length, slideTwo.getTextRuns().length);
-		for(int i=0; i<expectText.length; i++) {
-			assertEquals(expectText[i], slideTwo.getTextRuns()[i].getText());
-		}
+		HSLFSheet slideTwo = ss.getSlides().get(1);
+		String[] expectText = new String[] {"This is the title on page 2","This is page two\rIt has several blocks of text\rNone of them have formatting"};
+		assertEquals(expectText.length, slideTwo.getTextParagraphs().size());
+        int i = 0;
+        for(List<HSLFTextParagraph> textParas : slideTwo.getTextParagraphs()) {
+            assertEquals(expectText[i++], HSLFTextParagraph.getRawText(textParas));
+        }
 	}
 
 	/**
@@ -64,15 +70,15 @@
 	 */
 	public void testWithShortTextPropData() throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
-		HSLFSlideShow hss = new HSLFSlideShow(slTests.openResourceAsStream("iisd_report.ppt"));
-		SlideShow sss = new SlideShow(hss);
+		HSLFSlideShowImpl hss = new HSLFSlideShowImpl(slTests.openResourceAsStream("iisd_report.ppt"));
+		HSLFSlideShow sss = new HSLFSlideShow(hss);
 
 		// Should come out with 10 slides, no notes
-		assertEquals(10, sss.getSlides().length);
-		assertEquals(0, sss.getNotes().length);
+		assertEquals(10, sss.getSlides().size());
+		assertEquals(0, sss.getNotes().size());
 
 		// Check text on first slide
-		Slide s = sss.getSlides()[0];
+		HSLFSlide s = sss.getSlides().get(0);
 		String exp =
 			"Realizing the Development Dividend:\n" +
 			"Community Capacity Building and CDM.\n" +
@@ -82,7 +88,7 @@
 			"COP 11 \u2013 MOP 1\n" + // special long hyphen
 			"December 5, 2005\n";
 
-		assertEquals(1, s.getTextRuns().length);
-		assertEquals(exp, s.getTextRuns()[0].getText());
+		assertEquals(1, s.getTextParagraphs().size());
+		assertEquals(exp, HSLFTextParagraph.getRawText(s.getTextParagraphs().get(0)));
 	}
 }
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSlideOrdering.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSlideOrdering.java
index 373ec33..e1a6a60 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSlideOrdering.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSlideOrdering.java
@@ -17,62 +17,62 @@
 
 package org.apache.poi.hslf.usermodel;
 
-import junit.framework.TestCase;
-import org.apache.poi.hslf.*;
-import org.apache.poi.hslf.model.*;
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
 import org.apache.poi.POIDataSamples;
+import org.junit.Before;
+import org.junit.Test;
 
 /**
  * Tests that SlideShow returns Sheets in the right order
  *
  * @author Nick Burch (nick at torchbox dot com)
  */
-public final class TestSlideOrdering extends TestCase {
+public final class TestSlideOrdering {
     private static POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 
 	// Simple slideshow, record order matches slide order
-	private SlideShow ssA;
+	private HSLFSlideShow ssA;
 	// Complex slideshow, record order doesn't match slide order
-	private SlideShow ssB;
+	private HSLFSlideShow ssB;
 
-	public TestSlideOrdering() throws Exception {
-		HSLFSlideShow hssA = new HSLFSlideShow(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
-		ssA = new SlideShow(hssA);
+	@Before
+	public void init() throws Exception {
+		HSLFSlideShowImpl hssA = new HSLFSlideShowImpl(slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+		ssA = new HSLFSlideShow(hssA);
 
-		HSLFSlideShow hssB = new HSLFSlideShow(slTests.openResourceAsStream("incorrect_slide_order.ppt"));
-		ssB = new SlideShow(hssB);
+		HSLFSlideShowImpl hssB = new HSLFSlideShowImpl(slTests.openResourceAsStream("incorrect_slide_order.ppt"));
+		ssB = new HSLFSlideShow(hssB);
 	}
 
 	/**
 	 * Test the simple case - record order matches slide order
 	 */
+	@Test
 	public void testSimpleCase() {
-		assertEquals(2, ssA.getSlides().length);
+		assertEquals(2, ssA.getSlides().size());
 
-		Slide s1 = ssA.getSlides()[0];
-		Slide s2 = ssA.getSlides()[1];
+		HSLFSlide s1 = ssA.getSlides().get(0);
+		HSLFSlide s2 = ssA.getSlides().get(1);
 
 		String[] firstTRs = new String[] { "This is a test title", "This is the title on page 2" };
 
-		assertEquals(firstTRs[0], s1.getTextRuns()[0].getText());
-		assertEquals(firstTRs[1], s2.getTextRuns()[0].getText());
+		assertEquals(firstTRs[0], HSLFTextParagraph.getRawText(s1.getTextParagraphs().get(0)));
+		assertEquals(firstTRs[1], HSLFTextParagraph.getRawText(s2.getTextParagraphs().get(0)));
 	}
 
 	/**
 	 * Test the complex case - record order differs from slide order
 	 */
+    @Test
 	public void testComplexCase() {
-		assertEquals(3, ssB.getSlides().length);
-
-		Slide s1 = ssB.getSlides()[0];
-		Slide s2 = ssB.getSlides()[1];
-		Slide s3 = ssB.getSlides()[2];
-
-		String[] firstTRs = new String[] { "Slide 1", "Slide 2", "Slide 3" };
-
-		assertEquals(firstTRs[0], s1.getTextRuns()[0].getText());
-		assertEquals(firstTRs[1], s2.getTextRuns()[0].getText());
-		assertEquals(firstTRs[2], s3.getTextRuns()[0].getText());
+		assertEquals(3, ssB.getSlides().size());
+		int i=1;
+		for (HSLFSlide s : ssB.getSlides()) {
+		    assertEquals("Slide "+(i++), HSLFTextParagraph.getRawText(s.getTextParagraphs().get(0)));
+		}
 	}
 
 	/**
@@ -86,16 +86,17 @@
 	protected void assertSlideOrdering(String filename, String[] titles) throws Exception {
         POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
 
-        SlideShow ppt = new SlideShow(slTests.openResourceAsStream(filename));
-		Slide[] slide = ppt.getSlides();
+        HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream(filename));
+		List<HSLFSlide> slide = ppt.getSlides();
 
-		assertEquals(titles.length, slide.length);
-		for (int i = 0; i < slide.length; i++) {
-			String title = slide[i].getTitle();
+		assertEquals(titles.length, slide.size());
+		for (int i = 0; i < slide.size(); i++) {
+			String title = slide.get(i).getTitle();
 			assertEquals("Wrong slide title in " + filename, titles[i], title);
 		}
 	}
 
+    @Test
 	public void testTitles() throws Exception {
 		assertSlideOrdering("basic_test_ppt_file.ppt", new String[] {
 				"This is a test title", "This is the title on page 2" });
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSoundData.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSoundData.java
index 5295555..9bbec5a 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSoundData.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSoundData.java
@@ -37,9 +37,9 @@
         //read the reference sound file
         byte[] ref_data = slTests.readFile("ringin.wav");
 
-        SlideShow ppt = new SlideShow(slTests.openResourceAsStream("sound.ppt"));
+        HSLFSlideShow ppt = new HSLFSlideShow(slTests.openResourceAsStream("sound.ppt"));
 
-        SoundData[] sound = ppt.getSoundData();
+        HSLFSoundData[] sound = ppt.getSoundData();
         assertEquals("Expected 1 sound", 1, sound.length);
 
         assertArrayEquals(ref_data, sound[0].getData());
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java
index 0851ff4..2270cd4 100644
--- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java
@@ -19,13 +19,12 @@
 
 package org.apache.poi.hslf.usermodel;
 
-import junit.framework.TestCase;
+import static org.junit.Assert.*;
 
-import org.apache.poi.hslf.model.Shape;
-import org.apache.poi.hslf.model.Slide;
-import org.apache.poi.hslf.model.Table;
-import org.apache.poi.hslf.model.TextRun;
+import java.util.List;
+
 import org.apache.poi.POIDataSamples;
+import org.junit.Test;
 
 
 /**
@@ -33,40 +32,39 @@
  * 
  * @author Alex Nikiforov [mailto:anikif@gmail.com]
  */
-public final class TestTable extends TestCase {
+public class TestTable {
     private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
 
-	protected void setUp() throws Exception {
-	}
-
-	public void testTable() throws Exception {
-		SlideShow ppt = new SlideShow(_slTests.openResourceAsStream("54111.ppt"));
+    @Test
+    public void testTable() throws Exception {
+		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("54111.ppt"));
 		assertTrue("No Exceptions while reading file", true);
 
-		final Slide[] slides = ppt.getSlides();
-		assertEquals(1, slides.length);
-		checkSlide(slides[0]);
+		List<HSLFSlide> slides = ppt.getSlides();
+		assertEquals(1, slides.size());
+		checkSlide(slides.get(0));
 	}
-	private void checkSlide(final Slide s) {
-		TextRun[] textRuns = s.getTextRuns();
-		assertEquals(2, textRuns.length);
+	
+	private void checkSlide(final HSLFSlide s) {
+		List<List<HSLFTextParagraph>> textRuns = s.getTextParagraphs();
+		assertEquals(2, textRuns.size());
 
-		RichTextRun textRun = textRuns[0].getRichTextRuns()[0];
+		HSLFTextRun textRun = textRuns.get(0).get(0).getTextRuns().get(0);
 		assertEquals("Table sample", textRun.getRawText().trim());
-		assertEquals(1, textRuns[0].getRichTextRuns().length);
-		assertFalse(textRun.isBullet());
+		assertEquals(1, textRuns.get(0).get(0).getTextRuns().size());
+		assertFalse(textRun.getTextParagraph().isBullet());
 
-		assertEquals("Dummy text", textRuns[1].getRawText());
+		assertEquals("Dummy text", HSLFTextParagraph.getRawText(textRuns.get(1)));
 		
-		final Shape[] shapes = s.getShapes();
+		List<HSLFShape> shapes = s.getShapes();
 		assertNotNull(shapes);
-		assertEquals(3, shapes.length);
-		assertTrue(shapes[2] instanceof Table);
-		final Table table = (Table) shapes[2];
+		assertEquals(3, shapes.size());
+		assertTrue(shapes.get(2) instanceof HSLFTable);
+		final HSLFTable table = (HSLFTable) shapes.get(2);
 		assertEquals(4, table.getNumberOfColumns());
 		assertEquals(6, table.getNumberOfRows());
 		for (int x = 0; x < 4; x ++) {
-			assertEquals("TH Cell " + (x + 1), table.getCell(0, x).getTextRun().getRawText());
+			assertEquals("TH Cell " + (x + 1), HSLFTextParagraph.getRawText(table.getCell(0, x).getTextParagraphs()));
 			for (int y = 1; y < 6; y++) {
 				assertEquals("Row " + y + ", Cell " + (x + 1), table.getCell(y, x).getText());
 			}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java
new file mode 100644
index 0000000..aa0c307
--- /dev/null
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java
@@ -0,0 +1,563 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import static org.junit.Assert.*;
+
+import java.awt.Color;
+import java.io.*;
+import java.util.List;
+
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.model.textproperties.TextPropCollection;
+import org.apache.poi.hslf.record.*;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests for TextRuns
+ *
+ * @author Nick Burch (nick at torchbox dot com)
+ */
+public final class TestTextRun {
+    private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
+
+	// SlideShow primed on the test data
+	private HSLFSlideShow ss;
+	private HSLFSlideShow ssRich;
+
+	@Before
+	public void setUp() throws IOException {
+
+		// Basic (non rich) test file
+		ss = new HSLFSlideShow(_slTests.openResourceAsStream("basic_test_ppt_file.ppt"));
+
+		// Rich test file
+		ssRich = new HSLFSlideShow(_slTests.openResourceAsStream("Single_Coloured_Page.ppt"));
+	}
+
+	/**
+	 * Test to ensure that getting the text works correctly
+	 */
+	@Test
+	public void testGetText() {
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParas = slideOne.getTextParagraphs();
+
+		assertEquals(2, textParas.size());
+
+		// Get text works with \n
+		assertEquals("This is a test title", HSLFTextParagraph.getText(textParas.get(0)));
+		assertEquals("This is a test subtitle\nThis is on page 1", HSLFTextParagraph.getText(textParas.get(1)));
+
+		// Raw text has \r instead
+		assertEquals("This is a test title", HSLFTextParagraph.getRawText(textParas.get(0)));
+		assertEquals("This is a test subtitle\rThis is on page 1", HSLFTextParagraph.getRawText(textParas.get(1)));
+
+
+		// Now check on a rich text run
+		HSLFSlide slideOneR = ssRich.getSlides().get(0);
+		textParas = slideOneR.getTextParagraphs();
+
+		assertEquals(2, textParas.size());
+		assertEquals("This is a title, it\u2019s in black", HSLFTextParagraph.getText(textParas.get(0)));
+		assertEquals("This is the subtitle, in bold\nThis bit is blue and italic\nThis bit is red (normal)", HSLFTextParagraph.getText(textParas.get(1)));
+		assertEquals("This is a title, it\u2019s in black", HSLFTextParagraph.getRawText(textParas.get(0)));
+		assertEquals("This is the subtitle, in bold\rThis bit is blue and italic\rThis bit is red (normal)", HSLFTextParagraph.getRawText(textParas.get(1)));
+	}
+
+	/**
+	 * Test to ensure changing non rich text bytes->bytes works correctly
+	 */
+	@Test
+	public void testSetText() {
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textRuns = slideOne.getTextParagraphs();
+		HSLFTextParagraph run = textRuns.get(0).get(0);
+		HSLFTextRun tr =  run.getTextRuns().get(0);
+
+		// Check current text
+		assertEquals("This is a test title", tr.getRawText());
+
+		// Change
+		String changeTo = "New test title";
+		tr.setText(changeTo);
+		assertEquals(changeTo, tr.getRawText());
+
+		// Ensure trailing \n's are NOT stripped, it is legal to set a text with a trailing '\r'
+		tr.setText(changeTo + "\n");
+		assertEquals(changeTo + "\r", tr.getRawText());
+	}
+
+	/**
+	 * Test to ensure that changing non rich text between bytes and
+	 *  chars works correctly
+	 */
+	@SuppressWarnings("unused")
+    @Test
+	public void testAdvancedSetText() {
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		List<HSLFTextParagraph> paras = slideOne.getTextParagraphs().get(0);
+		HSLFTextParagraph para = paras.get(0);
+		
+        TextHeaderAtom tha = null;
+        TextBytesAtom tba = null;
+        TextCharsAtom tca = null;
+		for (Record r : para.getRecords()) {
+		    if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r;
+		    else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r;
+		    else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r;
+		}
+
+		// Bytes -> Bytes
+		assertNull(tca);
+		assertNotNull(tba);
+		// assertFalse(run._isUnicode);
+		assertEquals("This is a test title", para.getTextRuns().get(0).getRawText());
+
+		String changeBytesOnly = "New Test Title";
+		HSLFTextParagraph.setText(paras, changeBytesOnly);
+		para = paras.get(0);
+		tha = null; tba = null; tca = null;
+        for (Record r : para.getRecords()) {
+            if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r;
+            else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r;
+            else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r;
+        }
+		
+		assertEquals(changeBytesOnly, HSLFTextParagraph.getRawText(paras));
+		assertNull(tca);
+		assertNotNull(tba);
+
+		// Bytes -> Chars
+        assertNull(tca);
+        assertNotNull(tba);
+		assertEquals(changeBytesOnly, HSLFTextParagraph.getRawText(paras));
+
+		String changeByteChar = "This is a test title with a '\u0121' g with a dot";
+		HSLFTextParagraph.setText(paras, changeByteChar);
+		para = paras.get(0);
+        tha = null; tba = null; tca = null;
+        for (Record r : para.getRecords()) {
+            if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r;
+            else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r;
+            else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r;
+        }		
+
+		assertEquals(changeByteChar, HSLFTextParagraph.getRawText(paras));
+		assertNotNull(tca);
+		assertNull(tba);
+
+		// Chars -> Chars
+		assertNull(tba);
+		assertNotNull(tca);
+		assertEquals(changeByteChar, HSLFTextParagraph.getRawText(paras));
+
+		String changeCharChar = "This is a test title with a '\u0147' N with a hat";
+		HSLFTextParagraph.setText(paras, changeCharChar);
+        para = paras.get(0);
+        tha = null; tba = null; tca = null;
+        for (Record r : para.getRecords()) {
+            if (r instanceof TextHeaderAtom) tha = (TextHeaderAtom)r;
+            else if (r instanceof TextBytesAtom) tba = (TextBytesAtom)r;
+            else if (r instanceof TextCharsAtom) tca = (TextCharsAtom)r;
+        }       
+
+		assertEquals(changeCharChar, HSLFTextParagraph.getRawText(paras));
+		assertNotNull(tca);
+		assertNull(tba);
+	}
+
+	/**
+	 * Tests to ensure that non rich text has the right default rich text run
+	 *  set up for it
+	 */
+	@Test
+	public void testGetRichTextNonRich() {
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
+
+		assertEquals(2, textParass.size());
+
+		List<HSLFTextParagraph> trA = textParass.get(0);
+		List<HSLFTextParagraph> trB = textParass.get(1);
+
+		assertEquals(1, trA.size());
+		assertEquals(2, trB.size());
+
+		HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0);
+		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
+
+		assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText());
+		assertEquals(HSLFTextParagraph.getRawText(trB.subList(0, 1)), rtrB.getRawText());
+	}
+
+	/**
+	 * Tests to ensure that the rich text runs are built up correctly
+	 */
+	@Test
+	public void testGetRichText() {
+		HSLFSlide slideOne = ssRich.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
+
+		assertEquals(2, textParass.size());
+
+		List<HSLFTextParagraph> trA = textParass.get(0);
+		List<HSLFTextParagraph> trB = textParass.get(1);
+
+		assertEquals(1, trA.size());
+		assertEquals(3, trB.size());
+
+		HSLFTextRun rtrA = trA.get(0).getTextRuns().get(0);
+		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
+		HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0);
+		HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0);
+
+		assertEquals(HSLFTextParagraph.getRawText(trA), rtrA.getRawText());
+
+		String trBstr = HSLFTextParagraph.getRawText(trB);
+		assertEquals(trBstr.substring(0, 30), rtrB.getRawText());
+		assertEquals(trBstr.substring(30,58), rtrC.getRawText());
+		assertEquals(trBstr.substring(58,82), rtrD.getRawText());
+
+		// Same paragraph styles
+		assertEquals(trB.get(0).getParagraphStyle(), trB.get(1).getParagraphStyle());
+		assertEquals(trB.get(0).getParagraphStyle(), trB.get(2).getParagraphStyle());
+
+		// Different char styles
+		assertNotEquals(rtrB.getCharacterStyle(), rtrC.getCharacterStyle());
+        assertNotEquals(rtrB.getCharacterStyle(), rtrD.getCharacterStyle());
+        assertNotEquals(rtrC.getCharacterStyle(), rtrD.getCharacterStyle());
+	}
+
+	/**
+	 * Tests to ensure that setting the text where the text isn't rich,
+	 *  ensuring that everything stays with the same default styling
+	 */
+	@Test
+	public void testSetTextWhereNotRich() {
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
+		List<HSLFTextParagraph> trB = textParass.get(0);
+		assertEquals(1, trB.size());
+
+		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
+		assertEquals(HSLFTextParagraph.getText(trB), rtrB.getRawText());
+
+		// Change text via normal
+		HSLFTextParagraph.setText(trB, "Test Foo Test");
+		rtrB = trB.get(0).getTextRuns().get(0);
+		assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB));
+		assertEquals("Test Foo Test", rtrB.getRawText());
+	}
+
+	/**
+	 * Tests to ensure that setting the text where the text is rich
+	 *  sets everything to the same styling
+	 */
+	@Test
+	public void testSetTextWhereRich() {
+		HSLFSlide slideOne = ssRich.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
+		List<HSLFTextParagraph> trB = textParass.get(1);
+		assertEquals(3, trB.size());
+
+		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
+		HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0);
+		HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0);
+		TextPropCollection tpBP = rtrB.getTextParagraph().getParagraphStyle();
+		TextPropCollection tpBC = rtrB.getCharacterStyle();
+		TextPropCollection tpCP = rtrC.getTextParagraph().getParagraphStyle();
+		TextPropCollection tpCC = rtrC.getCharacterStyle();
+		TextPropCollection tpDP = rtrD.getTextParagraph().getParagraphStyle();
+		TextPropCollection tpDC = rtrD.getCharacterStyle();
+
+//		assertEquals(trB.getRawText().substring(0, 30), rtrB.getRawText());
+		assertNotNull(tpBP);
+		assertNotNull(tpBC);
+		assertNotNull(tpCP);
+		assertNotNull(tpCC);
+		assertNotNull(tpDP);
+		assertNotNull(tpDC);
+		assertEquals(tpBP,tpCP);
+		assertEquals(tpBP,tpDP);
+		assertEquals(tpCP,tpDP);
+		assertNotEquals(tpBC,tpCC);
+		assertNotEquals(tpBC,tpDC);
+		assertNotEquals(tpCC,tpDC);
+
+		// Change text via normal
+		HSLFTextParagraph.setText(trB, "Test Foo Test");
+
+		// Ensure now have first style
+		assertEquals(1, trB.get(0).getTextRuns().size());
+		rtrB = trB.get(0).getTextRuns().get(0);
+		assertEquals("Test Foo Test", HSLFTextParagraph.getRawText(trB));
+		assertEquals("Test Foo Test", rtrB.getRawText());
+		assertNotNull(rtrB.getCharacterStyle());
+		assertNotNull(rtrB.getTextParagraph().getParagraphStyle());
+		assertEquals( tpBP, rtrB.getTextParagraph().getParagraphStyle() );
+		assertEquals( tpBC, rtrB.getCharacterStyle() );
+	}
+
+	/**
+	 * Test to ensure the right stuff happens if we change the text
+	 *  in a rich text run, that doesn't happen to actually be rich
+	 */
+	@Test
+	public void testChangeTextInRichTextRunNonRich() {
+		HSLFSlide slideOne = ss.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textRuns = slideOne.getTextParagraphs();
+		List<HSLFTextParagraph> trB = textRuns.get(1);
+		assertEquals(1, trB.get(0).getTextRuns().size());
+
+		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
+		assertEquals(HSLFTextParagraph.getRawText(trB.subList(0, 1)), rtrB.getRawText());
+		assertNotNull(rtrB.getCharacterStyle());
+		assertNotNull(rtrB.getTextParagraph().getParagraphStyle());
+
+		// Change text via rich
+		rtrB.setText("Test Test Test");
+		assertEquals("Test Test Test", HSLFTextParagraph.getRawText(trB.subList(0, 1)));
+		assertEquals("Test Test Test", rtrB.getRawText());
+
+		// Will now have dummy props
+        assertNotNull(rtrB.getCharacterStyle());
+        assertNotNull(rtrB.getTextParagraph().getParagraphStyle());
+	}
+
+	/**
+	 * Tests to ensure changing the text within rich text runs works
+	 *  correctly
+	 */
+	@Test
+	public void testChangeTextInRichTextRun() {
+		HSLFSlide slideOne = ssRich.getSlides().get(0);
+		List<List<HSLFTextParagraph>> textParass = slideOne.getTextParagraphs();
+		List<HSLFTextParagraph> trB = textParass.get(1);
+		assertEquals(3, trB.size());
+
+		// We start with 3 text runs, each with their own set of styles,
+		// but all sharing the same paragraph styles
+		HSLFTextRun rtrB = trB.get(0).getTextRuns().get(0);
+		HSLFTextRun rtrC = trB.get(1).getTextRuns().get(0);
+		HSLFTextRun rtrD = trB.get(2).getTextRuns().get(0);
+		TextPropCollection tpBP = rtrB.getTextParagraph().getParagraphStyle();
+		TextPropCollection tpBC = rtrB.getCharacterStyle();
+		TextPropCollection tpCP = rtrC.getTextParagraph().getParagraphStyle();
+		TextPropCollection tpCC = rtrC.getCharacterStyle();
+		TextPropCollection tpDP = rtrD.getTextParagraph().getParagraphStyle();
+		TextPropCollection tpDC = rtrD.getCharacterStyle();
+
+		// Check text and stylings
+		assertEquals(HSLFTextParagraph.getRawText(trB).substring(0, 30), rtrB.getRawText());
+		assertNotNull(tpBP);
+		assertNotNull(tpBC);
+		assertNotNull(tpCP);
+		assertNotNull(tpCC);
+		assertNotNull(tpDP);
+		assertNotNull(tpDC);
+		assertEquals(tpBP, tpCP);
+		assertEquals(tpBP, tpDP);
+		assertEquals(tpCP, tpDP);
+		assertNotEquals(tpBC, tpCC);
+		assertNotEquals(tpBC, tpDC);
+		assertNotEquals(tpCC, tpDC);
+
+		// Check text in the rich runs
+		assertEquals("This is the subtitle, in bold\r", rtrB.getRawText());
+		assertEquals("This bit is blue and italic\r", rtrC.getRawText());
+		assertEquals("This bit is red (normal)", rtrD.getRawText());
+
+		String newBText = "New Subtitle, will still be bold\n";
+		String newCText = "New blue and italic text\n";
+		String newDText = "Funky new normal red text";
+		rtrB.setText(newBText);
+		rtrC.setText(newCText);
+		rtrD.setText(newDText);
+		HSLFTextParagraph.storeText(trB);
+
+		assertEquals(newBText.replace('\n','\r'), rtrB.getRawText());
+		assertEquals(newCText.replace('\n','\r'), rtrC.getRawText());
+		assertEquals(newDText.replace('\n','\r'), rtrD.getRawText());
+
+		assertEquals(newBText.replace('\n','\r') + newCText.replace('\n','\r') + newDText.replace('\n','\r'), HSLFTextParagraph.getRawText(trB));
+
+		// The styles should have been updated for the new sizes
+		assertEquals(newBText.length(), tpBC.getCharactersCovered());
+		assertEquals(newCText.length(), tpCC.getCharactersCovered());
+		assertEquals(newDText.length()+1, tpDC.getCharactersCovered()); // Last one is always one larger
+
+        // Paragraph style should be sum of text length
+		assertEquals(
+			newBText.length() + newCText.length() + newDText.length() +1,
+			tpBP.getCharactersCovered() + tpCP.getCharactersCovered() + tpDP.getCharactersCovered()
+		);
+
+		// Check stylings still as expected
+		TextPropCollection ntpBC = rtrB.getCharacterStyle();
+		TextPropCollection ntpCC = rtrC.getCharacterStyle();
+		TextPropCollection ntpDC = rtrD.getCharacterStyle();
+		assertEquals(tpBC.getTextPropList(), ntpBC.getTextPropList());
+		assertEquals(tpCC.getTextPropList(), ntpCC.getTextPropList());
+		assertEquals(tpDC.getTextPropList(), ntpDC.getTextPropList());
+	}
+
+
+	/**
+	 * Test case for Bug 41015.
+	 *
+	 * In some cases RichTextRun.getText() threw StringIndexOutOfBoundsException because
+	 * of the wrong list of potential paragraph properties defined in StyleTextPropAtom.
+	 *
+	 */
+	@Test
+	public void testBug41015() throws IOException {
+		List<HSLFTextRun> rt;
+
+		HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug-41015.ppt"));
+		HSLFSlide sl = ppt.getSlides().get(0);
+        List<List<HSLFTextParagraph>> textParass = sl.getTextParagraphs();
+		assertEquals(2, textParass.size());
+		
+		List<HSLFTextParagraph> textParas = textParass.get(0);
+		rt = textParass.get(0).get(0).getTextRuns();
+		assertEquals(1, rt.size());
+		assertEquals(0, textParass.get(0).get(0).getIndentLevel());
+		assertEquals("sdfsdfsdf", rt.get(0).getRawText());
+
+		textParas = textParass.get(1);
+		String texts[] = {"Sdfsdfsdf\r","Dfgdfg\r","Dfgdfgdfg\r","Sdfsdfs\r","Sdfsdf\r"};
+		int indents[] = {0,0,0,1,1};
+		int i=0;
+		for (HSLFTextParagraph p : textParas) {
+		    assertEquals(texts[i], p.getTextRuns().get(0).getRawText());
+		    assertEquals(indents[i], p.getIndentLevel());
+		    i++;
+		}
+	}
+
+	/**
+	 * Test creation of TextRun objects.
+	 */
+	@Test
+	public void testAddTextRun() {
+		HSLFSlideShow ppt = new HSLFSlideShow();
+		HSLFSlide slide = ppt.createSlide();
+
+		assertEquals(0, slide.getTextParagraphs().size());
+
+		HSLFTextBox shape1 = new HSLFTextBox();
+		List<HSLFTextParagraph> run1 = shape1.getTextParagraphs();
+		shape1.setText("Text 1");
+		slide.addShape(shape1);
+
+		//The array of Slide's text runs must be updated when new text shapes are added.
+		List<List<HSLFTextParagraph>> runs = slide.getTextParagraphs();
+		assertNotNull(runs);
+		assertSame(run1, runs.get(0));
+
+		HSLFTextBox shape2 = new HSLFTextBox();
+		List<HSLFTextParagraph> run2 = shape2.getTextParagraphs();
+		shape2.setText("Text 2");
+		slide.addShape(shape2);
+
+		runs = slide.getTextParagraphs();
+		assertEquals(2, runs.size());
+
+		assertSame(run1, runs.get(0));
+		assertSame(run2, runs.get(1));
+
+		// as getShapes()
+		List<HSLFShape> sh = slide.getShapes();
+		assertEquals(2, sh.size());
+		assertTrue(sh.get(0) instanceof HSLFTextBox);
+		HSLFTextBox box1 = (HSLFTextBox)sh.get(0);
+		assertSame(run1, box1.getTextParagraphs());
+		HSLFTextBox box2 = (HSLFTextBox)sh.get(1);
+		assertSame(run2, box2.getTextParagraphs());
+
+		// test Table - a complex group of shapes containing text objects
+		HSLFSlide slide2 = ppt.createSlide();
+		assertTrue(slide2.getTextParagraphs().isEmpty());
+		HSLFTable table = new HSLFTable(2, 2);
+		slide2.addShape(table);
+		runs = slide2.getTextParagraphs();
+		assertNotNull(runs);
+		assertEquals(4, runs.size());
+	}
+
+	@Test
+	public void test48916() throws IOException {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("SampleShow.ppt"));
+        List<HSLFSlide> slides = ppt.getSlides();
+        for(HSLFSlide slide : slides){
+            for(HSLFShape sh : slide.getShapes()){
+                if (!(sh instanceof HSLFTextShape)) continue;
+                HSLFTextShape tx = (HSLFTextShape)sh;
+                List<HSLFTextParagraph> paras = tx.getTextParagraphs();
+                //verify that records cached in  TextRun and EscherTextboxWrapper are the same
+                Record[] runChildren = paras.get(0).getRecords();
+                Record[] txboxChildren = tx.getEscherTextboxWrapper().getChildRecords();
+                assertEquals(runChildren.length, txboxChildren.length);
+                for(int i=0; i < txboxChildren.length; i++){
+                    assertSame(txboxChildren[i], runChildren[i]);
+                }
+                // caused NPE prior to fix of Bugzilla #48916
+                for (HSLFTextParagraph p : paras) {
+                    for (HSLFTextRun rt : p.getTextRuns()) {
+                        rt.setBold(true);
+                        rt.setFontColor(Color.RED);
+                    }
+                }
+                // tx.storeText();
+            }
+        }
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ppt.write(out);
+        
+        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
+        for(HSLFSlide slide : ppt.getSlides()){
+            for(HSLFShape sh : slide.getShapes()){
+                if(sh instanceof HSLFTextShape){
+                    HSLFTextShape tx = (HSLFTextShape)sh;
+                    List<HSLFTextParagraph> run = tx.getTextParagraphs();
+                    HSLFTextRun rt = run.get(0).getTextRuns().get(0);
+                    assertTrue(rt.isBold());
+                    assertEquals(rt.getFontColor(), Color.RED);
+                }
+            }
+        }
+
+    }
+
+	@Test
+	public void test52244() throws IOException {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52244.ppt"));
+        HSLFSlide slide = ppt.getSlides().get(0);
+
+        int sizes[] = { 36, 24, 12, 32, 12, 12 };
+        
+        int i=0;
+        for (List<HSLFTextParagraph> textParas : slide.getTextParagraphs()) {
+            assertEquals("Arial", textParas.get(0).getTextRuns().get(0).getFontFamily());
+            assertEquals(sizes[i++], textParas.get(0).getTextRuns().get(0).getFontSize().intValue());
+        }
+    }
+
+}
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextShape.java
new file mode 100644
index 0000000..07a1a68
--- /dev/null
+++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextShape.java
@@ -0,0 +1,213 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hslf.usermodel;
+
+import static org.junit.Assert.*;
+
+import java.io.*;
+import java.util.*;
+
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.hslf.record.TextHeaderAtom;
+import org.apache.poi.sl.usermodel.ShapeType;
+import org.junit.Test;
+
+/**
+ * Verify behavior of <code>TextShape</code> and its sub-classes
+ *
+ * @author Yegor Kozlov
+ */
+public final class TestTextShape {
+    private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance();
+
+    @Test
+    public void createAutoShape(){
+        HSLFTextShape shape = new HSLFAutoShape(ShapeType.TRAPEZOID);
+        assertNull(shape.getEscherTextboxWrapper());
+        assertNotNull(shape.getTextParagraphs());
+        assertNotNull(shape.getEscherTextboxWrapper());
+        assertEquals("", shape.getText());
+        assertEquals(-1, shape.getTextParagraphs().get(0).getIndex());
+    }
+
+    @Test
+    public void createTextBox(){
+        HSLFTextShape shape = new HSLFTextBox();
+        List<HSLFTextParagraph> paras = shape.getTextParagraphs();
+        assertNotNull(paras);
+        assertNotNull(shape.getText());
+        assertNotNull(shape.getEscherTextboxWrapper());
+
+        assertNotNull(shape.getTextParagraphs());
+        assertNotNull(shape.getEscherTextboxWrapper());
+        assertEquals("", shape.getText());
+
+    }
+
+    /**
+     * Verify we can get text from TextShape in the following cases:
+     *  - placeholders
+     *  - normal TextBox object
+     *  - text in auto-shapes
+     */
+    @Test
+    public void read() throws IOException {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text_shapes.ppt"));
+
+        List<String> lst1 = new ArrayList<String>();
+        HSLFSlide slide = ppt.getSlides().get(0);
+        for (HSLFShape shape : slide.getShapes()) {
+            assertTrue("Expected TextShape but found " + shape.getClass().getName(), shape instanceof HSLFTextShape);
+            HSLFTextShape tx = (HSLFTextShape)shape;
+            List<HSLFTextParagraph> paras = tx.getTextParagraphs();
+            assertNotNull(paras);
+            int runType = paras.get(0).getRunType();
+
+            ShapeType type = shape.getShapeType();
+            String rawText = HSLFTextParagraph.getRawText(paras);
+            switch (type){
+                case TEXT_BOX:
+                    assertEquals("Text in a TextBox", rawText);
+                    break;
+                case RECT:
+                    if(runType == TextHeaderAtom.OTHER_TYPE)
+                        assertEquals("Rectangle", rawText);
+                    else if(runType == TextHeaderAtom.TITLE_TYPE)
+                        assertEquals("Title Placeholder", rawText);
+                    break;
+                case OCTAGON:
+                    assertEquals("Octagon", rawText);
+                    break;
+                case ELLIPSE:
+                    assertEquals("Ellipse", rawText);
+                    break;
+                case ROUND_RECT:
+                    assertEquals("RoundRectangle", rawText);
+                    break;
+                default:
+                    fail("Unexpected shape: " + shape.getShapeName());
+
+            }
+            lst1.add(rawText);
+        }
+
+        List<String> lst2 = new ArrayList<String>();
+        for (List<HSLFTextParagraph> paras : slide.getTextParagraphs()) {
+            lst2.add(HSLFTextParagraph.getRawText(paras));
+        }
+
+        assertTrue(lst1.containsAll(lst2));
+    }
+
+    @Test
+    public void readWrite() throws IOException {
+        HSLFSlideShow ppt = new HSLFSlideShow();
+        HSLFSlide slide =  ppt.createSlide();
+
+        HSLFTextShape shape1 = new HSLFTextBox();
+        shape1.setText("Hello, World!");
+        slide.addShape(shape1);
+
+        shape1.moveTo(100, 100);
+
+        HSLFTextShape shape2 = new HSLFAutoShape(ShapeType.RIGHT_ARROW);
+        shape2.setText("Testing TextShape");
+        slide.addShape(shape2);
+        shape2.moveTo(300, 300);
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ppt.write(out);
+        out.close();
+
+        ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()));
+        slide = ppt.getSlides().get(0);
+        List<HSLFShape> shape = slide.getShapes();
+
+        assertTrue(shape.get(0) instanceof HSLFTextShape);
+        shape1 = (HSLFTextShape)shape.get(0);
+        assertEquals(ShapeType.TEXT_BOX, shape1.getShapeType());
+        assertEquals("Hello, World!", shape1.getText());
+
+        assertTrue(shape.get(1) instanceof HSLFTextShape);
+        shape1 = (HSLFTextShape)shape.get(1);
+        assertEquals(ShapeType.RIGHT_ARROW, shape1.getShapeType());
+        assertEquals("Testing TextShape", shape1.getText());
+    }
+
+    @Test
+    public void margins() throws IOException {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("text-margins.ppt"));
+
+        HSLFSlide slide = ppt.getSlides().get(0);
+
+        Map<String,HSLFTextShape> map = new HashMap<String,HSLFTextShape>();
+        for (HSLFShape shape : slide.getShapes()) {
+            if(shape instanceof HSLFTextShape){
+                HSLFTextShape tx = (HSLFTextShape)shape;
+                map.put(tx.getText(), tx);
+            }
+        }
+
+        HSLFTextShape tx;
+
+        tx = map.get("TEST1");
+        assertEquals(0.1, tx.getLeftInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.1, tx.getRightInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.39, tx.getTopInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.05, tx.getBottomInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+
+        tx = map.get("TEST2");
+        assertEquals(0.1, tx.getLeftInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.1, tx.getRightInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.05, tx.getTopInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.39, tx.getBottomInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+
+        tx = map.get("TEST3");
+        assertEquals(0.39, tx.getLeftInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.1, tx.getRightInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.05, tx.getTopInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.05, tx.getBottomInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+
+        tx = map.get("TEST4");
+        assertEquals(0.1, tx.getLeftInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.39, tx.getRightInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.05, tx.getTopInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+        assertEquals(0.05, tx.getBottomInset()*HSLFShape.EMU_PER_POINT/HSLFShape.EMU_PER_INCH, 0.01);
+    }
+
+    @Test
+    public void bug52599() throws IOException {
+        HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("52599.ppt"));
+
+        HSLFSlide slide = ppt.getSlides().get(0);
+        List<HSLFShape> sh = slide.getShapes();
+        assertEquals(3, sh.size());
+
+        HSLFTextShape sh0 = (HSLFTextShape)sh.get(0);
+        assertNotNull(sh0.getTextParagraphs());
+        assertEquals("", sh0.getText());
+
+        HSLFTextShape sh1 = (HSLFTextShape)sh.get(1);
+        assertNotNull(sh1.getTextParagraphs());
+        assertEquals("", sh1.getText());
+
+        HSLFTextShape sh2 = (HSLFTextShape)sh.get(2);
+        assertEquals("this box should be shown just once", sh2.getText());
+        assertEquals(-1, sh2.getTextParagraphs().get(0).getIndex());
+    }
+}
diff --git a/src/types/definitions/dml-shapeGeometry.xjb b/src/types/definitions/dml-shapeGeometry.xjb
new file mode 100644
index 0000000..43a0c2a
--- /dev/null
+++ b/src/types/definitions/dml-shapeGeometry.xjb
@@ -0,0 +1,7 @@
+<jxb:bindings version="1.0"

+	xmlns:xs="http://www.w3.org/2001/XMLSchema"

+	xmlns:jxb="http://java.sun.com/xml/ns/jaxb"

+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+	xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd">

+	<jxb:globalBindings generateIsSetMethod="true"/>

+</jxb:bindings>

diff --git a/test-data/slideshow/54541_cropped_bitmap2.ppt b/test-data/slideshow/54541_cropped_bitmap2.ppt
new file mode 100644
index 0000000..3d79dbd
--- /dev/null
+++ b/test-data/slideshow/54541_cropped_bitmap2.ppt
Binary files differ
diff --git a/test-data/slideshow/alterman_security2.pptx b/test-data/slideshow/alterman_security2.pptx
new file mode 100644
index 0000000..1329228
--- /dev/null
+++ b/test-data/slideshow/alterman_security2.pptx
Binary files differ
diff --git a/test-data/slideshow/sample_pptx_grouping_issues.pptx b/test-data/slideshow/sample_pptx_grouping_issues.pptx
new file mode 100644
index 0000000..bf0c702
--- /dev/null
+++ b/test-data/slideshow/sample_pptx_grouping_issues.pptx
Binary files differ