]> source.dussan.org Git - vaadin-framework.git/commitdiff
Add SASS source code, unit tests and test resources to project (#9223)
authorHenri Sara <hesara@vaadin.com>
Wed, 8 Aug 2012 10:22:54 +0000 (13:22 +0300)
committerHenri Sara <hesara@vaadin.com>
Wed, 8 Aug 2012 11:29:48 +0000 (14:29 +0300)
112 files changed:
sass/src/com/vaadin/sass/SassCompiler.java [new file with mode: 0644]
sass/src/com/vaadin/sass/ScssServlet.java [new file with mode: 0644]
sass/src/com/vaadin/sass/ScssStylesheet.java [new file with mode: 0644]
sass/src/com/vaadin/sass/handler/SCSSDocumentHandler.java [new file with mode: 0644]
sass/src/com/vaadin/sass/handler/SCSSDocumentHandlerImpl.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/CharStream.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/Generic_CharStream.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/JumpException.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/LexicalUnitImpl.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/LocatorImpl.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/MediaListImpl.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/ParseException.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/Parser.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/Parser.jj [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/ParserConstants.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/ParserTokenManager.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/SCSSLexicalUnit.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/SelectorListImpl.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/Selectors.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/ThrowedParseException.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/Token.java [new file with mode: 0644]
sass/src/com/vaadin/sass/parser/TokenMgrError.java [new file with mode: 0644]
sass/src/com/vaadin/sass/selector/CompositeSelector.java [new file with mode: 0644]
sass/src/com/vaadin/sass/selector/SelectorUtil.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/BlockNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/EachNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/ExtendNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/ForNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/FunctionNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/IfNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/ImportNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/MediaNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/MixinDefNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/MixinNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/NestPropertiesNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/Node.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/RuleNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/VariableNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/tree/WhileNode.java [new file with mode: 0644]
sass/src/com/vaadin/sass/util/ColorUtil.java [new file with mode: 0644]
sass/src/com/vaadin/sass/util/DeepCopy.java [new file with mode: 0644]
sass/src/com/vaadin/sass/util/FastByteArrayInputStream.java [new file with mode: 0644]
sass/src/com/vaadin/sass/util/FastByteArrayOutputStream.java [new file with mode: 0644]
sass/src/com/vaadin/sass/util/StringUtil.java [new file with mode: 0644]
sass/src/com/vaadin/sass/visitor/BlockVisitor.java [new file with mode: 0644]
sass/src/com/vaadin/sass/visitor/ExtendVisitor.java [new file with mode: 0644]
sass/src/com/vaadin/sass/visitor/ImportVisitor.java [new file with mode: 0644]
sass/src/com/vaadin/sass/visitor/MixinVisitor.java [new file with mode: 0644]
sass/src/com/vaadin/sass/visitor/NestPropertiesVisitor.java [new file with mode: 0644]
sass/src/com/vaadin/sass/visitor/ParentSelectorVisitor.java [new file with mode: 0644]
sass/src/com/vaadin/sass/visitor/VariableVisitor.java [new file with mode: 0644]
sass/src/com/vaadin/sass/visitor/Visitor.java [new file with mode: 0644]
tests/sass/resources/basic/comments.css [new file with mode: 0644]
tests/sass/resources/basic/empty_block.css [new file with mode: 0644]
tests/sass/resources/basic/media.css [new file with mode: 0644]
tests/sass/resources/basic/properties.css [new file with mode: 0644]
tests/sass/resources/basic/reindeer.css [new file with mode: 0644]
tests/sass/resources/basic/selectors.css [new file with mode: 0644]
tests/sass/resources/css/control-directives.scss [new file with mode: 0644]
tests/sass/resources/css/extends.css [new file with mode: 0644]
tests/sass/resources/css/functions.css [new file with mode: 0644]
tests/sass/resources/css/imports.css [new file with mode: 0644]
tests/sass/resources/css/mixins.css [new file with mode: 0644]
tests/sass/resources/css/nested-properties.css [new file with mode: 0644]
tests/sass/resources/css/nesting.css [new file with mode: 0644]
tests/sass/resources/css/parent-import.css [new file with mode: 0644]
tests/sass/resources/css/parent-selector.css [new file with mode: 0644]
tests/sass/resources/css/variables.css [new file with mode: 0644]
tests/sass/resources/scss/_partial-for-import.scss [new file with mode: 0644]
tests/sass/resources/scss/control-directives.scss [new file with mode: 0644]
tests/sass/resources/scss/extends.scss [new file with mode: 0644]
tests/sass/resources/scss/folder-test/parent-import.scss [new file with mode: 0644]
tests/sass/resources/scss/folder-test2/base-imported.scss [new file with mode: 0644]
tests/sass/resources/scss/folder-test2/base.scss [new file with mode: 0644]
tests/sass/resources/scss/folder-test2/url.scss [new file with mode: 0644]
tests/sass/resources/scss/folder-test2/variables.scss [new file with mode: 0644]
tests/sass/resources/scss/functions.scss [new file with mode: 0644]
tests/sass/resources/scss/imports.scss [new file with mode: 0644]
tests/sass/resources/scss/interpolation.scss [new file with mode: 0644]
tests/sass/resources/scss/mixins.scss [new file with mode: 0644]
tests/sass/resources/scss/nested-properties.scss [new file with mode: 0644]
tests/sass/resources/scss/nesting.scss [new file with mode: 0644]
tests/sass/resources/scss/parent-selector.scss [new file with mode: 0644]
tests/sass/resources/scss/reference-parent-selector.css [new file with mode: 0644]
tests/sass/resources/scss/variables.scss [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/AllTests.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/CssTestSuite.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/ScssTestSuite.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/TestBase.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/VisitorTestSuite.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/parser/ParserTest.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/css/Comments.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/css/EmptyBlock.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/css/Interpolation.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/css/Media.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/css/Properties.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/css/Reindeer.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/css/Selectors.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/ControlDirectives.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/Extends.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/Functions.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/Imports.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/Mixins.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/NestedProperties.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/Nesting.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/ParentImports.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/ParentSelector.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/scss/Variables.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/visitor/ImportVisitorTest.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/visitor/MixinVisitorTest.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/testcases/visitor/NestedPropertiesVisitorTest.java [new file with mode: 0644]
tests/sass/src/com/vaadin/sass/tree/ImportNodeTest.java [new file with mode: 0644]

diff --git a/sass/src/com/vaadin/sass/SassCompiler.java b/sass/src/com/vaadin/sass/SassCompiler.java
new file mode 100644 (file)
index 0000000..701f1e7
--- /dev/null
@@ -0,0 +1,39 @@
+package com.vaadin.sass;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+public class SassCompiler {
+
+    public static void main(String[] args) throws Exception {
+        String input = null;
+        String output = null;
+        if (args.length == 0) {
+            System.out
+                    .println("usage: SassCompile <scss file to compile> <css file to write>");
+            return;
+        } else if (args.length == 1) {
+            input = args[0];
+        } else {
+            input = args[0];
+            output = args[1];
+        }
+        File inputFile = new File(input);
+        ScssStylesheet scss = ScssStylesheet.get(inputFile);
+        scss.compile();
+        if (output == null) {
+            System.out.println(scss.toString());
+        } else {
+            writeFile(output, scss.toString());
+        }
+    }
+
+    public static void writeFile(String filename, String output)
+            throws IOException {
+        File file = new File(filename);
+        FileWriter writer = new FileWriter(file);
+        writer.write(output);
+        writer.close();
+    }
+}
diff --git a/sass/src/com/vaadin/sass/ScssServlet.java b/sass/src/com/vaadin/sass/ScssServlet.java
new file mode 100644 (file)
index 0000000..545bf27
--- /dev/null
@@ -0,0 +1,44 @@
+package com.vaadin.sass;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class ScssServlet extends HttpServlet {
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+            throws ServletException, IOException {
+        String cssPath = req.getRequestURI();
+        if (cssPath.endsWith(".css")) {
+            File cssFile = new File(cssPath);
+            if (cssFile.exists()) {
+
+            } else {
+                String scssPath = cssPath.replace(".css", ".scss");
+                File scssFile = new File(scssPath);
+                if (scssFile.exists()) {
+                    ScssStylesheet scss = ScssStylesheet.get(new File(cssPath));
+                    try {
+                        scss.compile();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    resp.setContentType("text/css");
+                    OutputStream fout = resp.getOutputStream();
+                    OutputStream bos = new BufferedOutputStream(fout);
+                    OutputStreamWriter outputwriter = new OutputStreamWriter(
+                            bos);
+                    outputwriter.write(scss.toString());
+                }
+
+            }
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/ScssStylesheet.java b/sass/src/com/vaadin/sass/ScssStylesheet.java
new file mode 100644 (file)
index 0000000..18945df
--- /dev/null
@@ -0,0 +1,102 @@
+package com.vaadin.sass;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.Node;
+import com.vaadin.sass.visitor.BlockVisitor;
+import com.vaadin.sass.visitor.ExtendVisitor;
+import com.vaadin.sass.visitor.ImportVisitor;
+import com.vaadin.sass.visitor.MixinVisitor;
+import com.vaadin.sass.visitor.NestPropertiesVisitor;
+import com.vaadin.sass.visitor.ParentSelectorVisitor;
+import com.vaadin.sass.visitor.VariableVisitor;
+import com.vaadin.sass.visitor.Visitor;
+
+public class ScssStylesheet extends Node {
+
+    private static final long serialVersionUID = 3849790204404961608L;
+
+    /**
+     * Read in a file SCSS and parse it into a ScssStylesheet
+     * 
+     * @param file
+     * @throws IOException
+     */
+    public ScssStylesheet() {
+        super();
+    }
+
+    /**
+     * Main entry point for the SASS compiler. Takes in a file and builds upp a
+     * ScssStylesheet tree out of it. Calling compile() on it will transform
+     * SASS into CSS. Calling toString() will print out the SCSS/CSS.
+     * 
+     * @param file
+     * @return
+     * @throws CSSException
+     * @throws IOException
+     */
+    public static ScssStylesheet get(File file) throws CSSException,
+            IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        file = file.getCanonicalFile();
+        handler.getStyleSheet().setFileName(file.getAbsoluteFile().getParent());
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(file.getAbsolutePath());
+        return handler.getStyleSheet();
+    }
+
+    /**
+     * Applies all the visitors and compiles SCSS into Css.
+     * 
+     * @throws Exception
+     */
+    public void compile() throws Exception {
+        List<Visitor> visitors = new ArrayList<Visitor>();
+        visitors.add(new ImportVisitor());
+        visitors.add(new MixinVisitor());
+        visitors.add(new VariableVisitor());
+        visitors.add(new ParentSelectorVisitor());
+        visitors.add(new BlockVisitor());
+        visitors.add(new NestPropertiesVisitor());
+        visitors.add(new ExtendVisitor());
+        for (Visitor visitor : visitors) {
+            visitor.traverse(this);
+        }
+    }
+
+    /**
+     * Prints out the current state of the node tree. Will return SCSS before
+     * compile and CSS after.
+     * 
+     * For now this is an own method with it's own implementation that most node
+     * types will implement themselves.
+     */
+    @Override
+    public String toString() {
+        StringBuilder string = new StringBuilder("");
+        if (children.size() > 0) {
+            string.append(children.get(0).toString());
+        }
+        String delimeter = "\n\n";
+        if (children.size() > 1) {
+            for (int i = 1; i < children.size(); i++) {
+                String childString = children.get(i).toString();
+                if (childString != null) {
+                    string.append(delimeter).append(childString);
+                }
+            }
+        }
+        String output = string.toString();
+        return output;
+    }
+}
diff --git a/sass/src/com/vaadin/sass/handler/SCSSDocumentHandler.java b/sass/src/com/vaadin/sass/handler/SCSSDocumentHandler.java
new file mode 100644 (file)
index 0000000..1ac2f00
--- /dev/null
@@ -0,0 +1,52 @@
+package com.vaadin.sass.handler;
+
+import java.util.Collection;
+
+import org.w3c.css.sac.DocumentHandler;
+import org.w3c.css.sac.LexicalUnit;
+import org.w3c.css.sac.SACMediaList;
+import org.w3c.css.sac.SelectorList;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.tree.EachNode;
+import com.vaadin.sass.tree.ForNode;
+import com.vaadin.sass.tree.IfNode;
+import com.vaadin.sass.tree.MixinDefNode;
+import com.vaadin.sass.tree.VariableNode;
+import com.vaadin.sass.tree.WhileNode;
+
+public interface SCSSDocumentHandler extends DocumentHandler {
+    ScssStylesheet getStyleSheet();
+
+    void variable(String name, LexicalUnit value, boolean guarded);
+
+    void startMixinDirective(String name, Collection<VariableNode> args);
+
+    void endMixinDirective(String name, Collection<VariableNode> args);
+
+    MixinDefNode mixinDirective(String name, String args, String body);
+
+    void debugDirective();
+
+    ForNode forDirective(String var, String from, String to, boolean exclusive,
+            String body);
+
+    EachNode eachDirective(String var, String list, String body);
+
+    WhileNode whileDirective(String condition, String body);
+
+    IfNode ifDirective();
+
+    void extendDirective(SelectorList list);
+
+    void startNestedProperties(String name);
+
+    void endNestedProperties(String name);
+
+    void includeDirective(String name, Collection<LexicalUnit> args);
+
+    void importStyle(String uri, SACMediaList media, boolean isURL);
+
+    void property(String name, LexicalUnit value, boolean important,
+            String comment);
+}
diff --git a/sass/src/com/vaadin/sass/handler/SCSSDocumentHandlerImpl.java b/sass/src/com/vaadin/sass/handler/SCSSDocumentHandlerImpl.java
new file mode 100644 (file)
index 0000000..f4e9398
--- /dev/null
@@ -0,0 +1,251 @@
+package com.vaadin.sass.handler;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.LexicalUnit;
+import org.w3c.css.sac.SACMediaList;
+import org.w3c.css.sac.SelectorList;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.tree.BlockNode;
+import com.vaadin.sass.tree.EachNode;
+import com.vaadin.sass.tree.ExtendNode;
+import com.vaadin.sass.tree.ForNode;
+import com.vaadin.sass.tree.IfNode;
+import com.vaadin.sass.tree.ImportNode;
+import com.vaadin.sass.tree.MediaNode;
+import com.vaadin.sass.tree.MixinDefNode;
+import com.vaadin.sass.tree.MixinNode;
+import com.vaadin.sass.tree.NestPropertiesNode;
+import com.vaadin.sass.tree.Node;
+import com.vaadin.sass.tree.RuleNode;
+import com.vaadin.sass.tree.VariableNode;
+import com.vaadin.sass.tree.WhileNode;
+
+public class SCSSDocumentHandlerImpl implements SCSSDocumentHandler {
+
+    private final ScssStylesheet styleSheet;
+    Stack<Node> nodeStack = new Stack<Node>();
+    private Map<String, Stack<LexicalUnit>> variableMap;
+
+    public SCSSDocumentHandlerImpl() {
+        this(new ScssStylesheet());
+        variableMap = new HashMap<String, Stack<LexicalUnit>>();
+    }
+
+    public SCSSDocumentHandlerImpl(ScssStylesheet styleSheet) {
+        this.styleSheet = styleSheet;
+        nodeStack.push(styleSheet);
+    }
+
+    public void addVariable(String varName, LexicalUnit value) {
+        if (variableMap.get(varName) == null) {
+            variableMap.put(varName, new Stack<LexicalUnit>());
+        }
+        Stack<LexicalUnit> valueStack = variableMap.get(varName);
+        valueStack.push(value);
+    }
+
+    public void removeVaraible(String varName) {
+        Stack<LexicalUnit> valueStack = variableMap.get(varName);
+        if (valueStack != null && !valueStack.isEmpty()) {
+            valueStack.pop();
+        }
+    }
+
+    public LexicalUnit getVariable(String varName) {
+        Stack<LexicalUnit> valueStack = variableMap.get(varName);
+        if (valueStack != null && !valueStack.isEmpty()) {
+            return valueStack.peek();
+        }
+        return null;
+    }
+
+    @Override
+    public ScssStylesheet getStyleSheet() {
+        return styleSheet;
+    }
+
+    @Override
+    public void startDocument(InputSource source) throws CSSException {
+        nodeStack.push(styleSheet);
+        // System.out.println("startDocument(InputSource source): "
+        // + source.getURI());
+    }
+
+    @Override
+    public void endDocument(InputSource source) throws CSSException {
+        // System.out.println("endDocument(InputSource source): "
+        // + source.getURI());
+    }
+
+    @Override
+    public void variable(String name, LexicalUnit value, boolean guarded) {
+        VariableNode node = new VariableNode(name, value, guarded);
+        nodeStack.peek().appendChild(node);
+    }
+
+    @Override
+    public void debugDirective() {
+    }
+
+    @Override
+    public ForNode forDirective(String var, String from, String to,
+            boolean exclusive, String body) {
+        ForNode node = new ForNode(var, from, to, exclusive, body);
+        System.out.println(node);
+        return node;
+    }
+
+    @Override
+    public EachNode eachDirective(String var, String list, String body) {
+        EachNode node = new EachNode(var, list, body);
+        System.out.println(node);
+        return node;
+    }
+
+    @Override
+    public WhileNode whileDirective(String condition, String body) {
+        WhileNode node = new WhileNode(condition, body);
+        System.out.println(node);
+        return node;
+    }
+
+    @Override
+    public IfNode ifDirective() {
+        return new IfNode();
+    }
+
+    @Override
+    public void comment(String text) throws CSSException {
+        System.out.println("comment(String text): " + text);
+    }
+
+    @Override
+    public void ignorableAtRule(String atRule) throws CSSException {
+        System.out.println("ignorableAtRule(String atRule): " + atRule);
+    }
+
+    @Override
+    public void namespaceDeclaration(String prefix, String uri)
+            throws CSSException {
+        System.out.println("namespaceDeclaration(String prefix, String uri): "
+                + prefix + ", " + uri);
+    }
+
+    @Override
+    public void importStyle(String uri, SACMediaList media,
+            String defaultNamespaceURI) throws CSSException {
+    }
+
+    @Override
+    public void startMedia(SACMediaList media) throws CSSException {
+        MediaNode node = new MediaNode(media);
+        nodeStack.peek().appendChild(node);
+        nodeStack.push(node);
+    }
+
+    @Override
+    public void endMedia(SACMediaList media) throws CSSException {
+        nodeStack.pop();
+    }
+
+    @Override
+    public void startPage(String name, String pseudo_page) throws CSSException {
+        System.out.println("startPage(String name, String pseudo_page): "
+                + name + ", " + pseudo_page);
+    }
+
+    @Override
+    public void endPage(String name, String pseudo_page) throws CSSException {
+        System.out.println("endPage(String name, String pseudo_page): " + name
+                + ", " + pseudo_page);
+    }
+
+    @Override
+    public void startFontFace() throws CSSException {
+        System.out.println("startFontFace()");
+    }
+
+    @Override
+    public void endFontFace() throws CSSException {
+        System.out.println("endFontFace()");
+    }
+
+    @Override
+    public void startSelector(SelectorList selectors) throws CSSException {
+        BlockNode node = new BlockNode(selectors);
+        nodeStack.peek().appendChild(node);
+        nodeStack.push(node);
+    }
+
+    @Override
+    public void endSelector(SelectorList selectors) throws CSSException {
+        nodeStack.pop();
+    }
+
+    @Override
+    public void property(String name, LexicalUnit value, boolean important)
+            throws CSSException {
+        property(name, value, important, null);
+    }
+
+    public void property(String name, LexicalUnit value, boolean important,
+            String comment) {
+        RuleNode node = new RuleNode(name, value, important, comment);
+        nodeStack.peek().appendChild(node);
+    }
+
+    @Override
+    public void extendDirective(SelectorList list) {
+        ExtendNode node = new ExtendNode(list);
+        nodeStack.peek().appendChild(node);
+    }
+
+    @Override
+    public MixinDefNode mixinDirective(String name, String args, String body) {
+        MixinDefNode node = new MixinDefNode(name, args, body);
+        return node;
+    }
+
+    @Override
+    public void startNestedProperties(String name) {
+        NestPropertiesNode node = new NestPropertiesNode(name);
+        nodeStack.peek().appendChild(node);
+        nodeStack.push(node);
+    }
+
+    @Override
+    public void endNestedProperties(String name) {
+        nodeStack.pop();
+    }
+
+    @Override
+    public void startMixinDirective(String name, Collection<VariableNode> args) {
+        MixinDefNode node = new MixinDefNode(name, args);
+        nodeStack.peek().appendChild(node);
+        nodeStack.push(node);
+    }
+
+    @Override
+    public void endMixinDirective(String name, Collection<VariableNode> args) {
+        nodeStack.pop();
+    }
+
+    @Override
+    public void includeDirective(String name, Collection<LexicalUnit> args) {
+        MixinNode node = new MixinNode(name, args);
+        nodeStack.peek().appendChild(node);
+    }
+
+    @Override
+    public void importStyle(String uri, SACMediaList media, boolean isURL) {
+        ImportNode node = new ImportNode(uri, media, isURL);
+        nodeStack.peek().appendChild(node);
+    }
+}
diff --git a/sass/src/com/vaadin/sass/parser/CharStream.java b/sass/src/com/vaadin/sass/parser/CharStream.java
new file mode 100644 (file)
index 0000000..004e3eb
--- /dev/null
@@ -0,0 +1,115 @@
+/* Generated By:JavaCC: Do not edit this line. CharStream.java Version 5.0 */
+/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+package com.vaadin.sass.parser;
+
+/**
+ * This interface describes a character stream that maintains line and
+ * column number positions of the characters.  It also has the capability
+ * to backup the stream to some extent.  An implementation of this
+ * interface is used in the TokenManager implementation generated by
+ * JavaCCParser.
+ *
+ * All the methods except backup can be implemented in any fashion. backup
+ * needs to be implemented correctly for the correct operation of the lexer.
+ * Rest of the methods are all used to get information like line number,
+ * column number and the String that constitutes a token and are not used
+ * by the lexer. Hence their implementation won't affect the generated lexer's
+ * operation.
+ */
+
+public
+interface CharStream {
+
+  /**
+   * Returns the next character from the selected input.  The method
+   * of selecting the input is the responsibility of the class
+   * implementing this interface.  Can throw any java.io.IOException.
+   */
+  char readChar() throws java.io.IOException;
+
+  @Deprecated
+  /**
+   * Returns the column position of the character last read.
+   * @deprecated
+   * @see #getEndColumn
+   */
+  int getColumn();
+
+  @Deprecated
+  /**
+   * Returns the line number of the character last read.
+   * @deprecated
+   * @see #getEndLine
+   */
+  int getLine();
+
+  /**
+   * Returns the column number of the last character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getEndColumn();
+
+  /**
+   * Returns the line number of the last character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getEndLine();
+
+  /**
+   * Returns the column number of the first character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getBeginColumn();
+
+  /**
+   * Returns the line number of the first character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getBeginLine();
+
+  /**
+   * Backs up the input stream by amount steps. Lexer calls this method if it
+   * had already read some characters, but could not use them to match a
+   * (longer) token. So, they will be used again as the prefix of the next
+   * token and it is the implemetation's responsibility to do this right.
+   */
+  void backup(int amount);
+
+  /**
+   * Returns the next character that marks the beginning of the next token.
+   * All characters must remain in the buffer between two successive calls
+   * to this method to implement backup correctly.
+   */
+  char BeginToken() throws java.io.IOException;
+
+  /**
+   * Returns a string made up of characters from the marked token beginning
+   * to the current buffer position. Implementations have the choice of returning
+   * anything that they want to. For example, for efficiency, one might decide
+   * to just return null, which is a valid implementation.
+   */
+  String GetImage();
+
+  /**
+   * Returns an array of characters that make up the suffix of length 'len' for
+   * the currently matched token. This is used to build up the matched string
+   * for use in actions in the case of MORE. A simple and inefficient
+   * implementation of this is as follows :
+   *
+   *   {
+   *      String t = GetImage();
+   *      return t.substring(t.length() - len, t.length()).toCharArray();
+   *   }
+   */
+  char[] GetSuffix(int len);
+
+  /**
+   * The lexer calls this function to indicate that it is done with the stream
+   * and hence implementations can free any resources held by this class.
+   * Again, the body of this function can be just empty and it will not
+   * affect the lexer's operation.
+   */
+  void Done();
+
+}
+/* JavaCC - OriginalChecksum=28e31651bf0ffe57018eaaa3310c55ac (do not edit this line) */
diff --git a/sass/src/com/vaadin/sass/parser/Generic_CharStream.java b/sass/src/com/vaadin/sass/parser/Generic_CharStream.java
new file mode 100644 (file)
index 0000000..fd9c8a7
--- /dev/null
@@ -0,0 +1,355 @@
+/* Generated By:JavaCC: Do not edit this line. Generic_CharStream.java Version 0.7pre6 */
+package com.vaadin.sass.parser;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (without unicode processing).
+ */
+
+public final class Generic_CharStream implements CharStream
+{
+  public static final boolean staticFlag = false;
+  int bufsize;
+  int available;
+  int tokenBegin;
+  public int bufpos = -1;
+  private int bufline[];
+  private int bufcolumn[];
+
+  private int column = 0;
+  private int line = 1;
+
+  private boolean prevCharIsCR = false;
+  private boolean prevCharIsLF = false;
+
+  private java.io.Reader reader;
+
+  private char[] buffer;
+  private int maxNextCharInd = 0;
+  private int inBuf = 0;
+
+  private final void ExpandBuff(boolean wrapAround)
+  {
+     char[] newbuffer = new char[bufsize + 2048];
+     int newbufline[] = new int[bufsize + 2048];
+     int newbufcolumn[] = new int[bufsize + 2048];
+
+     try
+     {
+        if (wrapAround)
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           System.arraycopy(buffer, 0, newbuffer,
+                                             bufsize - tokenBegin, bufpos);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+        }
+        else
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos -= tokenBegin);
+        }
+     }
+     catch (Throwable t)
+     {
+        throw new Error(t.getMessage());
+     }
+
+
+     bufsize += 2048;
+     available = bufsize;
+     tokenBegin = 0;
+  }
+
+  private final void FillBuff() throws java.io.IOException
+  {
+     if (maxNextCharInd == available)
+     {
+        if (available == bufsize)
+        {
+           if (tokenBegin > 2048)
+           {
+              bufpos = maxNextCharInd = 0;
+              available = tokenBegin;
+           }
+           else if (tokenBegin < 0)
+              bufpos = maxNextCharInd = 0;
+           else
+              ExpandBuff(false);
+        }
+        else if (available > tokenBegin)
+           available = bufsize;
+        else if ((tokenBegin - available) < 2048)
+           ExpandBuff(true);
+        else
+           available = tokenBegin;
+     }
+
+     int i;
+     try {
+        if ((i = reader.read(buffer, maxNextCharInd,
+                                    available - maxNextCharInd)) == -1)
+        {
+           reader.close();
+           throw new java.io.IOException();
+        }
+        else
+           maxNextCharInd += i;
+        return;
+     }
+     catch(java.io.IOException e) {
+        --bufpos;
+        backup(0);
+        if (tokenBegin == -1)
+           tokenBegin = bufpos;
+        throw e;
+     }
+  }
+
+  public final char BeginToken() throws java.io.IOException
+  {
+     tokenBegin = -1;
+     char c = readChar();
+     tokenBegin = bufpos;
+
+     return c;
+  }
+
+  private final void UpdateLineColumn(char c)
+  {
+     column++;
+
+     if (prevCharIsLF)
+     {
+        prevCharIsLF = false;
+        line += (column = 1);
+     }
+     else if (prevCharIsCR)
+     {
+        prevCharIsCR = false;
+        if (c == '\n')
+        {
+           prevCharIsLF = true;
+        }
+        else
+           line += (column = 1);
+     }
+
+     switch (c)
+     {
+        case '\r' :
+           prevCharIsCR = true;
+           break;
+        case '\n' :
+           prevCharIsLF = true;
+           break;
+        case '\t' :
+           column--;
+           column += (8 - (column & 07));
+           break;
+        default :
+           break;
+     }
+
+     bufline[bufpos] = line;
+     bufcolumn[bufpos] = column;
+  }
+
+  public final char readChar() throws java.io.IOException
+  {
+     if (inBuf > 0)
+     {
+        --inBuf;
+        return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]);
+     }
+
+     if (++bufpos >= maxNextCharInd)
+        FillBuff();
+
+     char c = (char)((char)0xff & buffer[bufpos]);
+
+     UpdateLineColumn(c);
+     return (c);
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndColumn
+   */
+
+  public final int getColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndLine
+   */
+
+  public final int getLine() {
+     return bufline[bufpos];
+  }
+
+  public final int getEndColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  public final int getEndLine() {
+     return bufline[bufpos];
+  }
+
+  public final int getBeginColumn() {
+     return bufcolumn[tokenBegin];
+  }
+
+  public final int getBeginLine() {
+     return bufline[tokenBegin];
+  }
+
+  public final void backup(int amount) {
+
+    inBuf += amount;
+    if ((bufpos -= amount) < 0)
+       bufpos += bufsize;
+  }
+
+  public Generic_CharStream(java.io.Reader dstream, int startline,
+                           int startcolumn, int buffersize)
+  {
+    reader = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    available = bufsize = buffersize;
+    buffer = new char[buffersize];
+    bufline = new int[buffersize];
+    bufcolumn = new int[buffersize];
+  }
+
+  public Generic_CharStream(java.io.Reader dstream, int startline,
+                           int startcolumn)
+  {
+     this(dstream, startline, startcolumn, 4096);
+  }
+  public void ReInit(java.io.Reader dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    reader = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    if (buffer == null || buffersize != buffer.length)
+    {
+      available = bufsize = buffersize;
+      buffer = new char[buffersize];
+      bufline = new int[buffersize];
+      bufcolumn = new int[buffersize];
+    }
+    prevCharIsLF = prevCharIsCR = false;
+    tokenBegin = inBuf = maxNextCharInd = 0;
+    bufpos = -1;
+  }
+
+  public void ReInit(java.io.Reader dstream, int startline,
+                                                           int startcolumn)
+  {
+     ReInit(dstream, startline, startcolumn, 4096);
+  }
+
+  public final String GetImage()
+  {
+     if (bufpos >= tokenBegin)
+        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+     else
+        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                              new String(buffer, 0, bufpos + 1);
+  }
+
+  public final char[] GetSuffix(int len)
+  {
+     char[] ret = new char[len];
+
+     if ((bufpos + 1) >= len)
+        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+     else
+     {
+        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                                                          len - bufpos - 1);
+        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+     }
+     return ret;
+  }
+
+  public void Done()
+  {
+     buffer = null;
+     bufline = null;
+     bufcolumn = null;
+  }
+
+  /**
+   * Method to adjust line and column numbers for the start of a token.<BR>
+   */
+  public void adjustBeginLineColumn(int newLine, int newCol)
+  {
+     int start = tokenBegin;
+     int len;
+
+     if (bufpos >= tokenBegin)
+     {
+        len = bufpos - tokenBegin + inBuf + 1;
+     }
+     else
+     {
+        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+     }
+
+     int i = 0, j = 0, k = 0;
+     int nextColDiff = 0, columnDiff = 0;
+
+     while (i < len &&
+            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+     {
+        bufline[j] = newLine;
+        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+        bufcolumn[j] = newCol + columnDiff;
+        columnDiff = nextColDiff;
+        i++;
+     } 
+
+     if (i < len)
+     {
+        bufline[j] = newLine++;
+        bufcolumn[j] = newCol + columnDiff;
+
+        while (i++ < len)
+        {
+           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+              bufline[j] = newLine++;
+           else
+              bufline[j] = newLine;
+        }
+     }
+
+     line = bufline[j];
+     column = bufcolumn[j];
+  }
+
+}
diff --git a/sass/src/com/vaadin/sass/parser/JumpException.java b/sass/src/com/vaadin/sass/parser/JumpException.java
new file mode 100644 (file)
index 0000000..4d0f592
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * (c) COPYRIGHT 1999 World Wide Web Consortium
+ * (Massachusetts Institute of Technology, Institut National de Recherche
+ *  en Informatique et en Automatique, Keio University).
+ * All Rights Reserved. http://www.w3.org/Consortium/Legal/
+ *
+ * $Id: JumpException.java,v 1.1 1999/06/09 15:21:33 plehegar Exp $
+ */
+package com.vaadin.sass.parser;
+
+/**
+ * @version $Revision: 1.1 $
+ * @author Philippe Le Hegaret
+ */
+public class JumpException extends RuntimeException {
+    private static final long serialVersionUID = -2010286909393046205L;
+
+    /**
+     * Creates a new JumpException
+     */
+    public JumpException() {
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/parser/LexicalUnitImpl.java b/sass/src/com/vaadin/sass/parser/LexicalUnitImpl.java
new file mode 100644 (file)
index 0000000..2a62c0d
--- /dev/null
@@ -0,0 +1,575 @@
+/*
+ * Copyright (c) 1999 World Wide Web Consortium
+ * (Massachusetts Institute of Technology, Institut National de Recherche
+ *  en Informatique et en Automatique, Keio University).
+ * All Rights Reserved. http://www.w3.org/Consortium/Legal/
+ *
+ * $Id: LexicalUnitImpl.java,v 1.3 2000/02/15 02:08:19 plehegar Exp $
+ */
+package com.vaadin.sass.parser;
+
+import java.io.Serializable;
+
+import org.w3c.css.sac.LexicalUnit;
+
+import com.vaadin.sass.util.ColorUtil;
+
+/**
+ * @version $Revision: 1.3 $
+ * @author Philippe Le Hegaret
+ */
+public class LexicalUnitImpl implements LexicalUnit, SCSSLexicalUnit,
+        Serializable {
+    private static final long serialVersionUID = -6649833716809789399L;
+
+    LexicalUnit prev;
+    LexicalUnit next;
+
+    short type;
+    int line;
+    int column;
+
+    int i;
+    float f;
+    short dimension;
+    String sdimension;
+    String s;
+    String fname;
+    LexicalUnitImpl params;
+
+    LexicalUnitImpl(short type, int line, int column, LexicalUnitImpl p) {
+        if (p != null) {
+            prev = p;
+            p.next = this;
+        }
+        this.line = line;
+        this.column = column - 1;
+        this.type = type;
+    }
+
+    LexicalUnitImpl(int line, int column, LexicalUnitImpl previous, int i) {
+        this(SAC_INTEGER, line, column, previous);
+        this.i = i;
+    }
+
+    LexicalUnitImpl(int line, int column, LexicalUnitImpl previous,
+            short dimension, String sdimension, float f) {
+        this(dimension, line, column, previous);
+        this.f = f;
+        this.dimension = dimension;
+        this.sdimension = sdimension;
+    }
+
+    LexicalUnitImpl(int line, int column, LexicalUnitImpl previous, short type,
+            String s) {
+        this(type, line, column, previous);
+        this.s = s;
+    }
+
+    LexicalUnitImpl(short type, int line, int column, LexicalUnitImpl previous,
+            String fname, LexicalUnitImpl params) {
+        this(type, line, column, previous);
+        this.fname = fname;
+        this.params = params;
+    }
+
+    public int getLineNumber() {
+        return line;
+    }
+
+    public int getColumnNumber() {
+        return column;
+    }
+
+    @Override
+    public short getLexicalUnitType() {
+        return type;
+    }
+
+    @Override
+    public LexicalUnit getNextLexicalUnit() {
+        return next;
+    }
+
+    public void setNextLexicalUnit(LexicalUnit n) {
+        next = n;
+    }
+
+    @Override
+    public LexicalUnit getPreviousLexicalUnit() {
+        return prev;
+    }
+
+    @Override
+    public int getIntegerValue() {
+        return i;
+    }
+
+    void setIntegerValue(int i) {
+        this.i = i;
+    }
+
+    @Override
+    public float getFloatValue() {
+        return f;
+    }
+
+    public void setFloatValue(float f) {
+        this.f = f;
+    }
+
+    @Override
+    public String getDimensionUnitText() {
+        switch (type) {
+        case SAC_PERCENTAGE:
+            return "%";
+        case SAC_EM:
+            return "em";
+        case SAC_EX:
+            return "ex";
+        case SAC_PIXEL:
+            return "px";
+        case SAC_CENTIMETER:
+            return "cm";
+        case SAC_MILLIMETER:
+            return "mm";
+        case SAC_INCH:
+            return "in";
+        case SAC_POINT:
+            return "pt";
+        case SAC_PICA:
+            return "pc";
+        case SAC_DEGREE:
+            return "deg";
+        case SAC_RADIAN:
+            return "rad";
+        case SAC_GRADIAN:
+            return "grad";
+        case SAC_MILLISECOND:
+            return "ms";
+        case SAC_SECOND:
+            return "s";
+        case SAC_HERTZ:
+            return "Hz";
+        case SAC_KILOHERTZ:
+            return "kHz";
+        case SAC_DIMENSION:
+            return sdimension;
+        default:
+            throw new IllegalStateException("invalid dimension " + type);
+        }
+    }
+
+    @Override
+    public String getStringValue() {
+        return s;
+    }
+
+    public void setStringValue(String str) {
+        s = str;
+    }
+
+    @Override
+    public String getFunctionName() {
+        return fname;
+    }
+
+    @Override
+    public LexicalUnitImpl getParameters() {
+        return params;
+    }
+
+    @Override
+    public LexicalUnitImpl getSubValues() {
+        return params;
+    }
+
+    @Override
+    public String toString() {
+        short type = getLexicalUnitType();
+        String text = null;
+        switch (type) {
+        case SCSS_VARIABLE:
+            text = "$" + s;
+            break;
+        case LexicalUnit.SAC_OPERATOR_COMMA:
+            text = ",";
+            break;
+        case LexicalUnit.SAC_OPERATOR_PLUS:
+            text = "+";
+            break;
+        case LexicalUnit.SAC_OPERATOR_MINUS:
+            text = "-";
+            break;
+        case LexicalUnit.SAC_OPERATOR_MULTIPLY:
+            text = "*";
+            break;
+        case LexicalUnit.SAC_OPERATOR_SLASH:
+            text = "/";
+            break;
+        case LexicalUnit.SAC_OPERATOR_MOD:
+            text = "%";
+            break;
+        case LexicalUnit.SAC_OPERATOR_EXP:
+            text = "^";
+            break;
+        case LexicalUnit.SAC_OPERATOR_LT:
+            text = "<";
+            break;
+        case LexicalUnit.SAC_OPERATOR_GT:
+            text = ">";
+            break;
+        case LexicalUnit.SAC_OPERATOR_LE:
+            text = "<=";
+            break;
+        case LexicalUnit.SAC_OPERATOR_GE:
+            text = "=>";
+            break;
+        case LexicalUnit.SAC_OPERATOR_TILDE:
+            text = "~";
+            break;
+        case LexicalUnit.SAC_INHERIT:
+            text = "inherit";
+            break;
+        case LexicalUnit.SAC_INTEGER:
+            text = Integer.toString(getIntegerValue(), 10);
+            break;
+        case LexicalUnit.SAC_REAL:
+            text = getFloatValue() + "";
+            break;
+        case LexicalUnit.SAC_EM:
+        case LexicalUnit.SAC_EX:
+        case LexicalUnit.SAC_PIXEL:
+        case LexicalUnit.SAC_INCH:
+        case LexicalUnit.SAC_CENTIMETER:
+        case LexicalUnit.SAC_MILLIMETER:
+        case LexicalUnit.SAC_POINT:
+        case LexicalUnit.SAC_PICA:
+        case LexicalUnit.SAC_PERCENTAGE:
+        case LexicalUnit.SAC_DEGREE:
+        case LexicalUnit.SAC_GRADIAN:
+        case LexicalUnit.SAC_RADIAN:
+        case LexicalUnit.SAC_MILLISECOND:
+        case LexicalUnit.SAC_SECOND:
+        case LexicalUnit.SAC_HERTZ:
+        case LexicalUnit.SAC_KILOHERTZ:
+        case LexicalUnit.SAC_DIMENSION:
+            float f = getFloatValue();
+            int i = (int) f;
+            if ((i) == f) {
+                text = i + getDimensionUnitText();
+            } else {
+                text = f + getDimensionUnitText();
+            }
+            break;
+        case LexicalUnit.SAC_URI:
+            text = "url(" + getStringValue() + ")";
+            break;
+        case LexicalUnit.SAC_RGBCOLOR:
+        case LexicalUnit.SAC_COUNTER_FUNCTION:
+        case LexicalUnit.SAC_COUNTERS_FUNCTION:
+        case LexicalUnit.SAC_RECT_FUNCTION:
+        case LexicalUnit.SAC_FUNCTION:
+            String funcName = getFunctionName();
+            LexicalUnitImpl firstParam = getParameters();
+            if ("round".equals(funcName)) {
+                firstParam
+                        .setFloatValue(Math.round(firstParam.getFloatValue()));
+                text = firstParam.toString();
+            } else if ("ceil".equals(funcName)) {
+                firstParam.setFloatValue((float) Math.ceil(firstParam
+                        .getFloatValue()));
+                text = firstParam.toString();
+            } else if ("floor".equals(funcName)) {
+                firstParam.setFloatValue((float) Math.floor(firstParam
+                        .getFloatValue()));
+                text = firstParam.toString();
+            } else if ("abs".equals(funcName)) {
+                firstParam.setFloatValue(Math.abs(firstParam.getFloatValue()));
+                text = firstParam.toString();
+            } else if ("darken".equals(funcName)) {
+                LexicalUnitImpl dark = ColorUtil.darken(this);
+                text = dark.toString();
+            } else if ("lighten".equals(funcName)) {
+                text = ColorUtil.lighten(this).toString();
+            } else {
+                text = getFunctionName() + "(" + getParameters() + ")";
+            }
+            break;
+        case LexicalUnit.SAC_IDENT:
+            text = getStringValue();
+            break;
+        case LexicalUnit.SAC_STRING_VALUE:
+            // @@SEEME. not exact
+            text = "\"" + getStringValue() + "\"";
+            break;
+        case LexicalUnit.SAC_ATTR:
+            text = "attr(" + getStringValue() + ")";
+            break;
+        case LexicalUnit.SAC_UNICODERANGE:
+            text = "@@TODO";
+            break;
+        case LexicalUnit.SAC_SUB_EXPRESSION:
+            text = getSubValues().toString();
+            break;
+        default:
+            text = "@unknown";
+            break;
+        }
+        if (getNextLexicalUnit() != null) {
+            if (getNextLexicalUnit().getLexicalUnitType() == SAC_OPERATOR_COMMA) {
+                return text + getNextLexicalUnit();
+            }
+            return text + ' ' + getNextLexicalUnit();
+        } else {
+            return text;
+        }
+    }
+
+    @Override
+    public LexicalUnitImpl divide(LexicalUnitImpl denominator) {
+        setFloatValue(getFloatValue() / denominator.getIntegerValue());
+        return this;
+    }
+
+    @Override
+    public LexicalUnitImpl add(LexicalUnitImpl another) {
+        setFloatValue(getFloatValue() + another.getFloatValue());
+        return this;
+    }
+
+    @Override
+    public LexicalUnitImpl minus(LexicalUnitImpl another) {
+        setFloatValue(getFloatValue() - another.getFloatValue());
+        return this;
+    }
+
+    @Override
+    public LexicalUnitImpl multiply(LexicalUnitImpl another) {
+        setFloatValue(getFloatValue() * another.getIntegerValue());
+        return this;
+    }
+
+    public void replaceValue(LexicalUnitImpl another) {
+        type = another.getLexicalUnitType();
+        i = another.getIntegerValue();
+        f = another.getFloatValue();
+        dimension = another.getDimension();
+        sdimension = another.getSdimension();
+        s = another.getStringValue();
+        fname = getFunctionName();
+        params = another.getParameters();
+        prev = another.getPreviousLexicalUnit();
+        LexicalUnit finalNextInAnother = another;
+        while (finalNextInAnother.getNextLexicalUnit() != null) {
+            finalNextInAnother = finalNextInAnother.getNextLexicalUnit();
+        }
+        ((LexicalUnitImpl) finalNextInAnother).setNextLexicalUnit(next);
+        next = another.next;
+    }
+
+    public short getDimension() {
+        return dimension;
+    }
+
+    public String getSdimension() {
+        return sdimension;
+    }
+
+    // here some useful function for creation
+    public static LexicalUnitImpl createVariable(int line, int column,
+            LexicalUnitImpl previous, String name) {
+        return new LexicalUnitImpl(line, column, previous, SCSS_VARIABLE, name);
+    }
+
+    public static LexicalUnitImpl createNumber(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        int i = (int) v;
+        if (v == i) {
+            return new LexicalUnitImpl(line, column, previous, i);
+        } else {
+            return new LexicalUnitImpl(line, column, previous, SAC_REAL, "", v);
+        }
+    }
+
+    public static LexicalUnitImpl createInteger(int line, int column,
+            LexicalUnitImpl previous, int i) {
+        return new LexicalUnitImpl(line, column, previous, i);
+    }
+
+    public static LexicalUnitImpl createPercentage(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_PERCENTAGE,
+                null, v);
+    }
+
+    static LexicalUnitImpl createEMS(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_EM, null, v);
+    }
+
+    static LexicalUnitImpl createEXS(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_EX, null, v);
+    }
+
+    static LexicalUnitImpl createPX(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_PIXEL, null, v);
+    }
+
+    static LexicalUnitImpl createCM(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_CENTIMETER,
+                null, v);
+    }
+
+    static LexicalUnitImpl createMM(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_MILLIMETER,
+                null, v);
+    }
+
+    static LexicalUnitImpl createIN(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_INCH, null, v);
+    }
+
+    static LexicalUnitImpl createPT(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_POINT, null, v);
+    }
+
+    static LexicalUnitImpl createPC(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_PICA, null, v);
+    }
+
+    static LexicalUnitImpl createDEG(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_DEGREE, null, v);
+    }
+
+    static LexicalUnitImpl createRAD(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_RADIAN, null, v);
+    }
+
+    static LexicalUnitImpl createGRAD(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        return new LexicalUnitImpl(line, column, previous, SAC_GRADIAN, null, v);
+    }
+
+    static LexicalUnitImpl createMS(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        if (v < 0) {
+            throw new ParseException("Time values may not be negative");
+        }
+        return new LexicalUnitImpl(line, column, previous, SAC_MILLISECOND,
+                null, v);
+    }
+
+    static LexicalUnitImpl createS(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        if (v < 0) {
+            throw new ParseException("Time values may not be negative");
+        }
+        return new LexicalUnitImpl(line, column, previous, SAC_SECOND, null, v);
+    }
+
+    static LexicalUnitImpl createHZ(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        if (v < 0) {
+            throw new ParseException("Frequency values may not be negative");
+        }
+        return new LexicalUnitImpl(line, column, previous, SAC_HERTZ, null, v);
+    }
+
+    static LexicalUnitImpl createKHZ(int line, int column,
+            LexicalUnitImpl previous, float v) {
+        if (v < 0) {
+            throw new ParseException("Frequency values may not be negative");
+        }
+        return new LexicalUnitImpl(line, column, previous, SAC_KILOHERTZ, null,
+                v);
+    }
+
+    static LexicalUnitImpl createDimen(int line, int column,
+            LexicalUnitImpl previous, float v, String s) {
+        return new LexicalUnitImpl(line, column, previous, SAC_DIMENSION, s, v);
+    }
+
+    static LexicalUnitImpl createInherit(int line, int column,
+            LexicalUnitImpl previous) {
+        return new LexicalUnitImpl(line, column, previous, SAC_INHERIT,
+                "inherit");
+    }
+
+    public static LexicalUnitImpl createIdent(int line, int column,
+            LexicalUnitImpl previous, String s) {
+        return new LexicalUnitImpl(line, column, previous, SAC_IDENT, s);
+    }
+
+    static LexicalUnitImpl createString(int line, int column,
+            LexicalUnitImpl previous, String s) {
+        return new LexicalUnitImpl(line, column, previous, SAC_STRING_VALUE, s);
+    }
+
+    static LexicalUnitImpl createURL(int line, int column,
+            LexicalUnitImpl previous, String s) {
+        return new LexicalUnitImpl(line, column, previous, SAC_URI, s);
+    }
+
+    static LexicalUnitImpl createAttr(int line, int column,
+            LexicalUnitImpl previous, String s) {
+        return new LexicalUnitImpl(line, column, previous, SAC_ATTR, s);
+    }
+
+    static LexicalUnitImpl createCounter(int line, int column,
+            LexicalUnitImpl previous, LexicalUnit params) {
+        return new LexicalUnitImpl(SAC_COUNTER_FUNCTION, line, column,
+                previous, "counter", (LexicalUnitImpl) params);
+    }
+
+    public static LexicalUnitImpl createCounters(int line, int column,
+            LexicalUnitImpl previous, LexicalUnit params) {
+        return new LexicalUnitImpl(SAC_COUNTERS_FUNCTION, line, column,
+                previous, "counters", (LexicalUnitImpl) params);
+    }
+
+    public static LexicalUnitImpl createRGBColor(int line, int column,
+            LexicalUnitImpl previous, LexicalUnit params) {
+        return new LexicalUnitImpl(SAC_RGBCOLOR, line, column, previous, "rgb",
+                (LexicalUnitImpl) params);
+    }
+
+    public static LexicalUnitImpl createRect(int line, int column,
+            LexicalUnitImpl previous, LexicalUnit params) {
+        return new LexicalUnitImpl(SAC_RECT_FUNCTION, line, column, previous,
+                "rect", (LexicalUnitImpl) params);
+    }
+
+    public static LexicalUnitImpl createFunction(int line, int column,
+            LexicalUnitImpl previous, String fname, LexicalUnit params) {
+        return new LexicalUnitImpl(SAC_FUNCTION, line, column, previous, fname,
+                (LexicalUnitImpl) params);
+    }
+
+    public static LexicalUnitImpl createUnicodeRange(int line, int column,
+            LexicalUnit previous, LexicalUnit params) {
+        // @@ return new LexicalUnitImpl(line, column, previous, null,
+        // SAC_UNICODERANGE, params);
+        return null;
+    }
+
+    public static LexicalUnitImpl createComma(int line, int column,
+            LexicalUnitImpl previous) {
+        return new LexicalUnitImpl(SAC_OPERATOR_COMMA, line, column, previous);
+    }
+
+    public static LexicalUnitImpl createSlash(int line, int column,
+            LexicalUnitImpl previous) {
+        return new LexicalUnitImpl(SAC_OPERATOR_SLASH, line, column, previous);
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/parser/LocatorImpl.java b/sass/src/com/vaadin/sass/parser/LocatorImpl.java
new file mode 100644 (file)
index 0000000..77e7543
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 1999 World Wide Web Consortium
+ * (Massachusetts Institute of Technology, Institut National de Recherche
+ *  en Informatique et en Automatique, Keio University).
+ * All Rights Reserved. http://www.w3.org/Consortium/Legal/
+ *
+ * $Id: LocatorImpl.java,v 1.2 2000/02/14 16:59:06 plehegar Exp $
+ */
+package com.vaadin.sass.parser;
+
+import org.w3c.css.sac.Locator;
+
+/**
+ * @version $Revision: 1.2 $
+ * @author  Philippe Le Hegaret
+ */
+public class LocatorImpl implements Locator {
+
+    // W3C DEBUG mode
+    private static boolean W3CDebug;
+    static {
+       try {
+           W3CDebug = (Boolean.getBoolean("debug")
+                       || Boolean.getBoolean("org.w3c.flute.parser.LocatorImpl.debug")
+                       || Boolean.getBoolean("org.w3c.flute.parser.debug")
+                       || Boolean.getBoolean("org.w3c.flute.debug")
+                       || Boolean.getBoolean("org.w3c.debug")
+                       || Boolean.getBoolean("org.debug"));
+       } catch (Exception e) {
+           // nothing
+       }
+    }
+    
+    String uri;
+    int    line;
+    int    column;
+
+    public String getURI() {
+       return uri;
+    }
+
+    public int getLineNumber() {
+       return line;
+    }
+
+    public int getColumnNumber() {
+       return column;
+    }
+
+    /**
+     * Creates a new LocatorImpl
+     */
+    public LocatorImpl(Parser p) {
+       if (W3CDebug) {
+           System.err.println( "LocatorImpl::newLocator(" + p + ");");
+       }
+        uri = p.source.getURI();
+       line = p.token.beginLine;
+       column = p.token.beginColumn;
+    }
+    
+    /**
+     * Reinitializes a LocatorImpl
+     */
+    public LocatorImpl(Parser p, Token tok) {
+       if (W3CDebug) {
+           System.err.println( "LocatorImpl::newLocator(" + p 
+                               + ", " + tok + ");");
+       }
+        uri = p.source.getURI();
+       line = tok.beginLine;
+       column = tok.beginColumn;
+    }
+    
+    /**
+     * Reinitializes a LocatorImpl
+     */
+    public LocatorImpl(Parser p, int line, int column) {
+       if (W3CDebug) {
+           System.err.println( "LocatorImpl::newLocator(" + p 
+                               + ", " + line 
+                                + ", " + column + ");");
+       }
+        uri = p.source.getURI();
+       this.line = line;
+       this.column = column;
+    }
+    
+    /**
+     * Reinitializes a LocatorImpl
+     */
+    public LocatorImpl reInit(Parser p) {
+       if (W3CDebug) {
+           System.err.println( "LocatorImpl::reInit(" + p + ");" );
+       }
+        uri = p.source.getURI();
+       line = p.token.beginLine;
+       column = p.token.beginColumn;
+       return this;
+    }
+    
+    /**
+     * Reinitializes a LocatorImpl
+     */
+    public LocatorImpl reInit(Parser p, Token tok) {
+       if (W3CDebug) {
+           System.err.println( "LocatorImpl::reInit(" + p 
+                               + ", " + tok + ");");
+       }
+        uri = p.source.getURI();
+       line = tok.beginLine;
+       column = tok.beginColumn;
+       return this;
+    }
+    
+    /**
+     * Reinitializes a LocatorImpl
+     */
+    public LocatorImpl reInit(Parser p, int line, int column) {
+       if (W3CDebug) {
+           System.err.println("LocatorImpl::reInit(" + p 
+                              + ", " + line 
+                              + ", " + column + ");");
+       }
+        uri = p.source.getURI();
+       this.line = line;
+       this.column = column;
+       return this;
+    }
+}
diff --git a/sass/src/com/vaadin/sass/parser/MediaListImpl.java b/sass/src/com/vaadin/sass/parser/MediaListImpl.java
new file mode 100644 (file)
index 0000000..042e385
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * (c) COPYRIGHT 1999 World Wide Web Consortium
+ * (Massachusetts Institute of Technology, Institut National de Recherche
+ *  en Informatique et en Automatique, Keio University).
+ * All Rights Reserved. http://www.w3.org/Consortium/Legal/
+ *
+ * $Id: MediaListImpl.java,v 1.4 2000/04/26 13:40:19 plehegar Exp $
+ */
+package com.vaadin.sass.parser;
+
+import org.w3c.css.sac.SACMediaList;
+
+/**
+ * @version $Revision: 1.4 $
+ * @author Philippe Le Hegaret
+ */
+public class MediaListImpl implements SACMediaList {
+
+    String[] array = new String[10];
+    int current;
+
+    @Override
+    public int getLength() {
+        return current;
+    }
+
+    @Override
+    public String item(int index) {
+        if ((index < 0) || (index >= current)) {
+            return null;
+        }
+        return array[index];
+    }
+
+    void addItem(String medium) {
+        if (medium.equals("all")) {
+            array[0] = "all";
+            current = 1;
+            return;
+        }
+        for (int i = 0; i < current; i++) {
+            if (medium.equals(array[i])) {
+                return;
+            }
+        }
+        if (current == array.length) {
+            String[] old = array;
+            array = new String[current + current];
+            System.arraycopy(old, 0, array, 0, current);
+        }
+        array[current++] = medium;
+    }
+
+    /**
+     * Returns a string representation of this object.
+     */
+    @Override
+    public String toString() {
+        switch (current) {
+        case 0:
+            return "";
+        case 1:
+            return array[0];
+        default:
+            boolean not_done = true;
+            int i = 0;
+            StringBuffer buf = new StringBuffer(50);
+            do {
+                buf.append(array[i++]);
+                if (i == current) {
+                    not_done = false;
+                } else {
+                    buf.append(", ");
+                }
+            } while (not_done);
+            return buf.toString();
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/parser/ParseException.java b/sass/src/com/vaadin/sass/parser/ParseException.java
new file mode 100644 (file)
index 0000000..482e5d3
--- /dev/null
@@ -0,0 +1,188 @@
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */
+package com.vaadin.sass.parser;
+
+import org.w3c.css.sac.CSSException;
+
+/**
+ * This exception is thrown when parse errors are encountered. You can
+ * explicitly create objects of this exception type by calling the method
+ * generateParseException in the generated parser.
+ * 
+ * You can modify this class to customize your error reporting mechanisms so
+ * long as you retain the public fields.
+ */
+public class ParseException extends CSSException {
+    private static final long serialVersionUID = -8556588037264585977L;
+
+    /**
+     * This constructor is used by the method "generateParseException" in the
+     * generated parser. Calling this constructor generates a new object of this
+     * type with the fields "currentToken", "expectedTokenSequences", and
+     * "tokenImage" set. The boolean flag "specialConstructor" is also set to
+     * true to indicate that this constructor was used to create this object.
+     * This constructor calls its super class with the empty string to force the
+     * "toString" method of parent class "Throwable" to print the error message
+     * in the form: ParseException: <result of getMessage>
+     */
+    public ParseException(Token currentTokenVal,
+            int[][] expectedTokenSequencesVal, String[] tokenImageVal) {
+        super("");
+        specialConstructor = true;
+        currentToken = currentTokenVal;
+        expectedTokenSequences = expectedTokenSequencesVal;
+        tokenImage = tokenImageVal;
+    }
+
+    /**
+     * The following constructors are for use by you for whatever purpose you
+     * can think of. Constructing the exception in this manner makes the
+     * exception behave in the normal way - i.e., as documented in the class
+     * "Throwable". The fields "errorToken", "expectedTokenSequences", and
+     * "tokenImage" do not contain relevant information. The JavaCC generated
+     * code does not use these constructors.
+     */
+
+    public ParseException() {
+        super();
+        specialConstructor = false;
+    }
+
+    public ParseException(String message) {
+        super(message);
+        specialConstructor = false;
+    }
+
+    /**
+     * This variable determines which constructor was used to create this object
+     * and thereby affects the semantics of the "getMessage" method (see below).
+     */
+    protected boolean specialConstructor;
+
+    /**
+     * This is the last token that has been consumed successfully. If this
+     * object has been created due to a parse error, the token followng this
+     * token will (therefore) be the first error token.
+     */
+    public Token currentToken;
+
+    /**
+     * Each entry in this array is an array of integers. Each array of integers
+     * represents a sequence of tokens (by their ordinal values) that is
+     * expected at this point of the parse.
+     */
+    public int[][] expectedTokenSequences;
+
+    /**
+     * This is a reference to the "tokenImage" array of the generated parser
+     * within which the parse error occurred. This array is defined in the
+     * generated ...Constants interface.
+     */
+    public String[] tokenImage;
+
+    /**
+     * This method has the standard behavior when this object has been created
+     * using the standard constructors. Otherwise, it uses "currentToken" and
+     * "expectedTokenSequences" to generate a parse error message and returns
+     * it. If this object has been created due to a parse error, and you do not
+     * catch it (it gets thrown from the parser), then this method is called
+     * during the printing of the final stack trace, and hence the correct error
+     * message gets displayed.
+     */
+    @Override
+    public String getMessage() {
+        if (!specialConstructor) {
+            return super.getMessage();
+        }
+        String expected = "";
+        int maxSize = 0;
+        for (int i = 0; i < expectedTokenSequences.length; i++) {
+            if (maxSize < expectedTokenSequences[i].length) {
+                maxSize = expectedTokenSequences[i].length;
+            }
+            for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+                expected += tokenImage[expectedTokenSequences[i][j]] + " ";
+            }
+            if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+                expected += "...";
+            }
+            expected += eol + "    ";
+        }
+        String retval = "Encountered \"";
+        Token tok = currentToken.next;
+        for (int i = 0; i < maxSize; i++) {
+            if (i != 0) {
+                retval += " ";
+            }
+            if (tok.kind == 0) {
+                retval += tokenImage[0];
+                break;
+            }
+            retval += add_escapes(tok.image);
+            tok = tok.next;
+        }
+        retval += "\" at line " + currentToken.next.beginLine + ", column "
+                + currentToken.next.beginColumn + "." + eol;
+        if (expectedTokenSequences.length == 1) {
+            retval += "Was expecting:" + eol + "    ";
+        } else {
+            retval += "Was expecting one of:" + eol + "    ";
+        }
+        retval += expected;
+        return retval;
+    }
+
+    /**
+     * The end of line string for this machine.
+     */
+    protected String eol = System.getProperty("line.separator", "\n");
+
+    /**
+     * Used to convert raw characters to their escaped version when these raw
+     * version cannot be used as part of an ASCII string literal.
+     */
+    protected String add_escapes(String str) {
+        StringBuffer retval = new StringBuffer();
+        char ch;
+        for (int i = 0; i < str.length(); i++) {
+            switch (str.charAt(i)) {
+            case 0:
+                continue;
+            case '\b':
+                retval.append("\\b");
+                continue;
+            case '\t':
+                retval.append("\\t");
+                continue;
+            case '\n':
+                retval.append("\\n");
+                continue;
+            case '\f':
+                retval.append("\\f");
+                continue;
+            case '\r':
+                retval.append("\\r");
+                continue;
+            case '\"':
+                retval.append("\\\"");
+                continue;
+            case '\'':
+                retval.append("\\\'");
+                continue;
+            case '\\':
+                retval.append("\\\\");
+                continue;
+            default:
+                if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                    String s = "0000" + Integer.toString(ch, 16);
+                    retval.append("\\u"
+                            + s.substring(s.length() - 4, s.length()));
+                } else {
+                    retval.append(ch);
+                }
+                continue;
+            }
+        }
+        return retval.toString();
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/parser/Parser.java b/sass/src/com/vaadin/sass/parser/Parser.java
new file mode 100644 (file)
index 0000000..df70d81
--- /dev/null
@@ -0,0 +1,4968 @@
+/* Generated By:JavaCC: Do not edit this line. Parser.java */
+package com.vaadin.sass.parser;
+
+import java.io.*;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Map;
+
+import org.w3c.css.sac.ConditionFactory;
+import org.w3c.css.sac.Condition;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SimpleSelector;
+import org.w3c.css.sac.DocumentHandler;
+import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.ErrorHandler;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
+import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.LexicalUnit;
+
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
+
+import org.w3c.flute.util.Encoding;
+
+import com.vaadin.sass.handler.*;
+
+import com.vaadin.sass.tree.*;
+
+/**
+ * A CSS2 parser
+ *
+ * @author Philippe Le H�garet
+ * @version $Revision: 1.15 $
+ */
+public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
+
+    // replaces all \t, \n, etc with this StringBuffer.
+    static final StringBuilder SPACE = new StringBuilder(" ");
+
+    // the document handler for the parser
+    protected SCSSDocumentHandlerImpl documentHandler;
+    // the error handler for the parser
+    protected ErrorHandler errorHandler;
+    // the input source for the parser
+    protected InputSource source;
+
+    protected ConditionFactory conditionFactory;
+    protected SelectorFactory selectorFactory;
+
+    // temporary place holder for pseudo-element ...
+    private String pseudoElt;
+
+    /**
+     * Creates a new Parser
+     */
+    public Parser() {
+        this((CharStream) null);
+    }
+
+    /**
+     * @@TODO
+     * @exception CSSException Not yet implemented
+     */
+    public void setLocale(Locale locale) throws CSSException {
+        throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR);
+    }
+
+    /**
+     * Set the document handler for this parser
+     */
+    public void setDocumentHandler(DocumentHandler handler) {
+        this.documentHandler = (SCSSDocumentHandlerImpl) handler;
+    }
+
+    public void setSelectorFactory(SelectorFactory selectorFactory) {
+        this.selectorFactory = selectorFactory;
+    }
+
+    public void setConditionFactory(ConditionFactory conditionFactory) {
+        this.conditionFactory = conditionFactory;
+    }
+
+    /**
+     * Set the error handler for this parser
+     */
+    public void setErrorHandler(ErrorHandler error) {
+        this.errorHandler = error;
+    }
+
+    /**
+     * Main parse methods
+     *
+     * @param source the source of the style sheet.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */
+    public void parseStyleSheet(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+
+        parserUnit();
+    }
+
+    /**
+     * Convenient method for URIs.
+     *
+     * @param systemId the fully resolved URI of the style sheet.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */
+    public void parseStyleSheet(String systemId)
+            throws CSSException, IOException {
+        parseStyleSheet(new InputSource(systemId));
+    }
+
+    /**
+     * This method parses only one rule (style rule or at-rule, except @charset).
+     *
+     * @param source the source of the rule.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */
+    public void parseRule(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        _parseRule();
+    }
+
+    /**
+     * This method parses a style declaration (including the surrounding curly
+     * braces).
+     *
+     * @param source the source of the style declaration.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */
+    public void parseStyleDeclaration(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        _parseDeclarationBlock();
+    }
+
+    /**
+     * This methods returns "http://www.w3.org/TR/REC-CSS2".
+     * @return the string "http://www.w3.org/TR/REC-CSS2".
+     */
+    public String getParserVersion() {
+        return "http://www.w3.org/TR/REC-CSS2";
+    }
+
+    /**
+     * Parse methods used by DOM Level 2 implementation.
+     */
+    public void parseImportRule(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        _parseImportRule();
+    }
+
+    public void parseMediaRule(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        _parseMediaRule();
+    }
+
+    public SelectorList parseSelectors(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        return _parseSelectors();
+    }
+
+    public LexicalUnit parsePropertyValue(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        return expr();
+    }
+
+    public boolean parsePriority(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        return prio();
+    }
+
+    /**
+     * Convert the source into a Reader. Used only by DOM Level 2 parser methods.
+     */
+    private Reader getReader(InputSource source) throws IOException {
+        if (source.getCharacterStream() != null) {
+            return source.getCharacterStream();
+        } else if (source.getByteStream() != null) {
+            // My DOM level 2 implementation doesn't use this case.
+            if (source.getEncoding() == null) {
+                // unknown encoding, use ASCII as default.
+                return new InputStreamReader(source.getByteStream(), "ASCII");
+            } else {
+                return new InputStreamReader(source.getByteStream(),
+                                             source.getEncoding());
+            }
+        } else {
+            // systemId
+            // @@TODO
+            throw new CSSException("not yet implemented");
+        }
+    }
+
+    /**
+     * Convert the source into a CharStream with encoding informations.
+     * The encoding can be found in the InputSource or in the CSS document.
+     * Since this method marks the reader and make a reset after looking for
+     * the charset declaration, you'll find the charset declaration into the
+     * stream.  
+     */
+    private CharStream getCharStreamWithLurk(InputSource source)
+            throws CSSException, IOException {
+        if (source.getCharacterStream() != null) {
+            // all encoding are supposed to be resolved by the user
+            // return the reader
+            return new Generic_CharStream(source.getCharacterStream(), 1, 1);
+        } else if (source.getByteStream() == null) {
+            // @@CONTINUE ME. see also getReader() with systemId
+            try {
+                source.setByteStream(new URL(source.getURI()).openStream());
+            } catch (Exception e) {
+                try {
+                    source.setByteStream(new FileInputStream(source.getURI()));
+                } catch (IOException ex) {
+                    throw new CSSException("invalid url ?");
+                }
+            }
+        }
+        String encoding = "ASCII";
+        InputStream input = source.getByteStream();
+        char c = ' ';
+
+        if (!input.markSupported()) {
+            input = new BufferedInputStream(input);
+            source.setByteStream(input);
+        }
+        input.mark(100);
+        c = (char) input.read();
+
+        if (c == '@') {
+            // hum, is it a charset ?
+            int size   = 100;
+            byte[] buf = new byte[size];
+            input.read(buf, 0, 7);
+            String keyword = new String(buf, 0, 7);
+            if (keyword.equals("charset")) {
+                // Yes, this is the charset declaration !
+
+                // here I don't use the right declaration : white space are ' '.
+                while ((c = (char) input.read()) == ' ') {
+                    // find the first quote
+                }
+                char endChar = c;
+                int i = 0;
+
+                if ((endChar != '"') && (endChar != '\u005c'')) {
+                    // hum this is not a quote.
+                    throw new CSSException("invalid charset declaration");
+                }
+
+                while ((c = (char) input.read()) != endChar) {
+                    buf[i++] = (byte) c;
+                    if (i == size) {
+                        byte[] old = buf;
+                        buf = new byte[size + 100];
+                        System.arraycopy(old, 0, buf, 0, size);
+                        size += 100;
+                    }
+                }
+                while ((c = (char) input.read()) == ' ') {
+                    // find the next relevant character
+                }
+                if (c != ';') {
+                    // no semi colon at the end ?
+                    throw new CSSException("invalid charset declaration: "
+                                           + "missing semi colon");
+                }
+                encoding = new String(buf, 0, i);
+                if (source.getEncoding() != null) {
+                    // compare the two encoding informations.
+                    // For example, I don't accept to have ASCII and after UTF-8.
+                    // Is it really good ? That is the question.
+                    if (!encoding.equals(source.getEncoding())) {
+                        throw new CSSException("invalid encoding information.");
+                    }
+                }
+            } // else no charset declaration available
+        }
+        // ok set the real encoding of this source.
+        source.setEncoding(encoding);
+        // set the real reader of this source.
+        source.setCharacterStream(new InputStreamReader(source.getByteStream(),
+                                             Encoding.getJavaEncoding(encoding)));
+        // reset the stream (leave the charset declaration in the stream).
+        input.reset();
+
+        return new Generic_CharStream(source.getCharacterStream(), 1, 1);
+    }
+
+    private LocatorImpl currentLocator;
+    private Locator getLocator() {
+        if (currentLocator == null) {
+            currentLocator = new LocatorImpl(this);
+            return currentLocator;
+        }
+        return currentLocator.reInit(this);
+    }
+    private LocatorImpl getLocator(Token save) {
+        if (currentLocator == null) {
+            currentLocator = new LocatorImpl(this, save);
+            return currentLocator;
+        }
+        return currentLocator.reInit(this, save);
+    }
+
+    private void reportError(Locator l, Exception e) {
+        if (errorHandler != null) {
+            if (e instanceof ParseException) {
+                // construct a clean error message.
+                ParseException pe = (ParseException) e;
+                if (pe.specialConstructor) {
+                    StringBuffer errorM = new StringBuffer();
+                    if (pe.currentToken != null) {
+                        errorM.append("encountered \u005c"")
+                            .append(pe.currentToken.next);
+                    }
+                    errorM.append('"');
+                    if (pe.expectedTokenSequences.length != 0) {
+                        errorM.append(". Was expecting one of: ");
+                        for (int i = 0; i < pe.expectedTokenSequences.length; i++) {
+                            for (int j = 0; j < pe.expectedTokenSequences[i].length; j++) {
+                                int kind = pe.expectedTokenSequences[i][j];
+                                if (kind != S) {
+                                    errorM.append(pe.tokenImage[kind]);
+                                    errorM.append(' ');
+                                }
+                            }
+                        }
+                    }
+                    errorHandler.error(new CSSParseException(errorM.toString(),
+                                                             l, e));
+                } else {
+                    errorHandler.error(new CSSParseException(e.getMessage(),
+                                                             l, e));
+                }
+            } else if (e == null) {
+                errorHandler.error(new CSSParseException("error", l, null));
+            } else {
+                errorHandler.error(new CSSParseException(e.getMessage(), l, e));
+            }
+        }
+    }
+
+    private void reportWarningSkipText(Locator l, String text) {
+        if (errorHandler != null && text  != null) {
+            errorHandler.warning(new CSSParseException("Skipping: " + text, l));
+        }
+    }
+
+/*
+ * The grammar of CSS2
+ */
+
+/**
+ * The main entry for the parser.
+ *
+ * @exception ParseException exception during the parse
+ */
+  final public void parserUnit() throws ParseException {
+    try {
+          documentHandler.startDocument(source);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case CHARSET_SYM:
+        charset();
+        break;
+      default:
+        jj_la1[0] = jj_gen;
+        ;
+      }
+      label_1:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+        case CDO:
+        case CDC:
+        case ATKEYWORD:
+          ;
+          break;
+        default:
+          jj_la1[1] = jj_gen;
+          break label_1;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          jj_consume_token(S);
+          break;
+        case CDO:
+        case CDC:
+        case ATKEYWORD:
+          ignoreStatement();
+          break;
+        default:
+          jj_la1[2] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+      label_2:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IMPORT_SYM:
+          ;
+          break;
+        default:
+          jj_la1[3] = jj_gen;
+          break label_2;
+        }
+        importDeclaration();
+        label_3:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case CDO:
+          case CDC:
+          case ATKEYWORD:
+            ;
+            break;
+          default:
+            jj_la1[4] = jj_gen;
+            break label_3;
+          }
+          ignoreStatement();
+          label_4:
+          while (true) {
+            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+            case S:
+              ;
+              break;
+            default:
+              jj_la1[5] = jj_gen;
+              break label_4;
+            }
+            jj_consume_token(S);
+          }
+        }
+      }
+      afterImportDeclaration();
+      jj_consume_token(0);
+    } finally {
+        documentHandler.endDocument(source);
+    }
+  }
+
+  final public void charset() throws ParseException {
+  Token n;
+    try {
+      jj_consume_token(CHARSET_SYM);
+      label_5:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[6] = jj_gen;
+          break label_5;
+        }
+        jj_consume_token(S);
+      }
+      n = jj_consume_token(STRING);
+      label_6:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[7] = jj_gen;
+          break label_6;
+        }
+        jj_consume_token(S);
+      }
+      jj_consume_token(SEMICOLON);
+    } catch (ParseException e) {
+        reportError(getLocator(e.currentToken.next), e);
+        skipStatement();
+        // reportWarningSkipText(getLocator(), skipStatement());
+
+    } catch (Exception e) {
+        reportError(getLocator(), e);
+        skipStatement();
+        // reportWarningSkipText(getLocator(), skipStatement());
+
+    }
+  }
+
+  final public void afterImportDeclaration() throws ParseException {
+ String ret;
+ Locator l;
+    label_7:
+    while (true) {
+      ;
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case VARIABLE:
+        variable();
+        break;
+      case MIXIN_SYM:
+        mixinDirective();
+        break;
+      case INCLUDE_SYM:
+        includeDirective();
+        break;
+      case LBRACKET:
+      case ANY:
+      case PARENT:
+      case DOT:
+      case COLON:
+      case IDENT:
+      case HASH:
+        styleRule();
+        break;
+      case MEDIA_SYM:
+        media();
+        break;
+      case PAGE_SYM:
+        page();
+        break;
+      case FONT_FACE_SYM:
+        fontFace();
+        break;
+      default:
+        jj_la1[8] = jj_gen;
+          l = getLocator();
+        ret = skipStatement();
+          if ((ret == null) || (ret.length() == 0)) {
+              {if (true) return;}
+          }
+          reportWarningSkipText(l, ret);
+          if (ret.charAt(0) == '@') {
+              documentHandler.ignorableAtRule(ret);
+          }
+      }
+      label_8:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case CDO:
+        case CDC:
+        case ATKEYWORD:
+          ;
+          break;
+        default:
+          jj_la1[9] = jj_gen;
+          break label_8;
+        }
+        ignoreStatement();
+        label_9:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[10] = jj_gen;
+            break label_9;
+          }
+          jj_consume_token(S);
+        }
+      }
+    }
+  }
+
+  final public void ignoreStatement() throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case CDO:
+      jj_consume_token(CDO);
+      break;
+    case CDC:
+      jj_consume_token(CDC);
+      break;
+    case ATKEYWORD:
+      atRuleDeclaration();
+      break;
+    default:
+      jj_la1[11] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+  }
+
+/**
+ * The import statement
+ *
+ * @exception ParseException exception during the parse
+ */
+  final public void importDeclaration() throws ParseException {
+ Token n;
+ String uri;
+ MediaListImpl ml = new MediaListImpl();
+ boolean isURL = false;
+    try {
+      jj_consume_token(IMPORT_SYM);
+      label_10:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[12] = jj_gen;
+          break label_10;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case STRING:
+        n = jj_consume_token(STRING);
+                               uri = convertStringIndex(n.image, 1,
+                                                        n.image.length() -1);
+        break;
+      case URL:
+        n = jj_consume_token(URL);
+               isURL=true;
+               uri = n.image.substring(4, n.image.length()-1).trim();
+               if ((uri.charAt(0) == '"')
+                   || (uri.charAt(0) == '\u005c'')) {
+                   uri = uri.substring(1, uri.length()-1);
+               }
+        break;
+      default:
+        jj_la1[13] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      label_11:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[14] = jj_gen;
+          break label_11;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case IDENT:
+        mediaStatement(ml);
+        break;
+      default:
+        jj_la1[15] = jj_gen;
+        ;
+      }
+      jj_consume_token(SEMICOLON);
+      label_12:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[16] = jj_gen;
+          break label_12;
+        }
+        jj_consume_token(S);
+      }
+               if (ml.getLength() == 0) {
+                   // see section 6.3 of the CSS2 recommandation.
+                   ml.addItem("all");
+               }
+               documentHandler.importStyle(uri, ml, isURL);
+    } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+
+    }
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public void media() throws ParseException {
+    boolean start = false;
+    String ret;
+    MediaListImpl ml = new MediaListImpl();
+    try {
+      jj_consume_token(MEDIA_SYM);
+      label_13:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[17] = jj_gen;
+          break label_13;
+        }
+        jj_consume_token(S);
+      }
+      mediaStatement(ml);
+     start = true; documentHandler.startMedia(ml);
+      jj_consume_token(LBRACE);
+      label_14:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[18] = jj_gen;
+          break label_14;
+        }
+        jj_consume_token(S);
+      }
+      label_15:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case CDO:
+        case LBRACE:
+        case DASHMATCH:
+        case INCLUDES:
+        case PLUS:
+        case MINUS:
+        case COMMA:
+        case SEMICOLON:
+        case PRECEDES:
+        case LBRACKET:
+        case ANY:
+        case PARENT:
+        case DOT:
+        case COLON:
+        case NONASCII:
+        case STRING:
+        case IDENT:
+        case NUMBER:
+        case URL:
+        case PERCENTAGE:
+        case HASH:
+        case IMPORT_SYM:
+        case MEDIA_SYM:
+        case CHARSET_SYM:
+        case PAGE_SYM:
+        case FONT_FACE_SYM:
+        case ATKEYWORD:
+        case IMPORTANT_SYM:
+        case UNICODERANGE:
+        case FUNCTION:
+        case UNKNOWN:
+          ;
+          break;
+        default:
+          jj_la1[19] = jj_gen;
+          break label_15;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case LBRACKET:
+        case ANY:
+        case PARENT:
+        case DOT:
+        case COLON:
+        case IDENT:
+        case HASH:
+          styleRule();
+          break;
+        case CDO:
+        case LBRACE:
+        case DASHMATCH:
+        case INCLUDES:
+        case PLUS:
+        case MINUS:
+        case COMMA:
+        case SEMICOLON:
+        case PRECEDES:
+        case NONASCII:
+        case STRING:
+        case NUMBER:
+        case URL:
+        case PERCENTAGE:
+        case IMPORT_SYM:
+        case MEDIA_SYM:
+        case CHARSET_SYM:
+        case PAGE_SYM:
+        case FONT_FACE_SYM:
+        case ATKEYWORD:
+        case IMPORTANT_SYM:
+        case UNICODERANGE:
+        case FUNCTION:
+        case UNKNOWN:
+          skipUnknownRule();
+          break;
+        default:
+          jj_la1[20] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+      jj_consume_token(RBRACE);
+      label_16:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[21] = jj_gen;
+          break label_16;
+        }
+        jj_consume_token(S);
+      }
+    } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+
+    } finally {
+     if (start) {
+         documentHandler.endMedia(ml);
+     }
+    }
+  }
+
+  final public void mediaStatement(MediaListImpl ml) throws ParseException {
+    String m;
+    m = medium();
+    label_17:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COMMA:
+        ;
+        break;
+      default:
+        jj_la1[22] = jj_gen;
+        break label_17;
+      }
+      jj_consume_token(COMMA);
+      label_18:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[23] = jj_gen;
+          break label_18;
+        }
+        jj_consume_token(S);
+      }
+                                   ml.addItem(m);
+      m = medium();
+    }
+     ml.addItem(m);
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public String medium() throws ParseException {
+ Token n;
+    n = jj_consume_token(IDENT);
+    label_19:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[24] = jj_gen;
+        break label_19;
+      }
+      jj_consume_token(S);
+    }
+                         {if (true) return convertIdent(n.image);}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public void page() throws ParseException {
+ boolean start = false;
+ Token n = null;
+ String page = null;
+ String pseudo = null;
+    try {
+      jj_consume_token(PAGE_SYM);
+      label_20:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[25] = jj_gen;
+          break label_20;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case IDENT:
+        n = jj_consume_token(IDENT);
+        label_21:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[26] = jj_gen;
+            break label_21;
+          }
+          jj_consume_token(S);
+        }
+        break;
+      default:
+        jj_la1[27] = jj_gen;
+        ;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COLON:
+        pseudo = pseudo_page();
+        break;
+      default:
+        jj_la1[28] = jj_gen;
+        ;
+      }
+          if (n != null) {
+              page = convertIdent(n.image);
+          }
+      jj_consume_token(LBRACE);
+      label_22:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[29] = jj_gen;
+          break label_22;
+        }
+        jj_consume_token(S);
+      }
+          start = true;
+          documentHandler.startPage(page, pseudo);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case IDENT:
+        declaration();
+        break;
+      default:
+        jj_la1[30] = jj_gen;
+        ;
+      }
+      label_23:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case SEMICOLON:
+          ;
+          break;
+        default:
+          jj_la1[31] = jj_gen;
+          break label_23;
+        }
+        jj_consume_token(SEMICOLON);
+        label_24:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[32] = jj_gen;
+            break label_24;
+          }
+          jj_consume_token(S);
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IDENT:
+          declaration();
+          break;
+        default:
+          jj_la1[33] = jj_gen;
+          ;
+        }
+      }
+      jj_consume_token(RBRACE);
+      label_25:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[34] = jj_gen;
+          break label_25;
+        }
+        jj_consume_token(S);
+      }
+    } catch (ParseException e) {
+     if (errorHandler != null) {
+         LocatorImpl li = new LocatorImpl(this,
+                                          e.currentToken.next.beginLine,
+                                          e.currentToken.next.beginColumn-1);
+         reportError(li, e);
+         skipStatement();
+         // reportWarningSkipText(li, skipStatement());
+     } else {
+         skipStatement();
+     }
+    } finally {
+     if (start) {
+         documentHandler.endPage(page, pseudo);
+     }
+    }
+  }
+
+  final public String pseudo_page() throws ParseException {
+  Token n;
+    jj_consume_token(COLON);
+    n = jj_consume_token(IDENT);
+    label_26:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[35] = jj_gen;
+        break label_26;
+      }
+      jj_consume_token(S);
+    }
+                             {if (true) return convertIdent(n.image);}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void fontFace() throws ParseException {
+    boolean start = false;
+    try {
+      jj_consume_token(FONT_FACE_SYM);
+      label_27:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[36] = jj_gen;
+          break label_27;
+        }
+        jj_consume_token(S);
+      }
+      jj_consume_token(LBRACE);
+      label_28:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[37] = jj_gen;
+          break label_28;
+        }
+        jj_consume_token(S);
+      }
+        start = true; documentHandler.startFontFace();
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case IDENT:
+        declaration();
+        break;
+      default:
+        jj_la1[38] = jj_gen;
+        ;
+      }
+      label_29:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case SEMICOLON:
+          ;
+          break;
+        default:
+          jj_la1[39] = jj_gen;
+          break label_29;
+        }
+        jj_consume_token(SEMICOLON);
+        label_30:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[40] = jj_gen;
+            break label_30;
+          }
+          jj_consume_token(S);
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IDENT:
+          declaration();
+          break;
+        default:
+          jj_la1[41] = jj_gen;
+          ;
+        }
+      }
+      jj_consume_token(RBRACE);
+      label_31:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[42] = jj_gen;
+          break label_31;
+        }
+        jj_consume_token(S);
+      }
+    } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+
+    } finally {
+     if (start) {
+         documentHandler.endFontFace();
+     }
+    }
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public void atRuleDeclaration() throws ParseException {
+ Token n;
+ String ret;
+    n = jj_consume_token(ATKEYWORD);
+        ret=skipStatement();
+        reportWarningSkipText(getLocator(), ret);
+        if ((ret != null) && (ret.charAt(0) == '@')) {
+            documentHandler.ignorableAtRule(ret);
+        }
+  }
+
+  final public void skipUnknownRule() throws ParseException {
+  Token n;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case ATKEYWORD:
+      n = jj_consume_token(ATKEYWORD);
+      break;
+    case CDO:
+      n = jj_consume_token(CDO);
+      break;
+    case CHARSET_SYM:
+      n = jj_consume_token(CHARSET_SYM);
+      break;
+    case COMMA:
+      n = jj_consume_token(COMMA);
+      break;
+    case DASHMATCH:
+      n = jj_consume_token(DASHMATCH);
+      break;
+    case FONT_FACE_SYM:
+      n = jj_consume_token(FONT_FACE_SYM);
+      break;
+    case FUNCTION:
+      n = jj_consume_token(FUNCTION);
+      break;
+    case IMPORTANT_SYM:
+      n = jj_consume_token(IMPORTANT_SYM);
+      break;
+    case IMPORT_SYM:
+      n = jj_consume_token(IMPORT_SYM);
+      break;
+    case INCLUDES:
+      n = jj_consume_token(INCLUDES);
+      break;
+    case LBRACE:
+      n = jj_consume_token(LBRACE);
+      break;
+    case MEDIA_SYM:
+      n = jj_consume_token(MEDIA_SYM);
+      break;
+    case NONASCII:
+      n = jj_consume_token(NONASCII);
+      break;
+    case NUMBER:
+      n = jj_consume_token(NUMBER);
+      break;
+    case PAGE_SYM:
+      n = jj_consume_token(PAGE_SYM);
+      break;
+    case PERCENTAGE:
+      n = jj_consume_token(PERCENTAGE);
+      break;
+    case STRING:
+      n = jj_consume_token(STRING);
+      break;
+    case UNICODERANGE:
+      n = jj_consume_token(UNICODERANGE);
+      break;
+    case URL:
+      n = jj_consume_token(URL);
+      break;
+    case SEMICOLON:
+      n = jj_consume_token(SEMICOLON);
+      break;
+    case PLUS:
+      n = jj_consume_token(PLUS);
+      break;
+    case PRECEDES:
+      n = jj_consume_token(PRECEDES);
+      break;
+    case MINUS:
+      n = jj_consume_token(MINUS);
+      break;
+    case UNKNOWN:
+      n = jj_consume_token(UNKNOWN);
+      break;
+    default:
+      jj_la1[43] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+     String ret;
+     Locator loc = getLocator();
+     ret=skipStatement();
+     reportWarningSkipText(loc, ret);
+     if ((ret != null) && (n.image.charAt(0) == '@')) {
+         documentHandler.ignorableAtRule(ret);
+     }
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public char combinator() throws ParseException {
+char connector = ' ';
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case PLUS:
+      jj_consume_token(PLUS);
+      label_32:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[44] = jj_gen;
+          break label_32;
+        }
+        jj_consume_token(S);
+      }
+                   {if (true) return '+';}
+      break;
+    case PRECEDES:
+      jj_consume_token(PRECEDES);
+      label_33:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[45] = jj_gen;
+          break label_33;
+        }
+        jj_consume_token(S);
+      }
+                     {if (true) return '>';}
+      break;
+    case S:
+      jj_consume_token(S);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case PLUS:
+      case PRECEDES:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case PLUS:
+          jj_consume_token(PLUS);
+                 connector = '+';
+          break;
+        case PRECEDES:
+          jj_consume_token(PRECEDES);
+                   connector = '>';
+          break;
+        default:
+          jj_la1[46] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+        label_34:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[47] = jj_gen;
+            break label_34;
+          }
+          jj_consume_token(S);
+        }
+        break;
+      default:
+        jj_la1[48] = jj_gen;
+        ;
+      }
+               {if (true) return connector;}
+      break;
+    default:
+      jj_la1[49] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public String property() throws ParseException {
+ Token n;
+    n = jj_consume_token(IDENT);
+    label_35:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[50] = jj_gen;
+        break label_35;
+      }
+      jj_consume_token(S);
+    }
+                         {if (true) return convertIdent(n.image);}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String variableName() throws ParseException {
+ Token n;
+    n = jj_consume_token(VARIABLE);
+    label_36:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[51] = jj_gen;
+        break label_36;
+      }
+      jj_consume_token(S);
+    }
+                         {if (true) return convertIdent(n.image.substring(1));}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String functionName() throws ParseException {
+ Token n;
+    n = jj_consume_token(FUNCTION);
+    label_37:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[52] = jj_gen;
+        break label_37;
+      }
+      jj_consume_token(S);
+    }
+                           {if (true) return convertIdent(n.image.substring(0, n.image.length()-1));}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public void styleRule() throws ParseException {
+    boolean start = false;
+    SelectorList l = null;
+    Token save;
+    Locator loc;
+    try {
+      l = selectorList();
+                        save = token;
+      jj_consume_token(LBRACE);
+      label_38:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[53] = jj_gen;
+          break label_38;
+        }
+        jj_consume_token(S);
+      }
+         start = true;
+         documentHandler.startSelector(l);
+      label_39:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case LBRACKET:
+        case ANY:
+        case PARENT:
+        case DOT:
+        case COLON:
+        case INCLUDE_SYM:
+        case EXTEND_SYM:
+        case IDENT:
+        case VARIABLE:
+        case HASH:
+        case MEDIA_SYM:
+          ;
+          break;
+        default:
+          jj_la1[54] = jj_gen;
+          break label_39;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case INCLUDE_SYM:
+          includeDirective();
+          break;
+        case MEDIA_SYM:
+          media();
+          break;
+        case EXTEND_SYM:
+          extendDirective();
+          break;
+        case VARIABLE:
+          variable();
+          break;
+        default:
+          jj_la1[55] = jj_gen;
+          if (jj_2_1(3)) {
+            declarationOrNestedProperties();
+          } else {
+            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case IDENT:
+            case HASH:
+              styleRule();
+              break;
+            default:
+              jj_la1[56] = jj_gen;
+              jj_consume_token(-1);
+              throw new ParseException();
+            }
+          }
+        }
+      }
+      jj_consume_token(RBRACE);
+      label_40:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[57] = jj_gen;
+          break label_40;
+        }
+        jj_consume_token(S);
+      }
+    } catch (ThrowedParseException e) {
+     if (errorHandler != null) {
+         LocatorImpl li = new LocatorImpl(this,
+                                          e.e.currentToken.next.beginLine,
+                                          e.e.currentToken.next.beginColumn-1);
+         reportError(li, e.e);
+     }
+    } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+
+    } catch (TokenMgrError e) {
+     reportWarningSkipText(getLocator(), skipStatement());
+    } finally {
+     if (start) {
+         documentHandler.endSelector(l);
+     }
+    }
+  }
+
+  final public SelectorList selectorList() throws ParseException {
+    SelectorListImpl selectors = new SelectorListImpl();
+    Selector selector;
+    selector = selector();
+    label_41:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COMMA:
+        ;
+        break;
+      default:
+        jj_la1[58] = jj_gen;
+        break label_41;
+      }
+      jj_consume_token(COMMA);
+      label_42:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[59] = jj_gen;
+          break label_42;
+        }
+        jj_consume_token(S);
+      }
+                                        selectors.addSelector(selector);
+      selector = selector();
+    }
+    selectors.addSelector(selector);
+    {if (true) return selectors;}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public Selector selector() throws ParseException {
+    Selector selector;
+    char    comb;
+    try {
+      selector = simple_selector(null, ' ');
+      label_43:
+      while (true) {
+        if (jj_2_2(2)) {
+          ;
+        } else {
+          break label_43;
+        }
+        comb = combinator();
+        selector = simple_selector(selector, comb);
+      }
+      label_44:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[60] = jj_gen;
+          break label_44;
+        }
+        jj_consume_token(S);
+      }
+       {if (true) return selector;}
+    } catch (ParseException e) {
+     /*
+     Token t = getToken(1);
+     StringBuffer s = new StringBuffer();
+     s.append(getToken(0).image);
+     while ((t.kind != COMMA) && (t.kind != SEMICOLON) 
+           && (t.kind != LBRACE) && (t.kind != EOF)) {
+        s.append(t.image);
+        getNextToken();
+        t = getToken(1);
+     }
+     reportWarningSkipText(getLocator(), s.toString());
+     */
+     Token t = getToken(1);
+     while ((t.kind != COMMA) && (t.kind != SEMICOLON)
+            && (t.kind != LBRACE) && (t.kind != EOF)) {
+         getNextToken();
+         t = getToken(1);
+     }
+
+     {if (true) throw new ThrowedParseException(e);}
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public Selector simple_selector(Selector selector, char comb) throws ParseException {
+    SimpleSelector simple_current = null;
+    Condition cond = null;
+
+    pseudoElt = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case ANY:
+    case PARENT:
+    case IDENT:
+      simple_current = element_name();
+      label_45:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case LBRACKET:
+        case DOT:
+        case COLON:
+        case HASH:
+          ;
+          break;
+        default:
+          jj_la1[61] = jj_gen;
+          break label_45;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case HASH:
+          cond = hash(cond);
+          break;
+        case DOT:
+          cond = _class(cond);
+          break;
+        case LBRACKET:
+          cond = attrib(cond);
+          break;
+        case COLON:
+          cond = pseudo(cond);
+          break;
+        default:
+          jj_la1[62] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+      break;
+    case HASH:
+      cond = hash(cond);
+      label_46:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case LBRACKET:
+        case DOT:
+        case COLON:
+          ;
+          break;
+        default:
+          jj_la1[63] = jj_gen;
+          break label_46;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case DOT:
+          cond = _class(cond);
+          break;
+        case LBRACKET:
+          cond = attrib(cond);
+          break;
+        case COLON:
+          cond = pseudo(cond);
+          break;
+        default:
+          jj_la1[64] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+      break;
+    case DOT:
+      cond = _class(cond);
+      label_47:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case LBRACKET:
+        case DOT:
+        case COLON:
+        case HASH:
+          ;
+          break;
+        default:
+          jj_la1[65] = jj_gen;
+          break label_47;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case HASH:
+          cond = hash(cond);
+          break;
+        case DOT:
+          cond = _class(cond);
+          break;
+        case LBRACKET:
+          cond = attrib(cond);
+          break;
+        case COLON:
+          cond = pseudo(cond);
+          break;
+        default:
+          jj_la1[66] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+      break;
+    case COLON:
+      cond = pseudo(cond);
+      label_48:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case LBRACKET:
+        case DOT:
+        case COLON:
+        case HASH:
+          ;
+          break;
+        default:
+          jj_la1[67] = jj_gen;
+          break label_48;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case HASH:
+          cond = hash(cond);
+          break;
+        case DOT:
+          cond = _class(cond);
+          break;
+        case LBRACKET:
+          cond = attrib(cond);
+          break;
+        case COLON:
+          cond = pseudo(cond);
+          break;
+        default:
+          jj_la1[68] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+      break;
+    case LBRACKET:
+      cond = attrib(cond);
+      label_49:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case LBRACKET:
+        case DOT:
+        case COLON:
+        case HASH:
+          ;
+          break;
+        default:
+          jj_la1[69] = jj_gen;
+          break label_49;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case HASH:
+          cond = hash(cond);
+          break;
+        case DOT:
+          cond = _class(cond);
+          break;
+        case LBRACKET:
+          cond = attrib(cond);
+          break;
+        case COLON:
+          cond = pseudo(cond);
+          break;
+        default:
+          jj_la1[70] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+      break;
+    default:
+      jj_la1[71] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+            if (simple_current == null) {
+                simple_current = selectorFactory.createElementSelector(null, null);
+            }
+            if (cond != null) {
+                simple_current = selectorFactory.createConditionalSelector(simple_current,
+                                                                    cond);
+            }
+            if (selector != null) {
+                switch (comb) {
+                case ' ':
+                    selector = selectorFactory.createDescendantSelector(selector,
+                                                                       simple_current);
+                    break;
+                case '+':
+                    selector =
+                        selectorFactory.createDirectAdjacentSelector((short) 1,
+                                                                     selector,
+                                                                     simple_current);
+                    break;
+                case '>':
+                    selector = selectorFactory.createChildSelector(selector,
+                                                                  simple_current);
+                    break;
+                default:
+                    {if (true) throw new ParseException("invalid state. send a bug report");}
+                }
+            } else {
+                selector= simple_current;
+            }
+            if (pseudoElt != null) {
+                selector = selectorFactory.createChildSelector(selector,
+                             selectorFactory.createPseudoElementSelector(null, pseudoElt));
+            }
+            {if (true) return selector;}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public Condition _class(Condition pred) throws ParseException {
+ Token n;
+Condition c;
+    jj_consume_token(DOT);
+    n = jj_consume_token(IDENT);
+          c = conditionFactory.createClassCondition(null, n.image);
+          if (pred == null) {
+              {if (true) return c;}
+          } else {
+              {if (true) return conditionFactory.createAndCondition(pred, c);}
+          }
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public SimpleSelector element_name() throws ParseException {
+ Token n;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case IDENT:
+      n = jj_consume_token(IDENT);
+      {if (true) return selectorFactory.createElementSelector(null, convertIdent(n.image));}
+      break;
+    case ANY:
+      jj_consume_token(ANY);
+      {if (true) return selectorFactory.createElementSelector(null, "*");}
+      break;
+    case PARENT:
+      jj_consume_token(PARENT);
+      {if (true) return selectorFactory.createElementSelector(null, "&");}
+      break;
+    default:
+      jj_la1[72] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public Condition attrib(Condition pred) throws ParseException {
+    int cases = 0;
+    Token att = null;
+    Token val = null;
+    String attValue = null;
+    jj_consume_token(LBRACKET);
+    label_50:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[73] = jj_gen;
+        break label_50;
+      }
+      jj_consume_token(S);
+    }
+    att = jj_consume_token(IDENT);
+    label_51:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[74] = jj_gen;
+        break label_51;
+      }
+      jj_consume_token(S);
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case DASHMATCH:
+    case INCLUDES:
+    case EQ:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case EQ:
+        jj_consume_token(EQ);
+                          cases = 1;
+        break;
+      case INCLUDES:
+        jj_consume_token(INCLUDES);
+                          cases = 2;
+        break;
+      case DASHMATCH:
+        jj_consume_token(DASHMATCH);
+                          cases = 3;
+        break;
+      default:
+        jj_la1[75] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      label_52:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[76] = jj_gen;
+          break label_52;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case IDENT:
+        val = jj_consume_token(IDENT);
+                        attValue = val.image;
+        break;
+      case STRING:
+        val = jj_consume_token(STRING);
+                           attValue = convertStringIndex(val.image, 1,
+                                                         val.image.length() -1);
+        break;
+      default:
+        jj_la1[77] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      label_53:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[78] = jj_gen;
+          break label_53;
+        }
+        jj_consume_token(S);
+      }
+      break;
+    default:
+      jj_la1[79] = jj_gen;
+      ;
+    }
+    jj_consume_token(RBRACKET);
+      String name = convertIdent(att.image);
+      Condition c;
+      switch (cases) {
+          case 0:
+          c = conditionFactory.createAttributeCondition(name, null, false, null);
+          break;
+          case 1:
+          c = conditionFactory.createAttributeCondition(name, null, false,
+                                                        attValue);
+          break;
+          case 2:
+          c = conditionFactory.createOneOfAttributeCondition(name, null, false,
+                                                             attValue);
+          break;
+          case 3:
+          c = conditionFactory.createBeginHyphenAttributeCondition(name, null,
+                                                                   false,
+                                                                   attValue);
+          break;
+          default:
+          // never reached.
+          c = null;
+      }
+      if (pred == null) {
+          {if (true) return c;}
+      } else {
+          {if (true) return conditionFactory.createAndCondition(pred, c);}
+      }
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public Condition pseudo(Condition pred) throws ParseException {
+ Token n;
+Token language;
+boolean isPseudoElement = false;
+    jj_consume_token(COLON);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case COLON:
+      jj_consume_token(COLON);
+             isPseudoElement=true;
+      break;
+    default:
+      jj_la1[80] = jj_gen;
+      ;
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case IDENT:
+      n = jj_consume_token(IDENT);
+            String s = convertIdent(n.image);
+            if (isPseudoElement) {
+                if (pseudoElt != null) {
+                    {if (true) throw new CSSParseException("duplicate pseudo element definition "
+                                                + s, getLocator());}
+                } else {
+                    pseudoElt = s;
+                    {if (true) return pred;}
+                }
+            } else {
+                Condition c =
+                conditionFactory.createPseudoClassCondition(null, s);
+                if (pred == null) {
+                    {if (true) return c;}
+                } else {
+                    {if (true) return conditionFactory.createAndCondition(pred, c);}
+                }
+            }
+      break;
+    case FUNCTION:
+      n = jj_consume_token(FUNCTION);
+      label_54:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[81] = jj_gen;
+          break label_54;
+        }
+        jj_consume_token(S);
+      }
+      language = jj_consume_token(IDENT);
+      label_55:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[82] = jj_gen;
+          break label_55;
+        }
+        jj_consume_token(S);
+      }
+      jj_consume_token(RPARAN);
+                  String f = convertIdent(n.image);
+                  if (f.equals("lang(")) {
+                      Condition d =
+              conditionFactory.createLangCondition(convertIdent(language.image));
+                      if (pred == null) {
+                          {if (true) return d;}
+                      } else {
+                          {if (true) return conditionFactory.createAndCondition(pred, d);}
+                      }
+                  } else {
+                      {if (true) throw new CSSParseException("invalid pseudo function name "
+                                                  + f, getLocator());}
+                  }
+      break;
+    default:
+      jj_la1[83] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public Condition hash(Condition pred) throws ParseException {
+ Token n;
+    n = jj_consume_token(HASH);
+      Condition d =
+          conditionFactory.createIdCondition(n.image.substring(1));
+      if (pred == null) {
+          {if (true) return d;}
+      } else {
+          {if (true) return conditionFactory.createAndCondition(pred, d);}
+      }
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void variable() throws ParseException {
+        String name;
+        LexicalUnit exp = null;
+        boolean guarded = false;
+        String raw;
+    try {
+      name = variableName();
+      jj_consume_token(COLON);
+      label_56:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[84] = jj_gen;
+          break label_56;
+        }
+        jj_consume_token(S);
+      }
+      exp = expr();
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case GUARDED_SYM:
+        guarded = guarded();
+        break;
+      default:
+        jj_la1[85] = jj_gen;
+        ;
+      }
+      label_57:
+      while (true) {
+        jj_consume_token(SEMICOLON);
+        label_58:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[86] = jj_gen;
+            break label_58;
+          }
+          jj_consume_token(S);
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case SEMICOLON:
+          ;
+          break;
+        default:
+          jj_la1[87] = jj_gen;
+          break label_57;
+        }
+      }
+                    documentHandler.variable(name, exp, guarded);
+    } catch (JumpException e) {
+            skipAfterExpression();
+    } catch (NumberFormatException e) {
+            if (errorHandler != null) {
+                errorHandler.error(new CSSParseException("Invalid number "
+                                                  + e.getMessage(),
+                                                  getLocator(),
+                                                  e));
+            }
+            reportWarningSkipText(getLocator(), skipAfterExpression());
+    } catch (ParseException e) {
+            if (errorHandler != null) {
+                if (e.currentToken != null) {
+                        LocatorImpl li = new LocatorImpl(this,
+                                                      e.currentToken.next.beginLine,
+                                                      e.currentToken.next.beginColumn-1);
+                        reportError(li, e);
+                } else {
+                        reportError(getLocator(), e);
+            }
+                skipAfterExpression();
+            } else {
+                skipAfterExpression();
+            }
+    }
+  }
+
+  final public void mixinDirective() throws ParseException {
+    String name;
+    ArrayList<VariableNode> args = null;
+    String body;
+    jj_consume_token(MIXIN_SYM);
+    label_59:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[88] = jj_gen;
+        break label_59;
+      }
+      jj_consume_token(S);
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case IDENT:
+      name = property();
+      break;
+    case FUNCTION:
+      name = functionName();
+      args = arglist();
+      jj_consume_token(RPARAN);
+      label_60:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[89] = jj_gen;
+          break label_60;
+        }
+        jj_consume_token(S);
+      }
+      break;
+    default:
+      jj_la1[90] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    jj_consume_token(LBRACE);
+    label_61:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[91] = jj_gen;
+        break label_61;
+      }
+      jj_consume_token(S);
+    }
+     documentHandler.startMixinDirective(name, args);
+    label_62:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case LBRACKET:
+      case ANY:
+      case PARENT:
+      case DOT:
+      case COLON:
+      case INCLUDE_SYM:
+      case EXTEND_SYM:
+      case IDENT:
+      case VARIABLE:
+      case HASH:
+      case MEDIA_SYM:
+        ;
+        break;
+      default:
+        jj_la1[92] = jj_gen;
+        break label_62;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case INCLUDE_SYM:
+        includeDirective();
+        break;
+      case MEDIA_SYM:
+        media();
+        break;
+      case EXTEND_SYM:
+        extendDirective();
+        break;
+      case VARIABLE:
+        variable();
+        break;
+      default:
+        jj_la1[93] = jj_gen;
+        if (jj_2_3(3)) {
+          declarationOrNestedProperties();
+        } else {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case LBRACKET:
+          case ANY:
+          case PARENT:
+          case DOT:
+          case COLON:
+          case IDENT:
+          case HASH:
+            styleRule();
+            break;
+          default:
+            jj_la1[94] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+        }
+      }
+    }
+    jj_consume_token(RBRACE);
+    label_63:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[95] = jj_gen;
+        break label_63;
+      }
+      jj_consume_token(S);
+    }
+     documentHandler.endMixinDirective(name, args);
+  }
+
+  final public ArrayList<VariableNode> arglist() throws ParseException {
+    ArrayList<VariableNode> args = new ArrayList<VariableNode>();
+    VariableNode arg;
+    arg = mixinArg();
+    label_64:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COMMA:
+        ;
+        break;
+      default:
+        jj_la1[96] = jj_gen;
+        break label_64;
+      }
+      jj_consume_token(COMMA);
+      label_65:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[97] = jj_gen;
+          break label_65;
+        }
+        jj_consume_token(S);
+      }
+                                      args.add(arg);
+      arg = mixinArg();
+    }
+      args.add(arg);
+        {if (true) return args;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public VariableNode mixinArg() throws ParseException {
+    String name;
+    LexicalUnit value = null;
+    name = variableName();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case COLON:
+      jj_consume_token(COLON);
+      label_66:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[98] = jj_gen;
+          break label_66;
+        }
+        jj_consume_token(S);
+      }
+      value = term(null);
+      break;
+    default:
+      jj_la1[99] = jj_gen;
+      ;
+    }
+        VariableNode arg = new VariableNode(name, value, false);
+        {if (true) return arg;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public ArrayList<LexicalUnit> argValuelist() throws ParseException {
+    ArrayList<LexicalUnit> args = new ArrayList<LexicalUnit>();
+    LexicalUnit argValue;
+    argValue = term(null);
+                           args.add(argValue);
+    label_67:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COMMA:
+        ;
+        break;
+      default:
+        jj_la1[100] = jj_gen;
+        break label_67;
+      }
+      jj_consume_token(COMMA);
+      label_68:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[101] = jj_gen;
+          break label_68;
+        }
+        jj_consume_token(S);
+      }
+      argValue = term(null);
+       args.add(argValue);
+    }
+     {if (true) return args;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void includeDirective() throws ParseException {
+    String name;
+    ArrayList<LexicalUnit> args=null;
+    jj_consume_token(INCLUDE_SYM);
+    label_69:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[102] = jj_gen;
+        break label_69;
+      }
+      jj_consume_token(S);
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case IDENT:
+      name = property();
+      break;
+    case FUNCTION:
+      name = functionName();
+      args = argValuelist();
+      jj_consume_token(RPARAN);
+      break;
+    default:
+      jj_la1[103] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    label_70:
+    while (true) {
+      jj_consume_token(SEMICOLON);
+      label_71:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[104] = jj_gen;
+          break label_71;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SEMICOLON:
+        ;
+        break;
+      default:
+        jj_la1[105] = jj_gen;
+        break label_70;
+      }
+    }
+            documentHandler.includeDirective(name, args);
+  }
+
+  final public Node functionDirective() throws ParseException {
+    String name;
+    String args = null;
+    String body;
+    int[] stops = {RPARAN};
+    name = functionName();
+    args = skipStatementUntilRightParan();
+    jj_consume_token(RPARAN);
+    label_72:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[106] = jj_gen;
+        break label_72;
+      }
+      jj_consume_token(S);
+    }
+    body = skipStatement();
+        {if (true) return null;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public Node returnDirective() throws ParseException {
+    String raw;
+    raw = skipStatement();
+         {if (true) return null;}
+    throw new Error("Missing return statement in function");
+  }
+
+  void debugDirective() throws ParseException {
+  }
+
+  void warnDirective() throws ParseException {
+  }
+
+  final public Node forDirective() throws ParseException {
+    String var;
+    String from;
+    String to;
+    boolean exclusive;
+    String body;
+    Token tok;
+    var = variableName();
+        int[] toThrough = {TO, THROUGH};
+        from = skipStatementUntil(toThrough);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case TO:
+      tok = jj_consume_token(TO);
+                 exclusive = true;
+      break;
+    case THROUGH:
+      tok = jj_consume_token(THROUGH);
+                       exclusive = false;
+      break;
+    default:
+      jj_la1[107] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    to = skipStatementUntilLeftBrace();
+    label_73:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[108] = jj_gen;
+        break label_73;
+      }
+      jj_consume_token(S);
+    }
+    body = skipStatement();
+     {if (true) return documentHandler.forDirective(var, from, to, exclusive, body);}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public Node eachDirective() throws ParseException {
+    String var;
+    String list;
+    String body;
+    var = variableName();
+    jj_consume_token(EACH_IN);
+    label_74:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[109] = jj_gen;
+        break label_74;
+      }
+      jj_consume_token(S);
+    }
+    list = skipStatementUntilLeftBrace();
+    body = skipStatement();
+        {if (true) return documentHandler.eachDirective(var, list, body);}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public Node whileDirective() throws ParseException {
+    String condition;
+    String body;
+    condition = skipStatementUntilLeftBrace();
+    body = skipStatement();
+        {if (true) return documentHandler.whileDirective(condition, body);}
+    throw new Error("Missing return statement in function");
+  }
+
+  Node ifDirective() throws ParseException {
+    return documentHandler.ifDirective();
+  }
+
+  void elseDirective() throws ParseException {
+  }
+
+  final public void extendDirective() throws ParseException {
+ SelectorList list;
+    jj_consume_token(EXTEND_SYM);
+    label_75:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[110] = jj_gen;
+        break label_75;
+      }
+      jj_consume_token(S);
+    }
+    list = selectorList();
+    label_76:
+    while (true) {
+      jj_consume_token(SEMICOLON);
+      label_77:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[111] = jj_gen;
+          break label_77;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SEMICOLON:
+        ;
+        break;
+      default:
+        jj_la1[112] = jj_gen;
+        break label_76;
+      }
+    }
+     documentHandler.extendDirective(list);
+  }
+
+  Node importDirective() throws ParseException {
+    return null;
+  }
+
+  Node charsetDirective() throws ParseException {
+    return null;
+  }
+
+  Node mozDocumentDirective() throws ParseException {
+    return null;
+  }
+
+  Node supportsDirective() throws ParseException {
+    return null;
+  }
+
+  final public void nestedProperties() throws ParseException {
+ String name;
+LexicalUnit exp;
+    name = property();
+    jj_consume_token(COLON);
+    label_78:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[113] = jj_gen;
+        break label_78;
+      }
+      jj_consume_token(S);
+    }
+    jj_consume_token(LBRACE);
+    label_79:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[114] = jj_gen;
+        break label_79;
+      }
+      jj_consume_token(S);
+    }
+      documentHandler.startNestedProperties(name);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case IDENT:
+      declaration();
+      break;
+    default:
+      jj_la1[115] = jj_gen;
+      ;
+    }
+    label_80:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SEMICOLON:
+        ;
+        break;
+      default:
+        jj_la1[116] = jj_gen;
+        break label_80;
+      }
+      jj_consume_token(SEMICOLON);
+      label_81:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[117] = jj_gen;
+          break label_81;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case IDENT:
+        declaration();
+        break;
+      default:
+        jj_la1[118] = jj_gen;
+        ;
+      }
+    }
+    jj_consume_token(RBRACE);
+      documentHandler.endNestedProperties(name);
+    label_82:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[119] = jj_gen;
+        break label_82;
+      }
+      jj_consume_token(S);
+    }
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public void declarationOrNestedProperties() throws ParseException {
+  boolean important = false;
+  String name;
+  LexicalUnit exp;
+  Token save;
+    try {
+      name = property();
+       save = token;
+      jj_consume_token(COLON);
+      label_83:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[120] = jj_gen;
+          break label_83;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case PLUS:
+      case MINUS:
+      case STRING:
+      case IDENT:
+      case NUMBER:
+      case URL:
+      case VARIABLE:
+      case PERCENTAGE:
+      case PT:
+      case MM:
+      case CM:
+      case PC:
+      case IN:
+      case PX:
+      case EMS:
+      case EXS:
+      case DEG:
+      case RAD:
+      case GRAD:
+      case MS:
+      case SECOND:
+      case HZ:
+      case KHZ:
+      case DIMEN:
+      case HASH:
+      case UNICODERANGE:
+      case FUNCTION:
+        exp = expr();
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IMPORTANT_SYM:
+          important = prio();
+          break;
+        default:
+          jj_la1[121] = jj_gen;
+          ;
+        }
+         Token next = getToken(1);
+         if(next.kind == SEMICOLON || next.kind == RBRACE){
+             while(next.kind == SEMICOLON){
+                 skipStatement();
+                 next = getToken(1);
+             }
+             if(token.specialToken!=null){
+                 documentHandler.property(name, exp, important, token.specialToken.image);
+             }else{
+                 documentHandler.property(name, exp, important, null);
+             }
+         }
+        break;
+      case LBRACE:
+        jj_consume_token(LBRACE);
+        label_84:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[122] = jj_gen;
+            break label_84;
+          }
+          jj_consume_token(S);
+        }
+         documentHandler.startNestedProperties(name);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IDENT:
+          declaration();
+          break;
+        default:
+          jj_la1[123] = jj_gen;
+          ;
+        }
+        label_85:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case SEMICOLON:
+            ;
+            break;
+          default:
+            jj_la1[124] = jj_gen;
+            break label_85;
+          }
+          jj_consume_token(SEMICOLON);
+          label_86:
+          while (true) {
+            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+            case S:
+              ;
+              break;
+            default:
+              jj_la1[125] = jj_gen;
+              break label_86;
+            }
+            jj_consume_token(S);
+          }
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case IDENT:
+            declaration();
+            break;
+          default:
+            jj_la1[126] = jj_gen;
+            ;
+          }
+        }
+        jj_consume_token(RBRACE);
+        label_87:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case S:
+            ;
+            break;
+          default:
+            jj_la1[127] = jj_gen;
+            break label_87;
+          }
+          jj_consume_token(S);
+        }
+         documentHandler.endNestedProperties(name);
+        break;
+      default:
+        jj_la1[128] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+    } catch (JumpException e) {
+     skipAfterExpression();
+     // reportWarningSkipText(getLocator(), skipAfterExpression());
+
+    } catch (NumberFormatException e) {
+     if (errorHandler != null) {
+         errorHandler.error(new CSSParseException("Invalid number "
+                                                  + e.getMessage(),
+                                                  getLocator(),
+                                                  e));
+     }
+     reportWarningSkipText(getLocator(), skipAfterExpression());
+    } catch (ParseException e) {
+     if (errorHandler != null) {
+         if (e.currentToken != null) {
+             LocatorImpl li = new LocatorImpl(this,
+                                              e.currentToken.next.beginLine,
+                                              e.currentToken.next.beginColumn-1);
+             reportError(li, e);
+         } else {
+             reportError(getLocator(), e);
+         }
+         skipAfterExpression();
+         /*
+         LocatorImpl loc = (LocatorImpl) getLocator();
+         loc.column--;
+         reportWarningSkipText(loc, skipAfterExpression());
+         */
+     } else {
+         skipAfterExpression();
+     }
+    }
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public void declaration() throws ParseException {
+  boolean important = false;
+  String name;
+  LexicalUnit exp;
+  Token save;
+    try {
+      name = property();
+       save = token;
+      jj_consume_token(COLON);
+      label_88:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[129] = jj_gen;
+          break label_88;
+        }
+        jj_consume_token(S);
+      }
+      exp = expr();
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case IMPORTANT_SYM:
+        important = prio();
+        break;
+      default:
+        jj_la1[130] = jj_gen;
+        ;
+      }
+         documentHandler.property(name, exp, important);
+    } catch (JumpException e) {
+     skipAfterExpression();
+     // reportWarningSkipText(getLocator(), skipAfterExpression());
+
+    } catch (NumberFormatException e) {
+     if (errorHandler != null) {
+         errorHandler.error(new CSSParseException("Invalid number "
+                                                  + e.getMessage(),
+                                                  getLocator(),
+                                                  e));
+     }
+     reportWarningSkipText(getLocator(), skipAfterExpression());
+    } catch (ParseException e) {
+     if (errorHandler != null) {
+         if (e.currentToken != null) {
+             LocatorImpl li = new LocatorImpl(this,
+                                              e.currentToken.next.beginLine,
+                                              e.currentToken.next.beginColumn-1);
+             reportError(li, e);
+         } else {
+             reportError(getLocator(), e);
+         }
+         skipAfterExpression();
+         /*
+        LocatorImpl loc = (LocatorImpl) getLocator();
+        loc.column--;
+        reportWarningSkipText(loc, skipAfterExpression());
+        */
+     } else {
+         skipAfterExpression();
+     }
+    }
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public boolean prio() throws ParseException {
+    jj_consume_token(IMPORTANT_SYM);
+    label_89:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[131] = jj_gen;
+        break label_89;
+      }
+      jj_consume_token(S);
+    }
+                             {if (true) return true;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public boolean guarded() throws ParseException {
+    jj_consume_token(GUARDED_SYM);
+    label_90:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[132] = jj_gen;
+        break label_90;
+      }
+      jj_consume_token(S);
+    }
+                          {if (true) return true;}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public LexicalUnitImpl operator(LexicalUnitImpl prev) throws ParseException {
+ Token n;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case DIV:
+      n = jj_consume_token(DIV);
+      label_91:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[133] = jj_gen;
+          break label_91;
+        }
+        jj_consume_token(S);
+      }
+                 {if (true) return LexicalUnitImpl.createSlash(n.beginLine,
+                                                       n.beginColumn,
+                                                       prev);}
+      break;
+    case COMMA:
+      n = jj_consume_token(COMMA);
+      label_92:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[134] = jj_gen;
+          break label_92;
+        }
+        jj_consume_token(S);
+      }
+                   {if (true) return LexicalUnitImpl.createComma(n.beginLine,
+                                                         n.beginColumn,
+                                                         prev);}
+      break;
+    default:
+      jj_la1[135] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public LexicalUnit expr() throws ParseException {
+    LexicalUnitImpl first, res;
+    char op;
+    first = term(null);
+                      res = first;
+    label_93:
+    while (true) {
+      if (jj_2_4(2)) {
+        ;
+      } else {
+        break label_93;
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case COMMA:
+      case DIV:
+        res = operator(res);
+        break;
+      default:
+        jj_la1[136] = jj_gen;
+        ;
+      }
+      res = term(res);
+    }
+    {if (true) return first;}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public char unaryOperator() throws ParseException {
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case MINUS:
+      jj_consume_token(MINUS);
+        {if (true) return '-';}
+      break;
+    case PLUS:
+      jj_consume_token(PLUS);
+        {if (true) return '+';}
+      break;
+    default:
+      jj_la1[137] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public LexicalUnitImpl term(LexicalUnitImpl prev) throws ParseException {
+  LexicalUnitImpl result = null;
+  Token n = null;
+  char op = ' ';
+  String varName;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case PLUS:
+    case MINUS:
+    case STRING:
+    case IDENT:
+    case NUMBER:
+    case URL:
+    case PERCENTAGE:
+    case PT:
+    case MM:
+    case CM:
+    case PC:
+    case IN:
+    case PX:
+    case EMS:
+    case EXS:
+    case DEG:
+    case RAD:
+    case GRAD:
+    case MS:
+    case SECOND:
+    case HZ:
+    case KHZ:
+    case DIMEN:
+    case HASH:
+    case UNICODERANGE:
+    case FUNCTION:
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case PLUS:
+      case MINUS:
+      case NUMBER:
+      case PERCENTAGE:
+      case PT:
+      case MM:
+      case CM:
+      case PC:
+      case IN:
+      case PX:
+      case EMS:
+      case EXS:
+      case DEG:
+      case RAD:
+      case GRAD:
+      case MS:
+      case SECOND:
+      case HZ:
+      case KHZ:
+      case DIMEN:
+      case FUNCTION:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case PLUS:
+        case MINUS:
+          op = unaryOperator();
+          break;
+        default:
+          jj_la1[138] = jj_gen;
+          ;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case NUMBER:
+          n = jj_consume_token(NUMBER);
+          result = LexicalUnitImpl.createNumber(n.beginLine, n.beginColumn,
+                                                prev, number(op, n, 0));
+          break;
+        case PERCENTAGE:
+          n = jj_consume_token(PERCENTAGE);
+          result = LexicalUnitImpl.createPercentage(n.beginLine, n.beginColumn,
+                                                    prev, number(op, n, 1));
+          break;
+        case PT:
+          n = jj_consume_token(PT);
+          result = LexicalUnitImpl.createPT(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2));
+          break;
+        case CM:
+          n = jj_consume_token(CM);
+          result = LexicalUnitImpl.createCM(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2));
+          break;
+        case MM:
+          n = jj_consume_token(MM);
+          result = LexicalUnitImpl.createMM(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2));
+          break;
+        case PC:
+          n = jj_consume_token(PC);
+          result = LexicalUnitImpl.createPC(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2));
+          break;
+        case IN:
+          n = jj_consume_token(IN);
+          result = LexicalUnitImpl.createIN(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2));
+          break;
+        case PX:
+          n = jj_consume_token(PX);
+          result = LexicalUnitImpl.createPX(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2));
+          break;
+        case EMS:
+          n = jj_consume_token(EMS);
+          result = LexicalUnitImpl.createEMS(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 2));
+          break;
+        case EXS:
+          n = jj_consume_token(EXS);
+          result = LexicalUnitImpl.createEXS(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 2));
+          break;
+        case DEG:
+          n = jj_consume_token(DEG);
+          result = LexicalUnitImpl.createDEG(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 3));
+          break;
+        case RAD:
+          n = jj_consume_token(RAD);
+          result = LexicalUnitImpl.createRAD(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 3));
+          break;
+        case GRAD:
+          n = jj_consume_token(GRAD);
+          result = LexicalUnitImpl.createGRAD(n.beginLine, n.beginColumn,
+                                              prev, number(op, n, 3));
+          break;
+        case SECOND:
+          n = jj_consume_token(SECOND);
+          result = LexicalUnitImpl.createS(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 1));
+          break;
+        case MS:
+          n = jj_consume_token(MS);
+          result = LexicalUnitImpl.createMS(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2));
+          break;
+        case HZ:
+          n = jj_consume_token(HZ);
+          result = LexicalUnitImpl.createHZ(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2));
+          break;
+        case KHZ:
+          n = jj_consume_token(KHZ);
+          result = LexicalUnitImpl.createKHZ(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 3));
+          break;
+        case DIMEN:
+          n = jj_consume_token(DIMEN);
+            String s = n.image;
+            int i = 0;
+            while (i < s.length()
+                   && (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
+                i++;
+            }
+            result = LexicalUnitImpl.createDimen(n.beginLine, n.beginColumn, prev,
+                                                 Float.valueOf(s.substring(0, i)).floatValue(),
+                                                 s.substring(i));
+          break;
+        case FUNCTION:
+          result = function(op, prev);
+          break;
+        default:
+          jj_la1[139] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+        break;
+      case STRING:
+      case IDENT:
+      case URL:
+      case HASH:
+      case UNICODERANGE:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case STRING:
+          n = jj_consume_token(STRING);
+          result =
+          LexicalUnitImpl.createString(n.beginLine, n.beginColumn, prev,
+                                       convertStringIndex(n.image, 1,
+                                                          n.image.length() -1));
+          break;
+        case IDENT:
+          n = jj_consume_token(IDENT);
+        String s = convertIdent(n.image);
+        if ("inherit".equals(s)) {
+            result = LexicalUnitImpl.createInherit(n.beginLine, n.beginColumn,
+                                               prev);
+        } else {
+            result = LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+                                               prev, convertIdent(n.image));
+        }
+
+          /* /
+         Auto correction code used in the CSS Validator but must not
+          be used by a conformant CSS2 parser.
+        * Common error :
+        * H1 {
+        *   color : black
+        *   background : white
+        * }
+        *
+       Token t = getToken(1);
+       Token semicolon = new Token();
+       semicolon.kind = SEMICOLON;
+       semicolon.image = ";";
+       if (t.kind == COLON) {
+           // @@SEEME. (generate a warning?)
+           // @@SEEME if expression is a single ident, 
+              generate an error ?
+           rejectToken(semicolon);
+           
+           result = prev;
+       }
+       / */
+
+          break;
+        case HASH:
+          result = hexcolor(prev);
+          break;
+        case URL:
+          result = url(prev);
+          break;
+        case UNICODERANGE:
+          result = unicode(prev);
+          break;
+        default:
+          jj_la1[140] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+        break;
+      default:
+        jj_la1[141] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      label_94:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[142] = jj_gen;
+          break label_94;
+        }
+        jj_consume_token(S);
+      }
+      break;
+    case VARIABLE:
+      varName = variableName();
+          result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
+                 prev, varName);
+      break;
+    default:
+      jj_la1[143] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+          {if (true) return result;}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * Handle all CSS2 functions.
+ * @exception ParseException exception during the parse
+ */
+  final public LexicalUnitImpl function(char operator, LexicalUnitImpl prev) throws ParseException {
+ Token n;
+ LexicalUnit params = null;
+    n = jj_consume_token(FUNCTION);
+    label_95:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[144] = jj_gen;
+        break label_95;
+      }
+      jj_consume_token(S);
+    }
+        String fname = convertIdent(n.image);
+        if("alpha(".equals(fname)){
+            String body = skipStatementUntilSemiColon();
+            {if (true) return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+                 null, "alpha("+body);}
+        }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case PLUS:
+    case MINUS:
+    case STRING:
+    case IDENT:
+    case NUMBER:
+    case URL:
+    case VARIABLE:
+    case PERCENTAGE:
+    case PT:
+    case MM:
+    case CM:
+    case PC:
+    case IN:
+    case PX:
+    case EMS:
+    case EXS:
+    case DEG:
+    case RAD:
+    case GRAD:
+    case MS:
+    case SECOND:
+    case HZ:
+    case KHZ:
+    case DIMEN:
+    case HASH:
+    case UNICODERANGE:
+    case FUNCTION:
+      params = expr();
+      break;
+    default:
+      jj_la1[145] = jj_gen;
+      ;
+    }
+    jj_consume_token(RPARAN);
+        if (operator != ' ') {
+            {if (true) throw new CSSParseException("invalid operator before a function.",
+                                        getLocator());}
+        }
+        String f = convertIdent(n.image);
+        LexicalUnitImpl l = (LexicalUnitImpl) params;
+        boolean loop = true;
+        if ("rgb(".equals(f)) {
+            // this is a RGB declaration (e.g. rgb(255, 50%, 0) )
+            int i = 0;
+            while (loop && l != null && i < 5) {
+                switch (i) {
+                    case 0:
+                    case 2:
+                    case 4:
+                        if ((l.getLexicalUnitType() != LexicalUnit.SAC_INTEGER)
+                            && (l.getLexicalUnitType() != LexicalUnit.SAC_PERCENTAGE)) {
+                            loop = false;
+                        }
+                        break;
+                    case 1:
+                    case 3:
+                        if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                            loop = false;
+                        }
+                        break;
+                    default:
+                        {if (true) throw new ParseException("implementation error");}
+                }
+                if (loop) {
+                    l = (LexicalUnitImpl) l.getNextLexicalUnit();
+                    i ++;
+                }
+            }
+            if ((i == 5) && loop && (l == null)) {
+                {if (true) return LexicalUnitImpl.createRGBColor(n.beginLine,
+                                                      n.beginColumn,
+                                                      prev, params);}
+            } else {
+                if (errorHandler != null) {
+                    String errorText;
+                    Locator loc;
+                    if (i < 5) {
+                        if (params == null) {
+                            loc = new LocatorImpl(this, n.beginLine,
+                                                  n.beginColumn-1);
+                            errorText = "not enough parameters.";
+                        } else if (l == null) {
+                            loc = new LocatorImpl(this, n.beginLine,
+                                                  n.beginColumn-1);
+                            errorText = "not enough parameters: "
+                                + params.toString();
+                        } else {
+                            loc = new LocatorImpl(this, l.getLineNumber(),
+                                                  l.getColumnNumber());
+                            errorText = "invalid parameter: "
+                                + l.toString();
+                        }
+                    } else {
+                        loc = new LocatorImpl(this, l.getLineNumber(),
+                                              l.getColumnNumber());
+                        errorText = "too many parameters: "
+                            + l.toString();
+                    }
+                    errorHandler.error(new CSSParseException(errorText, loc));
+                }
+
+                {if (true) throw new JumpException();}
+            }
+        } else if ("counter".equals(f)) {
+            int i = 0;
+            while (loop && l != null && i < 3) {
+                switch (i) {
+                    case 0:
+                    case 2:
+                        if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+                            loop = false;
+                        }
+                        break;
+                    case 1:
+                        if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                            loop = false;
+                        }
+                        break;
+                    default:
+                        {if (true) throw new ParseException("implementation error");}
+                }
+                l = (LexicalUnitImpl) l.getNextLexicalUnit();
+                i ++;
+            }
+            if (((i == 1) || (i == 3)) && loop && (l == null)) {
+                {if (true) return LexicalUnitImpl.createCounter(n.beginLine, n.beginColumn,
+                                                     prev, params);}
+            }
+
+        } else if ("counters(".equals(f)) {
+
+            int i = 0;
+            while (loop && l != null && i < 5) {
+                switch (i) {
+                    case 0:
+                    case 4:
+                        if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+                            loop = false;
+                        }
+                        break;
+                    case 2:
+                        if (l.getLexicalUnitType() != LexicalUnit.SAC_STRING_VALUE) {
+                            loop = false;
+                        }
+                        break;
+                    case 1:
+                    case 3:
+                        if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                            loop = false;
+                        }
+                        break;
+                    default:
+                        {if (true) throw new ParseException("implementation error");}
+                }
+                l = (LexicalUnitImpl) l.getNextLexicalUnit();
+                i ++;
+            }
+            if (((i == 3) || (i == 5)) && loop && (l == null)) {
+                {if (true) return LexicalUnitImpl.createCounters(n.beginLine, n.beginColumn,
+                                                      prev, params);}
+            }
+        } else if ("attr(".equals(f)) {
+            if ((l != null)
+                && (l.getNextLexicalUnit() == null)
+                && (l.getLexicalUnitType() == LexicalUnit.SAC_IDENT)) {
+                {if (true) return LexicalUnitImpl.createAttr(l.getLineNumber(),
+                                                  l.getColumnNumber(),
+                                                  prev, l.getStringValue());}
+            }
+        } else if ("rect(".equals(f)) {
+            int i = 0;
+            while (loop && l != null && i < 7) {
+                switch (i) {
+                    case 0:
+                    case 2:
+                    case 4:
+                    case 6:
+                        switch (l.getLexicalUnitType()) {
+                        case LexicalUnit.SAC_INTEGER:
+                            if (l.getIntegerValue() != 0) {
+                                loop = false;
+                            }
+                            break;
+                        case LexicalUnit.SAC_IDENT:
+                            if (!l.getStringValue().equals("auto")) {
+                                loop = false;
+                            }
+                            break;
+                        case LexicalUnit.SAC_EM:
+                        case LexicalUnit.SAC_EX:
+                        case LexicalUnit.SAC_PIXEL:
+                        case LexicalUnit.SAC_CENTIMETER:
+                        case LexicalUnit.SAC_MILLIMETER:
+                        case LexicalUnit.SAC_INCH:
+                        case LexicalUnit.SAC_POINT:
+                        case LexicalUnit.SAC_PICA:
+                            // nothing
+                            break;
+                        default:
+                            loop = false;
+                        }
+                        break;
+                    case 1:
+                    case 3:
+                    case 5:
+                        if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                            loop = false;
+                        }
+                        break;
+                    default:
+                        {if (true) throw new ParseException("implementation error");}
+                }
+                l = (LexicalUnitImpl) l.getNextLexicalUnit();
+                i ++;
+            }
+            if ((i == 7) && loop && (l == null)) {
+                {if (true) return LexicalUnitImpl.createRect(n.beginLine, n.beginColumn,
+                                                  prev, params);}
+            }
+        }
+        {if (true) return LexicalUnitImpl.createFunction(n.beginLine, n.beginColumn, prev,
+                                              f.substring(0,
+                                                        f.length() -1),
+                                              params);}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public LexicalUnitImpl unicode(LexicalUnitImpl prev) throws ParseException {
+  Token n;
+    n = jj_consume_token(UNICODERANGE);
+     LexicalUnitImpl params = null;
+     String s = n.image.substring(2);
+     int index = s.indexOf('-');
+     if (index == -1) {
+         params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                                params, Integer.parseInt(s, 16));
+     } else {
+         String s1 = s.substring(0, index);
+         String s2 = s.substring(index);
+
+         params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                                params, Integer.parseInt(s1, 16));
+         params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                                params, Integer.parseInt(s2, 16));
+     }
+
+     {if (true) return LexicalUnitImpl.createUnicodeRange(n.beginLine, n.beginColumn,
+                                               prev, params);}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public LexicalUnitImpl url(LexicalUnitImpl prev) throws ParseException {
+  Token n;
+    n = jj_consume_token(URL);
+   String urlname = n.image.substring(4, n.image.length()-1).trim();
+   if (urlname.charAt(0) == '"'
+       || urlname.charAt(0) == '\u005c'') {
+       urlname = urlname.substring(1, urlname.length()-1);
+   }
+   {if (true) return LexicalUnitImpl.createURL(n.beginLine, n.beginColumn, prev, urlname);}
+    throw new Error("Missing return statement in function");
+  }
+
+/**
+ * @exception ParseException exception during the parse
+ */
+  final public LexicalUnitImpl hexcolor(LexicalUnitImpl prev) throws ParseException {
+ Token n;
+    n = jj_consume_token(HASH);
+     int r;
+     LexicalUnitImpl first, params = null;
+     String s = n.image.substring(1);
+
+     if(s.length()!=3 && s.length()!=6) {
+         first = null;
+         {if (true) throw new CSSParseException("invalid hexadecimal notation for RGB: " + s,
+                                     getLocator());}
+     }
+     {if (true) return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+             prev, n.image);}
+    throw new Error("Missing return statement in function");
+  }
+
+  float number(char operator, Token n, int lengthUnit) throws ParseException {
+    String image  = n.image;
+    float f = 0;
+
+    if (lengthUnit != 0) {
+        image = image.substring(0, image.length() - lengthUnit);
+    }
+    f = Float.valueOf(image).floatValue();
+    return (operator == '-')? -f: f;
+  }
+
+  String skipStatementUntilSemiColon() throws ParseException {
+    int[] semicolon = {SEMICOLON};
+    return skipStatementUntil(semicolon);
+  }
+
+  String skipStatementUntilLeftBrace() throws ParseException {
+    int[] lBrace = {LBRACE};
+    return skipStatementUntil(lBrace);
+  }
+
+  String skipStatementUntilRightParan() throws ParseException {
+    int[] rParan = {RPARAN};
+    return skipStatementUntil(rParan);
+  }
+
+  String skipStatementUntil(int[] symbols) throws ParseException {
+    StringBuffer s = new StringBuffer();
+    boolean stop = false;
+    Token tok;
+    while(!stop){
+        tok = getToken(1);
+        if(tok.kind == EOF) {
+            return null;
+        }
+        for(int sym : symbols){
+            if(tok.kind == sym){
+                stop = true;
+                break;
+            }
+        }
+        if(!stop){
+            if (tok.image != null) {
+                s.append(tok.image);
+            }
+            getNextToken();
+        }
+    }
+    return s.toString().trim();
+  }
+
+  String skipStatement() throws ParseException {
+    StringBuffer s = new StringBuffer();
+    Token tok = getToken(0);
+    if (tok.image != null) {
+        s.append(tok.image);
+    }
+    while (true) {
+        tok = getToken(1);
+        if (tok.kind == EOF) {
+            return null;
+        }
+        s.append(tok.image);
+        if (tok.kind == LBRACE) {
+            getNextToken();
+            s.append(skip_to_matching_brace());
+            getNextToken();
+            tok = getToken(1);
+            break;
+        } else if (tok.kind == RBRACE) {
+            getNextToken();
+            tok = getToken(1);
+            break;
+        } else if (tok.kind == SEMICOLON) {
+            getNextToken();
+            tok = getToken(1);
+            break;
+        }
+        getNextToken();
+    }
+
+    // skip white space
+    while (true) {
+        if (tok.kind != S) {
+            break;
+        }
+        tok = getNextToken();
+        tok = getToken(1);
+    }
+
+    return s.toString().trim();
+  }
+
+  String skip_to_matching_brace() throws ParseException {
+    StringBuffer s = new StringBuffer();
+    Token tok;
+    int nesting = 1;
+    while (true) {
+        tok = getToken(1);
+        if (tok.kind == EOF) {
+            break;
+        }
+        s.append(tok.image);
+        if (tok.kind == LBRACE) {
+            nesting++;
+        } else if (tok.kind == RBRACE) {
+            nesting--;
+            if (nesting == 0) {
+                break;
+            }
+        }
+        getNextToken();
+    }
+    return s.toString();
+  }
+
+  String convertStringIndex(String s, int start, int len) throws ParseException {
+    StringBuffer buf = new StringBuffer(len);
+    int index = start;
+
+    while (index < len) {
+        char c = s.charAt(index);
+        if (c == '\u005c\u005c') {
+            if (++index < len) {
+                c = s.charAt(index);
+                switch (c) {
+                case '0': case '1': case '2': case '3': case '4':
+                case '5': case '6': case '7': case '8': case '9':
+                case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+                case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+                    int numValue = Character.digit(c, 16);
+                    int count = 0;
+                    int p = 16;
+
+                    while (index + 1 < len && count < 6) {
+                        c = s.charAt(index+1);
+
+                        if (Character.digit(c, 16) != -1) {
+                            numValue = (numValue * 16) + Character.digit(c, 16);
+                            p *= 16;
+                            index++;
+                        } else {
+                            if (c == ' ') {
+                                // skip the latest white space
+                                index++;
+                            }
+                            break;
+                        }
+                    }
+                    buf.append((char) numValue);
+                    break;
+                case '\u005cn':
+                case '\u005cf':
+                    break;
+                case '\u005cr':
+                    if (index + 1 < len) {
+                        if (s.charAt(index + 1) == '\u005cn') {
+                            index ++;
+                        }
+                    }
+                    break;
+                default:
+                    buf.append(c);
+                }
+            } else {
+                throw new CSSParseException("invalid string " + s, getLocator());
+            }
+        } else {
+            buf.append(c);
+        }
+        index++;
+    }
+
+    return buf.toString();
+  }
+
+  String convertIdent(String s) throws ParseException {
+    return convertStringIndex(s, 0, s.length());
+  }
+
+  String convertString(String s) throws ParseException {
+    return convertStringIndex(s, 0, s.length());
+  }
+
+  void rejectToken(Token t) throws ParseException {
+    Token fakeToken = new Token();
+    t.next = token;
+    fakeToken.next = t;
+    token = fakeToken;
+  }
+
+  String skipAfterExpression() throws ParseException {
+    Token t = getToken(1);
+    StringBuffer s = new StringBuffer();
+    s.append(getToken(0).image);
+
+    while ((t.kind != RBRACE) && (t.kind != SEMICOLON) && (t.kind != EOF)) {
+        s.append(t.image);
+        getNextToken();
+        t = getToken(1);
+    }
+
+    return s.toString();
+  }
+
+/**
+ * The following functions are useful for a DOM CSS implementation only and are
+ * not part of the general CSS2 parser.
+ */
+  final public void _parseRule() throws ParseException {
+ String ret = null;
+    label_96:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[146] = jj_gen;
+        break label_96;
+      }
+      jj_consume_token(S);
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case IMPORT_SYM:
+      importDeclaration();
+      break;
+    case LBRACKET:
+    case ANY:
+    case PARENT:
+    case DOT:
+    case COLON:
+    case IDENT:
+    case HASH:
+      styleRule();
+      break;
+    case MEDIA_SYM:
+      media();
+      break;
+    case PAGE_SYM:
+      page();
+      break;
+    case FONT_FACE_SYM:
+      fontFace();
+      break;
+    default:
+      jj_la1[147] = jj_gen;
+      ret = skipStatement();
+                    if ((ret == null) || (ret.length() == 0)) {
+                        {if (true) return;}
+                    }
+                    if (ret.charAt(0) == '@') {
+                        documentHandler.ignorableAtRule(ret);
+                    } else {
+                        {if (true) throw new CSSParseException("unrecognize rule: " + ret,
+                                                    getLocator());}
+                    }
+    }
+  }
+
+  final public void _parseImportRule() throws ParseException {
+    label_97:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[148] = jj_gen;
+        break label_97;
+      }
+      jj_consume_token(S);
+    }
+    importDeclaration();
+  }
+
+  final public void _parseMediaRule() throws ParseException {
+    label_98:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[149] = jj_gen;
+        break label_98;
+      }
+      jj_consume_token(S);
+    }
+    media();
+  }
+
+  final public void _parseDeclarationBlock() throws ParseException {
+    label_99:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case S:
+        ;
+        break;
+      default:
+        jj_la1[150] = jj_gen;
+        break label_99;
+      }
+      jj_consume_token(S);
+    }
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case IDENT:
+      declaration();
+      break;
+    default:
+      jj_la1[151] = jj_gen;
+      ;
+    }
+    label_100:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SEMICOLON:
+        ;
+        break;
+      default:
+        jj_la1[152] = jj_gen;
+        break label_100;
+      }
+      jj_consume_token(SEMICOLON);
+      label_101:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[153] = jj_gen;
+          break label_101;
+        }
+        jj_consume_token(S);
+      }
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case IDENT:
+        declaration();
+        break;
+      default:
+        jj_la1[154] = jj_gen;
+        ;
+      }
+    }
+  }
+
+  final public SelectorList _parseSelectors() throws ParseException {
+  SelectorList p = null;
+    try {
+      label_102:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case S:
+          ;
+          break;
+        default:
+          jj_la1[155] = jj_gen;
+          break label_102;
+        }
+        jj_consume_token(S);
+      }
+      p = selectorList();
+          {if (true) return p;}
+    } catch (ThrowedParseException e) {
+        {if (true) throw (ParseException) e.e.fillInStackTrace();}
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+  private boolean jj_2_1(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_1(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(0, xla); }
+  }
+
+  private boolean jj_2_2(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_2(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(1, xla); }
+  }
+
+  private boolean jj_2_3(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_3(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(2, xla); }
+  }
+
+  private boolean jj_2_4(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_4(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(3, xla); }
+  }
+
+  private boolean jj_3R_130() {
+    if (jj_scan_token(COMMA)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_129() {
+    if (jj_scan_token(DIV)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_119() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_129()) {
+    jj_scanpos = xsp;
+    if (jj_3R_130()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_168() {
+    if (jj_scan_token(UNICODERANGE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_171() {
+    if (jj_3R_122()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_118() {
+    if (jj_3R_128()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_117() {
+    if (jj_3R_127()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_116() {
+    if (jj_3R_126()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_165() {
+    if (jj_scan_token(FUNCTION)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    xsp = jj_scanpos;
+    if (jj_3R_171()) jj_scanpos = xsp;
+    if (jj_scan_token(RPARAN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_115() {
+    if (jj_3R_125()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_114() {
+    if (jj_3R_124()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_125() {
+    if (jj_scan_token(HASH)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_105() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_114()) {
+    jj_scanpos = xsp;
+    if (jj_3R_115()) {
+    jj_scanpos = xsp;
+    if (jj_3R_116()) {
+    jj_scanpos = xsp;
+    if (jj_3R_117()) {
+    jj_scanpos = xsp;
+    if (jj_3R_118()) return true;
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_121() {
+    if (jj_3R_133()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_163() {
+    if (jj_3R_168()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_162() {
+    if (jj_3R_167()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_161() {
+    if (jj_3R_166()) return true;
+    return false;
+  }
+
+  private boolean jj_3_1() {
+    if (jj_3R_103()) return true;
+    return false;
+  }
+
+  private boolean jj_3_2() {
+    if (jj_3R_104()) return true;
+    if (jj_3R_105()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_160() {
+    if (jj_scan_token(IDENT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_127() {
+    if (jj_scan_token(COLON)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_159() {
+    if (jj_scan_token(STRING)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_158() {
+    if (jj_3R_165()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_132() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_159()) {
+    jj_scanpos = xsp;
+    if (jj_3R_160()) {
+    jj_scanpos = xsp;
+    if (jj_3R_161()) {
+    jj_scanpos = xsp;
+    if (jj_3R_162()) {
+    jj_scanpos = xsp;
+    if (jj_3R_163()) return true;
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3_3() {
+    if (jj_3R_103()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_157() {
+    if (jj_scan_token(DIMEN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_156() {
+    if (jj_scan_token(KHZ)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_155() {
+    if (jj_scan_token(HZ)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_154() {
+    if (jj_scan_token(MS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_153() {
+    if (jj_scan_token(SECOND)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_152() {
+    if (jj_scan_token(GRAD)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_151() {
+    if (jj_scan_token(RAD)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_110() {
+    if (jj_scan_token(LBRACE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_150() {
+    if (jj_scan_token(DEG)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_149() {
+    if (jj_scan_token(EXS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_148() {
+    if (jj_scan_token(EMS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_147() {
+    if (jj_scan_token(PX)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_146() {
+    if (jj_scan_token(IN)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_109() {
+    if (jj_3R_122()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_128() {
+    if (jj_scan_token(LBRACKET)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_145() {
+    if (jj_scan_token(PC)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_144() {
+    if (jj_scan_token(MM)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_143() {
+    if (jj_scan_token(CM)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_103() {
+    if (jj_3R_108()) return true;
+    if (jj_scan_token(COLON)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    xsp = jj_scanpos;
+    if (jj_3R_109()) {
+    jj_scanpos = xsp;
+    if (jj_3R_110()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_138() {
+    if (jj_scan_token(PARENT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_142() {
+    if (jj_scan_token(PT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_137() {
+    if (jj_scan_token(ANY)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_141() {
+    if (jj_scan_token(PERCENTAGE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_133() {
+    if (jj_scan_token(VARIABLE)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_139() {
+    if (jj_3R_164()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_140() {
+    if (jj_scan_token(NUMBER)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_124() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_136()) {
+    jj_scanpos = xsp;
+    if (jj_3R_137()) {
+    jj_scanpos = xsp;
+    if (jj_3R_138()) return true;
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_136() {
+    if (jj_scan_token(IDENT)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_131() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_139()) jj_scanpos = xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_140()) {
+    jj_scanpos = xsp;
+    if (jj_3R_141()) {
+    jj_scanpos = xsp;
+    if (jj_3R_142()) {
+    jj_scanpos = xsp;
+    if (jj_3R_143()) {
+    jj_scanpos = xsp;
+    if (jj_3R_144()) {
+    jj_scanpos = xsp;
+    if (jj_3R_145()) {
+    jj_scanpos = xsp;
+    if (jj_3R_146()) {
+    jj_scanpos = xsp;
+    if (jj_3R_147()) {
+    jj_scanpos = xsp;
+    if (jj_3R_148()) {
+    jj_scanpos = xsp;
+    if (jj_3R_149()) {
+    jj_scanpos = xsp;
+    if (jj_3R_150()) {
+    jj_scanpos = xsp;
+    if (jj_3R_151()) {
+    jj_scanpos = xsp;
+    if (jj_3R_152()) {
+    jj_scanpos = xsp;
+    if (jj_3R_153()) {
+    jj_scanpos = xsp;
+    if (jj_3R_154()) {
+    jj_scanpos = xsp;
+    if (jj_3R_155()) {
+    jj_scanpos = xsp;
+    if (jj_3R_156()) {
+    jj_scanpos = xsp;
+    if (jj_3R_157()) {
+    jj_scanpos = xsp;
+    if (jj_3R_158()) return true;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_108() {
+    if (jj_scan_token(IDENT)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_135() {
+    if (jj_scan_token(PRECEDES)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_120() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_131()) {
+    jj_scanpos = xsp;
+    if (jj_3R_132()) return true;
+    }
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_107() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_120()) {
+    jj_scanpos = xsp;
+    if (jj_3R_121()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_134() {
+    if (jj_scan_token(PLUS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_123() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_134()) {
+    jj_scanpos = xsp;
+    if (jj_3R_135()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_106() {
+    if (jj_3R_119()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_166() {
+    if (jj_scan_token(HASH)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_112() {
+    if (jj_scan_token(PRECEDES)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_104() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_111()) {
+    jj_scanpos = xsp;
+    if (jj_3R_112()) {
+    jj_scanpos = xsp;
+    if (jj_3R_113()) return true;
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_111() {
+    if (jj_scan_token(PLUS)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_113() {
+    if (jj_scan_token(S)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_123()) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3R_170() {
+    if (jj_scan_token(PLUS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_164() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_169()) {
+    jj_scanpos = xsp;
+    if (jj_3R_170()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_169() {
+    if (jj_scan_token(MINUS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_126() {
+    if (jj_scan_token(DOT)) return true;
+    return false;
+  }
+
+  private boolean jj_3_4() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_106()) jj_scanpos = xsp;
+    if (jj_3R_107()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_167() {
+    if (jj_scan_token(URL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_122() {
+    if (jj_3R_107()) return true;
+    return false;
+  }
+
+  /** Generated Token Manager. */
+  public ParserTokenManager token_source;
+  /** Current token. */
+  public Token token;
+  /** Next token. */
+  public Token jj_nt;
+  private int jj_ntk;
+  private Token jj_scanpos, jj_lastpos;
+  private int jj_la;
+  private int jj_gen;
+  final private int[] jj_la1 = new int[156];
+  static private int[] jj_la1_0;
+  static private int[] jj_la1_1;
+  static private int[] jj_la1_2;
+  static private int[] jj_la1_3;
+  static {
+      jj_la1_init_0();
+      jj_la1_init_1();
+      jj_la1_init_2();
+      jj_la1_init_3();
+   }
+   private static void jj_la1_init_0() {
+      jj_la1_0 = new int[] {0x0,0x6002,0x6002,0x0,0x6000,0x2,0x2,0x2,0x74000000,0x6000,0x2,0x6000,0x2,0x0,0x2,0x0,0x2,0x2,0x2,0x75f6a000,0x75f6a000,0x2,0x400000,0x2,0x2,0x2,0x2,0x0,0x0,0x2,0x0,0x800000,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,0x1f6a000,0x2,0x2,0x1100000,0x2,0x1100000,0x1100002,0x2,0x2,0x2,0x2,0x74000000,0x0,0x74000000,0x2,0x400000,0x2,0x2,0x44000000,0x44000000,0x44000000,0x44000000,0x44000000,0x44000000,0x44000000,0x44000000,0x44000000,0x44000000,0x74000000,0x30000000,0x2,0x2,0xe0000,0x2,0x0,0x2,0xe0000,0x0,0x2,0x2,0x0,0x2,0x0,0x2,0x800000,0x2,0x2,0x0,0x2,0x74000000,0x0,0x74000000,0x2,0x400000,0x2,0x2,0x0,0x400000,0x2,0x2,0x0,0x2,0x800000,0x2,0x0,0x2,0x2,0x2,0x2,0x800000,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,0x2,0x0,0x2,0x0,0x800000,0x2,0x0,0x2,0x308000,0x2,0x0,0x2,0x2,0x2,0x2,0x2400000,0x2400000,0x300000,0x300000,0x0,0x0,0x300000,0x2,0x300000,0x2,0x300000,0x2,0x74000000,0x2,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,};
+   }
+   private static void jj_la1_init_1() {
+      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000c002,0x0,0x0,0x0,0x0,0x20000000,0x0,0x40000000,0x0,0x0,0x0,0xe0000006,0xe0000006,0x0,0x0,0x0,0x0,0x0,0x0,0x40000000,0x2,0x0,0x40000000,0x0,0x0,0x40000000,0x0,0x0,0x0,0x0,0x40000000,0x0,0x0,0x40000000,0x0,0xa0000004,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x42008002,0x2008000,0x40000002,0x0,0x0,0x0,0x0,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x40000002,0x40000000,0x0,0x0,0x0,0x0,0x60000000,0x0,0x0,0x2,0x0,0x0,0x40000000,0x0,0x10000000,0x0,0x0,0x0,0x0,0x40000000,0x0,0x42008002,0x2008000,0x40000002,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x40000000,0x0,0x0,0x0,0x1800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000000,0x0,0x0,0x40000000,0x0,0x0,0x0,0x0,0x40000000,0x0,0x0,0x40000000,0x0,0xe0000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000,0x60000000,0xe0000000,0x0,0xe0000000,0x0,0xe0000000,0x0,0x40000002,0x0,0x0,0x0,0x40000000,0x0,0x0,0x40000000,0x0,};
+   }
+   private static void jj_la1_init_2() {
+      jj_la1_2 = new int[] {0x800000,0x4000000,0x4000000,0x200000,0x4000000,0x0,0x0,0x0,0x3500004,0x4000000,0x0,0x4000000,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0xff0000a,0xff0000a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfe0000a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x500004,0x400004,0x100000,0x0,0x0,0x0,0x0,0x100000,0x100000,0x0,0x0,0x100000,0x100000,0x100000,0x100000,0x100000,0x100000,0x100000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x500004,0x400004,0x100000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x0,0x0,0x0,0x0,0x0,0x1ffffe,0x0,0x8000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff8,0x100002,0x1ffffa,0x0,0x1ffffe,0x0,0x1ffffe,0x0,0x3700000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+   }
+   private static void jj_la1_init_3() {
+      jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xe0,0xe0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xe0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x20,0x60,0x0,0x60,0x0,0x60,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
+   }
+  final private JJCalls[] jj_2_rtns = new JJCalls[4];
+  private boolean jj_rescan = false;
+  private int jj_gc = 0;
+
+  /** Constructor with user supplied CharStream. */
+  public Parser(CharStream stream) {
+    token_source = new ParserTokenManager(stream);
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 156; i++) jj_la1[i] = -1;
+    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+  }
+
+  /** Reinitialise. */
+  public void ReInit(CharStream stream) {
+    token_source.ReInit(stream);
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 156; i++) jj_la1[i] = -1;
+    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+  }
+
+  /** Constructor with generated Token Manager. */
+  public Parser(ParserTokenManager tm) {
+    token_source = tm;
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 156; i++) jj_la1[i] = -1;
+    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+  }
+
+  /** Reinitialise. */
+  public void ReInit(ParserTokenManager tm) {
+    token_source = tm;
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 156; i++) jj_la1[i] = -1;
+    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
+  }
+
+  private Token jj_consume_token(int kind) throws ParseException {
+    Token oldToken;
+    if ((oldToken = token).next != null) token = token.next;
+    else token = token.next = token_source.getNextToken();
+    jj_ntk = -1;
+    if (token.kind == kind) {
+      jj_gen++;
+      if (++jj_gc > 100) {
+        jj_gc = 0;
+        for (int i = 0; i < jj_2_rtns.length; i++) {
+          JJCalls c = jj_2_rtns[i];
+          while (c != null) {
+            if (c.gen < jj_gen) c.first = null;
+            c = c.next;
+          }
+        }
+      }
+      return token;
+    }
+    token = oldToken;
+    jj_kind = kind;
+    throw generateParseException();
+  }
+
+  static private final class LookaheadSuccess extends java.lang.Error { }
+  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
+  private boolean jj_scan_token(int kind) {
+    if (jj_scanpos == jj_lastpos) {
+      jj_la--;
+      if (jj_scanpos.next == null) {
+        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
+      } else {
+        jj_lastpos = jj_scanpos = jj_scanpos.next;
+      }
+    } else {
+      jj_scanpos = jj_scanpos.next;
+    }
+    if (jj_rescan) {
+      int i = 0; Token tok = token;
+      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
+      if (tok != null) jj_add_error_token(kind, i);
+    }
+    if (jj_scanpos.kind != kind) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
+    return false;
+  }
+
+
+/** Get the next Token. */
+  final public Token getNextToken() {
+    if (token.next != null) token = token.next;
+    else token = token.next = token_source.getNextToken();
+    jj_ntk = -1;
+    jj_gen++;
+    return token;
+  }
+
+/** Get the specific Token. */
+  final public Token getToken(int index) {
+    Token t = token;
+    for (int i = 0; i < index; i++) {
+      if (t.next != null) t = t.next;
+      else t = t.next = token_source.getNextToken();
+    }
+    return t;
+  }
+
+  private int jj_ntk() {
+    if ((jj_nt=token.next) == null)
+      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
+    else
+      return (jj_ntk = jj_nt.kind);
+  }
+
+  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
+  private int[] jj_expentry;
+  private int jj_kind = -1;
+  private int[] jj_lasttokens = new int[100];
+  private int jj_endpos;
+
+  private void jj_add_error_token(int kind, int pos) {
+    if (pos >= 100) return;
+    if (pos == jj_endpos + 1) {
+      jj_lasttokens[jj_endpos++] = kind;
+    } else if (jj_endpos != 0) {
+      jj_expentry = new int[jj_endpos];
+      for (int i = 0; i < jj_endpos; i++) {
+        jj_expentry[i] = jj_lasttokens[i];
+      }
+      jj_entries_loop: for (java.util.Iterator<?> it = jj_expentries.iterator(); it.hasNext();) {
+        int[] oldentry = (int[])(it.next());
+        if (oldentry.length == jj_expentry.length) {
+          for (int i = 0; i < jj_expentry.length; i++) {
+            if (oldentry[i] != jj_expentry[i]) {
+              continue jj_entries_loop;
+            }
+          }
+          jj_expentries.add(jj_expentry);
+          break jj_entries_loop;
+        }
+      }
+      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
+    }
+  }
+
+  /** Generate ParseException. */
+  public ParseException generateParseException() {
+    jj_expentries.clear();
+    boolean[] la1tokens = new boolean[104];
+    if (jj_kind >= 0) {
+      la1tokens[jj_kind] = true;
+      jj_kind = -1;
+    }
+    for (int i = 0; i < 156; i++) {
+      if (jj_la1[i] == jj_gen) {
+        for (int j = 0; j < 32; j++) {
+          if ((jj_la1_0[i] & (1<<j)) != 0) {
+            la1tokens[j] = true;
+          }
+          if ((jj_la1_1[i] & (1<<j)) != 0) {
+            la1tokens[32+j] = true;
+          }
+          if ((jj_la1_2[i] & (1<<j)) != 0) {
+            la1tokens[64+j] = true;
+          }
+          if ((jj_la1_3[i] & (1<<j)) != 0) {
+            la1tokens[96+j] = true;
+          }
+        }
+      }
+    }
+    for (int i = 0; i < 104; i++) {
+      if (la1tokens[i]) {
+        jj_expentry = new int[1];
+        jj_expentry[0] = i;
+        jj_expentries.add(jj_expentry);
+      }
+    }
+    jj_endpos = 0;
+    jj_rescan_token();
+    jj_add_error_token(0, 0);
+    int[][] exptokseq = new int[jj_expentries.size()][];
+    for (int i = 0; i < jj_expentries.size(); i++) {
+      exptokseq[i] = jj_expentries.get(i);
+    }
+    return new ParseException(token, exptokseq, tokenImage);
+  }
+
+  /** Enable tracing. */
+  final public void enable_tracing() {
+  }
+
+  /** Disable tracing. */
+  final public void disable_tracing() {
+  }
+
+  private void jj_rescan_token() {
+    jj_rescan = true;
+    for (int i = 0; i < 4; i++) {
+    try {
+      JJCalls p = jj_2_rtns[i];
+      do {
+        if (p.gen > jj_gen) {
+          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
+          switch (i) {
+            case 0: jj_3_1(); break;
+            case 1: jj_3_2(); break;
+            case 2: jj_3_3(); break;
+            case 3: jj_3_4(); break;
+          }
+        }
+        p = p.next;
+      } while (p != null);
+      } catch(LookaheadSuccess ls) { }
+    }
+    jj_rescan = false;
+  }
+
+  private void jj_save(int index, int xla) {
+    JJCalls p = jj_2_rtns[index];
+    while (p.gen > jj_gen) {
+      if (p.next == null) { p = p.next = new JJCalls(); break; }
+      p = p.next;
+    }
+    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
+  }
+
+  static final class JJCalls {
+    int gen;
+    Token first;
+    int arg;
+    JJCalls next;
+  }
+
+}
diff --git a/sass/src/com/vaadin/sass/parser/Parser.jj b/sass/src/com/vaadin/sass/parser/Parser.jj
new file mode 100644 (file)
index 0000000..67fe870
--- /dev/null
@@ -0,0 +1,2443 @@
+/* -*-java-extended-*-
+ * Copyright (c) 1999 World Wide Web Consortium
+ * (Massachusetts Institute of Technology, Institut National de Recherche
+ *  en Informatique et en Automatique, Keio University).
+ * All Rights Reserved. http://www.w3.org/Consortium/Legal/
+ *
+ * $Id: Parser.jj,v 1.15 2000/10/27 21:09:37 plehegar Exp $
+ */
+
+options {
+    IGNORE_CASE  = true;
+    STATIC = false;
+    USER_CHAR_STREAM = true;
+    /* DEBUG_TOKEN_MANAGER = true;
+       DEBUG_PARSER = true; */
+}
+
+PARSER_BEGIN(Parser)
+
+package com.vaadin.sass.parser;
+
+import java.io.*;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Map;
+
+import org.w3c.css.sac.ConditionFactory;
+import org.w3c.css.sac.Condition;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SimpleSelector;
+import org.w3c.css.sac.DocumentHandler;
+import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.ErrorHandler;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
+import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.LexicalUnit;
+
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
+
+import org.w3c.flute.util.Encoding;
+
+import com.vaadin.sass.handler.*;
+
+import com.vaadin.sass.tree.*;
+
+/**
+ * A CSS2 parser
+ *
+ * @author Philippe Le H�garet
+ * @version $Revision: 1.15 $
+ */
+public class Parser implements org.w3c.css.sac.Parser {
+
+    // replaces all \t, \n, etc with this StringBuffer.
+    static final StringBuilder SPACE = new StringBuilder(" ");
+
+    // the document handler for the parser
+    protected SCSSDocumentHandlerImpl documentHandler;
+    // the error handler for the parser
+    protected ErrorHandler errorHandler;
+    // the input source for the parser
+    protected InputSource source;
+
+    protected ConditionFactory conditionFactory;
+    protected SelectorFactory selectorFactory;
+
+    // temporary place holder for pseudo-element ...
+    private String pseudoElt;
+    
+    /**
+     * Creates a new Parser
+     */
+    public Parser() {
+       this((CharStream) null);
+    }
+
+    /**
+     * @@TODO
+     * @exception CSSException Not yet implemented
+     */    
+    public void setLocale(Locale locale) throws CSSException {
+       throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR);
+    }
+
+    /**
+     * Set the document handler for this parser
+     */    
+    public void setDocumentHandler(DocumentHandler handler) {
+       this.documentHandler = (SCSSDocumentHandlerImpl) handler;
+    }
+
+    public void setSelectorFactory(SelectorFactory selectorFactory) {
+       this.selectorFactory = selectorFactory;
+    }
+
+    public void setConditionFactory(ConditionFactory conditionFactory) {
+       this.conditionFactory = conditionFactory;
+    }
+
+    /**
+     * Set the error handler for this parser
+     */    
+    public void setErrorHandler(ErrorHandler error) {
+       this.errorHandler = error;
+    }
+    
+    /**
+     * Main parse methods
+     *
+     * @param source the source of the style sheet.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */
+    public void parseStyleSheet(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+
+       parserUnit();
+    }
+
+    /**
+     * Convenient method for URIs.
+     *
+     * @param systemId the fully resolved URI of the style sheet.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */    
+    public void parseStyleSheet(String systemId) 
+           throws CSSException, IOException {
+       parseStyleSheet(new InputSource(systemId));
+    }
+
+    /**
+     * This method parses only one rule (style rule or at-rule, except @charset).
+     *
+     * @param source the source of the rule.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */    
+    public void parseRule(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       _parseRule();
+    }
+
+    /**
+     * This method parses a style declaration (including the surrounding curly
+     * braces).
+     *
+     * @param source the source of the style declaration.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */
+    public void parseStyleDeclaration(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       _parseDeclarationBlock();
+    }
+
+    /**
+     * This methods returns "http://www.w3.org/TR/REC-CSS2".
+     * @return the string "http://www.w3.org/TR/REC-CSS2".
+     */    
+    public String getParserVersion() {
+       return "http://www.w3.org/TR/REC-CSS2";
+    }
+
+    /**
+     * Parse methods used by DOM Level 2 implementation.
+     */    
+    public void parseImportRule(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       _parseImportRule();
+    }
+
+    public void parseMediaRule(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       _parseMediaRule();
+    }
+
+    public SelectorList parseSelectors(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       return _parseSelectors();
+    }
+
+    public LexicalUnit parsePropertyValue(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       return expr();
+    }
+
+    public boolean parsePriority(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       return prio();
+    }
+
+    /**
+     * Convert the source into a Reader. Used only by DOM Level 2 parser methods.
+     */    
+    private Reader getReader(InputSource source) throws IOException {
+       if (source.getCharacterStream() != null) {
+           return source.getCharacterStream();
+       } else if (source.getByteStream() != null) {
+           // My DOM level 2 implementation doesn't use this case.
+           if (source.getEncoding() == null) {
+               // unknown encoding, use ASCII as default.
+               return new InputStreamReader(source.getByteStream(), "ASCII");
+           } else {
+               return new InputStreamReader(source.getByteStream(), 
+                                            source.getEncoding());
+           }
+       } else {
+           // systemId
+           // @@TODO
+           throw new CSSException("not yet implemented");
+       }
+    }
+
+    /**
+     * Convert the source into a CharStream with encoding informations.
+     * The encoding can be found in the InputSource or in the CSS document.
+     * Since this method marks the reader and make a reset after looking for
+     * the charset declaration, you'll find the charset declaration into the
+     * stream.  
+     */
+    private CharStream getCharStreamWithLurk(InputSource source)
+           throws CSSException, IOException {
+       if (source.getCharacterStream() != null) {
+           // all encoding are supposed to be resolved by the user
+           // return the reader
+           return new Generic_CharStream(source.getCharacterStream(), 1, 1);
+       } else if (source.getByteStream() == null) {
+           // @@CONTINUE ME. see also getReader() with systemId
+           try {
+               source.setByteStream(new URL(source.getURI()).openStream());
+           } catch (Exception e) {
+               try {
+                   source.setByteStream(new FileInputStream(source.getURI()));
+               } catch (IOException ex) {
+                   throw new CSSException("invalid url ?");
+               }
+           }
+       }
+       String encoding = "ASCII";
+       InputStream input = source.getByteStream();
+       char c = ' ';
+
+       if (!input.markSupported()) {
+           input = new BufferedInputStream(input);
+           source.setByteStream(input);
+       }
+       input.mark(100);
+       c = (char) input.read();
+
+       if (c == '@') {
+           // hum, is it a charset ?
+           int size   = 100;
+           byte[] buf = new byte[size];
+           input.read(buf, 0, 7);
+           String keyword = new String(buf, 0, 7);
+           if (keyword.equals("charset")) {
+               // Yes, this is the charset declaration !
+
+               // here I don't use the right declaration : white space are ' '.
+               while ((c = (char) input.read()) == ' ') {
+                   // find the first quote
+               }
+               char endChar = c;
+               int i = 0;
+
+               if ((endChar != '"') && (endChar != '\'')) {
+                   // hum this is not a quote.
+                   throw new CSSException("invalid charset declaration");
+               }
+
+               while ((c = (char) input.read()) != endChar) {
+                   buf[i++] = (byte) c;
+                   if (i == size) {
+                       byte[] old = buf;
+                       buf = new byte[size + 100];
+                       System.arraycopy(old, 0, buf, 0, size);
+                       size += 100;
+                   }
+               }
+               while ((c = (char) input.read()) == ' ') {
+                   // find the next relevant character
+               }
+               if (c != ';') {
+                   // no semi colon at the end ?
+                   throw new CSSException("invalid charset declaration: "
+                                          + "missing semi colon");
+               }
+               encoding = new String(buf, 0, i);
+               if (source.getEncoding() != null) {
+                   // compare the two encoding informations.
+                   // For example, I don't accept to have ASCII and after UTF-8.
+                   // Is it really good ? That is the question.
+                   if (!encoding.equals(source.getEncoding())) {
+                       throw new CSSException("invalid encoding information.");
+                   }
+               }
+           } // else no charset declaration available
+       }
+       // ok set the real encoding of this source.
+       source.setEncoding(encoding);
+       // set the real reader of this source.
+       source.setCharacterStream(new InputStreamReader(source.getByteStream(),
+                                             Encoding.getJavaEncoding(encoding)));
+       // reset the stream (leave the charset declaration in the stream).
+       input.reset();
+
+       return new Generic_CharStream(source.getCharacterStream(), 1, 1);
+    }
+
+    private LocatorImpl currentLocator;
+    private Locator getLocator() {
+       if (currentLocator == null) {
+           currentLocator = new LocatorImpl(this);
+           return currentLocator;
+       }
+       return currentLocator.reInit(this);
+    }
+    private LocatorImpl getLocator(Token save) {
+       if (currentLocator == null) {
+           currentLocator = new LocatorImpl(this, save);
+           return currentLocator;
+       }
+       return currentLocator.reInit(this, save);
+    }
+
+    private void reportError(Locator l, Exception e) {
+       if (errorHandler != null) {
+           if (e instanceof ParseException) {
+               // construct a clean error message.
+               ParseException pe = (ParseException) e;
+               if (pe.specialConstructor) {
+                   StringBuffer errorM = new StringBuffer();
+                   if (pe.currentToken != null) {
+                       errorM.append("encountered \"")
+                           .append(pe.currentToken.next);
+                   }
+                   errorM.append('"');
+                   if (pe.expectedTokenSequences.length != 0) {
+                       errorM.append(". Was expecting one of: ");
+                       for (int i = 0; i < pe.expectedTokenSequences.length; i++) {
+                           for (int j = 0; j < pe.expectedTokenSequences[i].length; j++) {
+                               int kind = pe.expectedTokenSequences[i][j];
+                               if (kind != S) {
+                                   errorM.append(pe.tokenImage[kind]);
+                                   errorM.append(' ');
+                               }
+                           }
+                       }
+                   }
+                   errorHandler.error(new CSSParseException(errorM.toString(), 
+                                                            l, e));
+               } else {
+                   errorHandler.error(new CSSParseException(e.getMessage(), 
+                                                            l, e));
+               }
+           } else if (e == null) {
+               errorHandler.error(new CSSParseException("error", l, null));
+           } else {
+               errorHandler.error(new CSSParseException(e.getMessage(), l, e));
+           }
+       }
+    }
+
+    private void reportWarningSkipText(Locator l, String text) {
+       if (errorHandler != null && text  != null) {
+           errorHandler.warning(new CSSParseException("Skipping: " + text, l));
+       }
+    }
+}
+
+PARSER_END(Parser)
+
+/*
+ * The tokenizer 
+ */
+
+<DEFAULT>
+TOKEN :
+{
+    < S : ( [ " ", "\t" , "\n" , "\r", "\f" ] )+ > 
+       { image = Parser.SPACE; }
+}
+
+<DEFAULT>
+MORE:
+{
+    "#{" : IN_INTERPOLATION
+}
+
+<IN_INTERPOLATION>
+MORE:
+{
+    < ~["}"]> : IN_INTERPOLATION
+}
+
+<IN_INTERPOLATION>
+SPECIAL_TOKEN:
+{
+    <INTERPOLATION: "}"> : DEFAULT
+}
+    
+<DEFAULT>
+MORE :
+{
+  "//" : IN_SINGLE_LINE_COMMENT
+}
+
+<IN_SINGLE_LINE_COMMENT>
+MORE :
+{
+    < ~["\n","\r"] > : IN_SINGLE_LINE_COMMENT
+}
+
+<IN_SINGLE_LINE_COMMENT>
+SKIP :
+{
+    < "\n"|"\r"|"\r\n" > : DEFAULT
+}
+    
+
+<DEFAULT>
+MORE :
+{
+  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
+|
+  "/*" : IN_MULTI_LINE_COMMENT
+}
+<IN_FORMAL_COMMENT>
+SPECIAL_TOKEN :
+{
+  <FORMAL_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_MULTI_LINE_COMMENT>
+SKIP :
+{
+  <MULTI_LINE_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
+MORE :
+{
+  < ~[] >
+}
+
+<DEFAULT>
+TOKEN :
+{
+  < CDO : "<!--" >
+  | < CDC : "-->" >
+  | < LBRACE : "{" >
+  | < RBRACE : "}">
+  | < DASHMATCH : "|=" >
+  | < INCLUDES  : "~=" >
+  | < EQ        : "=" >
+  | < PLUS      : "+" >
+  | < MINUS     : "-" >
+  | < COMMA     : "," >
+  | < SEMICOLON : ";" >
+  | < PRECEDES  : ">" >
+  | < DIV       : "/" >
+  | < LBRACKET  : "[" >
+  | < RBRACKET  : "]" >
+  | < ANY       : "*" >
+  | < PARENT    : "&" >
+  | < DOT       : "." >
+  | < LPARAN    : "(" >
+  | < RPARAN    : ")">
+}
+
+<DEFAULT>
+TOKEN :
+{
+  < COLON     : ":" >
+}
+
+<DEFAULT>
+TOKEN : /* basic tokens */
+{ 
+    < NONASCII    : ["\200"-"\377"] >
+  | < #H          : ["0"-"9", "a"-"f"] >
+  | < #UNICODE    : "\\" <H> ( <H> )? /* I can't say {1,6} */
+                         ( <H> )? ( <H> )?
+                         ( <H> )? ( <H> )? 
+                    ( [ " ", "\t" , "\n" , "\r", "\f" ] )? >
+  | < #ESCAPE     : <UNICODE> | ( "\\" [ " "-"~","\200"-"\377" ] ) >
+  | < #NMSTART    : ("-")?[ "a"-"z"] | <NONASCII> | <ESCAPE> >
+  | < #NMCHAR    : ["a"-"z", "0"-"9", "-", "_"] | <NONASCII> | <ESCAPE> >
+  | < #STRINGCHAR : [ "\t"," ","!","#","$","%","&","("-"~" ] 
+                    | "\\\n" | "\\\r\n" | "\\\r" | "\\\f" 
+                    | <NONASCII> | <ESCAPE> >
+  | < #D          : ["0"-"9"] >
+  | < #NAME       : ( <NMCHAR> )+ >
+}
+
+
+<DEFAULT>
+TOKEN :
+{
+    <TO         : "to">
+    |<THROUGH   : "through">
+    |<EACH_IN        : "in">
+}
+
+/* DERECTIVES */
+<DEFAULT>
+TOKEN :
+{
+    <MIXIN_SYM          : "@mixin">
+  | <INCLUDE_SYM        : "@include">
+  | <FUNCTION_SYM       : "@function">
+  | <RETURN_SYM         : "@return">
+  | <DEBUG_SYM          : "@debug">
+  | <WARN_SYM           : "@warn">
+  | <FOR_SYM            : "@for">
+  | <EACH_SYM           : "@each">
+  | <WHILE_SYM          : "@while">
+  | <IF_SYM             : "@if">
+  | <ELSE_SYM           : "@else">
+  | <EXTEND_SYM         : "@extend">
+  | <MOZ_DOCUMENT_SYM   : "@-moz-document">
+  | <SUPPORTS_SYM       : "@supports">
+}
+
+<DEFAULT>
+TOKEN:
+{
+        < GUARDED_SYM : "!" ( <S> )? "default">
+}
+
+<DEFAULT>
+TOKEN :
+{
+  < STRING      : ( "\"" ( <STRINGCHAR> | "'" )* "\"" ) | 
+                  ( "'" ( <STRINGCHAR> | "\"" )* "'" ) >
+  | < IDENT         : <NMSTART> ( <NMCHAR> )* >
+  | < NUMBER     : ( <D> )+ | ( <D> )* "." ( <D> )+ > 
+  | < #_URL       : [ "!","#","$","%","&","*"-"~" ] | <NONASCII> | <ESCAPE> >
+  | < URL         : "url(" ( <S> )*
+                    ( <STRING> | ( <_URL> )* ) ( <S> )* ")" >            
+}
+
+<DEFAULT>
+TOKEN:
+{
+       < VARIABLE : "$" <IDENT>>
+}
+
+<DEFAULT>
+TOKEN :
+{
+   < PERCENTAGE : <NUMBER> "%" >
+ | < PT : <NUMBER> "pt" >
+ | < MM : <NUMBER> "mm" >
+ | < CM : <NUMBER> "cm" >
+ | < PC : <NUMBER> "pc" >
+ | < IN : <NUMBER> "in" >
+ | < PX : <NUMBER> "px" >
+ | < EMS : <NUMBER> "em" >
+ | < EXS : <NUMBER> "ex" >
+ | < DEG : <NUMBER> "deg" >
+ | < RAD : <NUMBER> "rad" >
+ | < GRAD : <NUMBER> "grad" >
+ | < MS : <NUMBER> "ms" >
+ | < SECOND  : <NUMBER> "s" >
+ | < HZ : <NUMBER> "Hz" >
+ | < KHZ : <NUMBER> "kHz" >
+ | < DIMEN  : <NUMBER> <IDENT> >
+}
+
+<DEFAULT>
+TOKEN :
+{
+  < HASH : "#" <NAME> >
+}
+
+/* RESERVED ATRULE WORDS */
+<DEFAULT>
+TOKEN : 
+{
+    < IMPORT_SYM   : "@import">
+  | < MEDIA_SYM    : "@media" >
+  | < CHARSET_SYM  : "@charset" >
+  | < PAGE_SYM     : "@page"  >
+  | < FONT_FACE_SYM: "@font-face" >
+  | < ATKEYWORD    : "@" <IDENT> >
+}
+
+<DEFAULT>
+TOKEN :
+{
+ < IMPORTANT_SYM : "!" ( <S> )? "important" >
+}
+
+<DEFAULT>
+TOKEN :
+{
+    < #RANGE0 : <H> <H> <H> <H>  <H> >
+    | < #RANGE1 : <H> <H> <H> <H> <H> ( "?" )? >
+    | < #RANGE2 : <H> <H> <H> <H> ( "?" )? ( "?" )? >
+    | < #RANGE3 : <H> <H> <H> ( "?" )? ( "?" )? ( "?" )? >
+    | < #RANGE4 : <H> <H> ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
+    | < #RANGE5 : <H> ( "?" )? ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
+    | < #RANGE6 : "?" ( "?" )? ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
+    | < #RANGE  : <RANGE0> | <RANGE1> | <RANGE2> 
+                  | <RANGE3> | <RANGE4> | <RANGE5> | <RANGE6> >
+    | < #UNI    : <H> ( <H> )? ( <H> )? ( <H> )? ( <H> )? ( <H> )? >
+    | < UNICODERANGE : "U+" <RANGE>
+                        | "U+" <UNI> "-" <UNI> >
+}
+
+<DEFAULT>
+TOKEN :
+{
+ < FUNCTION : <IDENT> "(" >
+}
+
+<DEFAULT, IN_MULTI_LINE_COMMENT>
+TOKEN :
+{ /* avoid token manager error */
+    < UNKNOWN : ~[] >
+}
+
+/*
+ * The grammar of CSS2
+ */
+
+/**
+ * The main entry for the parser.
+ *
+ * @exception ParseException exception during the parse
+ */
+void parserUnit() :
+{}
+{
+    try {
+       { documentHandler.startDocument(source); }
+       ( charset() )?
+       ( <S> | ignoreStatement() )*
+       ( importDeclaration() ( ignoreStatement() ( <S> )* )* )*
+       afterImportDeclaration()
+       <EOF>
+    } finally {
+       documentHandler.endDocument(source);
+    }
+}
+
+void charset() :
+{ Token n; }
+{  
+    try {
+       <CHARSET_SYM> ( <S> )* n=<STRING> ( <S> )* ";"
+    } catch (ParseException e) {
+        reportError(getLocator(e.currentToken.next), e);
+       skipStatement();
+       // reportWarningSkipText(getLocator(), skipStatement());
+    } catch (Exception e) {
+        reportError(getLocator(), e);
+       skipStatement();
+       // reportWarningSkipText(getLocator(), skipStatement());
+    }
+}
+
+void afterImportDeclaration() :
+{String ret; 
+ Locator l;
+}
+{
+  ( ( variable() | mixinDirective() | includeDirective() | styleRule() | media()| page() | fontFace() 
+      | { l = getLocator(); } ret=skipStatement() 
+      {
+         if ((ret == null) || (ret.length() == 0)) {
+             return; 
+         }
+         reportWarningSkipText(l, ret);
+         if (ret.charAt(0) == '@') {
+             documentHandler.ignorableAtRule(ret);
+         }
+      }
+      )
+    ( ignoreStatement() ( <S> )* )* )*
+}
+
+void ignoreStatement() :
+{}
+{
+   <CDO> | <CDC> | atRuleDeclaration()
+}
+
+/**
+ * The import statement
+ *
+ * @exception ParseException exception during the parse
+ */
+void importDeclaration() :
+{Token n;
+ String uri;
+ MediaListImpl ml = new MediaListImpl();
+ boolean isURL = false;
+}
+{
+ try {
+  <IMPORT_SYM> 
+       ( <S> )* ( n=<STRING> { uri = convertStringIndex(n.image, 1, 
+                                                       n.image.length() -1); }
+                 | n=<URL> 
+          {
+              isURL=true;            
+              uri = n.image.substring(4, n.image.length()-1).trim();
+              if ((uri.charAt(0) == '"')
+                  || (uri.charAt(0) == '\'')) {
+                  uri = uri.substring(1, uri.length()-1);
+              }
+          }
+                 )
+       ( <S> )* ( mediaStatement(ml) )? ";"
+       ( <S> )*
+          {
+              if (ml.getLength() == 0) {
+                  // see section 6.3 of the CSS2 recommandation.
+                  ml.addItem("all");
+              }
+              documentHandler.importStyle(uri, ml, isURL);
+          }
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void media() :
+{ 
+    boolean start = false;
+    String ret;
+    MediaListImpl ml = new MediaListImpl(); 
+}
+{
+ try {
+  <MEDIA_SYM> ( <S> )*
+   mediaStatement(ml)
+   { start = true; documentHandler.startMedia(ml); }
+   <LBRACE> ( <S> )* ( styleRule() | skipUnknownRule() )* <RBRACE> ( <S> )*
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+ } finally {
+     if (start) {
+        documentHandler.endMedia(ml);
+     }
+ }
+}
+
+void mediaStatement(MediaListImpl ml) :
+{ 
+    String m;
+}
+{
+   m=medium() ( <COMMA> ( <S> )* { ml.addItem(m); } m=medium() )* 
+   { ml.addItem(m); }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String medium() : /* tv, projection, screen, ... */
+{Token n;}
+{
+    n=<IDENT> ( <S> )* { return convertIdent(n.image); }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void page() :
+{
+ boolean start = false;
+ Token n = null;
+ String page = null;
+ String pseudo = null;
+}
+{
+ try {
+  <PAGE_SYM> ( <S> )* ( n=<IDENT> ( <S> )* )?
+  ( pseudo=pseudo_page() )? 
+      {
+         if (n != null) {
+             page = convertIdent(n.image);
+         }
+      }
+  <LBRACE> (<S>)* 
+      {
+         start = true;
+         documentHandler.startPage(page, pseudo);
+      }
+     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )* 
+     <RBRACE> (<S>)*
+ } catch (ParseException e) {
+     if (errorHandler != null) {
+        LocatorImpl li = new LocatorImpl(this,
+                                         e.currentToken.next.beginLine,
+                                         e.currentToken.next.beginColumn-1);
+        reportError(li, e);
+        skipStatement();
+        // reportWarningSkipText(li, skipStatement());
+     } else {
+        skipStatement();
+     }
+ } finally {
+     if (start) {
+        documentHandler.endPage(page, pseudo);
+     }
+ }
+}
+
+String pseudo_page() :
+{ Token n; }
+{
+    ":" n=<IDENT> ( <S> )* { return convertIdent(n.image); }
+}
+
+void fontFace() :
+{
+    boolean start = false;
+}
+{
+ try {
+  <FONT_FACE_SYM> ( <S> )* 
+     <LBRACE> (<S>)* 
+      { start = true; documentHandler.startFontFace(); }
+     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )* 
+     <RBRACE> (<S>)*
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+ } finally {
+     if (start) {
+        documentHandler.endFontFace();
+     }
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void atRuleDeclaration() :
+{Token n;
+ String ret; 
+}
+{
+ n=<ATKEYWORD>
+    {
+       ret=skipStatement();
+       reportWarningSkipText(getLocator(), ret);
+       if ((ret != null) && (ret.charAt(0) == '@')) {
+           documentHandler.ignorableAtRule(ret);
+       }
+    }
+}
+
+void skipUnknownRule() :
+{ Token n;}
+{
+ ( n=<ATKEYWORD>
+| n=<CDO>
+| n=<CHARSET_SYM>
+| n=<COMMA>
+| n=<DASHMATCH>
+| n=<FONT_FACE_SYM>
+| n=<FUNCTION>
+| n=<IMPORTANT_SYM>
+| n=<IMPORT_SYM>
+| n=<INCLUDES>
+| n=<LBRACE>
+| n=<MEDIA_SYM>
+| n=<NONASCII>
+| n=<NUMBER>
+| n=<PAGE_SYM>
+| n=<PERCENTAGE>
+| n=<STRING>
+| n=<UNICODERANGE>
+| n=<URL>
+| n=";"
+| n="+"
+| n=">"
+| n="-"
+| n=<UNKNOWN>
+   ) {
+     String ret;
+     Locator loc = getLocator();
+     ret=skipStatement();
+     reportWarningSkipText(loc, ret);
+     if ((ret != null) && (n.image.charAt(0) == '@')) {
+        documentHandler.ignorableAtRule(ret);
+     }
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+char combinator() :
+{
+char connector = ' ';
+}
+{
+    "+" ( <S> )* { return '+'; }
+    | ">" ( <S> )* { return '>'; }
+| <S>  ( ( "+" { connector = '+'; } 
+           | ">" { connector = '>'; } )
+ ( <S> )* )? { return connector; }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String property() :
+{Token n; }
+{
+    n=<IDENT> ( <S> )* { return convertIdent(n.image); }
+}
+
+String variableName() :
+{Token n;}
+{
+    n=<VARIABLE> (<S>)* {return convertIdent(n.image.substring(1));}
+}
+
+String functionName() :
+{Token n;}
+{
+    n=<FUNCTION> ( <S> )* {return convertIdent(n.image.substring(0, n.image.length()-1));}
+}
+/**
+ * @exception ParseException exception during the parse
+ */
+void styleRule() :
+{
+    boolean start = false;
+    SelectorList l = null;
+    Token save;
+    Locator loc;
+}
+{
+ try {
+     l=selectorList() { save = token; } <LBRACE> (<S>)*
+     {
+        start = true;
+        documentHandler.startSelector(l);
+     }
+     ( includeDirective() | media() | extendDirective()| variable() | LOOKAHEAD(3) declarationOrNestedProperties() | styleRule())*
+     <RBRACE> (<S>)*
+ } catch (ThrowedParseException e) {
+     if (errorHandler != null) {
+        LocatorImpl li = new LocatorImpl(this,
+                                         e.e.currentToken.next.beginLine,
+                                         e.e.currentToken.next.beginColumn-1);
+        reportError(li, e.e);
+     }
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+ } catch (TokenMgrError e) {
+     reportWarningSkipText(getLocator(), skipStatement());
+ } finally {
+     if (start) {
+        documentHandler.endSelector(l);
+     }
+ }
+}
+
+SelectorList selectorList() :
+{
+    SelectorListImpl selectors = new SelectorListImpl();
+    Selector selector;
+}
+{
+ selector=selector() ( <COMMA> (<S>)* { selectors.addSelector(selector); } 
+                       selector=selector() )* 
+  { selectors.addSelector(selector); 
+    return selectors;
+  }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+Selector selector() :
+{   
+    Selector selector;
+    char    comb;
+}
+{
+ try {
+   selector=simple_selector(null, ' ') 
+       ( LOOKAHEAD(2) comb=combinator() 
+        selector=simple_selector(selector, comb) )* (<S>)*
+   {
+       return selector; 
+   }
+ } catch (ParseException e) {
+     /*
+     Token t = getToken(1);
+     StringBuffer s = new StringBuffer();
+     s.append(getToken(0).image);
+     while ((t.kind != COMMA) && (t.kind != SEMICOLON) 
+           && (t.kind != LBRACE) && (t.kind != EOF)) {
+        s.append(t.image);
+        getNextToken();
+        t = getToken(1);
+     }
+     reportWarningSkipText(getLocator(), s.toString());
+     */
+     Token t = getToken(1);
+     while ((t.kind != COMMA) && (t.kind != SEMICOLON) 
+           && (t.kind != LBRACE) && (t.kind != EOF)) {
+        getNextToken();
+        t = getToken(1);
+     }
+
+     throw new ThrowedParseException(e);
+  }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+Selector simple_selector(Selector selector, char comb) :
+{
+    SimpleSelector simple_current = null;
+    Condition cond = null;
+
+    pseudoElt = null;
+}
+{
+    ( simple_current=element_name() 
+       ( cond=hash(cond) | cond=_class(cond) 
+         | cond=attrib(cond) | cond=pseudo(cond) )*
+      | cond=hash(cond) ( cond=_class(cond) 
+                         | cond=attrib(cond) | cond=pseudo(cond) )*
+      | cond=_class(cond) ( cond=hash(cond) | cond=_class(cond) 
+                      | cond=attrib(cond) | cond=pseudo(cond) )*
+      | cond=pseudo(cond) ( cond=hash(cond) | cond=_class(cond) 
+                      | cond=attrib(cond) | cond=pseudo(cond) )*
+      | cond=attrib(cond) ( cond=hash(cond) | cond=_class(cond) 
+                           | cond=attrib(cond) | cond=pseudo(cond) )*
+      )
+       {
+           if (simple_current == null) {
+               simple_current = selectorFactory.createElementSelector(null, null);
+           }
+           if (cond != null) {
+               simple_current = selectorFactory.createConditionalSelector(simple_current, 
+                                                                   cond);
+           }
+           if (selector != null) {
+               switch (comb) {
+               case ' ':
+                   selector = selectorFactory.createDescendantSelector(selector, 
+                                                                      simple_current);
+                   break;
+               case '+':
+                   selector = 
+                       selectorFactory.createDirectAdjacentSelector((short) 1,
+                                                                    selector, 
+                                                                    simple_current);
+                   break;
+               case '>':
+                   selector = selectorFactory.createChildSelector(selector, 
+                                                                 simple_current);
+                   break;
+               default:
+                   throw new ParseException("invalid state. send a bug report");
+               }
+           } else {
+               selector= simple_current;
+           }
+           if (pseudoElt != null) {
+               selector = selectorFactory.createChildSelector(selector, 
+                             selectorFactory.createPseudoElementSelector(null, pseudoElt));
+           }
+           return selector;
+       }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+Condition _class(Condition pred) :
+{Token n;
+Condition c;
+}
+{
+  "." n=<IDENT>
+      { 
+         c = conditionFactory.createClassCondition(null, n.image);
+         if (pred == null) {
+             return c;
+         } else {
+             return conditionFactory.createAndCondition(pred, c);
+         }
+      }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+SimpleSelector element_name() :
+{Token n; }
+{
+    n=<IDENT> 
+    { 
+      return selectorFactory.createElementSelector(null, convertIdent(n.image)); 
+    }
+      | "*"
+    { return selectorFactory.createElementSelector(null, "*"); }
+      | "&"
+    { return selectorFactory.createElementSelector(null, "&"); }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+Condition attrib(Condition pred) :
+{
+    int cases = 0;
+    Token att = null;
+    Token val = null;
+    String attValue = null;
+}
+{
+  "[" ( <S> )* att=<IDENT> ( <S> )*
+      ( ( "="           { cases = 1; }
+         | <INCLUDES>  { cases = 2; }    
+         | <DASHMATCH> { cases = 3; } ) ( <S> )* 
+       ( val=<IDENT> { attValue = val.image; }
+         | val=<STRING> { attValue = convertStringIndex(val.image, 1, 
+                                                        val.image.length() -1);}
+       )
+       ( <S> )* )?
+  "]"
+  {
+      String name = convertIdent(att.image);
+      Condition c;
+      switch (cases) {
+         case 0:
+         c = conditionFactory.createAttributeCondition(name, null, false, null);
+         break;
+         case 1:
+         c = conditionFactory.createAttributeCondition(name, null, false, 
+                                                       attValue);
+         break;
+         case 2:
+         c = conditionFactory.createOneOfAttributeCondition(name, null, false, 
+                                                            attValue);
+         break;
+         case 3:
+         c = conditionFactory.createBeginHyphenAttributeCondition(name, null, 
+                                                                  false, 
+                                                                  attValue);
+         break;
+         default:
+         // never reached.
+         c = null;
+      }
+      if (pred == null) {
+         return c;
+      } else {
+         return conditionFactory.createAndCondition(pred, c);
+      }
+  }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+Condition pseudo(Condition pred) :
+{Token n;
+Token language;
+boolean isPseudoElement = false;
+}
+{
+    ":" (":"{isPseudoElement=true;})?( n=<IDENT>
+       {
+           String s = convertIdent(n.image);
+           if (isPseudoElement) {
+               if (pseudoElt != null) {
+                   throw new CSSParseException("duplicate pseudo element definition " 
+                                               + s, getLocator());
+               } else {
+                   pseudoElt = s;
+                   return pred;
+               }
+           } else {
+               Condition c = 
+               conditionFactory.createPseudoClassCondition(null, s);
+               if (pred == null) {
+                   return c;
+               } else {
+                   return conditionFactory.createAndCondition(pred, c);
+               }
+           }
+       }
+         | ( n=<FUNCTION> ( <S> )* language=<IDENT> ( <S> )* ")" 
+             {
+                 String f = convertIdent(n.image);
+                 if (f.equals("lang(")) {
+                     Condition d = 
+             conditionFactory.createLangCondition(convertIdent(language.image));
+                     if (pred == null) {
+                         return d;
+                     } else {
+                         return conditionFactory.createAndCondition(pred, d);
+                     }
+                 } else {
+                     throw new CSSParseException("invalid pseudo function name " 
+                                                 + f, getLocator());
+                 }
+             }
+             )
+         )
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+Condition hash(Condition pred) :
+{Token n; }
+{
+  n=<HASH>
+  {
+      Condition d = 
+         conditionFactory.createIdCondition(n.image.substring(1));
+      if (pred == null) {
+         return d;
+      } else {
+         return conditionFactory.createAndCondition(pred, d);
+      }
+  }
+}
+
+void variable() :
+{
+       String name;
+       LexicalUnit exp = null;
+       boolean guarded = false;
+       String raw;
+}
+{
+       try{
+               name = variableName()
+               ":" ( <S> )* exp=expr() ( guarded=guarded() )?(";"(<S>)*)+
+               //raw=skipStatementUntilSemiColon()
+               {
+                   documentHandler.variable(name, exp, guarded);
+               }
+       }catch (JumpException e) {
+           skipAfterExpression();
+       } catch (NumberFormatException e) {
+           if (errorHandler != null) {
+               errorHandler.error(new CSSParseException("Invalid number " 
+                                                 + e.getMessage(),
+                                                 getLocator(), 
+                                                 e));
+           }
+           reportWarningSkipText(getLocator(), skipAfterExpression());
+        } catch (ParseException e) {
+           if (errorHandler != null) {
+               if (e.currentToken != null) {
+                       LocatorImpl li = new LocatorImpl(this,
+                                                     e.currentToken.next.beginLine,
+                                                     e.currentToken.next.beginColumn-1);
+                       reportError(li, e);
+               } else {
+                       reportError(getLocator(), e);
+           }
+               skipAfterExpression();
+           } else {
+               skipAfterExpression();
+           }
+       }
+}
+
+void mixinDirective() :
+{
+    String name;
+    ArrayList<VariableNode> args = null;
+    String body;
+}
+{
+    <MIXIN_SYM>
+    (<S>)*
+    (name = property()
+    |(name = functionName() 
+      args = arglist()) <RPARAN> (<S>)*) <LBRACE> (<S>)*
+    {documentHandler.startMixinDirective(name, args);}
+    ( includeDirective() | media() | extendDirective()| variable() | LOOKAHEAD(3) declarationOrNestedProperties() | styleRule())*
+    //(includeDirective() | media() | LOOKAHEAD(declaration()) declaration()";"(<S>)* | styleRule())*
+    <RBRACE>(<S>)*
+    {documentHandler.endMixinDirective(name, args);}
+}
+
+ArrayList<VariableNode> arglist() :
+{
+    ArrayList<VariableNode> args = new ArrayList<VariableNode>();
+    VariableNode arg;
+}
+{
+    arg=mixinArg() ( <COMMA> (<S>)* { args.add(arg); } 
+        arg=mixinArg() )* 
+    { args.add(arg); 
+        return args;
+    }
+}
+
+VariableNode mixinArg() :
+{
+    String name;
+    LexicalUnit value = null;
+}
+{
+    name=variableName() (":" (<S>)* value=term(null) )?
+    {
+        VariableNode arg = new VariableNode(name, value, false);
+        return arg;
+    }
+}
+
+ArrayList<LexicalUnit> argValuelist() :
+{
+    ArrayList<LexicalUnit> args = new ArrayList<LexicalUnit>();
+    LexicalUnit argValue;
+}
+{
+    argValue= term(null) { args.add(argValue); }
+    ( <COMMA> (<S>)* argValue = term(null)
+      {args.add(argValue);}
+    )* 
+    {return args;}
+}
+
+void includeDirective() :
+{
+    String name;
+    ArrayList<LexicalUnit> args=null;
+}
+{
+    <INCLUDE_SYM>
+    (<S>)*
+    (name = property()
+         |(name = functionName() 
+           args = argValuelist()) <RPARAN>)(";"(<S>)*)+
+           {documentHandler.includeDirective(name, args);}
+}
+
+Node functionDirective() :
+{
+    String name;
+    String args = null;
+    String body;
+    int[] stops = {RPARAN};
+}
+{
+    (name=functionName() args = skipStatementUntilRightParan() <RPARAN>)
+    (<S>)*
+    body = skipStatement()   
+    {
+        return null;
+    }
+}
+
+Node returnDirective() :
+{
+    String raw;
+}
+{
+       raw = skipStatement()
+       {return null;}
+}
+
+JAVACODE
+void debugDirective(){
+}
+
+JAVACODE
+void warnDirective(){
+}
+
+Node forDirective() :
+{
+    String var;
+    String from;
+    String to;
+    boolean exclusive;
+    String body;
+    Token tok;
+}
+{
+    var = variableName()
+    {
+        int[] toThrough = {TO, THROUGH};
+        from = skipStatementUntil(toThrough);
+    }
+    (tok = <TO> {exclusive = true;}
+    | tok = <THROUGH> {exclusive = false;})
+    to = skipStatementUntilLeftBrace()
+    (<S>)*
+    body = skipStatement()
+    {return documentHandler.forDirective(var, from, to, exclusive, body);}
+}
+
+Node eachDirective() :
+{
+    String var;
+    String list;
+    String body;
+}  
+{
+    var = variableName()
+    <EACH_IN> (<S>)*
+    list = skipStatementUntilLeftBrace()
+    body = skipStatement()
+    {
+        return documentHandler.eachDirective(var, list, body);
+    }
+}
+
+Node whileDirective() :
+{
+    String condition;
+    String body;
+}
+{
+    condition = skipStatementUntilLeftBrace()
+    body = skipStatement()
+    {   return documentHandler.whileDirective(condition, body);}
+}
+
+JAVACODE
+Node ifDirective(){
+    return documentHandler.ifDirective();
+}
+
+JAVACODE
+void elseDirective(){
+   // throw new ParseException("Invalid CSS: @else must come after @if");
+}
+
+void extendDirective() : 
+{SelectorList list;}
+{
+    <EXTEND_SYM>
+    (<S>)*
+    list = selectorList()
+    (";"(<S>)*)+
+    {documentHandler.extendDirective(list);}
+}
+
+JAVACODE
+Node importDirective(){
+    return null;
+}
+
+JAVACODE
+Node charsetDirective(){
+    return null;
+}
+
+JAVACODE
+Node mozDocumentDirective(){
+    return null;
+}
+
+JAVACODE
+Node supportsDirective(){
+    return null;
+}
+
+
+void nestedProperties():
+{String name;
+LexicalUnit exp;}
+{
+    name=property()
+    ":" ( <S> )* 
+    <LBRACE> (<S>)*
+    {
+      documentHandler.startNestedProperties(name);
+    }
+    ( declaration() )? ( ";" ( <S> )* ( declaration() )? )*
+    <RBRACE>
+    {
+      documentHandler.endNestedProperties(name);
+    }
+    (<S>)*
+}
+/**
+ * @exception ParseException exception during the parse
+ */
+void declarationOrNestedProperties() :
+{ boolean important = false;
+  String name;
+  LexicalUnit exp;
+  Token save;
+}
+{
+ try {
+     name=property()
+     { save = token; }
+     ":" ( <S> )* 
+     (exp=expr() ( important=prio() )?
+     {
+         Token next = getToken(1);
+         if(next.kind == SEMICOLON || next.kind == RBRACE){
+             while(next.kind == SEMICOLON){
+                 skipStatement();
+                 next = getToken(1);
+             }
+             if(token.specialToken!=null){
+                 documentHandler.property(name, exp, important, token.specialToken.image);
+             }else{
+                 documentHandler.property(name, exp, important, null);
+             }
+         }
+     }
+     |<LBRACE> (<S>)*
+     {
+         documentHandler.startNestedProperties(name);
+     }
+     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )*
+     <RBRACE>(<S>)*
+     {
+         documentHandler.endNestedProperties(name);
+     }
+     )
+     
+ } catch (JumpException e) {
+     skipAfterExpression();
+     // reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (NumberFormatException e) {
+     if (errorHandler != null) {
+         errorHandler.error(new CSSParseException("Invalid number " 
+                                                  + e.getMessage(),
+                                                  getLocator(), 
+                                                  e));
+     }
+     reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (ParseException e) {
+     if (errorHandler != null) {
+         if (e.currentToken != null) {
+             LocatorImpl li = new LocatorImpl(this,
+                                              e.currentToken.next.beginLine,
+                                              e.currentToken.next.beginColumn-1);
+             reportError(li, e);
+         } else {
+             reportError(getLocator(), e);
+         }
+         skipAfterExpression();
+         /*
+         LocatorImpl loc = (LocatorImpl) getLocator();
+         loc.column--;
+         reportWarningSkipText(loc, skipAfterExpression());
+         */
+     } else {
+         skipAfterExpression();
+     }
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void declaration() :
+{ boolean important = false;
+  String name;
+  LexicalUnit exp;
+  Token save;
+}
+{
+ try {
+     name=property()
+     { save = token; }
+     ":" ( <S> )* exp=expr() ( important=prio() )?
+     {
+        documentHandler.property(name, exp, important);
+     }
+ } catch (JumpException e) {
+     skipAfterExpression();
+     // reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (NumberFormatException e) {
+     if (errorHandler != null) {
+        errorHandler.error(new CSSParseException("Invalid number " 
+                                                 + e.getMessage(),
+                                                 getLocator(), 
+                                                 e));
+     }
+     reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (ParseException e) {
+     if (errorHandler != null) {
+        if (e.currentToken != null) {
+            LocatorImpl li = new LocatorImpl(this,
+                                             e.currentToken.next.beginLine,
+                                             e.currentToken.next.beginColumn-1);
+            reportError(li, e);
+        } else {
+            reportError(getLocator(), e);
+        }
+        skipAfterExpression();
+        /*
+        LocatorImpl loc = (LocatorImpl) getLocator();
+        loc.column--;
+        reportWarningSkipText(loc, skipAfterExpression());
+        */
+     } else {
+        skipAfterExpression();
+     }
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+boolean prio() :
+{}
+{
+  <IMPORTANT_SYM> ( <S> )* { return true; }
+}
+
+boolean guarded() :
+{}
+{
+    <GUARDED_SYM> (<S>)* {return true;}
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl operator(LexicalUnitImpl prev) :
+{Token n;}
+{
+n="/" ( <S> )* { return LexicalUnitImpl.createSlash(n.beginLine, 
+                                                      n.beginColumn,
+                                                      prev); }
+| n="," ( <S> )* { return LexicalUnitImpl.createComma(n.beginLine, 
+                                                        n.beginColumn,
+                                                        prev); }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+LexicalUnit expr() :
+{
+    LexicalUnitImpl first, res;
+    char op;
+}
+{
+    first=term(null){ res = first; }
+    ( LOOKAHEAD(2) ( res=operator(res) )? res=term(res))*
+  { return first; }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+char unaryOperator() :
+{}
+{
+  "-" { return '-'; }
+| "+" { return '+'; }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl term(LexicalUnitImpl prev) :
+{ LexicalUnitImpl result = null;
+  Token n = null;
+  char op = ' ';
+  String varName;
+}
+{
+  (( ( ( op=unaryOperator() )?
+    (
+      n=<NUMBER>
+       { result = LexicalUnitImpl.createNumber(n.beginLine, n.beginColumn,
+                                               prev, number(op, n, 0)); }
+    | n=<PERCENTAGE>
+       { result = LexicalUnitImpl.createPercentage(n.beginLine, n.beginColumn,
+                                                   prev, number(op, n, 1)); }
+    | n=<PT>
+       { result = LexicalUnitImpl.createPT(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<CM>
+       { result = LexicalUnitImpl.createCM(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<MM>
+       { result = LexicalUnitImpl.createMM(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<PC>
+       { result = LexicalUnitImpl.createPC(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<IN>
+       { result = LexicalUnitImpl.createIN(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<PX>
+       { result = LexicalUnitImpl.createPX(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<EMS>
+       { result = LexicalUnitImpl.createEMS(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2)); }
+    | n=<EXS>
+       { result = LexicalUnitImpl.createEXS(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2)); }
+    | n=<DEG>
+       { result = LexicalUnitImpl.createDEG(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 3)); }
+    | n=<RAD>
+       { result = LexicalUnitImpl.createRAD(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 3)); }
+    | n=<GRAD>
+       { result = LexicalUnitImpl.createGRAD(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 3)); }
+    | n=<SECOND>
+       { result = LexicalUnitImpl.createS(n.beginLine, n.beginColumn,
+                                          prev, number(op, n, 1)); }
+    | n=<MS>
+       { result = LexicalUnitImpl.createMS(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<HZ>
+       { result = LexicalUnitImpl.createHZ(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<KHZ>
+       { result = LexicalUnitImpl.createKHZ(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 3)); }
+    | n=<DIMEN>
+       {
+           String s = n.image;
+           int i = 0;
+           while (i < s.length() 
+                  && (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
+               i++;
+           }
+           result = LexicalUnitImpl.createDimen(n.beginLine, n.beginColumn, prev, 
+                                                Float.valueOf(s.substring(0, i)).floatValue(),
+                                                s.substring(i));
+       }
+    | result=function(op, prev) ) )
+  | ( n=<STRING>
+       { result =
+         LexicalUnitImpl.createString(n.beginLine, n.beginColumn, prev,
+                                      convertStringIndex(n.image, 1, 
+                                                         n.image.length() -1));}
+       | n=<IDENT> 
+      { String s = convertIdent(n.image);
+       if ("inherit".equals(s)) {
+           result = LexicalUnitImpl.createInherit(n.beginLine, n.beginColumn,
+                                              prev);
+       } else {
+           result = LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+                                              prev, convertIdent(n.image));
+       }
+
+         /* /
+         Auto correction code used in the CSS Validator but must not
+          be used by a conformant CSS2 parser.
+        * Common error :
+        * H1 {
+        *   color : black
+        *   background : white
+        * }
+        *
+       Token t = getToken(1);
+       Token semicolon = new Token();
+       semicolon.kind = SEMICOLON;
+       semicolon.image = ";";
+       if (t.kind == COLON) {
+           // @@SEEME. (generate a warning?)
+           // @@SEEME if expression is a single ident, 
+              generate an error ?
+           rejectToken(semicolon);
+           
+           result = prev;
+       }
+       / */
+    }
+       | result=hexcolor(prev) 
+        | result=url(prev)
+       | result=unicode(prev)
+         ) ) ( <S> )*
+        | varName = variableName()
+         {result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
+                 prev, varName);})
+      {
+         return result;
+      }
+}
+
+/**
+ * Handle all CSS2 functions.
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl function(char operator, LexicalUnitImpl prev) :
+{Token n;
+ LexicalUnit params = null;
+}
+{
+    n=<FUNCTION> ( <S> )*  
+    {
+        String fname = convertIdent(n.image);
+        if("alpha(".equals(fname)){
+            String body = skipStatementUntilSemiColon();
+            return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+                 null, "alpha("+body);
+        }
+    }
+    ( params=expr() )? ")"
+    {
+        if (operator != ' ') {
+           throw new CSSParseException("invalid operator before a function.", 
+                                       getLocator());
+       }
+       String f = convertIdent(n.image);
+        LexicalUnitImpl l = (LexicalUnitImpl) params;
+       boolean loop = true;
+       if ("rgb(".equals(f)) {
+           // this is a RGB declaration (e.g. rgb(255, 50%, 0) )
+           int i = 0;
+           while (loop && l != null && i < 5) {
+               switch (i) {
+                   case 0:
+                   case 2:
+                   case 4:
+                       if ((l.getLexicalUnitType() != LexicalUnit.SAC_INTEGER)
+                           && (l.getLexicalUnitType() != LexicalUnit.SAC_PERCENTAGE)) {
+                           loop = false;
+                       }
+                       break;
+                   case 1:
+                   case 3:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                           loop = false;
+                       }
+                       break;
+                   default:
+                        throw new ParseException("implementation error");
+               }
+               if (loop) {
+                   l = (LexicalUnitImpl) l.getNextLexicalUnit();
+                   i ++;
+               }
+           }
+           if ((i == 5) && loop && (l == null)) {
+               return LexicalUnitImpl.createRGBColor(n.beginLine,
+                                                     n.beginColumn,
+                                                     prev, params);
+           } else {
+               if (errorHandler != null) {
+                   String errorText;
+                   Locator loc;
+                   if (i < 5) {
+                       if (params == null) {
+                           loc = new LocatorImpl(this, n.beginLine,
+                                                 n.beginColumn-1);
+                           errorText = "not enough parameters.";
+                       } else if (l == null) {
+                           loc = new LocatorImpl(this, n.beginLine,
+                                                 n.beginColumn-1);
+                           errorText = "not enough parameters: " 
+                               + params.toString();
+                       } else {
+                           loc = new LocatorImpl(this, l.getLineNumber(),
+                                                 l.getColumnNumber());
+                           errorText = "invalid parameter: "
+                               + l.toString();
+                       }
+                   } else {
+                       loc = new LocatorImpl(this, l.getLineNumber(),
+                                             l.getColumnNumber());
+                       errorText = "too many parameters: "
+                           + l.toString();
+                   }
+                   errorHandler.error(new CSSParseException(errorText, loc));
+               }
+
+               throw new JumpException();
+           }
+       } else if ("counter".equals(f)) {
+           int i = 0;
+           while (loop && l != null && i < 3) {
+               switch (i) {
+                   case 0:
+                   case 2:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+                           loop = false;
+                       }
+                       break;
+                   case 1:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                           loop = false;
+                       }
+                       break;
+                   default:
+                        throw new ParseException("implementation error");
+               }
+               l = (LexicalUnitImpl) l.getNextLexicalUnit();
+               i ++;
+           }
+           if (((i == 1) || (i == 3)) && loop && (l == null)) {
+               return LexicalUnitImpl.createCounter(n.beginLine, n.beginColumn,
+                                                    prev, params);
+           }
+
+       } else if ("counters(".equals(f)) {
+           
+           int i = 0;
+           while (loop && l != null && i < 5) {
+               switch (i) {
+                   case 0:
+                   case 4:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+                           loop = false;
+                       }
+                       break;
+                   case 2:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_STRING_VALUE) {
+                           loop = false;
+                       }
+                       break;
+                   case 1:
+                   case 3:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                           loop = false;
+                       }
+                       break;
+                   default:
+                        throw new ParseException("implementation error");
+               }
+               l = (LexicalUnitImpl) l.getNextLexicalUnit();
+               i ++;
+           }
+           if (((i == 3) || (i == 5)) && loop && (l == null)) {
+               return LexicalUnitImpl.createCounters(n.beginLine, n.beginColumn,
+                                                     prev, params);
+           }
+       } else if ("attr(".equals(f)) {
+           if ((l != null)
+               && (l.getNextLexicalUnit() == null)
+               && (l.getLexicalUnitType() == LexicalUnit.SAC_IDENT)) {
+                return LexicalUnitImpl.createAttr(l.getLineNumber(), 
+                                                 l.getColumnNumber(),
+                                                 prev, l.getStringValue());
+           }
+       } else if ("rect(".equals(f)) {
+           int i = 0;
+           while (loop && l != null && i < 7) {
+               switch (i) {
+                   case 0:
+                   case 2:
+                   case 4:
+                   case 6:
+                       switch (l.getLexicalUnitType()) {
+                       case LexicalUnit.SAC_INTEGER:
+                           if (l.getIntegerValue() != 0) {
+                               loop = false;
+                           }
+                           break;
+                       case LexicalUnit.SAC_IDENT:
+                           if (!l.getStringValue().equals("auto")) {
+                               loop = false;
+                           }
+                           break;
+                       case LexicalUnit.SAC_EM:
+                       case LexicalUnit.SAC_EX:
+                       case LexicalUnit.SAC_PIXEL:
+                       case LexicalUnit.SAC_CENTIMETER:
+                       case LexicalUnit.SAC_MILLIMETER:
+                       case LexicalUnit.SAC_INCH:
+                       case LexicalUnit.SAC_POINT:
+                       case LexicalUnit.SAC_PICA:
+                           // nothing
+                           break;
+                       default:
+                           loop = false;
+                       }
+                       break;
+                   case 1:
+                   case 3:
+                   case 5:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                           loop = false;
+                       }
+                       break;
+                   default:
+                        throw new ParseException("implementation error");
+               }
+               l = (LexicalUnitImpl) l.getNextLexicalUnit();
+               i ++;
+           }
+           if ((i == 7) && loop && (l == null)) {
+               return LexicalUnitImpl.createRect(n.beginLine, n.beginColumn,
+                                                 prev, params);
+           }
+       } 
+       return LexicalUnitImpl.createFunction(n.beginLine, n.beginColumn, prev, 
+                                             f.substring(0, 
+                                                       f.length() -1),
+                                             params);
+    }
+}
+
+LexicalUnitImpl unicode(LexicalUnitImpl prev) :
+{ Token n;
+}
+{
+  n=<UNICODERANGE>
+ {
+     LexicalUnitImpl params = null;
+     String s = n.image.substring(2);
+     int index = s.indexOf('-');
+     if (index == -1) {
+        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                               params, Integer.parseInt(s, 16));
+     } else {
+        String s1 = s.substring(0, index);
+        String s2 = s.substring(index);
+
+        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                               params, Integer.parseInt(s1, 16));
+        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                               params, Integer.parseInt(s2, 16));
+     }
+
+     return LexicalUnitImpl.createUnicodeRange(n.beginLine, n.beginColumn,
+                                              prev, params);
+ }
+}
+
+LexicalUnitImpl url(LexicalUnitImpl prev) :
+{ Token n;
+}
+{
+  n=<URL>
+ {
+   String urlname = n.image.substring(4, n.image.length()-1).trim();
+   if (urlname.charAt(0) == '"'
+       || urlname.charAt(0) == '\'') {
+       urlname = urlname.substring(1, urlname.length()-1);
+   }
+   return LexicalUnitImpl.createURL(n.beginLine, n.beginColumn, prev, urlname); 
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl hexcolor(LexicalUnitImpl prev) :
+{Token n; 
+}
+{
+ n=<HASH>
+ { 
+     int r;
+     LexicalUnitImpl first, params = null;
+     String s = n.image.substring(1);
+     
+     if(s.length()!=3 && s.length()!=6) {
+        first = null;
+        throw new CSSParseException("invalid hexadecimal notation for RGB: " + s, 
+                                    getLocator());
+     }
+     return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+             prev, n.image);
+ }
+}
+
+JAVACODE
+float number(char operator, Token n, int lengthUnit) {
+    String image  = n.image;
+    float f = 0;
+
+    if (lengthUnit != 0) {
+       image = image.substring(0, image.length() - lengthUnit);
+    }
+    f = Float.valueOf(image).floatValue();
+    return (operator == '-')? -f: f;
+}
+
+JAVACODE
+String skipStatementUntilSemiColon(){
+    int[] semicolon = {SEMICOLON};
+    return skipStatementUntil(semicolon);
+}
+
+JAVACODE
+String skipStatementUntilLeftBrace(){
+    int[] lBrace = {LBRACE};
+    return skipStatementUntil(lBrace);
+}
+
+JAVACODE
+String skipStatementUntilRightParan(){
+    int[] rParan = {RPARAN};
+    return skipStatementUntil(rParan);
+}
+
+JAVACODE
+String skipStatementUntil(int[] symbols){
+    StringBuffer s = new StringBuffer();
+    boolean stop = false;
+    Token tok;
+    while(!stop){
+        tok = getToken(1);
+        if(tok.kind == EOF) {
+            return null;
+        }
+        for(int sym : symbols){
+            if(tok.kind == sym){
+                stop = true;
+                break;
+            }
+        }
+        if(!stop){
+            if (tok.image != null) {
+                s.append(tok.image);
+            }
+            getNextToken();
+        }
+    }
+    return s.toString().trim();
+}
+
+JAVACODE
+String skipStatement() {
+    StringBuffer s = new StringBuffer();
+    Token tok = getToken(0);
+    if (tok.image != null) {
+        s.append(tok.image);    
+    }
+    while (true) {
+        tok = getToken(1);
+        if (tok.kind == EOF) {
+            return null;
+        } 
+        s.append(tok.image);
+        if (tok.kind == LBRACE) {
+            getNextToken();
+            s.append(skip_to_matching_brace());
+            getNextToken();
+            tok = getToken(1);
+            break;
+        } else if (tok.kind == RBRACE) {
+            getNextToken();
+            tok = getToken(1);
+            break;
+        } else if (tok.kind == SEMICOLON) {
+            getNextToken();
+            tok = getToken(1);
+            break;
+        }
+        getNextToken();
+    }
+    
+    // skip white space
+    while (true) {
+        if (tok.kind != S) {
+            break;
+        }
+        tok = getNextToken();
+        tok = getToken(1);
+    }
+
+    return s.toString().trim();
+}
+
+JAVACODE
+String skip_to_matching_brace() {
+    StringBuffer s = new StringBuffer();
+    Token tok;
+    int nesting = 1;
+    while (true) {
+        tok = getToken(1);
+        if (tok.kind == EOF) {
+            break;
+        }
+        s.append(tok.image);
+        if (tok.kind == LBRACE) {
+            nesting++;
+        } else if (tok.kind == RBRACE) {
+            nesting--;
+            if (nesting == 0) {
+                break;
+            }
+        }
+        getNextToken();
+    }
+    return s.toString();
+}
+
+/*
+ * Here I handle all CSS2 unicode character stuffs.
+ * I convert all \XXXXXX character into a single character.
+ * Don't forget that the parser has recognize the token before.
+ * (So IDENT won't contain newline and stuffs like this).
+ */
+JAVACODE
+String convertStringIndex(String s, int start, int len) {
+    StringBuffer buf = new StringBuffer(len);
+    int index = start;
+
+    while (index < len) {
+       char c = s.charAt(index);
+       if (c == '\\') {
+           if (++index < len) {
+               c = s.charAt(index);
+               switch (c) {
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+               case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+               case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+                   int numValue = Character.digit(c, 16);
+                   int count = 0;
+                   int p = 16;
+
+                   while (index + 1 < len && count < 6) {
+                       c = s.charAt(index+1);
+
+                       if (Character.digit(c, 16) != -1) {
+                           numValue = (numValue * 16) + Character.digit(c, 16);
+                           p *= 16;
+                           index++;
+                       } else {
+                           if (c == ' ') {
+                               // skip the latest white space
+                               index++;
+                           }
+                           break;
+                       }
+                   }
+                   buf.append((char) numValue);
+                   break;
+               case '\n':
+               case '\f':
+                   break;
+               case '\r':
+                   if (index + 1 < len) {
+                       if (s.charAt(index + 1) == '\n') {
+                           index ++;
+                       }
+                   }
+                   break;
+               default:
+                   buf.append(c);
+               }
+           } else {
+               throw new CSSParseException("invalid string " + s, getLocator());
+           }
+       } else {
+           buf.append(c);
+       }
+       index++;
+    }
+
+    return buf.toString();
+}
+
+JAVACODE
+String convertIdent(String s) {
+    return convertStringIndex(s, 0, s.length());
+}
+
+JAVACODE
+String convertString(String s) {
+    return convertStringIndex(s, 0, s.length());
+}
+
+/*
+ * @@HACK
+ * I can't insert a token into the tokens flow.
+ * It's jj_consume_token implementation dependant! :-(
+ */
+JAVACODE
+void rejectToken(Token t) {
+    Token fakeToken = new Token();
+    t.next = token;
+    fakeToken.next = t;
+    token = fakeToken;
+}
+
+/**
+ * skip after an expression
+ */
+JAVACODE
+String skipAfterExpression() {
+    Token t = getToken(1);
+    StringBuffer s = new StringBuffer();
+    s.append(getToken(0).image);
+    
+    while ((t.kind != RBRACE) && (t.kind != SEMICOLON) && (t.kind != EOF)) {
+       s.append(t.image);
+       getNextToken();
+       t = getToken(1);
+    }
+    
+    return s.toString();
+}
+
+/**
+ * The following functions are useful for a DOM CSS implementation only and are
+ * not part of the general CSS2 parser.
+ */
+
+void _parseRule() :
+{String ret = null;
+}
+{
+       ( <S> )*
+          ( importDeclaration() | styleRule() | media() | page() 
+            | fontFace() | ret=skipStatement() 
+               {
+                   if ((ret == null) || (ret.length() == 0)) {
+                       return; 
+                   }
+                   if (ret.charAt(0) == '@') {
+                       documentHandler.ignorableAtRule(ret);
+                   } else {
+                       throw new CSSParseException("unrecognize rule: " + ret,
+                                                   getLocator());
+                   }
+               }
+         )
+}
+
+void _parseImportRule() :
+{
+}
+{
+    ( <S> )* importDeclaration()
+}
+
+void _parseMediaRule() :
+{
+}
+{
+    ( <S> )* media()
+}
+
+void _parseDeclarationBlock() :
+{
+}
+{
+    ( <S> )* 
+       ( declaration() )? ( ";" ( <S> )* ( declaration() )? )* 
+ }
+
+SelectorList _parseSelectors() :
+{ SelectorList p = null; 
+}
+{
+    try {
+       ( <S> )* p = selectorList()
+       { return p; }
+    } catch (ThrowedParseException e) {
+       throw (ParseException) e.e.fillInStackTrace();
+    }
+}
+
+/*
+ * Local Variables:
+ * compile-command: javacc Parser.jj & javac Parser.java
+ * End:
+ */
diff --git a/sass/src/com/vaadin/sass/parser/ParserConstants.java b/sass/src/com/vaadin/sass/parser/ParserConstants.java
new file mode 100644 (file)
index 0000000..47ea524
--- /dev/null
@@ -0,0 +1,323 @@
+/* Generated By:JavaCC: Do not edit this line. ParserConstants.java */
+package com.vaadin.sass.parser;
+
+
+/**
+ * Token literal values and constants.
+ * Generated by org.javacc.parser.OtherFilesGen#start()
+ */
+public interface ParserConstants {
+
+  /** End of File. */
+  int EOF = 0;
+  /** RegularExpression Id. */
+  int S = 1;
+  /** RegularExpression Id. */
+  int INTERPOLATION = 4;
+  /** RegularExpression Id. */
+  int FORMAL_COMMENT = 10;
+  /** RegularExpression Id. */
+  int MULTI_LINE_COMMENT = 11;
+  /** RegularExpression Id. */
+  int CDO = 13;
+  /** RegularExpression Id. */
+  int CDC = 14;
+  /** RegularExpression Id. */
+  int LBRACE = 15;
+  /** RegularExpression Id. */
+  int RBRACE = 16;
+  /** RegularExpression Id. */
+  int DASHMATCH = 17;
+  /** RegularExpression Id. */
+  int INCLUDES = 18;
+  /** RegularExpression Id. */
+  int EQ = 19;
+  /** RegularExpression Id. */
+  int PLUS = 20;
+  /** RegularExpression Id. */
+  int MINUS = 21;
+  /** RegularExpression Id. */
+  int COMMA = 22;
+  /** RegularExpression Id. */
+  int SEMICOLON = 23;
+  /** RegularExpression Id. */
+  int PRECEDES = 24;
+  /** RegularExpression Id. */
+  int DIV = 25;
+  /** RegularExpression Id. */
+  int LBRACKET = 26;
+  /** RegularExpression Id. */
+  int RBRACKET = 27;
+  /** RegularExpression Id. */
+  int ANY = 28;
+  /** RegularExpression Id. */
+  int PARENT = 29;
+  /** RegularExpression Id. */
+  int DOT = 30;
+  /** RegularExpression Id. */
+  int LPARAN = 31;
+  /** RegularExpression Id. */
+  int RPARAN = 32;
+  /** RegularExpression Id. */
+  int COLON = 33;
+  /** RegularExpression Id. */
+  int NONASCII = 34;
+  /** RegularExpression Id. */
+  int H = 35;
+  /** RegularExpression Id. */
+  int UNICODE = 36;
+  /** RegularExpression Id. */
+  int ESCAPE = 37;
+  /** RegularExpression Id. */
+  int NMSTART = 38;
+  /** RegularExpression Id. */
+  int NMCHAR = 39;
+  /** RegularExpression Id. */
+  int STRINGCHAR = 40;
+  /** RegularExpression Id. */
+  int D = 41;
+  /** RegularExpression Id. */
+  int NAME = 42;
+  /** RegularExpression Id. */
+  int TO = 43;
+  /** RegularExpression Id. */
+  int THROUGH = 44;
+  /** RegularExpression Id. */
+  int EACH_IN = 45;
+  /** RegularExpression Id. */
+  int MIXIN_SYM = 46;
+  /** RegularExpression Id. */
+  int INCLUDE_SYM = 47;
+  /** RegularExpression Id. */
+  int FUNCTION_SYM = 48;
+  /** RegularExpression Id. */
+  int RETURN_SYM = 49;
+  /** RegularExpression Id. */
+  int DEBUG_SYM = 50;
+  /** RegularExpression Id. */
+  int WARN_SYM = 51;
+  /** RegularExpression Id. */
+  int FOR_SYM = 52;
+  /** RegularExpression Id. */
+  int EACH_SYM = 53;
+  /** RegularExpression Id. */
+  int WHILE_SYM = 54;
+  /** RegularExpression Id. */
+  int IF_SYM = 55;
+  /** RegularExpression Id. */
+  int ELSE_SYM = 56;
+  /** RegularExpression Id. */
+  int EXTEND_SYM = 57;
+  /** RegularExpression Id. */
+  int MOZ_DOCUMENT_SYM = 58;
+  /** RegularExpression Id. */
+  int SUPPORTS_SYM = 59;
+  /** RegularExpression Id. */
+  int GUARDED_SYM = 60;
+  /** RegularExpression Id. */
+  int STRING = 61;
+  /** RegularExpression Id. */
+  int IDENT = 62;
+  /** RegularExpression Id. */
+  int NUMBER = 63;
+  /** RegularExpression Id. */
+  int _URL = 64;
+  /** RegularExpression Id. */
+  int URL = 65;
+  /** RegularExpression Id. */
+  int VARIABLE = 66;
+  /** RegularExpression Id. */
+  int PERCENTAGE = 67;
+  /** RegularExpression Id. */
+  int PT = 68;
+  /** RegularExpression Id. */
+  int MM = 69;
+  /** RegularExpression Id. */
+  int CM = 70;
+  /** RegularExpression Id. */
+  int PC = 71;
+  /** RegularExpression Id. */
+  int IN = 72;
+  /** RegularExpression Id. */
+  int PX = 73;
+  /** RegularExpression Id. */
+  int EMS = 74;
+  /** RegularExpression Id. */
+  int EXS = 75;
+  /** RegularExpression Id. */
+  int DEG = 76;
+  /** RegularExpression Id. */
+  int RAD = 77;
+  /** RegularExpression Id. */
+  int GRAD = 78;
+  /** RegularExpression Id. */
+  int MS = 79;
+  /** RegularExpression Id. */
+  int SECOND = 80;
+  /** RegularExpression Id. */
+  int HZ = 81;
+  /** RegularExpression Id. */
+  int KHZ = 82;
+  /** RegularExpression Id. */
+  int DIMEN = 83;
+  /** RegularExpression Id. */
+  int HASH = 84;
+  /** RegularExpression Id. */
+  int IMPORT_SYM = 85;
+  /** RegularExpression Id. */
+  int MEDIA_SYM = 86;
+  /** RegularExpression Id. */
+  int CHARSET_SYM = 87;
+  /** RegularExpression Id. */
+  int PAGE_SYM = 88;
+  /** RegularExpression Id. */
+  int FONT_FACE_SYM = 89;
+  /** RegularExpression Id. */
+  int ATKEYWORD = 90;
+  /** RegularExpression Id. */
+  int IMPORTANT_SYM = 91;
+  /** RegularExpression Id. */
+  int RANGE0 = 92;
+  /** RegularExpression Id. */
+  int RANGE1 = 93;
+  /** RegularExpression Id. */
+  int RANGE2 = 94;
+  /** RegularExpression Id. */
+  int RANGE3 = 95;
+  /** RegularExpression Id. */
+  int RANGE4 = 96;
+  /** RegularExpression Id. */
+  int RANGE5 = 97;
+  /** RegularExpression Id. */
+  int RANGE6 = 98;
+  /** RegularExpression Id. */
+  int RANGE = 99;
+  /** RegularExpression Id. */
+  int UNI = 100;
+  /** RegularExpression Id. */
+  int UNICODERANGE = 101;
+  /** RegularExpression Id. */
+  int FUNCTION = 102;
+  /** RegularExpression Id. */
+  int UNKNOWN = 103;
+
+  /** Lexical state. */
+  int DEFAULT = 0;
+  /** Lexical state. */
+  int IN_INTERPOLATION = 1;
+  /** Lexical state. */
+  int IN_SINGLE_LINE_COMMENT = 2;
+  /** Lexical state. */
+  int IN_FORMAL_COMMENT = 3;
+  /** Lexical state. */
+  int IN_MULTI_LINE_COMMENT = 4;
+
+  /** Literal token values. */
+  String[] tokenImage = {
+    "<EOF>",
+    "<S>",
+    "\"#{\"",
+    "<token of kind 3>",
+    "\"}\"",
+    "\"//\"",
+    "<token of kind 6>",
+    "<token of kind 7>",
+    "<token of kind 8>",
+    "\"/*\"",
+    "\"*/\"",
+    "\"*/\"",
+    "<token of kind 12>",
+    "\"<!--\"",
+    "\"-->\"",
+    "\"{\"",
+    "\"}\"",
+    "\"|=\"",
+    "\"~=\"",
+    "\"=\"",
+    "\"+\"",
+    "\"-\"",
+    "\",\"",
+    "\";\"",
+    "\">\"",
+    "\"/\"",
+    "\"[\"",
+    "\"]\"",
+    "\"*\"",
+    "\"&\"",
+    "\".\"",
+    "\"(\"",
+    "\")\"",
+    "\":\"",
+    "<NONASCII>",
+    "<H>",
+    "<UNICODE>",
+    "<ESCAPE>",
+    "<NMSTART>",
+    "<NMCHAR>",
+    "<STRINGCHAR>",
+    "<D>",
+    "<NAME>",
+    "\"to\"",
+    "\"through\"",
+    "\"in\"",
+    "\"@mixin\"",
+    "\"@include\"",
+    "\"@function\"",
+    "\"@return\"",
+    "\"@debug\"",
+    "\"@warn\"",
+    "\"@for\"",
+    "\"@each\"",
+    "\"@while\"",
+    "\"@if\"",
+    "\"@else\"",
+    "\"@extend\"",
+    "\"@-moz-document\"",
+    "\"@supports\"",
+    "<GUARDED_SYM>",
+    "<STRING>",
+    "<IDENT>",
+    "<NUMBER>",
+    "<_URL>",
+    "<URL>",
+    "<VARIABLE>",
+    "<PERCENTAGE>",
+    "<PT>",
+    "<MM>",
+    "<CM>",
+    "<PC>",
+    "<IN>",
+    "<PX>",
+    "<EMS>",
+    "<EXS>",
+    "<DEG>",
+    "<RAD>",
+    "<GRAD>",
+    "<MS>",
+    "<SECOND>",
+    "<HZ>",
+    "<KHZ>",
+    "<DIMEN>",
+    "<HASH>",
+    "\"@import\"",
+    "\"@media\"",
+    "\"@charset\"",
+    "\"@page\"",
+    "\"@font-face\"",
+    "<ATKEYWORD>",
+    "<IMPORTANT_SYM>",
+    "<RANGE0>",
+    "<RANGE1>",
+    "<RANGE2>",
+    "<RANGE3>",
+    "<RANGE4>",
+    "<RANGE5>",
+    "<RANGE6>",
+    "<RANGE>",
+    "<UNI>",
+    "<UNICODERANGE>",
+    "<FUNCTION>",
+    "<UNKNOWN>",
+  };
+
+}
diff --git a/sass/src/com/vaadin/sass/parser/ParserTokenManager.java b/sass/src/com/vaadin/sass/parser/ParserTokenManager.java
new file mode 100644 (file)
index 0000000..b527a99
--- /dev/null
@@ -0,0 +1,4286 @@
+/* Generated By:JavaCC: Do not edit this line. ParserTokenManager.java */
+package com.vaadin.sass.parser;
+import java.io.*;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Map;
+import org.w3c.css.sac.ConditionFactory;
+import org.w3c.css.sac.Condition;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SimpleSelector;
+import org.w3c.css.sac.DocumentHandler;
+import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.ErrorHandler;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
+import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.LexicalUnit;
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
+import org.w3c.flute.util.Encoding;
+import com.vaadin.sass.handler.*;
+import com.vaadin.sass.tree.*;
+
+/** Token Manager. */
+public class ParserTokenManager implements ParserConstants
+{
+
+  /** Debug output. */
+  public  java.io.PrintStream debugStream = System.out;
+  /** Set debug output. */
+  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
+{
+   switch (pos)
+   {
+      case 0:
+         if ((active0 & 0x380000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            return 375;
+         }
+         if ((active0 & 0x204000L) != 0L)
+            return 134;
+         if ((active0 & 0x40000000L) != 0L)
+            return 376;
+         if ((active0 & 0x2000220L) != 0L)
+            return 3;
+         if ((active0 & 0xfffc00000000000L) != 0L || (active1 & 0x3e00000L) != 0L)
+            return 72;
+         if ((active0 & 0x4L) != 0L)
+            return 377;
+         return -1;
+      case 1:
+         if ((active0 & 0x400000000000000L) != 0L)
+            return 73;
+         if ((active0 & 0xbffc00000000000L) != 0L || (active1 & 0x3e00000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 1;
+            return 378;
+         }
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 1;
+            return 375;
+         }
+         if ((active0 & 0x200L) != 0L)
+            return 1;
+         if ((active0 & 0x280000000000L) != 0L)
+            return 375;
+         return -1;
+      case 2:
+         if ((active0 & 0x80000000000000L) != 0L)
+            return 378;
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 2;
+            return 375;
+         }
+         if ((active0 & 0xf7fc00000000000L) != 0L || (active1 & 0x3e00000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 2;
+            return 378;
+         }
+         return -1;
+      case 3:
+         if ((active0 & 0x10000000000000L) != 0L)
+            return 378;
+         if ((active0 & 0xf6fc00000000000L) != 0L || (active1 & 0x3e00000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 3;
+            return 378;
+         }
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 3;
+            return 375;
+         }
+         return -1;
+      case 4:
+         if ((active0 & 0xe47c00000000000L) != 0L || (active1 & 0x2e00000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 4;
+            return 378;
+         }
+         if ((active0 & 0x128000000000000L) != 0L || (active1 & 0x1000000L) != 0L)
+            return 378;
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 4;
+            return 375;
+         }
+         return -1;
+      case 5:
+         if ((active0 & 0x100000000000L) != 0L)
+         {
+            jjmatchedKind = 62;
+            jjmatchedPos = 5;
+            return 375;
+         }
+         if ((active0 & 0x44400000000000L) != 0L || (active1 & 0x400000L) != 0L)
+            return 378;
+         if ((active0 & 0xe03800000000000L) != 0L || (active1 & 0x2a00000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 5;
+            return 378;
+         }
+         return -1;
+      case 6:
+         if ((active0 & 0x202000000000000L) != 0L || (active1 & 0x200000L) != 0L)
+            return 378;
+         if ((active0 & 0xc01800000000000L) != 0L || (active1 & 0x2800000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 6;
+            return 378;
+         }
+         if ((active0 & 0x100000000000L) != 0L)
+            return 375;
+         return -1;
+      case 7:
+         if ((active0 & 0xc01000000000000L) != 0L || (active1 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 7;
+            return 378;
+         }
+         if ((active0 & 0x800000000000L) != 0L || (active1 & 0x800000L) != 0L)
+            return 378;
+         return -1;
+      case 8:
+         if ((active0 & 0x801000000000000L) != 0L)
+            return 378;
+         if ((active0 & 0x400000000000000L) != 0L || (active1 & 0x2000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 8;
+            return 378;
+         }
+         return -1;
+      case 9:
+         if ((active1 & 0x2000000L) != 0L)
+            return 378;
+         if ((active0 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 9;
+            return 378;
+         }
+         return -1;
+      case 10:
+         if ((active0 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 10;
+            return 378;
+         }
+         return -1;
+      case 11:
+         if ((active0 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 11;
+            return 378;
+         }
+         return -1;
+      case 12:
+         if ((active0 & 0x400000000000000L) != 0L)
+         {
+            jjmatchedKind = 90;
+            jjmatchedPos = 12;
+            return 378;
+         }
+         return -1;
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_0(int pos, long active0, long active1)
+{
+   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
+}
+private int jjStopAtPos(int pos, int kind)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   return pos + 1;
+}
+private int jjMoveStringLiteralDfa0_0()
+{
+   switch(curChar)
+   {
+      case 35:
+         return jjMoveStringLiteralDfa1_0(0x4L, 0x0L);
+      case 38:
+         return jjStopAtPos(0, 29);
+      case 40:
+         return jjStopAtPos(0, 31);
+      case 41:
+         return jjStopAtPos(0, 32);
+      case 42:
+         return jjStopAtPos(0, 28);
+      case 43:
+         return jjStopAtPos(0, 20);
+      case 44:
+         return jjStopAtPos(0, 22);
+      case 45:
+         jjmatchedKind = 21;
+         return jjMoveStringLiteralDfa1_0(0x4000L, 0x0L);
+      case 46:
+         return jjStartNfaWithStates_0(0, 30, 376);
+      case 47:
+         jjmatchedKind = 25;
+         return jjMoveStringLiteralDfa1_0(0x220L, 0x0L);
+      case 58:
+         return jjStopAtPos(0, 33);
+      case 59:
+         return jjStopAtPos(0, 23);
+      case 60:
+         return jjMoveStringLiteralDfa1_0(0x2000L, 0x0L);
+      case 61:
+         return jjStopAtPos(0, 19);
+      case 62:
+         return jjStopAtPos(0, 24);
+      case 64:
+         return jjMoveStringLiteralDfa1_0(0xfffc00000000000L, 0x3e00000L);
+      case 91:
+         return jjStopAtPos(0, 26);
+      case 93:
+         return jjStopAtPos(0, 27);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa1_0(0x200000000000L, 0x0L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa1_0(0x180000000000L, 0x0L);
+      case 123:
+         return jjStopAtPos(0, 15);
+      case 124:
+         return jjMoveStringLiteralDfa1_0(0x20000L, 0x0L);
+      case 125:
+         return jjStopAtPos(0, 16);
+      case 126:
+         return jjMoveStringLiteralDfa1_0(0x40000L, 0x0L);
+      default :
+         return jjMoveNfa_0(4, 0);
+   }
+}
+private int jjMoveStringLiteralDfa1_0(long active0, long active1)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(0, active0, active1);
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 33:
+         return jjMoveStringLiteralDfa2_0(active0, 0x2000L, active1, 0L);
+      case 42:
+         if ((active0 & 0x200L) != 0L)
+            return jjStartNfaWithStates_0(1, 9, 1);
+         break;
+      case 45:
+         return jjMoveStringLiteralDfa2_0(active0, 0x400000000004000L, active1, 0L);
+      case 47:
+         if ((active0 & 0x20L) != 0L)
+            return jjStopAtPos(1, 5);
+         break;
+      case 61:
+         if ((active0 & 0x20000L) != 0L)
+            return jjStopAtPos(1, 17);
+         else if ((active0 & 0x40000L) != 0L)
+            return jjStopAtPos(1, 18);
+         break;
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000L);
+      case 68:
+      case 100:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0L);
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa2_0(active0, 0x320000000000000L, active1, 0L);
+      case 70:
+      case 102:
+         return jjMoveStringLiteralDfa2_0(active0, 0x11000000000000L, active1, 0x2000000L);
+      case 72:
+      case 104:
+         return jjMoveStringLiteralDfa2_0(active0, 0x100000000000L, active1, 0L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa2_0(active0, 0x80800000000000L, active1, 0x200000L);
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa2_0(active0, 0x400000000000L, active1, 0x400000L);
+      case 78:
+      case 110:
+         if ((active0 & 0x200000000000L) != 0L)
+            return jjStartNfaWithStates_0(1, 45, 375);
+         break;
+      case 79:
+      case 111:
+         if ((active0 & 0x80000000000L) != 0L)
+            return jjStartNfaWithStates_0(1, 43, 375);
+         break;
+      case 80:
+      case 112:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1000000L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa2_0(active0, 0x2000000000000L, active1, 0L);
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa2_0(active0, 0x800000000000000L, active1, 0L);
+      case 87:
+      case 119:
+         return jjMoveStringLiteralDfa2_0(active0, 0x48000000000000L, active1, 0L);
+      case 123:
+         if ((active0 & 0x4L) != 0L)
+            return jjStopAtPos(1, 2);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(0, active0, active1);
+}
+private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(0, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(1, active0, active1);
+      return 2;
+   }
+   switch(curChar)
+   {
+      case 45:
+         return jjMoveStringLiteralDfa3_0(active0, 0x2000L, active1, 0L);
+      case 62:
+         if ((active0 & 0x4000L) != 0L)
+            return jjStopAtPos(2, 14);
+         break;
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa3_0(active0, 0x28000000000000L, active1, 0x1000000L);
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa3_0(active0, 0x6000000000000L, active1, 0x400000L);
+      case 70:
+      case 102:
+         if ((active0 & 0x80000000000000L) != 0L)
+            return jjStartNfaWithStates_0(2, 55, 378);
+         break;
+      case 72:
+      case 104:
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000000L, active1, 0x800000L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000L, active1, 0L);
+      case 76:
+      case 108:
+         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000000L, active1, 0L);
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa3_0(active0, 0x400000000000000L, active1, 0x200000L);
+      case 78:
+      case 110:
+         return jjMoveStringLiteralDfa3_0(active0, 0x800000000000L, active1, 0L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa3_0(active0, 0x10000000000000L, active1, 0x2000000L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa3_0(active0, 0x100000000000L, active1, 0L);
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa3_0(active0, 0x801000000000000L, active1, 0L);
+      case 88:
+      case 120:
+         return jjMoveStringLiteralDfa3_0(active0, 0x200000000000000L, active1, 0L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(1, active0, active1);
+}
+private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(1, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(2, active0, active1);
+      return 3;
+   }
+   switch(curChar)
+   {
+      case 45:
+         if ((active0 & 0x2000L) != 0L)
+            return jjStopAtPos(3, 13);
+         break;
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800000L);
+      case 66:
+      case 98:
+         return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000L, active1, 0L);
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa4_0(active0, 0x20800000000000L, active1, 0L);
+      case 68:
+      case 100:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x400000L);
+      case 71:
+      case 103:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1000000L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa4_0(active0, 0x40000000000000L, active1, 0L);
+      case 78:
+      case 110:
+         return jjMoveStringLiteralDfa4_0(active0, 0x1000000000000L, active1, 0x2000000L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa4_0(active0, 0x400100000000000L, active1, 0L);
+      case 80:
+      case 112:
+         return jjMoveStringLiteralDfa4_0(active0, 0x800000000000000L, active1, 0x200000L);
+      case 82:
+      case 114:
+         if ((active0 & 0x10000000000000L) != 0L)
+            return jjStartNfaWithStates_0(3, 52, 378);
+         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000L, active1, 0L);
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa4_0(active0, 0x202000000000000L, active1, 0L);
+      case 88:
+      case 120:
+         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000L, active1, 0L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(2, active0, active1);
+}
+private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(2, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(3, active0, active1);
+      return 4;
+   }
+   switch(curChar)
+   {
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa5_0(active0, 0x1000000000000L, active1, 0L);
+      case 69:
+      case 101:
+         if ((active0 & 0x100000000000000L) != 0L)
+            return jjStartNfaWithStates_0(4, 56, 378);
+         else if ((active1 & 0x1000000L) != 0L)
+            return jjStartNfaWithStates_0(4, 88, 378);
+         return jjMoveStringLiteralDfa5_0(active0, 0x200000000000000L, active1, 0L);
+      case 72:
+      case 104:
+         if ((active0 & 0x20000000000000L) != 0L)
+            return jjStartNfaWithStates_0(4, 53, 378);
+         break;
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa5_0(active0, 0x400000000000L, active1, 0x400000L);
+      case 76:
+      case 108:
+         return jjMoveStringLiteralDfa5_0(active0, 0x40800000000000L, active1, 0L);
+      case 78:
+      case 110:
+         if ((active0 & 0x8000000000000L) != 0L)
+            return jjStartNfaWithStates_0(4, 51, 378);
+         break;
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x200000L);
+      case 80:
+      case 112:
+         return jjMoveStringLiteralDfa5_0(active0, 0x800000000000000L, active1, 0L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000L);
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa5_0(active0, 0x6100000000000L, active1, 0L);
+      case 90:
+      case 122:
+         return jjMoveStringLiteralDfa5_0(active0, 0x400000000000000L, active1, 0L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(3, active0, active1);
+}
+private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(3, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(4, active0, active1);
+      return 5;
+   }
+   switch(curChar)
+   {
+      case 45:
+         return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000L, active1, 0x2000000L);
+      case 65:
+      case 97:
+         if ((active1 & 0x400000L) != 0L)
+            return jjStartNfaWithStates_0(5, 86, 378);
+         break;
+      case 69:
+      case 101:
+         if ((active0 & 0x40000000000000L) != 0L)
+            return jjStartNfaWithStates_0(5, 54, 378);
+         break;
+      case 71:
+      case 103:
+         if ((active0 & 0x4000000000000L) != 0L)
+            return jjStartNfaWithStates_0(5, 50, 378);
+         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000L, active1, 0L);
+      case 78:
+      case 110:
+         if ((active0 & 0x400000000000L) != 0L)
+            return jjStartNfaWithStates_0(5, 46, 378);
+         return jjMoveStringLiteralDfa6_0(active0, 0x200000000000000L, active1, 0L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa6_0(active0, 0x800000000000000L, active1, 0L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa6_0(active0, 0x2000000000000L, active1, 0x200000L);
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800000L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa6_0(active0, 0x1000000000000L, active1, 0L);
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa6_0(active0, 0x800000000000L, active1, 0L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(4, active0, active1);
+}
+private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(4, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(5, active0, active1);
+      return 6;
+   }
+   switch(curChar)
+   {
+      case 68:
+      case 100:
+         if ((active0 & 0x200000000000000L) != 0L)
+            return jjStartNfaWithStates_0(6, 57, 378);
+         return jjMoveStringLiteralDfa7_0(active0, 0x400800000000000L, active1, 0L);
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800000L);
+      case 70:
+      case 102:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000000L);
+      case 72:
+      case 104:
+         if ((active0 & 0x100000000000L) != 0L)
+            return jjStartNfaWithStates_0(6, 44, 375);
+         break;
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa7_0(active0, 0x1000000000000L, active1, 0L);
+      case 78:
+      case 110:
+         if ((active0 & 0x2000000000000L) != 0L)
+            return jjStartNfaWithStates_0(6, 49, 378);
+         break;
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa7_0(active0, 0x800000000000000L, active1, 0L);
+      case 84:
+      case 116:
+         if ((active1 & 0x200000L) != 0L)
+            return jjStartNfaWithStates_0(6, 85, 378);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(5, active0, active1);
+}
+private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(5, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(6, active0, active1);
+      return 7;
+   }
+   switch(curChar)
+   {
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x2000000L);
+      case 69:
+      case 101:
+         if ((active0 & 0x800000000000L) != 0L)
+            return jjStartNfaWithStates_0(7, 47, 378);
+         break;
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa8_0(active0, 0x401000000000000L, active1, 0L);
+      case 84:
+      case 116:
+         if ((active1 & 0x800000L) != 0L)
+            return jjStartNfaWithStates_0(7, 87, 378);
+         return jjMoveStringLiteralDfa8_0(active0, 0x800000000000000L, active1, 0L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(6, active0, active1);
+}
+private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(6, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(7, active0, active1);
+      return 8;
+   }
+   switch(curChar)
+   {
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa9_0(active0, 0x400000000000000L, active1, 0x2000000L);
+      case 78:
+      case 110:
+         if ((active0 & 0x1000000000000L) != 0L)
+            return jjStartNfaWithStates_0(8, 48, 378);
+         break;
+      case 83:
+      case 115:
+         if ((active0 & 0x800000000000000L) != 0L)
+            return jjStartNfaWithStates_0(8, 59, 378);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(7, active0, active1);
+}
+private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(7, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(8, active0, active1);
+      return 9;
+   }
+   switch(curChar)
+   {
+      case 69:
+      case 101:
+         if ((active1 & 0x2000000L) != 0L)
+            return jjStartNfaWithStates_0(9, 89, 378);
+         break;
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa10_0(active0, 0x400000000000000L, active1, 0L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(8, active0, active1);
+}
+private int jjMoveStringLiteralDfa10_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(8, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(9, active0, 0L);
+      return 10;
+   }
+   switch(curChar)
+   {
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa11_0(active0, 0x400000000000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(9, active0, 0L);
+}
+private int jjMoveStringLiteralDfa11_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(9, old0, 0L);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(10, active0, 0L);
+      return 11;
+   }
+   switch(curChar)
+   {
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa12_0(active0, 0x400000000000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(10, active0, 0L);
+}
+private int jjMoveStringLiteralDfa12_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(10, old0, 0L);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(11, active0, 0L);
+      return 12;
+   }
+   switch(curChar)
+   {
+      case 78:
+      case 110:
+         return jjMoveStringLiteralDfa13_0(active0, 0x400000000000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(11, active0, 0L);
+}
+private int jjMoveStringLiteralDfa13_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(11, old0, 0L);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(12, active0, 0L);
+      return 13;
+   }
+   switch(curChar)
+   {
+      case 84:
+      case 116:
+         if ((active0 & 0x400000000000000L) != 0L)
+            return jjStartNfaWithStates_0(13, 58, 378);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(12, active0, 0L);
+}
+private int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_0(state, pos + 1);
+}
+static final long[] jjbitVec0 = {
+   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+private int jjMoveNfa_0(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 375;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 376:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(0, 4);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(186, 189);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(183, 185);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(181, 182);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(178, 180);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(173, 177);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(169, 172);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(165, 168);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(162, 164);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(159, 161);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(156, 158);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(153, 155);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(150, 152);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(147, 149);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(144, 146);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(141, 143);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(139, 140);
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 63)
+                        kind = 63;
+                     jjCheckNAdd(138);
+                  }
+                  break;
+               case 377:
+               case 61:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddTwoStates(61, 62);
+                  break;
+               case 72:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 73;
+                  break;
+               case 4:
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 63)
+                        kind = 63;
+                     jjCheckNAddStates(5, 78);
+                  }
+                  else if ((0x100003600L & l) != 0L)
+                  {
+                     if (kind > 1)
+                        kind = 1;
+                     jjCheckNAdd(0);
+                  }
+                  else if (curChar == 46)
+                     jjCheckNAddStates(79, 96);
+                  else if (curChar == 45)
+                     jjAddStates(97, 98);
+                  else if (curChar == 33)
+                     jjCheckNAddStates(99, 102);
+                  else if (curChar == 35)
+                     jjCheckNAddTwoStates(61, 62);
+                  else if (curChar == 36)
+                     jjCheckNAddStates(103, 106);
+                  else if (curChar == 39)
+                     jjCheckNAddStates(107, 110);
+                  else if (curChar == 34)
+                     jjCheckNAddStates(111, 114);
+                  else if (curChar == 47)
+                     jjstateSet[jjnewStateCnt++] = 3;
+                  break;
+               case 378:
+               case 74:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddTwoStates(74, 75);
+                  break;
+               case 375:
+                  if ((0x3ff200000000000L & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  else if (curChar == 40)
+                  {
+                     if (kind > 102)
+                        kind = 102;
+                  }
+                  if ((0x3ff200000000000L & l) != 0L)
+                  {
+                     if (kind > 62)
+                        kind = 62;
+                     jjCheckNAddTwoStates(93, 94);
+                  }
+                  break;
+               case 0:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 1)
+                     kind = 1;
+                  jjCheckNAdd(0);
+                  break;
+               case 1:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 2;
+                  break;
+               case 2:
+                  if ((0xffff7fffffffffffL & l) != 0L && kind > 8)
+                     kind = 8;
+                  break;
+               case 3:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 1;
+                  break;
+               case 5:
+                  if (curChar == 34)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 6:
+                  if ((0xfffffffb00000200L & l) != 0L)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 7:
+                  if (curChar == 34 && kind > 61)
+                     kind = 61;
+                  break;
+               case 9:
+                  if (curChar == 12)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 11:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 12:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(118, 123);
+                  break;
+               case 13:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 14:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(124, 132);
+                  break;
+               case 15:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(133, 137);
+                  break;
+               case 16:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(138, 143);
+                  break;
+               case 17:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(144, 150);
+                  break;
+               case 18:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(151, 158);
+                  break;
+               case 19:
+                  if (curChar == 13)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 20:
+                  if (curChar == 10)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 21:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 20;
+                  break;
+               case 22:
+                  if (curChar == 39)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 23:
+                  if ((0xffffff7f00000200L & l) != 0L)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 24:
+                  if (curChar == 39 && kind > 61)
+                     kind = 61;
+                  break;
+               case 26:
+                  if (curChar == 12)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 28:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 29:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(159, 164);
+                  break;
+               case 30:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 31:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(165, 173);
+                  break;
+               case 32:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(174, 178);
+                  break;
+               case 33:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(179, 184);
+                  break;
+               case 34:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(185, 191);
+                  break;
+               case 35:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(192, 199);
+                  break;
+               case 36:
+                  if (curChar == 13)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 37:
+                  if (curChar == 10)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 38:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 37;
+                  break;
+               case 39:
+                  if (curChar == 36)
+                     jjCheckNAddStates(103, 106);
+                  break;
+               case 40:
+                  if (curChar == 45)
+                     jjCheckNAdd(41);
+                  break;
+               case 42:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddTwoStates(42, 43);
+                  break;
+               case 44:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddTwoStates(42, 43);
+                  break;
+               case 45:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(200, 203);
+                  break;
+               case 46:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddTwoStates(42, 43);
+                  break;
+               case 47:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(204, 210);
+                  break;
+               case 48:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(211, 213);
+                  break;
+               case 49:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(214, 217);
+                  break;
+               case 50:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(218, 222);
+                  break;
+               case 51:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(223, 228);
+                  break;
+               case 54:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(229, 232);
+                  break;
+               case 55:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(233, 239);
+                  break;
+               case 56:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(240, 242);
+                  break;
+               case 57:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(243, 246);
+                  break;
+               case 58:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(247, 251);
+                  break;
+               case 59:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(252, 257);
+                  break;
+               case 60:
+                  if (curChar == 35)
+                     jjCheckNAddTwoStates(61, 62);
+                  break;
+               case 63:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddTwoStates(61, 62);
+                  break;
+               case 64:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(258, 261);
+                  break;
+               case 65:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddTwoStates(61, 62);
+                  break;
+               case 66:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(262, 268);
+                  break;
+               case 67:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(269, 271);
+                  break;
+               case 68:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(272, 275);
+                  break;
+               case 69:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(276, 280);
+                  break;
+               case 70:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(281, 286);
+                  break;
+               case 76:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddTwoStates(74, 75);
+                  break;
+               case 77:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(287, 290);
+                  break;
+               case 78:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddTwoStates(74, 75);
+                  break;
+               case 79:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(291, 297);
+                  break;
+               case 80:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(298, 300);
+                  break;
+               case 81:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(301, 304);
+                  break;
+               case 82:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(305, 309);
+                  break;
+               case 83:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(310, 315);
+                  break;
+               case 86:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(316, 319);
+                  break;
+               case 87:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(320, 326);
+                  break;
+               case 88:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(327, 329);
+                  break;
+               case 89:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(330, 333);
+                  break;
+               case 90:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(334, 338);
+                  break;
+               case 91:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(339, 344);
+                  break;
+               case 93:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddTwoStates(93, 94);
+                  break;
+               case 95:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddTwoStates(93, 94);
+                  break;
+               case 96:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(345, 348);
+                  break;
+               case 97:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddTwoStates(93, 94);
+                  break;
+               case 98:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(349, 355);
+                  break;
+               case 99:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(356, 358);
+                  break;
+               case 100:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(359, 362);
+                  break;
+               case 101:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(363, 367);
+                  break;
+               case 102:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(368, 373);
+                  break;
+               case 103:
+                  if ((0x3ff200000000000L & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  break;
+               case 104:
+                  if (curChar == 40 && kind > 102)
+                     kind = 102;
+                  break;
+               case 106:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  break;
+               case 107:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(374, 378);
+                  break;
+               case 108:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  break;
+               case 109:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(379, 386);
+                  break;
+               case 110:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(387, 390);
+                  break;
+               case 111:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(391, 395);
+                  break;
+               case 112:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(396, 401);
+                  break;
+               case 113:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(402, 408);
+                  break;
+               case 114:
+                  if (curChar == 33)
+                     jjCheckNAddStates(99, 102);
+                  break;
+               case 115:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(115, 122);
+                  break;
+               case 123:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(123, 132);
+                  break;
+               case 133:
+                  if (curChar == 45)
+                     jjAddStates(97, 98);
+                  break;
+               case 137:
+                  if (curChar == 46)
+                     jjCheckNAddStates(79, 96);
+                  break;
+               case 138:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 63)
+                     kind = 63;
+                  jjCheckNAdd(138);
+                  break;
+               case 139:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(139, 140);
+                  break;
+               case 140:
+                  if (curChar == 37 && kind > 67)
+                     kind = 67;
+                  break;
+               case 141:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(141, 143);
+                  break;
+               case 144:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(144, 146);
+                  break;
+               case 147:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(147, 149);
+                  break;
+               case 150:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(150, 152);
+                  break;
+               case 153:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(153, 155);
+                  break;
+               case 156:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(156, 158);
+                  break;
+               case 159:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(159, 161);
+                  break;
+               case 162:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(162, 164);
+                  break;
+               case 165:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(165, 168);
+                  break;
+               case 169:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(169, 172);
+                  break;
+               case 173:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(173, 177);
+                  break;
+               case 178:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(178, 180);
+                  break;
+               case 181:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(181, 182);
+                  break;
+               case 183:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(183, 185);
+                  break;
+               case 186:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(186, 189);
+                  break;
+               case 190:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(0, 4);
+                  break;
+               case 191:
+                  if (curChar == 45)
+                     jjCheckNAdd(192);
+                  break;
+               case 193:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddTwoStates(193, 194);
+                  break;
+               case 195:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddTwoStates(193, 194);
+                  break;
+               case 196:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(409, 412);
+                  break;
+               case 197:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddTwoStates(193, 194);
+                  break;
+               case 198:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(413, 419);
+                  break;
+               case 199:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(420, 422);
+                  break;
+               case 200:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(423, 426);
+                  break;
+               case 201:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(427, 431);
+                  break;
+               case 202:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(432, 437);
+                  break;
+               case 205:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(438, 441);
+                  break;
+               case 206:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(442, 448);
+                  break;
+               case 207:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(449, 451);
+                  break;
+               case 208:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(452, 455);
+                  break;
+               case 209:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(456, 460);
+                  break;
+               case 210:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(461, 466);
+                  break;
+               case 212:
+                  if (curChar == 40)
+                     jjCheckNAddStates(467, 472);
+                  break;
+               case 213:
+                  if ((0xfffffc7a00000000L & l) != 0L)
+                     jjCheckNAddStates(473, 476);
+                  break;
+               case 214:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(214, 215);
+                  break;
+               case 215:
+                  if (curChar == 41 && kind > 65)
+                     kind = 65;
+                  break;
+               case 217:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(473, 476);
+                  break;
+               case 218:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(477, 481);
+                  break;
+               case 219:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(473, 476);
+                  break;
+               case 220:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(482, 489);
+                  break;
+               case 221:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(490, 493);
+                  break;
+               case 222:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(494, 498);
+                  break;
+               case 223:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(499, 504);
+                  break;
+               case 224:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(505, 511);
+                  break;
+               case 225:
+                  if (curChar == 39)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 226:
+                  if ((0xffffff7f00000200L & l) != 0L)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 227:
+                  if (curChar == 39)
+                     jjCheckNAddTwoStates(214, 215);
+                  break;
+               case 229:
+                  if (curChar == 12)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 231:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 232:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(516, 521);
+                  break;
+               case 233:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 234:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(522, 530);
+                  break;
+               case 235:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(531, 535);
+                  break;
+               case 236:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(536, 541);
+                  break;
+               case 237:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(542, 548);
+                  break;
+               case 238:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(549, 556);
+                  break;
+               case 239:
+                  if (curChar == 13)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 240:
+                  if (curChar == 10)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 241:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 240;
+                  break;
+               case 242:
+                  if (curChar == 34)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               case 243:
+                  if ((0xfffffffb00000200L & l) != 0L)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               case 244:
+                  if (curChar == 34)
+                     jjCheckNAddTwoStates(214, 215);
+                  break;
+               case 246:
+                  if (curChar == 12)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               case 248:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               case 249:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(561, 566);
+                  break;
+               case 250:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               case 251:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(567, 575);
+                  break;
+               case 252:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(576, 580);
+                  break;
+               case 253:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(581, 586);
+                  break;
+               case 254:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(587, 593);
+                  break;
+               case 255:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(594, 601);
+                  break;
+               case 256:
+                  if (curChar == 13)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               case 257:
+                  if (curChar == 10)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               case 258:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 257;
+                  break;
+               case 259:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(602, 608);
+                  break;
+               case 262:
+                  if (curChar == 43)
+                     jjAddStates(609, 610);
+                  break;
+               case 263:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 264;
+                  break;
+               case 264:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(611, 614);
+                  break;
+               case 265:
+                  if (curChar == 63 && kind > 101)
+                     kind = 101;
+                  break;
+               case 266:
+               case 281:
+               case 285:
+               case 288:
+               case 291:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAdd(265);
+                  break;
+               case 267:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddTwoStates(265, 266);
+                  break;
+               case 268:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(615, 617);
+                  break;
+               case 269:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjAddStates(618, 623);
+                  break;
+               case 270:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 271;
+                  break;
+               case 271:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 272;
+                  break;
+               case 272:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAdd(273);
+                  break;
+               case 273:
+                  if ((0x3ff000000000000L & l) != 0L && kind > 101)
+                     kind = 101;
+                  break;
+               case 274:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 275;
+                  break;
+               case 275:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 276;
+                  break;
+               case 276:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 277;
+                  break;
+               case 277:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAdd(265);
+                  break;
+               case 278:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 279;
+                  break;
+               case 279:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 280;
+                  break;
+               case 280:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 281;
+                  break;
+               case 282:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 283;
+                  break;
+               case 283:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 284;
+                  break;
+               case 284:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddTwoStates(265, 285);
+                  break;
+               case 286:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 287;
+                  break;
+               case 287:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(624, 626);
+                  break;
+               case 289:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddTwoStates(265, 288);
+                  break;
+               case 290:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(627, 630);
+                  break;
+               case 292:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddTwoStates(265, 291);
+                  break;
+               case 293:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(631, 633);
+                  break;
+               case 294:
+                  if (curChar == 43)
+                     jjstateSet[jjnewStateCnt++] = 295;
+                  break;
+               case 295:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(296, 302);
+                  break;
+               case 296:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 297;
+                  break;
+               case 297:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 298;
+                  break;
+               case 298:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(634, 637);
+                  break;
+               case 299:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAdd(273);
+                  break;
+               case 300:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddTwoStates(273, 299);
+                  break;
+               case 301:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(638, 640);
+                  break;
+               case 302:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(641, 645);
+                  break;
+               case 303:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAdd(296);
+                  break;
+               case 304:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(303, 296);
+                  break;
+               case 305:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(646, 648);
+                  break;
+               case 306:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(649, 652);
+                  break;
+               case 308:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(653, 656);
+                  break;
+               case 309:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(657, 663);
+                  break;
+               case 310:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(664, 666);
+                  break;
+               case 311:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(667, 670);
+                  break;
+               case 312:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(671, 675);
+                  break;
+               case 313:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(676, 681);
+                  break;
+               case 314:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(682, 686);
+                  break;
+               case 315:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(687, 694);
+                  break;
+               case 316:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(695, 698);
+                  break;
+               case 317:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(699, 703);
+                  break;
+               case 318:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(704, 709);
+                  break;
+               case 319:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(710, 716);
+                  break;
+               case 320:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 63)
+                     kind = 63;
+                  jjCheckNAddStates(5, 78);
+                  break;
+               case 321:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 63)
+                     kind = 63;
+                  jjCheckNAdd(321);
+                  break;
+               case 322:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(322, 323);
+                  break;
+               case 323:
+                  if (curChar == 46)
+                     jjCheckNAdd(138);
+                  break;
+               case 324:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(324, 140);
+                  break;
+               case 325:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(325, 326);
+                  break;
+               case 326:
+                  if (curChar == 46)
+                     jjCheckNAdd(139);
+                  break;
+               case 327:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(327, 143);
+                  break;
+               case 328:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(328, 329);
+                  break;
+               case 329:
+                  if (curChar == 46)
+                     jjCheckNAdd(141);
+                  break;
+               case 330:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(330, 146);
+                  break;
+               case 331:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(331, 332);
+                  break;
+               case 332:
+                  if (curChar == 46)
+                     jjCheckNAdd(144);
+                  break;
+               case 333:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(333, 149);
+                  break;
+               case 334:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(334, 335);
+                  break;
+               case 335:
+                  if (curChar == 46)
+                     jjCheckNAdd(147);
+                  break;
+               case 336:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(336, 152);
+                  break;
+               case 337:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(337, 338);
+                  break;
+               case 338:
+                  if (curChar == 46)
+                     jjCheckNAdd(150);
+                  break;
+               case 339:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(339, 155);
+                  break;
+               case 340:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(340, 341);
+                  break;
+               case 341:
+                  if (curChar == 46)
+                     jjCheckNAdd(153);
+                  break;
+               case 342:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(342, 158);
+                  break;
+               case 343:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(343, 344);
+                  break;
+               case 344:
+                  if (curChar == 46)
+                     jjCheckNAdd(156);
+                  break;
+               case 345:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(345, 161);
+                  break;
+               case 346:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(346, 347);
+                  break;
+               case 347:
+                  if (curChar == 46)
+                     jjCheckNAdd(159);
+                  break;
+               case 348:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(348, 164);
+                  break;
+               case 349:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(349, 350);
+                  break;
+               case 350:
+                  if (curChar == 46)
+                     jjCheckNAdd(162);
+                  break;
+               case 351:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(351, 168);
+                  break;
+               case 352:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(352, 353);
+                  break;
+               case 353:
+                  if (curChar == 46)
+                     jjCheckNAdd(165);
+                  break;
+               case 354:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(354, 172);
+                  break;
+               case 355:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(355, 356);
+                  break;
+               case 356:
+                  if (curChar == 46)
+                     jjCheckNAdd(169);
+                  break;
+               case 357:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(357, 177);
+                  break;
+               case 358:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(358, 359);
+                  break;
+               case 359:
+                  if (curChar == 46)
+                     jjCheckNAdd(173);
+                  break;
+               case 360:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(360, 180);
+                  break;
+               case 361:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(361, 362);
+                  break;
+               case 362:
+                  if (curChar == 46)
+                     jjCheckNAdd(178);
+                  break;
+               case 363:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(363, 182);
+                  break;
+               case 364:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(364, 365);
+                  break;
+               case 365:
+                  if (curChar == 46)
+                     jjCheckNAdd(181);
+                  break;
+               case 366:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(366, 185);
+                  break;
+               case 367:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(367, 368);
+                  break;
+               case 368:
+                  if (curChar == 46)
+                     jjCheckNAdd(183);
+                  break;
+               case 369:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(369, 189);
+                  break;
+               case 370:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(370, 371);
+                  break;
+               case 371:
+                  if (curChar == 46)
+                     jjCheckNAdd(186);
+                  break;
+               case 372:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(717, 721);
+                  break;
+               case 373:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(373, 374);
+                  break;
+               case 374:
+                  if (curChar == 46)
+                     jjCheckNAdd(190);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 377:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 84)
+                        kind = 84;
+                     jjCheckNAddTwoStates(61, 62);
+                  }
+                  else if (curChar == 92)
+                     jjAddStates(722, 723);
+                  break;
+               case 134:
+                  if ((0x7fffffe07fffffeL & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  if ((0x7fffffe07fffffeL & l) != 0L)
+                  {
+                     if (kind > 62)
+                        kind = 62;
+                     jjCheckNAddTwoStates(93, 94);
+                  }
+                  break;
+               case 72:
+                  if ((0x7fffffe07fffffeL & l) != 0L)
+                  {
+                     if (kind > 90)
+                        kind = 90;
+                     jjCheckNAddTwoStates(74, 75);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(76, 86);
+                  break;
+               case 4:
+                  if ((0x7fffffe07fffffeL & l) != 0L)
+                  {
+                     if (kind > 62)
+                        kind = 62;
+                     jjCheckNAddStates(724, 728);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddStates(729, 732);
+                  else if (curChar == 64)
+                     jjAddStates(733, 736);
+                  if ((0x20000000200000L & l) != 0L)
+                     jjAddStates(737, 739);
+                  break;
+               case 378:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 90)
+                        kind = 90;
+                     jjCheckNAddTwoStates(74, 75);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(76, 77);
+                  break;
+               case 375:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(95, 96);
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 62)
+                        kind = 62;
+                     jjCheckNAddTwoStates(93, 94);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(106, 107);
+                  break;
+               case 2:
+                  if (kind > 8)
+                     kind = 8;
+                  break;
+               case 6:
+               case 11:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 8:
+                  if (curChar == 92)
+                     jjAddStates(740, 743);
+                  break;
+               case 10:
+                  if (curChar == 92)
+                     jjAddStates(744, 745);
+                  break;
+               case 12:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(118, 123);
+                  break;
+               case 14:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(124, 132);
+                  break;
+               case 15:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(133, 137);
+                  break;
+               case 16:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(138, 143);
+                  break;
+               case 17:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(144, 150);
+                  break;
+               case 18:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(151, 158);
+                  break;
+               case 23:
+               case 28:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 25:
+                  if (curChar == 92)
+                     jjAddStates(746, 749);
+                  break;
+               case 27:
+                  if (curChar == 92)
+                     jjAddStates(750, 751);
+                  break;
+               case 29:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(159, 164);
+                  break;
+               case 31:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(165, 173);
+                  break;
+               case 32:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(174, 178);
+                  break;
+               case 33:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(179, 184);
+                  break;
+               case 34:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(185, 191);
+                  break;
+               case 35:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(192, 199);
+                  break;
+               case 41:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddTwoStates(42, 43);
+                  break;
+               case 42:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddTwoStates(42, 43);
+                  break;
+               case 43:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(44, 45);
+                  break;
+               case 44:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddTwoStates(42, 43);
+                  break;
+               case 45:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(200, 203);
+                  break;
+               case 47:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(204, 210);
+                  break;
+               case 48:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(211, 213);
+                  break;
+               case 49:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(214, 217);
+                  break;
+               case 50:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(218, 222);
+                  break;
+               case 51:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(223, 228);
+                  break;
+               case 53:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(44, 54);
+                  break;
+               case 54:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(229, 232);
+                  break;
+               case 55:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(233, 239);
+                  break;
+               case 56:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(240, 242);
+                  break;
+               case 57:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(243, 246);
+                  break;
+               case 58:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(247, 251);
+                  break;
+               case 59:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddStates(252, 257);
+                  break;
+               case 61:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddTwoStates(61, 62);
+                  break;
+               case 62:
+                  if (curChar == 92)
+                     jjAddStates(722, 723);
+                  break;
+               case 63:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddTwoStates(61, 62);
+                  break;
+               case 64:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(258, 261);
+                  break;
+               case 66:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(262, 268);
+                  break;
+               case 67:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(269, 271);
+                  break;
+               case 68:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(272, 275);
+                  break;
+               case 69:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(276, 280);
+                  break;
+               case 70:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddStates(281, 286);
+                  break;
+               case 71:
+                  if (curChar == 64)
+                     jjAddStates(733, 736);
+                  break;
+               case 73:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddTwoStates(74, 75);
+                  break;
+               case 74:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddTwoStates(74, 75);
+                  break;
+               case 75:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(76, 77);
+                  break;
+               case 76:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddTwoStates(74, 75);
+                  break;
+               case 77:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(287, 290);
+                  break;
+               case 79:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(291, 297);
+                  break;
+               case 80:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(298, 300);
+                  break;
+               case 81:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(301, 304);
+                  break;
+               case 82:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(305, 309);
+                  break;
+               case 83:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(310, 315);
+                  break;
+               case 85:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(76, 86);
+                  break;
+               case 86:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(316, 319);
+                  break;
+               case 87:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(320, 326);
+                  break;
+               case 88:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(327, 329);
+                  break;
+               case 89:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(330, 333);
+                  break;
+               case 90:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(334, 338);
+                  break;
+               case 91:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddStates(339, 344);
+                  break;
+               case 93:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddTwoStates(93, 94);
+                  break;
+               case 94:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(95, 96);
+                  break;
+               case 95:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddTwoStates(93, 94);
+                  break;
+               case 96:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(345, 348);
+                  break;
+               case 98:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(349, 355);
+                  break;
+               case 99:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(356, 358);
+                  break;
+               case 100:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(359, 362);
+                  break;
+               case 101:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(363, 367);
+                  break;
+               case 102:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(368, 373);
+                  break;
+               case 103:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  break;
+               case 105:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(106, 107);
+                  break;
+               case 106:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  break;
+               case 107:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(374, 378);
+                  break;
+               case 109:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(379, 386);
+                  break;
+               case 110:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(387, 390);
+                  break;
+               case 111:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(391, 395);
+                  break;
+               case 112:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(396, 401);
+                  break;
+               case 113:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(402, 408);
+                  break;
+               case 116:
+                  if ((0x10000000100000L & l) != 0L && kind > 60)
+                     kind = 60;
+                  break;
+               case 117:
+                  if ((0x100000001000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 116;
+                  break;
+               case 118:
+                  if ((0x20000000200000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 117;
+                  break;
+               case 119:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 118;
+                  break;
+               case 120:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 119;
+                  break;
+               case 121:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 120;
+                  break;
+               case 122:
+                  if ((0x1000000010L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 121;
+                  break;
+               case 124:
+                  if ((0x10000000100000L & l) != 0L && kind > 91)
+                     kind = 91;
+                  break;
+               case 125:
+                  if ((0x400000004000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 124;
+                  break;
+               case 126:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 125;
+                  break;
+               case 127:
+                  if ((0x10000000100000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 126;
+                  break;
+               case 128:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 127;
+                  break;
+               case 129:
+                  if ((0x800000008000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 128;
+                  break;
+               case 130:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 129;
+                  break;
+               case 131:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 130;
+                  break;
+               case 132:
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 131;
+                  break;
+               case 135:
+                  if ((0x7fffffe07fffffeL & l) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  break;
+               case 136:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(724, 728);
+                  break;
+               case 142:
+                  if ((0x10000000100000L & l) != 0L && kind > 68)
+                     kind = 68;
+                  break;
+               case 143:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 142;
+                  break;
+               case 145:
+                  if ((0x200000002000L & l) != 0L && kind > 69)
+                     kind = 69;
+                  break;
+               case 146:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 145;
+                  break;
+               case 148:
+                  if ((0x200000002000L & l) != 0L && kind > 70)
+                     kind = 70;
+                  break;
+               case 149:
+                  if ((0x800000008L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 148;
+                  break;
+               case 151:
+                  if ((0x800000008L & l) != 0L && kind > 71)
+                     kind = 71;
+                  break;
+               case 152:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 151;
+                  break;
+               case 154:
+                  if ((0x400000004000L & l) != 0L && kind > 72)
+                     kind = 72;
+                  break;
+               case 155:
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 154;
+                  break;
+               case 157:
+                  if ((0x100000001000000L & l) != 0L && kind > 73)
+                     kind = 73;
+                  break;
+               case 158:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 157;
+                  break;
+               case 160:
+                  if ((0x200000002000L & l) != 0L && kind > 74)
+                     kind = 74;
+                  break;
+               case 161:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 160;
+                  break;
+               case 163:
+                  if ((0x100000001000000L & l) != 0L && kind > 75)
+                     kind = 75;
+                  break;
+               case 164:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 163;
+                  break;
+               case 166:
+                  if ((0x8000000080L & l) != 0L && kind > 76)
+                     kind = 76;
+                  break;
+               case 167:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 166;
+                  break;
+               case 168:
+                  if ((0x1000000010L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 167;
+                  break;
+               case 170:
+                  if ((0x1000000010L & l) != 0L && kind > 77)
+                     kind = 77;
+                  break;
+               case 171:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 170;
+                  break;
+               case 172:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 171;
+                  break;
+               case 174:
+                  if ((0x1000000010L & l) != 0L && kind > 78)
+                     kind = 78;
+                  break;
+               case 175:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 174;
+                  break;
+               case 176:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 175;
+                  break;
+               case 177:
+                  if ((0x8000000080L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 176;
+                  break;
+               case 179:
+                  if ((0x8000000080000L & l) != 0L && kind > 79)
+                     kind = 79;
+                  break;
+               case 180:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 179;
+                  break;
+               case 182:
+                  if ((0x8000000080000L & l) != 0L && kind > 80)
+                     kind = 80;
+                  break;
+               case 184:
+                  if ((0x400000004000000L & l) != 0L && kind > 81)
+                     kind = 81;
+                  break;
+               case 185:
+                  if ((0x10000000100L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 184;
+                  break;
+               case 187:
+                  if ((0x400000004000000L & l) != 0L && kind > 82)
+                     kind = 82;
+                  break;
+               case 188:
+                  if ((0x10000000100L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 187;
+                  break;
+               case 189:
+                  if ((0x80000000800L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 188;
+                  break;
+               case 192:
+                  if ((0x7fffffe07fffffeL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddTwoStates(193, 194);
+                  break;
+               case 193:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddTwoStates(193, 194);
+                  break;
+               case 194:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(195, 196);
+                  break;
+               case 195:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddTwoStates(193, 194);
+                  break;
+               case 196:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(409, 412);
+                  break;
+               case 198:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(413, 419);
+                  break;
+               case 199:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(420, 422);
+                  break;
+               case 200:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(423, 426);
+                  break;
+               case 201:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(427, 431);
+                  break;
+               case 202:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(432, 437);
+                  break;
+               case 204:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(195, 205);
+                  break;
+               case 205:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(438, 441);
+                  break;
+               case 206:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(442, 448);
+                  break;
+               case 207:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(449, 451);
+                  break;
+               case 208:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(452, 455);
+                  break;
+               case 209:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(456, 460);
+                  break;
+               case 210:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddStates(461, 466);
+                  break;
+               case 211:
+                  if ((0x20000000200000L & l) != 0L)
+                     jjAddStates(737, 739);
+                  break;
+               case 213:
+               case 217:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(473, 476);
+                  break;
+               case 216:
+                  if (curChar == 92)
+                     jjAddStates(752, 753);
+                  break;
+               case 218:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(477, 481);
+                  break;
+               case 220:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(482, 489);
+                  break;
+               case 221:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(490, 493);
+                  break;
+               case 222:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(494, 498);
+                  break;
+               case 223:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(499, 504);
+                  break;
+               case 224:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(505, 511);
+                  break;
+               case 226:
+               case 231:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 228:
+                  if (curChar == 92)
+                     jjAddStates(754, 757);
+                  break;
+               case 230:
+                  if (curChar == 92)
+                     jjAddStates(758, 759);
+                  break;
+               case 232:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(516, 521);
+                  break;
+               case 234:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(522, 530);
+                  break;
+               case 235:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(531, 535);
+                  break;
+               case 236:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(536, 541);
+                  break;
+               case 237:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(542, 548);
+                  break;
+               case 238:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(549, 556);
+                  break;
+               case 243:
+               case 248:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               case 245:
+                  if (curChar == 92)
+                     jjAddStates(760, 763);
+                  break;
+               case 247:
+                  if (curChar == 92)
+                     jjAddStates(764, 765);
+                  break;
+               case 249:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(561, 566);
+                  break;
+               case 251:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(567, 575);
+                  break;
+               case 252:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(576, 580);
+                  break;
+               case 253:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(581, 586);
+                  break;
+               case 254:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(587, 593);
+                  break;
+               case 255:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(594, 601);
+                  break;
+               case 260:
+                  if ((0x100000001000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 212;
+                  break;
+               case 261:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 260;
+                  break;
+               case 269:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjAddStates(618, 623);
+                  break;
+               case 270:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 271;
+                  break;
+               case 271:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 272;
+                  break;
+               case 272:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAdd(273);
+                  break;
+               case 273:
+                  if ((0x7e0000007eL & l) != 0L && kind > 101)
+                     kind = 101;
+                  break;
+               case 274:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 275;
+                  break;
+               case 275:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 276;
+                  break;
+               case 276:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 277;
+                  break;
+               case 277:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 265;
+                  break;
+               case 278:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 279;
+                  break;
+               case 279:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 280;
+                  break;
+               case 280:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 281;
+                  break;
+               case 282:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 283;
+                  break;
+               case 283:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 284;
+                  break;
+               case 286:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 287;
+                  break;
+               case 295:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddTwoStates(296, 302);
+                  break;
+               case 297:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjstateSet[jjnewStateCnt++] = 298;
+                  break;
+               case 298:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(634, 637);
+                  break;
+               case 299:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAdd(273);
+                  break;
+               case 300:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddTwoStates(273, 299);
+                  break;
+               case 301:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 101)
+                     kind = 101;
+                  jjCheckNAddStates(638, 640);
+                  break;
+               case 302:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(641, 645);
+                  break;
+               case 303:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAdd(296);
+                  break;
+               case 304:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddTwoStates(303, 296);
+                  break;
+               case 305:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(646, 648);
+                  break;
+               case 306:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(649, 652);
+                  break;
+               case 307:
+                  if (curChar == 92)
+                     jjCheckNAddStates(729, 732);
+                  break;
+               case 308:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(653, 656);
+                  break;
+               case 309:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(657, 663);
+                  break;
+               case 310:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(664, 666);
+                  break;
+               case 311:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(667, 670);
+                  break;
+               case 312:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(671, 675);
+                  break;
+               case 313:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddStates(676, 681);
+                  break;
+               case 314:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(682, 686);
+                  break;
+               case 315:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(687, 694);
+                  break;
+               case 316:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(695, 698);
+                  break;
+               case 317:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(699, 703);
+                  break;
+               case 318:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(704, 709);
+                  break;
+               case 319:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(710, 716);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 377:
+               case 61:
+               case 63:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 84)
+                     kind = 84;
+                  jjCheckNAddTwoStates(61, 62);
+                  break;
+               case 72:
+               case 76:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddTwoStates(74, 75);
+                  break;
+               case 4:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 34)
+                     kind = 34;
+                  jjCheckNAddStates(724, 728);
+                  break;
+               case 378:
+               case 74:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 90)
+                     kind = 90;
+                  jjCheckNAddTwoStates(74, 75);
+                  break;
+               case 375:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                  {
+                     if (kind > 62)
+                        kind = 62;
+                     jjCheckNAddTwoStates(93, 94);
+                  }
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  break;
+               case 2:
+                  if ((jjbitVec0[i2] & l2) != 0L && kind > 8)
+                     kind = 8;
+                  break;
+               case 6:
+               case 11:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(111, 114);
+                  break;
+               case 23:
+               case 28:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(107, 110);
+                  break;
+               case 42:
+               case 44:
+               case 52:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 66)
+                     kind = 66;
+                  jjCheckNAddTwoStates(42, 43);
+                  break;
+               case 93:
+               case 95:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 62)
+                     kind = 62;
+                  jjCheckNAddTwoStates(93, 94);
+                  break;
+               case 103:
+               case 106:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(115, 117);
+                  break;
+               case 193:
+               case 195:
+               case 203:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 83)
+                     kind = 83;
+                  jjCheckNAddTwoStates(193, 194);
+                  break;
+               case 213:
+               case 217:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(473, 476);
+                  break;
+               case 226:
+               case 231:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(512, 515);
+                  break;
+               case 243:
+               case 248:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(557, 560);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 375 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+private int jjMoveStringLiteralDfa0_4()
+{
+   switch(curChar)
+   {
+      case 42:
+         return jjMoveStringLiteralDfa1_4(0x800L);
+      default :
+         return 1;
+   }
+}
+private int jjMoveStringLiteralDfa1_4(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 47:
+         if ((active0 & 0x800L) != 0L)
+            return jjStopAtPos(1, 11);
+         break;
+      default :
+         return 2;
+   }
+   return 2;
+}
+private int jjMoveStringLiteralDfa0_2()
+{
+   return jjMoveNfa_2(0, 0);
+}
+private int jjMoveNfa_2(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 4;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((0xffffffffffffdbffL & l) != 0L)
+                  {
+                     if (kind > 6)
+                        kind = 6;
+                  }
+                  else if ((0x2400L & l) != 0L)
+                  {
+                     if (kind > 7)
+                        kind = 7;
+                  }
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 2;
+                  break;
+               case 1:
+                  if ((0x2400L & l) != 0L && kind > 7)
+                     kind = 7;
+                  break;
+               case 2:
+                  if (curChar == 10 && kind > 7)
+                     kind = 7;
+                  break;
+               case 3:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 2;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  kind = 6;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((jjbitVec0[i2] & l2) != 0L && kind > 6)
+                     kind = 6;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 4 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+private int jjMoveStringLiteralDfa0_3()
+{
+   switch(curChar)
+   {
+      case 42:
+         return jjMoveStringLiteralDfa1_3(0x400L);
+      default :
+         return 1;
+   }
+}
+private int jjMoveStringLiteralDfa1_3(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 47:
+         if ((active0 & 0x400L) != 0L)
+            return jjStopAtPos(1, 10);
+         break;
+      default :
+         return 2;
+   }
+   return 2;
+}
+private final int jjStopStringLiteralDfa_1(int pos, long active0)
+{
+   switch (pos)
+   {
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_1(int pos, long active0)
+{
+   return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
+}
+private int jjMoveStringLiteralDfa0_1()
+{
+   switch(curChar)
+   {
+      case 125:
+         return jjStopAtPos(0, 4);
+      default :
+         return jjMoveNfa_1(0, 0);
+   }
+}
+private int jjMoveNfa_1(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 1;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  kind = 3;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((0xdfffffffffffffffL & l) != 0L)
+                     kind = 3;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((jjbitVec0[i2] & l2) != 0L && kind > 3)
+                     kind = 3;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+static final int[] jjnextStates = {
+   190, 191, 192, 203, 204, 321, 322, 323, 324, 325, 326, 140, 327, 328, 329, 143, 
+   330, 331, 332, 146, 333, 334, 335, 149, 336, 337, 338, 152, 339, 340, 341, 155, 
+   342, 343, 344, 158, 345, 346, 347, 161, 348, 349, 350, 164, 351, 352, 353, 168, 
+   354, 355, 356, 172, 357, 358, 359, 177, 360, 361, 362, 180, 363, 364, 365, 182, 
+   366, 367, 368, 185, 369, 370, 371, 189, 372, 373, 374, 191, 192, 203, 204, 138, 
+   139, 141, 144, 147, 150, 153, 156, 159, 162, 165, 169, 173, 178, 181, 183, 186, 
+   190, 134, 135, 115, 122, 123, 132, 40, 41, 52, 53, 23, 24, 25, 27, 6, 
+   7, 8, 10, 103, 104, 105, 6, 13, 7, 8, 10, 14, 6, 15, 13, 7, 
+   8, 10, 16, 17, 18, 6, 13, 7, 8, 10, 6, 15, 13, 7, 8, 10, 
+   6, 15, 13, 7, 8, 10, 16, 6, 15, 13, 7, 8, 10, 16, 17, 23, 
+   30, 24, 25, 27, 31, 23, 32, 30, 24, 25, 27, 33, 34, 35, 23, 30, 
+   24, 25, 27, 23, 32, 30, 24, 25, 27, 23, 32, 30, 24, 25, 27, 33, 
+   23, 32, 30, 24, 25, 27, 33, 34, 42, 46, 43, 47, 42, 48, 46, 43, 
+   49, 50, 51, 42, 46, 43, 42, 48, 46, 43, 42, 48, 46, 43, 49, 42, 
+   48, 46, 43, 49, 50, 46, 42, 43, 55, 56, 46, 42, 43, 57, 58, 59, 
+   46, 42, 43, 56, 46, 42, 43, 56, 46, 42, 43, 57, 56, 46, 42, 43, 
+   57, 58, 61, 65, 62, 66, 61, 67, 65, 62, 68, 69, 70, 61, 65, 62, 
+   61, 67, 65, 62, 61, 67, 65, 62, 68, 61, 67, 65, 62, 68, 69, 74, 
+   78, 75, 79, 74, 80, 78, 75, 81, 82, 83, 74, 78, 75, 74, 80, 78, 
+   75, 74, 80, 78, 75, 81, 74, 80, 78, 75, 81, 82, 78, 74, 75, 87, 
+   88, 78, 74, 75, 89, 90, 91, 78, 74, 75, 88, 78, 74, 75, 88, 78, 
+   74, 75, 89, 88, 78, 74, 75, 89, 90, 93, 97, 94, 98, 93, 99, 97, 
+   94, 100, 101, 102, 93, 97, 94, 93, 99, 97, 94, 93, 99, 97, 94, 100, 
+   93, 99, 97, 94, 100, 101, 103, 108, 104, 105, 109, 103, 110, 108, 104, 105, 
+   111, 112, 113, 103, 108, 104, 105, 103, 110, 108, 104, 105, 103, 110, 108, 104, 
+   105, 111, 103, 110, 108, 104, 105, 111, 112, 193, 197, 194, 198, 193, 199, 197, 
+   194, 200, 201, 202, 193, 197, 194, 193, 199, 197, 194, 193, 199, 197, 194, 200, 
+   193, 199, 197, 194, 200, 201, 197, 193, 194, 206, 207, 197, 193, 194, 208, 209, 
+   210, 197, 193, 194, 207, 197, 193, 194, 207, 197, 193, 194, 208, 207, 197, 193, 
+   194, 208, 209, 213, 225, 242, 215, 216, 259, 213, 214, 215, 216, 213, 215, 216, 
+   219, 220, 213, 221, 215, 216, 219, 222, 223, 224, 213, 215, 216, 219, 213, 221, 
+   215, 216, 219, 213, 221, 215, 216, 219, 222, 213, 221, 215, 216, 219, 222, 223, 
+   226, 227, 228, 230, 226, 233, 227, 228, 230, 234, 226, 235, 233, 227, 228, 230, 
+   236, 237, 238, 226, 233, 227, 228, 230, 226, 235, 233, 227, 228, 230, 226, 235, 
+   233, 227, 228, 230, 236, 226, 235, 233, 227, 228, 230, 236, 237, 243, 244, 245, 
+   247, 243, 250, 244, 245, 247, 251, 243, 252, 250, 244, 245, 247, 253, 254, 255, 
+   243, 250, 244, 245, 247, 243, 252, 250, 244, 245, 247, 243, 252, 250, 244, 245, 
+   247, 253, 243, 252, 250, 244, 245, 247, 253, 254, 213, 225, 242, 214, 215, 216, 
+   259, 263, 269, 265, 266, 267, 268, 265, 266, 267, 270, 274, 278, 282, 286, 290, 
+   265, 288, 289, 265, 291, 292, 293, 265, 291, 292, 273, 299, 300, 301, 273, 299, 
+   300, 303, 296, 304, 305, 306, 303, 296, 304, 303, 296, 304, 305, 97, 93, 94, 
+   309, 310, 97, 93, 94, 311, 312, 313, 97, 93, 94, 310, 97, 93, 94, 310, 
+   97, 93, 94, 311, 310, 97, 93, 94, 311, 312, 108, 103, 104, 105, 315, 316, 
+   108, 103, 104, 105, 317, 318, 319, 108, 103, 104, 105, 316, 108, 103, 104, 105, 
+   316, 108, 103, 104, 105, 317, 316, 108, 103, 104, 105, 317, 318, 372, 191, 192, 
+   203, 204, 63, 64, 93, 103, 104, 105, 94, 95, 308, 106, 314, 72, 73, 84, 
+   85, 261, 262, 294, 9, 19, 21, 20, 11, 12, 26, 36, 38, 37, 28, 29, 
+   217, 218, 229, 239, 241, 240, 231, 232, 246, 256, 258, 257, 248, 249, 
+};
+
+/** Token literal values. */
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, null, null, null, null, null, null, 
+"\74\41\55\55", "\55\55\76", "\173", "\175", "\174\75", "\176\75", "\75", "\53", "\55", "\54", 
+"\73", "\76", "\57", "\133", "\135", "\52", "\46", "\56", "\50", "\51", "\72", null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, };
+
+/** Lexer state names. */
+public static final String[] lexStateNames = {
+   "DEFAULT",
+   "IN_INTERPOLATION",
+   "IN_SINGLE_LINE_COMMENT",
+   "IN_FORMAL_COMMENT",
+   "IN_MULTI_LINE_COMMENT",
+};
+
+/** Lex State array. */
+public static final int[] jjnewLexState = {
+   -1, -1, 1, -1, 0, 2, -1, 0, 3, 4, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, 
+};
+static final long[] jjtoToken = {
+   0xfffff807ffffe003L, 0xe00ffffffeL, 
+};
+static final long[] jjtoSkip = {
+   0xc90L, 0x0L, 
+};
+static final long[] jjtoSpecial = {
+   0x410L, 0x0L, 
+};
+static final long[] jjtoMore = {
+   0x136cL, 0x0L, 
+};
+protected CharStream input_stream;
+private final int[] jjrounds = new int[375];
+private final int[] jjstateSet = new int[750];
+private final StringBuilder jjimage = new StringBuilder();
+private StringBuilder image = jjimage;
+private int jjimageLen;
+private int lengthOfMatch;
+protected char curChar;
+/** Constructor. */
+public ParserTokenManager(CharStream stream){
+   input_stream = stream;
+}
+
+/** Constructor. */
+public ParserTokenManager(CharStream stream, int lexState){
+   this(stream);
+   SwitchTo(lexState);
+}
+
+/** Reinitialise parser. */
+public void ReInit(CharStream stream)
+{
+   jjmatchedPos = jjnewStateCnt = 0;
+   curLexState = defaultLexState;
+   input_stream = stream;
+   ReInitRounds();
+}
+private void ReInitRounds()
+{
+   int i;
+   jjround = 0x80000001;
+   for (i = 375; i-- > 0;)
+      jjrounds[i] = 0x80000000;
+}
+
+/** Reinitialise parser. */
+public void ReInit(CharStream stream, int lexState)
+{
+   ReInit(stream);
+   SwitchTo(lexState);
+}
+
+/** Switch to specified lex state. */
+public void SwitchTo(int lexState)
+{
+   if (lexState >= 5 || lexState < 0)
+      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+   else
+      curLexState = lexState;
+}
+
+protected Token jjFillToken()
+{
+   final Token t;
+   final String curTokenImage;
+   final int beginLine;
+   final int endLine;
+   final int beginColumn;
+   final int endColumn;
+   String im = jjstrLiteralImages[jjmatchedKind];
+   curTokenImage = (im == null) ? input_stream.GetImage() : im;
+   beginLine = input_stream.getBeginLine();
+   beginColumn = input_stream.getBeginColumn();
+   endLine = input_stream.getEndLine();
+   endColumn = input_stream.getEndColumn();
+   t = Token.newToken(jjmatchedKind, curTokenImage);
+
+   t.beginLine = beginLine;
+   t.endLine = endLine;
+   t.beginColumn = beginColumn;
+   t.endColumn = endColumn;
+
+   return t;
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+/** Get the next Token. */
+public Token getNextToken() 
+{
+  Token specialToken = null;
+  Token matchedToken;
+  int curPos = 0;
+
+  EOFLoop :
+  for (;;)
+  {
+   try
+   {
+      curChar = input_stream.BeginToken();
+   }
+   catch(java.io.IOException e)
+   {
+      jjmatchedKind = 0;
+      matchedToken = jjFillToken();
+      matchedToken.specialToken = specialToken;
+      return matchedToken;
+   }
+   image = jjimage;
+   image.setLength(0);
+   jjimageLen = 0;
+
+   for (;;)
+   {
+     switch(curLexState)
+     {
+       case 0:
+         jjmatchedKind = 0x7fffffff;
+         jjmatchedPos = 0;
+         curPos = jjMoveStringLiteralDfa0_0();
+         if (jjmatchedPos == 0 && jjmatchedKind > 103)
+         {
+            jjmatchedKind = 103;
+         }
+         break;
+       case 1:
+         jjmatchedKind = 0x7fffffff;
+         jjmatchedPos = 0;
+         curPos = jjMoveStringLiteralDfa0_1();
+         break;
+       case 2:
+         jjmatchedKind = 0x7fffffff;
+         jjmatchedPos = 0;
+         curPos = jjMoveStringLiteralDfa0_2();
+         break;
+       case 3:
+         jjmatchedKind = 0x7fffffff;
+         jjmatchedPos = 0;
+         curPos = jjMoveStringLiteralDfa0_3();
+         if (jjmatchedPos == 0 && jjmatchedKind > 12)
+         {
+            jjmatchedKind = 12;
+         }
+         break;
+       case 4:
+         jjmatchedKind = 0x7fffffff;
+         jjmatchedPos = 0;
+         curPos = jjMoveStringLiteralDfa0_4();
+         if (jjmatchedPos == 0 && jjmatchedKind > 12)
+         {
+            jjmatchedKind = 12;
+         }
+         break;
+     }
+     if (jjmatchedKind != 0x7fffffff)
+     {
+        if (jjmatchedPos + 1 < curPos)
+           input_stream.backup(curPos - jjmatchedPos - 1);
+        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+        {
+           matchedToken = jjFillToken();
+           matchedToken.specialToken = specialToken;
+           TokenLexicalActions(matchedToken);
+       if (jjnewLexState[jjmatchedKind] != -1)
+         curLexState = jjnewLexState[jjmatchedKind];
+           return matchedToken;
+        }
+        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+        {
+           if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+           {
+              matchedToken = jjFillToken();
+              if (specialToken == null)
+                 specialToken = matchedToken;
+              else
+              {
+                 matchedToken.specialToken = specialToken;
+                 specialToken = (specialToken.next = matchedToken);
+              }
+              SkipLexicalActions(matchedToken);
+           }
+           else
+              SkipLexicalActions(null);
+         if (jjnewLexState[jjmatchedKind] != -1)
+           curLexState = jjnewLexState[jjmatchedKind];
+           continue EOFLoop;
+        }
+        MoreLexicalActions();
+      if (jjnewLexState[jjmatchedKind] != -1)
+        curLexState = jjnewLexState[jjmatchedKind];
+        curPos = 0;
+        jjmatchedKind = 0x7fffffff;
+        try {
+           curChar = input_stream.readChar();
+           continue;
+        }
+        catch (java.io.IOException e1) { }
+     }
+     int error_line = input_stream.getEndLine();
+     int error_column = input_stream.getEndColumn();
+     String error_after = null;
+     boolean EOFSeen = false;
+     try { input_stream.readChar(); input_stream.backup(1); }
+     catch (java.io.IOException e1) {
+        EOFSeen = true;
+        error_after = curPos <= 1 ? "" : input_stream.GetImage();
+        if (curChar == '\n' || curChar == '\r') {
+           error_line++;
+           error_column = 0;
+        }
+        else
+           error_column++;
+     }
+     if (!EOFSeen) {
+        input_stream.backup(1);
+        error_after = curPos <= 1 ? "" : input_stream.GetImage();
+     }
+     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+   }
+  }
+}
+
+void SkipLexicalActions(Token matchedToken)
+{
+   switch(jjmatchedKind)
+   {
+      default :
+         break;
+   }
+}
+void MoreLexicalActions()
+{
+   jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
+   switch(jjmatchedKind)
+   {
+      case 8 :
+         image.append(input_stream.GetSuffix(jjimageLen));
+         jjimageLen = 0;
+                   input_stream.backup(1);
+         break;
+      default :
+         break;
+   }
+}
+void TokenLexicalActions(Token matchedToken)
+{
+   switch(jjmatchedKind)
+   {
+      case 1 :
+        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
+          image = Parser.SPACE;
+         break;
+      default :
+         break;
+   }
+}
+private void jjCheckNAdd(int state)
+{
+   if (jjrounds[state] != jjround)
+   {
+      jjstateSet[jjnewStateCnt++] = state;
+      jjrounds[state] = jjround;
+   }
+}
+private void jjAddStates(int start, int end)
+{
+   do {
+      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+   } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+   jjCheckNAdd(state1);
+   jjCheckNAdd(state2);
+}
+
+private void jjCheckNAddStates(int start, int end)
+{
+   do {
+      jjCheckNAdd(jjnextStates[start]);
+   } while (start++ != end);
+}
+
+}
diff --git a/sass/src/com/vaadin/sass/parser/SCSSLexicalUnit.java b/sass/src/com/vaadin/sass/parser/SCSSLexicalUnit.java
new file mode 100644 (file)
index 0000000..8c2fa40
--- /dev/null
@@ -0,0 +1,16 @@
+package com.vaadin.sass.parser;
+
+import org.w3c.css.sac.LexicalUnit;
+
+public interface SCSSLexicalUnit extends LexicalUnit {
+    static final short SCSS_VARIABLE = 100;
+
+    LexicalUnitImpl divide(LexicalUnitImpl denominator);
+
+    LexicalUnitImpl add(LexicalUnitImpl another);
+
+    LexicalUnitImpl minus(LexicalUnitImpl another);
+
+    LexicalUnitImpl multiply(LexicalUnitImpl another);
+
+}
diff --git a/sass/src/com/vaadin/sass/parser/SelectorListImpl.java b/sass/src/com/vaadin/sass/parser/SelectorListImpl.java
new file mode 100644 (file)
index 0000000..634fe57
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ *
+ * $Id: SelectorListImpl.java,v 1.1 2000/08/07 01:16:21 plehegar Exp $
+ */
+package com.vaadin.sass.parser;
+
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SelectorList;
+
+/**
+ * @version $Revision: 1.1 $
+ * @author Philippe Le Hegaret
+ */
+public class SelectorListImpl implements SelectorList {
+
+    Selector[] selectors = new Selector[5];
+    int current;
+
+    @Override
+    public Selector item(int index) {
+        if ((index < 0) || (index >= current)) {
+            return null;
+        }
+        return selectors[index];
+    }
+
+    public Selector itemSelector(int index) {
+        if ((index < 0) || (index >= current)) {
+            return null;
+        }
+        return selectors[index];
+    }
+
+    @Override
+    public int getLength() {
+        return current;
+    }
+
+    public void addSelector(Selector selector) {
+        if (current == selectors.length) {
+            Selector[] old = selectors;
+            selectors = new Selector[old.length + old.length];
+            System.arraycopy(old, 0, selectors, 0, old.length);
+        }
+        selectors[current++] = selector;
+    }
+
+    public void replaceSelector(int index, Selector selector) {
+        if ((index >= 0) && (index < current)) {
+            selectors[index] = selector;
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/parser/Selectors.java b/sass/src/com/vaadin/sass/parser/Selectors.java
new file mode 100644 (file)
index 0000000..bec8d66
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 World Wide Web Consortium,
+ * (Massachusetts Institute of Technology, Institut National de
+ * Recherche en Informatique et en Automatique, Keio University). All
+ * Rights Reserved. This program is distributed under the W3C's Software
+ * Intellectual Property License. This program is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+ *
+ * $Id: Selectors.java,v 1.1 2000/02/14 16:58:31 plehegar Exp $
+ */
+package com.vaadin.sass.parser;
+
+import org.w3c.css.sac.SelectorList;
+import org.w3c.css.sac.Selector;
+
+/**
+ * @version $Revision: 1.1 $
+ * @author  Philippe Le Hegaret
+ */
+class Selectors implements SelectorList {
+
+    Selector[] selectors = new Selector[5];
+    int      current;
+
+    public Selector item(int index) {
+       if ((index < 0) || (index >= current)) {
+           return null;
+       }
+       return selectors[index];
+    }
+
+    public Selector itemSelector(int index) {
+       if ((index < 0) || (index >= current)) {
+           return null;
+       }
+       return selectors[index];
+    }
+
+    public int getLength() {
+       return current;
+    }
+
+    void addSelector(Selector selector) {
+       if (current == selectors.length) {
+           Selector[] old = selectors;
+           selectors = new Selector[old.length + old.length];
+           System.arraycopy(old, 0, selectors, 0, old.length);
+       }
+       selectors[current++] = selector;
+    }
+}
diff --git a/sass/src/com/vaadin/sass/parser/ThrowedParseException.java b/sass/src/com/vaadin/sass/parser/ThrowedParseException.java
new file mode 100644 (file)
index 0000000..5c1a9e8
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * (c) COPYRIGHT 1999 World Wide Web Consortium
+ * (Massachusetts Institute of Technology, Institut National de Recherche
+ *  en Informatique et en Automatique, Keio University).
+ * All Rights Reserved. http://www.w3.org/Consortium/Legal/
+ *
+ * $Id: ThrowedParseException.java,v 1.1 1999/06/09 15:21:33 plehegar Exp $
+ */
+package com.vaadin.sass.parser;
+
+/**
+ * @version $Revision: 1.1 $
+ * @author Philippe Le Hegaret
+ */
+class ThrowedParseException extends RuntimeException {
+    private static final long serialVersionUID = -7926371344505913546L;
+
+    ParseException e;
+
+    /**
+     * Creates a new ThrowedParseException
+     */
+    ThrowedParseException(ParseException e) {
+        this.e = e;
+    }
+}
diff --git a/sass/src/com/vaadin/sass/parser/Token.java b/sass/src/com/vaadin/sass/parser/Token.java
new file mode 100644 (file)
index 0000000..554b978
--- /dev/null
@@ -0,0 +1,131 @@
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
+/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+package com.vaadin.sass.parser;
+
+/**
+ * Describes the input token stream.
+ */
+
+public class Token implements java.io.Serializable {
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * An integer that describes the kind of this token.  This numbering
+   * system is determined by JavaCCParser, and a table of these numbers is
+   * stored in the file ...Constants.java.
+   */
+  public int kind;
+
+  /** The line number of the first character of this Token. */
+  public int beginLine;
+  /** The column number of the first character of this Token. */
+  public int beginColumn;
+  /** The line number of the last character of this Token. */
+  public int endLine;
+  /** The column number of the last character of this Token. */
+  public int endColumn;
+
+  /**
+   * The string image of the token.
+   */
+  public String image;
+
+  /**
+   * A reference to the next regular (non-special) token from the input
+   * stream.  If this is the last token from the input stream, or if the
+   * token manager has not read tokens beyond this one, this field is
+   * set to null.  This is true only if this token is also a regular
+   * token.  Otherwise, see below for a description of the contents of
+   * this field.
+   */
+  public Token next;
+
+  /**
+   * This field is used to access special tokens that occur prior to this
+   * token, but after the immediately preceding regular (non-special) token.
+   * If there are no such special tokens, this field is set to null.
+   * When there are more than one such special token, this field refers
+   * to the last of these special tokens, which in turn refers to the next
+   * previous special token through its specialToken field, and so on
+   * until the first special token (whose specialToken field is null).
+   * The next fields of special tokens refer to other special tokens that
+   * immediately follow it (without an intervening regular token).  If there
+   * is no such token, this field is null.
+   */
+  public Token specialToken;
+
+  /**
+   * An optional attribute value of the Token.
+   * Tokens which are not used as syntactic sugar will often contain
+   * meaningful values that will be used later on by the compiler or
+   * interpreter. This attribute value is often different from the image.
+   * Any subclass of Token that actually wants to return a non-null value can
+   * override this method as appropriate.
+   */
+  public Object getValue() {
+    return null;
+  }
+
+  /**
+   * No-argument constructor
+   */
+  public Token() {}
+
+  /**
+   * Constructs a new token for the specified Image.
+   */
+  public Token(int kind)
+  {
+    this(kind, null);
+  }
+
+  /**
+   * Constructs a new token for the specified Image and Kind.
+   */
+  public Token(int kind, String image)
+  {
+    this.kind = kind;
+    this.image = image;
+  }
+
+  /**
+   * Returns the image.
+   */
+  public String toString()
+  {
+    return image;
+  }
+
+  /**
+   * Returns a new Token object, by default. However, if you want, you
+   * can create and return subclass objects based on the value of ofKind.
+   * Simply add the cases to the switch for all those special cases.
+   * For example, if you have a subclass of Token called IDToken that
+   * you want to create if ofKind is ID, simply add something like :
+   *
+   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
+   *
+   * to the following switch statement. Then you can cast matchedToken
+   * variable to the appropriate type and use sit in your lexical actions.
+   */
+  public static Token newToken(int ofKind, String image)
+  {
+    switch(ofKind)
+    {
+      default : return new Token(ofKind, image);
+    }
+  }
+
+  public static Token newToken(int ofKind)
+  {
+    return newToken(ofKind, null);
+  }
+
+}
+/* JavaCC - OriginalChecksum=fd921a11cd37e391729b9460c71d3ad6 (do not edit this line) */
diff --git a/sass/src/com/vaadin/sass/parser/TokenMgrError.java b/sass/src/com/vaadin/sass/parser/TokenMgrError.java
new file mode 100644 (file)
index 0000000..311bf0d
--- /dev/null
@@ -0,0 +1,147 @@
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
+/* JavaCCOptions: */
+package com.vaadin.sass.parser;
+
+/** Token Manager Error. */
+public class TokenMgrError extends Error
+{
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
+
+  /*
+   * Ordinals for various reasons why an Error of this type can be thrown.
+   */
+
+  /**
+   * Lexical error occurred.
+   */
+  static final int LEXICAL_ERROR = 0;
+
+  /**
+   * An attempt was made to create a second instance of a static token manager.
+   */
+  static final int STATIC_LEXER_ERROR = 1;
+
+  /**
+   * Tried to change to an invalid lexical state.
+   */
+  static final int INVALID_LEXICAL_STATE = 2;
+
+  /**
+   * Detected (and bailed out of) an infinite loop in the token manager.
+   */
+  static final int LOOP_DETECTED = 3;
+
+  /**
+   * Indicates the reason why the exception is thrown. It will have
+   * one of the above 4 values.
+   */
+  int errorCode;
+
+  /**
+   * Replaces unprintable characters by their escaped (or unicode escaped)
+   * equivalents in the given string
+   */
+  protected static final String addEscapes(String str) {
+    StringBuffer retval = new StringBuffer();
+    char ch;
+    for (int i = 0; i < str.length(); i++) {
+      switch (str.charAt(i))
+      {
+        case 0 :
+          continue;
+        case '\b':
+          retval.append("\\b");
+          continue;
+        case '\t':
+          retval.append("\\t");
+          continue;
+        case '\n':
+          retval.append("\\n");
+          continue;
+        case '\f':
+          retval.append("\\f");
+          continue;
+        case '\r':
+          retval.append("\\r");
+          continue;
+        case '\"':
+          retval.append("\\\"");
+          continue;
+        case '\'':
+          retval.append("\\\'");
+          continue;
+        case '\\':
+          retval.append("\\\\");
+          continue;
+        default:
+          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+            String s = "0000" + Integer.toString(ch, 16);
+            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+          } else {
+            retval.append(ch);
+          }
+          continue;
+      }
+    }
+    return retval.toString();
+  }
+
+  /**
+   * Returns a detailed message for the Error when it is thrown by the
+   * token manager to indicate a lexical error.
+   * Parameters :
+   *    EOFSeen     : indicates if EOF caused the lexical error
+   *    curLexState : lexical state in which this error occurred
+   *    errorLine   : line number when the error occurred
+   *    errorColumn : column number when the error occurred
+   *    errorAfter  : prefix that was seen before this error occurred
+   *    curchar     : the offending character
+   * Note: You can customize the lexical error message by modifying this method.
+   */
+  protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+    return("Lexical error at line " +
+          errorLine + ", column " +
+          errorColumn + ".  Encountered: " +
+          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+          "after : \"" + addEscapes(errorAfter) + "\"");
+  }
+
+  /**
+   * You can also modify the body of this method to customize your error messages.
+   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+   * of end-users concern, so you can return something like :
+   *
+   *     "Internal Error : Please file a bug report .... "
+   *
+   * from this method for such cases in the release version of your parser.
+   */
+  public String getMessage() {
+    return super.getMessage();
+  }
+
+  /*
+   * Constructors of various flavors follow.
+   */
+
+  /** No arg constructor. */
+  public TokenMgrError() {
+  }
+
+  /** Constructor with message and reason. */
+  public TokenMgrError(String message, int reason) {
+    super(message);
+    errorCode = reason;
+  }
+
+  /** Full Constructor. */
+  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+    this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+  }
+}
+/* JavaCC - OriginalChecksum=7d5524d89510a94f7c2ac022e99c24c3 (do not edit this line) */
diff --git a/sass/src/com/vaadin/sass/selector/CompositeSelector.java b/sass/src/com/vaadin/sass/selector/CompositeSelector.java
new file mode 100644 (file)
index 0000000..cd6026a
--- /dev/null
@@ -0,0 +1,27 @@
+package com.vaadin.sass.selector;
+
+import org.w3c.css.sac.Selector;
+
+public class CompositeSelector implements Selector {
+    public static final short SCSS_COMPOSITE_SELECTOR = 100;
+    private Selector first;
+    private Selector second;
+
+    public CompositeSelector(Selector first, Selector second) {
+        this.first = first;
+        this.second = second;
+    }
+
+    public Selector getFirst() {
+        return first;
+    }
+
+    public Selector getSecond() {
+        return second;
+    }
+
+    @Override
+    public short getSelectorType() {
+        return SCSS_COMPOSITE_SELECTOR;
+    }
+}
diff --git a/sass/src/com/vaadin/sass/selector/SelectorUtil.java b/sass/src/com/vaadin/sass/selector/SelectorUtil.java
new file mode 100644 (file)
index 0000000..92fc332
--- /dev/null
@@ -0,0 +1,292 @@
+package com.vaadin.sass.selector;
+
+import org.w3c.css.sac.CombinatorCondition;
+import org.w3c.css.sac.Condition;
+import org.w3c.css.sac.ConditionFactory;
+import org.w3c.css.sac.ConditionalSelector;
+import org.w3c.css.sac.DescendantSelector;
+import org.w3c.css.sac.ElementSelector;
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
+import org.w3c.css.sac.SiblingSelector;
+import org.w3c.css.sac.SimpleSelector;
+import org.w3c.flute.parser.selectors.AndConditionImpl;
+import org.w3c.flute.parser.selectors.AttributeConditionImpl;
+import org.w3c.flute.parser.selectors.ClassConditionImpl;
+import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
+import org.w3c.flute.parser.selectors.DirectAdjacentSelectorImpl;
+import org.w3c.flute.parser.selectors.ElementSelectorImpl;
+import org.w3c.flute.parser.selectors.IdConditionImpl;
+import org.w3c.flute.parser.selectors.PseudoClassConditionImpl;
+import org.w3c.flute.parser.selectors.PseudoElementSelectorImpl;
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+
+import com.vaadin.sass.parser.SelectorListImpl;
+
+public class SelectorUtil {
+
+    public static String toString(CompositeSelector compositeSelector) {
+        StringBuilder builder = new StringBuilder();
+        if (compositeSelector != null) {
+            if (compositeSelector.getFirst() != null) {
+                builder.append(toString(compositeSelector.getFirst())).append(
+                        " ");
+            }
+            if (compositeSelector.getSecond() != null) {
+                builder.append(toString(compositeSelector.getSecond()));
+            }
+        }
+        return builder.toString();
+    }
+
+    public static String toString(SelectorList selectorList) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < selectorList.getLength(); i++) {
+            String selectorString = toString(selectorList.item(i));
+            stringBuilder.append(selectorString);
+            if (selectorList.getLength() > i + 1) {
+                stringBuilder.append(", ");
+            }
+        }
+        return stringBuilder.toString();
+    }
+
+    public static String toString(Selector selector) {
+        if (selector == null) {
+            return "";
+        }
+        if (selector.getSelectorType() == Selector.SAC_CONDITIONAL_SELECTOR) {
+            StringBuilder stringBuilder = new StringBuilder();
+            ConditionalSelector conditionalSelector = (ConditionalSelector) selector;
+            String simpleSelectorString = toString(conditionalSelector
+                    .getSimpleSelector());
+            if (simpleSelectorString != null) {
+                stringBuilder.append(simpleSelectorString);
+            }
+            String conditionString = getConditionString(conditionalSelector
+                    .getCondition());
+            stringBuilder.append(conditionString);
+            return stringBuilder.toString();
+        } else if (selector.getSelectorType() == Selector.SAC_DESCENDANT_SELECTOR) {
+            return getDecendantSelectorString((DescendantSelector) selector,
+                    " ");
+        } else if (selector.getSelectorType() == Selector.SAC_CHILD_SELECTOR) {
+            DescendantSelector childSelector = (DescendantSelector) selector;
+            String seperator = " > ";
+            if (childSelector.getSimpleSelector() instanceof PseudoElementSelectorImpl) {
+                seperator = "::";
+            }
+            return getDecendantSelectorString((DescendantSelector) selector,
+                    seperator);
+        } else if (selector.getSelectorType() == Selector.SAC_ELEMENT_NODE_SELECTOR) {
+            ElementSelectorImpl elementSelector = (ElementSelectorImpl) selector;
+            return elementSelector.getLocalName() == null ? ""
+                    : elementSelector.getLocalName();
+        } else if (selector.getSelectorType() == Selector.SAC_DIRECT_ADJACENT_SELECTOR) {
+            DirectAdjacentSelectorImpl directAdjacentSelector = (DirectAdjacentSelectorImpl) selector;
+            StringBuilder stringBuilder = new StringBuilder();
+            stringBuilder
+                    .append(toString(directAdjacentSelector.getSelector()));
+            stringBuilder.append(" + ");
+            stringBuilder.append(toString(directAdjacentSelector
+                    .getSiblingSelector()));
+            return stringBuilder.toString();
+        } else if (selector.getSelectorType() == Selector.SAC_PSEUDO_ELEMENT_SELECTOR) {
+            PseudoElementSelectorImpl pseudoElementSelectorImpl = (PseudoElementSelectorImpl) selector;
+            return pseudoElementSelectorImpl.getLocalName();
+        } else if (selector.getSelectorType() == CompositeSelector.SCSS_COMPOSITE_SELECTOR) {
+            return toString((CompositeSelector) selector);
+        } else {
+            System.out.println("SU !Unknown selector type, type: "
+                    + selector.getSelectorType() + ", " + selector.toString());
+        }
+        return "";
+    }
+
+    private static String getDecendantSelectorString(
+            DescendantSelector selector, String separator) {
+        StringBuilder stringBuilder = new StringBuilder();
+        String ancestor = toString(selector.getAncestorSelector());
+        String simpleSelector = toString(selector.getSimpleSelector());
+        stringBuilder.append(ancestor);
+        stringBuilder.append(separator);
+        stringBuilder.append(simpleSelector);
+        return stringBuilder.toString();
+    }
+
+    private static String getConditionString(Condition condition) {
+        short conditionType = condition.getConditionType();
+        if (conditionType == Condition.SAC_CLASS_CONDITION) {
+            ClassConditionImpl classCondition = (ClassConditionImpl) condition;
+            return "." + classCondition.getValue();
+        } else if (conditionType == Condition.SAC_ID_CONDITION) {
+            IdConditionImpl idCondition = (IdConditionImpl) condition;
+            return "#" + idCondition.getValue();
+        } else if (conditionType == Condition.SAC_AND_CONDITION) {
+            AndConditionImpl andCondition = (AndConditionImpl) condition;
+            return getConditionString(andCondition.getFirstCondition())
+                    + getConditionString(andCondition.getSecondCondition());
+        } else if (conditionType == Condition.SAC_ATTRIBUTE_CONDITION) {
+            AttributeConditionImpl attributeCondition = (AttributeConditionImpl) condition;
+            StringBuilder string = new StringBuilder();
+            string.append('[');
+            string.append(attributeCondition.getLocalName());
+            String value = attributeCondition.getValue();
+            if ("true".equals(value) || "false".equals(value)) {
+                string.append("=").append(value).append(']');
+            } else {
+                string.append("=\"");
+                string.append(attributeCondition.getValue());
+                string.append("\"]");
+            }
+            return string.toString();
+        } else if (conditionType == Condition.SAC_PSEUDO_CLASS_CONDITION) {
+            PseudoClassConditionImpl pseudoClassCondition = (PseudoClassConditionImpl) condition;
+            return ":" + pseudoClassCondition.getValue();
+        } else {
+            System.out.println("CU !condition type not identified, type: "
+                    + conditionType + ", " + condition.toString());
+            return "";
+        }
+    }
+
+    public static boolean hasParentSelector(SelectorList selectorList) {
+        String selectorString = toString(selectorList);
+        return selectorString.contains("&");
+    }
+
+    public static SelectorList createNewSelectorListFromAnOldOneWithSomPartReplaced(
+            SelectorList oldList, String toBeReplacedSelectorName,
+            SelectorList candidateSelectorList) throws Exception {
+        if (candidateSelectorList.getLength() != 1) {
+            throw new Exception("Candidate selector should not be a list");
+        }
+        if (!(candidateSelectorList.item(0) instanceof SimpleSelector)) {
+            throw new Exception(
+                    "Candidate selector should only be a SimpleSelector");
+        }
+        SelectorListImpl newSelectorList = new SelectorListImpl();
+        SimpleSelector candidateSelector = (SimpleSelector) candidateSelectorList
+                .item(0);
+        for (int i = 0; i < oldList.getLength(); i++) {
+            Selector selector = oldList.item(i);
+            newSelectorList.addSelector(createSelectorWithSomePartReplaced(
+                    selector, toBeReplacedSelectorName, candidateSelector));
+        }
+        return newSelectorList;
+    }
+
+    private static Selector createSelectorWithSomePartReplaced(
+            Selector selector, String toBeReplacedSelectorName,
+            SimpleSelector candidateSelector) {
+        if (!toString(selector).contains(toBeReplacedSelectorName)) {
+            return selector;
+        }
+        SelectorFactory factory = new SelectorFactoryImpl();
+        if (selector instanceof SimpleSelector) {
+            return createSimpleSelectorWithSomePartReplaced(
+                    (SimpleSelector) selector, toBeReplacedSelectorName,
+                    candidateSelector);
+        } else if (selector instanceof DescendantSelector) {
+            DescendantSelector descendantSelector = (DescendantSelector) selector;
+            Selector ancestor = descendantSelector.getAncestorSelector();
+            SimpleSelector simpleSelector = descendantSelector
+                    .getSimpleSelector();
+            return factory.createDescendantSelector(
+                    createSelectorWithSomePartReplaced(ancestor,
+                            toBeReplacedSelectorName, candidateSelector),
+                    createSimpleSelectorWithSomePartReplaced(simpleSelector,
+                            toBeReplacedSelectorName, candidateSelector));
+        } else if (selector instanceof DirectAdjacentSelectorImpl) {
+            SiblingSelector siblingSelector = (SiblingSelector) selector;
+            Selector ancestor = siblingSelector.getSelector();
+            SimpleSelector simpleSelector = siblingSelector
+                    .getSiblingSelector();
+            return factory.createDirectAdjacentSelector(
+                    Selector.SAC_DIRECT_ADJACENT_SELECTOR, ancestor,
+                    simpleSelector);
+        } else if (selector instanceof CompositeSelector) {
+            CompositeSelector compositeSelector = (CompositeSelector) selector;
+            Selector first = compositeSelector.getFirst();
+            Selector second = compositeSelector.getSecond();
+            return new CompositeSelector(createSelectorWithSomePartReplaced(
+                    first, toBeReplacedSelectorName, candidateSelector),
+                    createSelectorWithSomePartReplaced(second,
+                            toBeReplacedSelectorName, candidateSelector));
+        }
+        return null;
+    }
+
+    private static SimpleSelector createSimpleSelectorWithSomePartReplaced(
+            SimpleSelector simpleSelector, String toBeReplacedSelectorName,
+            SimpleSelector candidateSelector) {
+        if (simpleSelector == null
+                || !toString(simpleSelector).contains(toBeReplacedSelectorName)) {
+            return simpleSelector;
+        }
+        if (simpleSelector instanceof ElementSelector
+                && candidateSelector instanceof ElementSelector) {
+            return candidateSelector;
+        }
+        if (simpleSelector instanceof ConditionalSelector) {
+            return createConditionSelectorWithSomePartReplaced(
+                    (ConditionalSelector) simpleSelector,
+                    toBeReplacedSelectorName, candidateSelector);
+        }
+        return simpleSelector;
+    }
+
+    private static ConditionalSelector createConditionSelectorWithSomePartReplaced(
+            ConditionalSelector oldConditionSelector,
+            String toBeReplacedSelectorName, SimpleSelector candidateSelector) {
+        if (oldConditionSelector == null
+                || !toString(oldConditionSelector).contains(
+                        toBeReplacedSelectorName)) {
+            return oldConditionSelector;
+        }
+        SelectorFactory selectorFactory = new SelectorFactoryImpl();
+        if (candidateSelector instanceof ElementSelector) {
+            return selectorFactory.createConditionalSelector(candidateSelector,
+                    oldConditionSelector.getCondition());
+        }
+        if (candidateSelector instanceof ConditionalSelector) {
+            // TODO some cases not covered.
+            ConditionalSelector candidateConditionSelector = (ConditionalSelector) candidateSelector;
+            Condition newCondition = createConditionWithSomePartReplaced(
+                    oldConditionSelector.getCondition(),
+                    toBeReplacedSelectorName,
+                    candidateConditionSelector.getCondition());
+            return selectorFactory.createConditionalSelector(
+                    oldConditionSelector.getSimpleSelector(), newCondition);
+        }
+        return oldConditionSelector;
+    }
+
+    private static Condition createConditionWithSomePartReplaced(
+            Condition oldCondition, String toBeReplaced, Condition candidate) {
+        if (oldCondition == null
+                || !getConditionString(oldCondition).contains(toBeReplaced)) {
+            return oldCondition;
+        }
+        if (oldCondition.getConditionType() == Condition.SAC_AND_CONDITION) {
+            ConditionFactory conditionFactory = new ConditionFactoryImpl();
+            CombinatorCondition oldCombinatorCondition = (CombinatorCondition) oldCondition;
+            Condition newFirstCondition = createConditionWithSomePartReplaced(
+                    oldCombinatorCondition.getFirstCondition(), toBeReplaced,
+                    candidate);
+            Condition newSecondCondition = createConditionWithSomePartReplaced(
+                    oldCombinatorCondition.getSecondCondition(), toBeReplaced,
+                    candidate);
+            return conditionFactory.createAndCondition(newFirstCondition,
+                    newSecondCondition);
+        } else {
+            return candidate;
+        }
+    }
+
+    public static boolean equals(Selector one, Selector another) {
+        return one == null ? another == null : toString(one).equals(
+                toString(another));
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/BlockNode.java b/sass/src/com/vaadin/sass/tree/BlockNode.java
new file mode 100644 (file)
index 0000000..946a6b9
--- /dev/null
@@ -0,0 +1,57 @@
+package com.vaadin.sass.tree;
+
+import org.w3c.css.sac.SelectorList;
+
+import com.vaadin.sass.parser.SelectorListImpl;
+import com.vaadin.sass.selector.SelectorUtil;
+
+public class BlockNode extends Node {
+
+    private static final long serialVersionUID = 5742962631468325048L;
+
+    SelectorList selectorList;
+
+    public BlockNode(SelectorList selectorList) {
+        this.selectorList = selectorList;
+    }
+
+    public SelectorList getSelectorList() {
+        return selectorList;
+    }
+
+    public void setSelectorList(SelectorList selectorList) {
+        this.selectorList = selectorList;
+    }
+
+    public String toString(boolean indent) {
+        StringBuilder string = new StringBuilder();
+        string.append(SelectorUtil.toString(selectorList));
+        string.append(" {\n");
+        for (Node child : children) {
+            if (indent) {
+                string.append("\t");
+            }
+            string.append("\t" + child.toString() + "\n");
+        }
+        if (indent) {
+            string.append("\t");
+        }
+        string.append("}");
+        return string.toString();
+    }
+
+    @Override
+    public String toString() {
+        return toString(false);
+    }
+
+    @Override
+    protected Object clone() throws CloneNotSupportedException {
+        SelectorListImpl clonedSelectorList = new SelectorListImpl();
+        for (int i = 0; i < selectorList.getLength(); i++) {
+            clonedSelectorList.addSelector(selectorList.item(i));
+        }
+        return null;
+        // BlockNode clone = new BlockNode()
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/EachNode.java b/sass/src/com/vaadin/sass/tree/EachNode.java
new file mode 100644 (file)
index 0000000..e60663b
--- /dev/null
@@ -0,0 +1,22 @@
+package com.vaadin.sass.tree;
+
+public class EachNode extends Node {
+    private static final long serialVersionUID = 7943948981204906221L;
+
+    private String var;
+    private String list;
+    private String body;
+
+    public EachNode(String var, String list, String body) {
+        super();
+        this.var = var;
+        this.list = list;
+        this.body = body;
+    }
+
+    @Override
+    public String toString() {
+        return "Each Node: {variable: " + var + ", list: " + list + ", body: "
+                + body + "}";
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/ExtendNode.java b/sass/src/com/vaadin/sass/tree/ExtendNode.java
new file mode 100644 (file)
index 0000000..2e49637
--- /dev/null
@@ -0,0 +1,19 @@
+package com.vaadin.sass.tree;
+
+import org.w3c.css.sac.SelectorList;
+
+public class ExtendNode extends Node {
+    private static final long serialVersionUID = 3301805078983796878L;
+
+    SelectorList list;
+
+    public ExtendNode(SelectorList list) {
+        super();
+        this.list = list;
+    }
+
+    public SelectorList getList() {
+        return list;
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/tree/ForNode.java b/sass/src/com/vaadin/sass/tree/ForNode.java
new file mode 100644 (file)
index 0000000..ae083a0
--- /dev/null
@@ -0,0 +1,28 @@
+package com.vaadin.sass.tree;
+
+public class ForNode extends Node {
+    private static final long serialVersionUID = -1159180539216623335L;
+
+    String var;
+    String from;
+    String to;
+    boolean exclusive;
+    String body;
+
+    public ForNode(String var, String from, String to, boolean exclusive,
+            String body) {
+        super();
+        this.var = var;
+        this.from = from;
+        this.to = to;
+        this.exclusive = exclusive;
+        this.body = body;
+    }
+
+    @Override
+    public String toString() {
+        return "For Node: " + "{variable: " + var + ", from:" + from + ", to: "
+                + to + ", exclusive: " + exclusive + ", body" + body;
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/tree/FunctionNode.java b/sass/src/com/vaadin/sass/tree/FunctionNode.java
new file mode 100644 (file)
index 0000000..898a2f9
--- /dev/null
@@ -0,0 +1,26 @@
+package com.vaadin.sass.tree;
+
+public class FunctionNode extends Node {
+    private static final long serialVersionUID = -5383104165955523923L;
+
+    private String name;
+    private String args;
+    private String body;
+
+    public FunctionNode(String name) {
+        super();
+        this.name = name;
+    }
+
+    public FunctionNode(String name, String args, String body) {
+        this.name = name;
+        this.args = args;
+        this.body = body;
+    }
+
+    @Override
+    public String toString() {
+        return "Function Node: {name: " + name + ", args: " + args + ", body: "
+                + body + "}";
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/IfNode.java b/sass/src/com/vaadin/sass/tree/IfNode.java
new file mode 100644 (file)
index 0000000..148ab1e
--- /dev/null
@@ -0,0 +1,6 @@
+package com.vaadin.sass.tree;
+
+public class IfNode extends Node {
+    private static final long serialVersionUID = 1561250630856748066L;
+
+}
diff --git a/sass/src/com/vaadin/sass/tree/ImportNode.java b/sass/src/com/vaadin/sass/tree/ImportNode.java
new file mode 100644 (file)
index 0000000..46657df
--- /dev/null
@@ -0,0 +1,55 @@
+package com.vaadin.sass.tree;
+
+import org.w3c.css.sac.SACMediaList;
+
+public class ImportNode extends Node {
+    private static final long serialVersionUID = 5671255892282668438L;
+
+    private String uri;
+    private SACMediaList ml;
+    private boolean isURL;
+
+    public ImportNode(String uri, SACMediaList ml, boolean isURL) {
+        super();
+        this.uri = uri;
+        this.ml = ml;
+        this.isURL = isURL;
+    }
+
+    public boolean isPureCssImport() {
+        return (isURL || uri.endsWith(".css") || uri.startsWith("http://") || hasMediaQueries());
+    }
+
+    private boolean hasMediaQueries() {
+        return (ml != null && ml.getLength() >= 1 && !"all".equals(ml.item(0)));
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder("@import ");
+        if (isURL) {
+            builder.append("url(").append(uri).append(")");
+        } else {
+            builder.append("\"").append(uri).append("\"");
+        }
+        if (hasMediaQueries()) {
+            for (int i = 0; i < ml.getLength(); i++) {
+                builder.append(" ").append(ml.item(i));
+            }
+        }
+        builder.append(";");
+        return builder.toString();
+    }
+
+    public String getUri() {
+        return uri;
+    }
+
+    public void setUri(String uri) {
+        this.uri = uri;
+    }
+
+    public SACMediaList getMl() {
+        return ml;
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/MediaNode.java b/sass/src/com/vaadin/sass/tree/MediaNode.java
new file mode 100644 (file)
index 0000000..5a824f0
--- /dev/null
@@ -0,0 +1,43 @@
+package com.vaadin.sass.tree;
+
+import org.w3c.css.sac.SACMediaList;
+
+public class MediaNode extends Node {
+    private static final long serialVersionUID = 2502097081457509523L;
+
+    SACMediaList media;
+
+    public MediaNode(SACMediaList media) {
+        super();
+        this.media = media;
+    }
+
+    public SACMediaList getMedia() {
+        return media;
+    }
+
+    public void setMedia(SACMediaList media) {
+        this.media = media;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder("@media ");
+        if (media != null) {
+            for (int i = 0; i < media.getLength(); i++) {
+                builder.append(media.item(i));
+            }
+        }
+        builder.append(" {\n");
+        for (Node child : children) {
+            if (child instanceof BlockNode) {
+                builder.append("\t" + ((BlockNode) child).toString(true) + "\n");
+            } else {
+                builder.append("\t" + child.toString() + "\n");
+            }
+
+        }
+        builder.append("}");
+        return builder.toString();
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/MixinDefNode.java b/sass/src/com/vaadin/sass/tree/MixinDefNode.java
new file mode 100644 (file)
index 0000000..891724f
--- /dev/null
@@ -0,0 +1,51 @@
+package com.vaadin.sass.tree;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class MixinDefNode extends Node {
+    private static final long serialVersionUID = 5469294053247343948L;
+
+    private String name;
+    private ArrayList<VariableNode> arglist;
+    private String args;
+    private String body;
+
+    public MixinDefNode(String name, Collection<VariableNode> args) {
+        super();
+        this.name = name;
+        arglist = new ArrayList<VariableNode>();
+        if (args != null && !args.isEmpty()) {
+            arglist.addAll(args);
+        }
+    }
+
+    public MixinDefNode(String name, String args, String body) {
+        this.name = name;
+        this.args = args;
+        this.body = body;
+    }
+
+    @Override
+    public String toString() {
+        return "Mixin Definition Node: {name: " + name + ", args: " + args
+                + ", body: " + body + "}";
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ArrayList<VariableNode> getArglist() {
+        return arglist;
+    }
+
+    public void setArglist(ArrayList<VariableNode> arglist) {
+        this.arglist = arglist;
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/tree/MixinNode.java b/sass/src/com/vaadin/sass/tree/MixinNode.java
new file mode 100644 (file)
index 0000000..596765d
--- /dev/null
@@ -0,0 +1,43 @@
+package com.vaadin.sass.tree;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.w3c.css.sac.LexicalUnit;
+
+public class MixinNode extends Node {
+    private static final long serialVersionUID = 4725008226813110658L;
+
+    private String name;
+    private ArrayList<LexicalUnit> arglist;
+
+    public MixinNode(String name, Collection<LexicalUnit> args) {
+        super();
+        this.name = name;
+        arglist = new ArrayList<LexicalUnit>();
+        if (args != null && !args.isEmpty()) {
+            arglist.addAll(args);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "name: " + name + " args: " + arglist;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ArrayList<LexicalUnit> getArglist() {
+        return arglist;
+    }
+
+    public void setArglist(ArrayList<LexicalUnit> arglist) {
+        this.arglist = arglist;
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/NestPropertiesNode.java b/sass/src/com/vaadin/sass/tree/NestPropertiesNode.java
new file mode 100644 (file)
index 0000000..51a4649
--- /dev/null
@@ -0,0 +1,40 @@
+package com.vaadin.sass.tree;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class NestPropertiesNode extends Node {
+    private static final long serialVersionUID = 3671253315690598308L;
+
+    public NestPropertiesNode(String name) {
+        super();
+        this.name = name;
+    }
+
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Collection<RuleNode> unNesting() {
+        List<RuleNode> result = new ArrayList<RuleNode>();
+        for (Node child : children) {
+            result.add(createNewRuleNodeFromChild((RuleNode) child));
+        }
+        return result;
+    }
+
+    public RuleNode createNewRuleNodeFromChild(RuleNode child) {
+        StringBuilder builder = new StringBuilder(name);
+        builder.append("-").append(child.getVariable());
+        RuleNode newRuleNode = new RuleNode(builder.toString(),
+                child.getValue(), child.isImportant(), null);
+        return newRuleNode;
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/Node.java b/sass/src/com/vaadin/sass/tree/Node.java
new file mode 100644 (file)
index 0000000..2e53947
--- /dev/null
@@ -0,0 +1,92 @@
+package com.vaadin.sass.tree;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public abstract class Node implements Serializable {
+    private static final long serialVersionUID = 5914711715839294816L;
+
+    protected ArrayList<Node> children;
+    private String fileName;
+
+    protected String rawString;
+    protected List<String> variables;
+
+    public Node() {
+        children = new ArrayList<Node>();
+        variables = new ArrayList<String>();
+    }
+
+    public Node(String raw) {
+        this();
+        rawString = raw;
+    }
+
+    public void appendAll(Collection<Node> nodes) {
+        if (nodes != null && !nodes.isEmpty()) {
+            children.addAll(nodes);
+        }
+    }
+
+    public void appendChild(Node node) {
+        if (node != null) {
+            children.add(node);
+        }
+    }
+
+    public void appendChild(Node node, Node after) {
+        if (node != null) {
+            int index = children.indexOf(after);
+            if (index != -1) {
+                children.add(index + 1, node);
+            } else {
+                throw new NullPointerException("after-node was not found");
+            }
+        }
+    }
+
+    public void removeChild(Node node) {
+        if (node != null) {
+            children.remove(node);
+        }
+    }
+
+    public ArrayList<Node> getChildren() {
+        return children;
+    }
+
+    public void setChildren(ArrayList<Node> children) {
+        this.children = children;
+    }
+
+    public boolean hasChildren() {
+        return !children.isEmpty();
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    @Override
+    public String toString() {
+        return "";
+    }
+
+    public String getRawString() {
+        return rawString;
+    }
+
+    public void addVariable(String var) {
+        variables.add(var);
+    }
+
+    public void removeVariable(String var) {
+        variables.remove(var);
+    }
+}
diff --git a/sass/src/com/vaadin/sass/tree/RuleNode.java b/sass/src/com/vaadin/sass/tree/RuleNode.java
new file mode 100644 (file)
index 0000000..1683a72
--- /dev/null
@@ -0,0 +1,64 @@
+package com.vaadin.sass.tree;
+
+import org.w3c.css.sac.LexicalUnit;
+
+public class RuleNode extends Node {
+    private static final long serialVersionUID = 6653493127869037022L;
+
+    String variable;
+    LexicalUnit value;
+    String comment;
+    private boolean important;
+
+    public RuleNode(String variable, LexicalUnit value, boolean important,
+            String comment) {
+        this.variable = variable;
+        this.value = value;
+        this.important = important;
+        this.comment = comment;
+    }
+
+    public String getVariable() {
+        return variable;
+    }
+
+    public void setVariable(String variable) {
+        this.variable = variable;
+    }
+
+    public LexicalUnit getValue() {
+        return value;
+    }
+
+    public void setValue(LexicalUnit value) {
+        this.value = value;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append(variable).append(": ").append(value.toString());
+        builder.append(important ? " !important;" : ";");
+        if (comment != null) {
+            builder.append(comment);
+        }
+        return builder.toString();
+    }
+
+    public boolean isImportant() {
+        return important;
+    }
+
+    public void setImportant(boolean important) {
+        this.important = important;
+    }
+
+    public String getComment() {
+        return comment;
+    }
+
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/tree/VariableNode.java b/sass/src/com/vaadin/sass/tree/VariableNode.java
new file mode 100644 (file)
index 0000000..3a7a5fe
--- /dev/null
@@ -0,0 +1,51 @@
+package com.vaadin.sass.tree;
+
+import org.w3c.css.sac.LexicalUnit;
+
+public class VariableNode extends Node {
+    private static final long serialVersionUID = 7003372557547748734L;
+
+    private String name;
+    private LexicalUnit expr;
+    private boolean guarded;
+
+    public VariableNode(String name, LexicalUnit expr, boolean guarded) {
+        super();
+        this.name = name;
+        this.expr = expr;
+        this.guarded = guarded;
+    }
+
+    public VariableNode(String name, String raw) {
+        super(raw);
+        this.name = name;
+    }
+
+    public LexicalUnit getExpr() {
+        return expr;
+    }
+
+    public void setExpr(LexicalUnit expr) {
+        this.expr = expr;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public boolean isGuarded() {
+        return guarded;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder("$");
+        builder.append(name).append(": ").append(expr);
+        return builder.toString();
+    }
+
+    public void setGuarded(boolean guarded) {
+        this.guarded = guarded;
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/tree/WhileNode.java b/sass/src/com/vaadin/sass/tree/WhileNode.java
new file mode 100644 (file)
index 0000000..3ec3b2e
--- /dev/null
@@ -0,0 +1,20 @@
+package com.vaadin.sass.tree;
+
+
+public class WhileNode extends Node {
+    private static final long serialVersionUID = 7593896018196027279L;
+
+    private String condition;
+    private String body;
+
+    public WhileNode(String condition, String body) {
+        this.condition = condition;
+        this.body = body;
+    }
+
+    @Override
+    public String toString() {
+        return "While Node: { condition: " + condition + ", body:" + body + "}";
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/util/ColorUtil.java b/sass/src/com/vaadin/sass/util/ColorUtil.java
new file mode 100644 (file)
index 0000000..4a9769a
--- /dev/null
@@ -0,0 +1,290 @@
+package com.vaadin.sass.util;
+
+import org.w3c.css.sac.LexicalUnit;
+
+import com.vaadin.sass.parser.LexicalUnitImpl;
+
+public class ColorUtil {
+    public static LexicalUnitImpl hexColorToHsl(LexicalUnitImpl hexColor) {
+        String s = hexColor.getStringValue().substring(1);
+        int r = 0, g = 0, b = 0;
+        if (s.length() == 3) {
+            String sh = s.substring(0, 1);
+            r = Integer.parseInt(sh + sh, 16);
+            sh = s.substring(1, 2);
+            g = Integer.parseInt(sh + sh, 16);
+            sh = s.substring(2, 3);
+            b = Integer.parseInt(sh + sh, 16);
+        } else if (s.length() == 6) {
+            r = Integer.parseInt(s.substring(0, 2), 16);
+            g = Integer.parseInt(s.substring(2, 4), 16);
+            b = Integer.parseInt(s.substring(4, 6), 16);
+        }
+        int hsl[] = calculateHsl(r, g, b);
+
+        LexicalUnitImpl hslParams = createHslParameters(hsl[0], hsl[1], hsl[2],
+                hexColor.getLineNumber(), hexColor.getColumnNumber(),
+                (LexicalUnitImpl) hexColor.getPreviousLexicalUnit());
+
+        return LexicalUnitImpl.createFunction(hexColor.getLineNumber(),
+                hexColor.getColumnNumber(),
+                (LexicalUnitImpl) hexColor.getPreviousLexicalUnit(), "hsl",
+                hslParams);
+    }
+
+    public static LexicalUnitImpl hslToHexColor(LexicalUnitImpl hsl, int lengh) {
+        int[] rgb = calculateRgb(hsl);
+        StringBuilder builder = new StringBuilder("#");
+        for (int i = 0; i < 3; i++) {
+            String color = Integer.toHexString(rgb[i]);
+            if (lengh == 3) {
+                if (color.length() == 1) {
+                    color = "0" + color;
+                }
+            }
+            if (lengh == 6) {
+                color = color.substring(0, 1);
+            }
+            builder.append(color);
+        }
+        return LexicalUnitImpl.createIdent(hsl.getLineNumber(),
+                hsl.getColumnNumber(),
+                (LexicalUnitImpl) hsl.getPreviousLexicalUnit(),
+                builder.toString());
+    }
+
+    private static int[] calculateRgb(LexicalUnitImpl hsl) {
+        LexicalUnitImpl hslParam = hsl.getParameters();
+        LexicalUnitImpl hue = null;
+        LexicalUnitImpl saturation = null;
+        LexicalUnitImpl lightness = null;
+        int i = 0;
+        while (i < 5) {
+            switch (i) {
+            case 0:
+                hue = hslParam;
+                break;
+            case 2:
+                saturation = hslParam;
+                break;
+            case 4:
+                lightness = hslParam;
+                break;
+            case 1:
+            case 3:
+                break;
+            }
+            hslParam = (LexicalUnitImpl) hslParam.getNextLexicalUnit();
+            i++;
+        }
+        float h = ((hue.getFloatValue() % 360) + 360) % 360 / 360;
+        float s = saturation.getFloatValue() / 100;
+        float l = lightness.getFloatValue() / 100;
+        float m2, m1;
+        int[] rgb = new int[3];
+        m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
+        m1 = l * 2 - m2;
+        rgb[0] = Math.round(hueToRgb(m1, m2, h + 1f / 3) * 255);
+        rgb[1] = Math.round(hueToRgb(m1, m2, h) * 255);
+        rgb[2] = Math.round(hueToRgb(m1, m2, h - 1f / 3) * 255);
+        return rgb;
+    }
+
+    public static LexicalUnitImpl rgbToHsl(LexicalUnitImpl rgb) {
+        LexicalUnitImpl rgbParam = rgb.getParameters();
+        LexicalUnitImpl red = null;
+        LexicalUnitImpl green = null;
+        LexicalUnitImpl blue = null;
+        int i = 0;
+        while (i < 5) {
+            switch (i) {
+            case 0:
+                red = rgbParam;
+                break;
+            case 2:
+                green = rgbParam;
+                break;
+            case 4:
+                blue = rgbParam;
+                break;
+            case 1:
+            case 3:
+                break;
+            }
+            rgbParam = (LexicalUnitImpl) rgbParam.getNextLexicalUnit();
+            i++;
+        }
+
+        int hsl[] = calculateHsl(red.getIntegerValue(),
+                green.getIntegerValue(), blue.getIntegerValue());
+
+        rgbParam = rgb.getParameters();
+
+        LexicalUnitImpl hslParams = createHslParameters(hsl[0], hsl[1], hsl[2],
+                rgbParam.getLineNumber(), rgbParam.getColumnNumber(),
+                (LexicalUnitImpl) rgbParam.getPreviousLexicalUnit());
+
+        return LexicalUnitImpl.createFunction(rgb.getLineNumber(),
+                rgb.getColumnNumber(),
+                (LexicalUnitImpl) rgb.getPreviousLexicalUnit(), "hsl",
+                hslParams);
+    }
+
+    private static int[] calculateHsl(int red, int green, int blue) {
+        int[] hsl = new int[3];
+
+        float r = red / 255f;
+        float g = green / 255f;
+        float b = blue / 255f;
+
+        float max = Math.max(Math.max(r, g), b);
+        float min = Math.min(Math.min(r, g), b);
+        float d = max - min;
+
+        float h = 0f, s = 0f, l = 0f;
+
+        if (max == min) {
+            h = 0;
+        }
+        if (max == r) {
+            h = 60 * (g - b) / d;
+        } else if (max == g) {
+            h = 60 * (b - r) / d + 120;
+        } else if (max == b) {
+            h = 60 * (r - g) / d + 240;
+        }
+
+        l = (max + min) / 2f;
+
+        if (max == min) {
+            s = 0;
+        } else if (l < 0.5) {
+            s = d / (2 * l);
+        } else {
+            s = d / (2 - 2 * l);
+        }
+
+        hsl[0] = Math.round(h % 360);
+        hsl[1] = Math.round(s * 100);
+        hsl[2] = Math.round(l * 100);
+
+        return hsl;
+    }
+
+    public static LexicalUnitImpl hslToRgb(LexicalUnitImpl hsl) {
+        int[] rgb = calculateRgb(hsl);
+        LexicalUnitImpl hslParam = hsl.getParameters();
+        LexicalUnitImpl rgbParams = createRgbParameters(rgb[0], rgb[1], rgb[2],
+                hslParam.getLineNumber(), hslParam.getColumnNumber(),
+                (LexicalUnitImpl) hslParam.getPreviousLexicalUnit());
+
+        return LexicalUnitImpl.createFunction(hsl.getLineNumber(),
+                hsl.getColumnNumber(),
+                (LexicalUnitImpl) hsl.getPreviousLexicalUnit(), "rgb",
+                rgbParams);
+    }
+
+    private static float hueToRgb(float m1, float m2, float h) {
+        if (h < 0) {
+            h = h + 1;
+        }
+        if (h > 1) {
+            h = h - 1;
+        }
+        if (h * 6 < 1) {
+            return m1 + (m2 - m1) * h * 6;
+        }
+        if (h * 2 < 1) {
+            return m2;
+        }
+        if (h * 3 < 2) {
+            return m1 + (m2 - m1) * (2f / 3 - h) * 6;
+        }
+        return m1;
+    }
+
+    private static LexicalUnitImpl createRgbParameters(int r, int g, int b,
+            int ln, int cn, LexicalUnitImpl prev) {
+        LexicalUnitImpl red = LexicalUnitImpl.createInteger(ln, cn, prev, r);
+        LexicalUnitImpl firstComma = LexicalUnitImpl.createComma(ln, cn, red);
+        LexicalUnitImpl green = LexicalUnitImpl.createInteger(ln, cn,
+                firstComma, g);
+        LexicalUnitImpl secondComma = LexicalUnitImpl
+                .createComma(ln, cn, green);
+        LexicalUnitImpl.createInteger(ln, cn, secondComma, b);
+        return red;
+    }
+
+    private static LexicalUnitImpl createHslParameters(int h, int s, int l,
+            int ln, int cn, LexicalUnitImpl prev) {
+        LexicalUnitImpl hue = LexicalUnitImpl.createInteger(ln, cn, prev, h);
+        LexicalUnitImpl firstComma = LexicalUnitImpl.createComma(ln, cn, hue);
+        LexicalUnitImpl saturation = LexicalUnitImpl.createPercentage(ln, cn,
+                firstComma, s);
+        LexicalUnitImpl secondComma = LexicalUnitImpl.createComma(ln, cn,
+                saturation);
+        LexicalUnitImpl.createPercentage(ln, cn, secondComma, l);
+        return hue;
+    }
+
+    public static LexicalUnitImpl darken(LexicalUnitImpl darkenFunc) {
+        LexicalUnitImpl color = darkenFunc.getParameters();
+        LexicalUnit amount = color.getNextLexicalUnit().getNextLexicalUnit();
+        LexicalUnitImpl pre = (LexicalUnitImpl) darkenFunc
+                .getPreviousLexicalUnit();
+
+        return adjust(color, amount, ColorOperation.Darken, pre);
+    }
+
+    private static LexicalUnitImpl adjust(LexicalUnitImpl color,
+            LexicalUnit amount, ColorOperation op, LexicalUnitImpl pre) {
+        if (color.getLexicalUnitType() == LexicalUnit.SAC_FUNCTION) {
+            LexicalUnit funcParam = color.getParameters();
+            if ("hsl".equals(color.getFunctionName())) {
+                LexicalUnit lightness = funcParam;
+                for (int index = 0; index < 4; index++) {
+                    lightness = lightness.getNextLexicalUnit();
+                }
+                float newValue = 0f;
+                if (op == ColorOperation.Darken) {
+                    newValue = lightness.getFloatValue()
+                            - amount.getFloatValue();
+                    newValue = newValue < 0 ? 0 : newValue;
+                } else if (op == ColorOperation.Lighten) {
+                    newValue = lightness.getFloatValue()
+                            + amount.getFloatValue();
+                    newValue = newValue > 100 ? 100 : newValue;
+                }
+                ((LexicalUnitImpl) lightness).setFloatValue(newValue);
+                return LexicalUnitImpl.createFunction(color.getLineNumber(),
+                        color.getColumnNumber(), pre, color.getFunctionName(),
+                        funcParam);
+            }
+
+        } else if (color.getLexicalUnitType() == LexicalUnit.SAC_IDENT) {
+            if (color.getStringValue().startsWith("#")) {
+                return hslToHexColor(
+                        adjust(hexColorToHsl(color), amount, op, pre), color
+                                .getStringValue().substring(1).length());
+            }
+        } else if (color.getLexicalUnitType() == LexicalUnit.SAC_RGBCOLOR) {
+            LexicalUnitImpl hsl = rgbToHsl(color);
+            LexicalUnitImpl hslAfterDarken = adjust(hsl, amount, op, pre);
+            return hslToRgb(hslAfterDarken);
+        }
+        return color;
+    }
+
+    public static LexicalUnitImpl lighten(LexicalUnitImpl lightenFunc) {
+        LexicalUnitImpl color = lightenFunc.getParameters();
+        LexicalUnit amount = color.getNextLexicalUnit().getNextLexicalUnit();
+        LexicalUnitImpl pre = (LexicalUnitImpl) lightenFunc
+                .getPreviousLexicalUnit();
+
+        return adjust(color, amount, ColorOperation.Lighten, pre);
+    }
+
+    enum ColorOperation {
+        Darken, Lighten
+    }
+}
diff --git a/sass/src/com/vaadin/sass/util/DeepCopy.java b/sass/src/com/vaadin/sass/util/DeepCopy.java
new file mode 100644 (file)
index 0000000..bf77118
--- /dev/null
@@ -0,0 +1,44 @@
+package com.vaadin.sass.util;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+/**
+ * Utility for making deep copies (vs. clone()'s shallow copies) of objects.
+ * Objects are first serialized and then deserialized. Error checking is fairly
+ * minimal in this implementation. If an object is encountered that cannot be
+ * serialized (or that references an object that cannot be serialized) an error
+ * is printed to System.err and null is returned. Depending on your specific
+ * application, it might make more sense to have copy(...) re-throw the
+ * exception.
+ */
+public class DeepCopy {
+
+    /**
+     * Returns a copy of the object, or null if the object cannot be serialized.
+     */
+    public static Object copy(Object orig) {
+        Object obj = null;
+        try {
+            // Write the object out to a byte array
+            FastByteArrayOutputStream fbos = new FastByteArrayOutputStream();
+            ObjectOutputStream out = new ObjectOutputStream(fbos);
+            out.writeObject(orig);
+            out.flush();
+            out.close();
+
+            // Retrieve an input stream from the byte array and read
+            // a copy of the object back in.
+            ObjectInputStream in = new ObjectInputStream(fbos.getInputStream());
+            obj = in.readObject();
+            in.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException cnfe) {
+            cnfe.printStackTrace();
+        }
+        return obj;
+    }
+
+}
\ No newline at end of file
diff --git a/sass/src/com/vaadin/sass/util/FastByteArrayInputStream.java b/sass/src/com/vaadin/sass/util/FastByteArrayInputStream.java
new file mode 100644 (file)
index 0000000..0f23f4b
--- /dev/null
@@ -0,0 +1,66 @@
+package com.vaadin.sass.util;
+
+import java.io.InputStream;
+
+/**
+ * ByteArrayInputStream implementation that does not synchronize methods.
+ */
+public class FastByteArrayInputStream extends InputStream {
+    /**
+     * Our byte buffer
+     */
+    protected byte[] buf = null;
+
+    /**
+     * Number of bytes that we can read from the buffer
+     */
+    protected int count = 0;
+
+    /**
+     * Number of bytes that have been read from the buffer
+     */
+    protected int pos = 0;
+
+    public FastByteArrayInputStream(byte[] buf, int count) {
+        this.buf = buf;
+        this.count = count;
+    }
+
+    @Override
+    public final int available() {
+        return count - pos;
+    }
+
+    @Override
+    public final int read() {
+        return (pos < count) ? (buf[pos++] & 0xff) : -1;
+    }
+
+    @Override
+    public final int read(byte[] b, int off, int len) {
+        if (pos >= count) {
+            return -1;
+        }
+
+        if ((pos + len) > count) {
+            len = (count - pos);
+        }
+
+        System.arraycopy(buf, pos, b, off, len);
+        pos += len;
+        return len;
+    }
+
+    @Override
+    public final long skip(long n) {
+        if ((pos + n) > count) {
+            n = count - pos;
+        }
+        if (n < 0) {
+            return 0;
+        }
+        pos += n;
+        return n;
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/util/FastByteArrayOutputStream.java b/sass/src/com/vaadin/sass/util/FastByteArrayOutputStream.java
new file mode 100644 (file)
index 0000000..3c1c572
--- /dev/null
@@ -0,0 +1,87 @@
+package com.vaadin.sass.util;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * ByteArrayOutputStream implementation that doesn't synchronize methods and
+ * doesn't copy the data on toByteArray().
+ */
+public class FastByteArrayOutputStream extends OutputStream {
+    /**
+     * Buffer and size
+     */
+    protected byte[] buf = null;
+    protected int size = 0;
+
+    /**
+     * Constructs a stream with buffer capacity size 5K
+     */
+    public FastByteArrayOutputStream() {
+        this(5 * 1024);
+    }
+
+    /**
+     * Constructs a stream with the given initial size
+     */
+    public FastByteArrayOutputStream(int initSize) {
+        size = 0;
+        buf = new byte[initSize];
+    }
+
+    /**
+     * Ensures that we have a large enough buffer for the given size.
+     */
+    private void verifyBufferSize(int sz) {
+        if (sz > buf.length) {
+            byte[] old = buf;
+            buf = new byte[Math.max(sz, 2 * buf.length)];
+            System.arraycopy(old, 0, buf, 0, old.length);
+            old = null;
+        }
+    }
+
+    public int getSize() {
+        return size;
+    }
+
+    /**
+     * Returns the byte array containing the written data. Note that this array
+     * will almost always be larger than the amount of data actually written.
+     */
+    public byte[] getByteArray() {
+        return buf;
+    }
+
+    @Override
+    public final void write(byte b[]) {
+        verifyBufferSize(size + b.length);
+        System.arraycopy(b, 0, buf, size, b.length);
+        size += b.length;
+    }
+
+    @Override
+    public final void write(byte b[], int off, int len) {
+        verifyBufferSize(size + len);
+        System.arraycopy(b, off, buf, size, len);
+        size += len;
+    }
+
+    @Override
+    public final void write(int b) {
+        verifyBufferSize(size + 1);
+        buf[size++] = (byte) b;
+    }
+
+    public void reset() {
+        size = 0;
+    }
+
+    /**
+     * Returns a ByteArrayInputStream for reading back the written data
+     */
+    public InputStream getInputStream() {
+        return new FastByteArrayInputStream(buf, size);
+    }
+
+}
diff --git a/sass/src/com/vaadin/sass/util/StringUtil.java b/sass/src/com/vaadin/sass/util/StringUtil.java
new file mode 100644 (file)
index 0000000..6b57407
--- /dev/null
@@ -0,0 +1,120 @@
+package com.vaadin.sass.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class StringUtil {
+    private static final String FOLDER_SEPARATOR = "/"; // folder separator
+
+    private static final String WINDOWS_FOLDER_SEPARATOR = "\\"; // Windows
+                                                                 // folder
+                                                                 // separator
+
+    private static final String TOP_PATH = ".."; // top folder
+
+    private static final String CURRENT_PATH = "."; // current folder
+
+    public static String cleanPath(String path) {
+        String pathToUse = replace(path, WINDOWS_FOLDER_SEPARATOR,
+                FOLDER_SEPARATOR);
+        String[] pathArray = delimitedListToStringArray(pathToUse,
+                FOLDER_SEPARATOR);
+        List pathElements = new LinkedList();
+        int tops = 0;
+        for (int i = pathArray.length - 1; i >= 0; i--) {
+            if (CURRENT_PATH.equals(pathArray[i])) {
+                // do nothing
+            } else if (TOP_PATH.equals(pathArray[i])) {
+                tops++;
+            } else {
+                if (tops > 0) {
+                    tops--;
+                } else {
+                    pathElements.add(0, pathArray[i]);
+                }
+            }
+        }
+        for (int i = 0; i < tops; i++) {
+            pathElements.add(0, TOP_PATH);
+        }
+        return collectionToDelimitedString(pathElements, FOLDER_SEPARATOR);
+    }
+
+    public static String replace(String inString, String oldPattern,
+            String newPattern) {
+        if (inString == null) {
+            return null;
+        }
+        if (oldPattern == null || newPattern == null) {
+            return inString;
+        }
+
+        StringBuffer sbuf = new StringBuffer();
+        // output StringBuffer we'll build up
+        int pos = 0; // our position in the old string
+        int index = inString.indexOf(oldPattern);
+        // the index of an occurrence we've found, or -1
+        int patLen = oldPattern.length();
+        while (index >= 0) {
+            sbuf.append(inString.substring(pos, index));
+            sbuf.append(newPattern);
+            pos = index + patLen;
+            index = inString.indexOf(oldPattern, pos);
+        }
+        sbuf.append(inString.substring(pos));
+
+        // remember to append any characters to the right of a match
+        return sbuf.toString();
+    }
+
+    public static String[] delimitedListToStringArray(String str,
+            String delimiter) {
+        if (str == null) {
+            return new String[0];
+        }
+        if (delimiter == null) {
+            return new String[] { str };
+        }
+
+        List result = new ArrayList();
+        int pos = 0;
+        int delPos = 0;
+        while ((delPos = str.indexOf(delimiter, pos)) != -1) {
+            result.add(str.substring(pos, delPos));
+            pos = delPos + delimiter.length();
+        }
+        if (str.length() > 0 && pos <= str.length()) {
+            // Add rest of String, but not in case of empty input.
+            result.add(str.substring(pos));
+        }
+
+        return (String[]) result.toArray(new String[result.size()]);
+    }
+
+    public static String collectionToDelimitedString(Collection coll,
+            String delim, String prefix, String suffix) {
+        if (coll == null) {
+            return "";
+        }
+
+        StringBuffer sb = new StringBuffer();
+        Iterator it = coll.iterator();
+        int i = 0;
+        while (it.hasNext()) {
+            if (i > 0) {
+                sb.append(delim);
+            }
+            sb.append(prefix).append(it.next()).append(suffix);
+            i++;
+        }
+        return sb.toString();
+    }
+
+    public static String collectionToDelimitedString(Collection coll,
+            String delim) {
+        return collectionToDelimitedString(coll, delim, "", "");
+    }
+}
diff --git a/sass/src/com/vaadin/sass/visitor/BlockVisitor.java b/sass/src/com/vaadin/sass/visitor/BlockVisitor.java
new file mode 100644 (file)
index 0000000..a05f082
--- /dev/null
@@ -0,0 +1,60 @@
+package com.vaadin.sass.visitor;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SelectorList;
+
+import com.vaadin.sass.parser.SelectorListImpl;
+import com.vaadin.sass.selector.CompositeSelector;
+import com.vaadin.sass.tree.BlockNode;
+import com.vaadin.sass.tree.Node;
+
+public class BlockVisitor implements Visitor {
+
+    @Override
+    public void traverse(Node node) {
+        traverse(null, node);
+    }
+
+    private void traverse(Node parent, Node node) {
+        Node after = node;
+        Set<Node> toBeDeleted = new HashSet<Node>();
+        for (int pos = 0; pos < node.getChildren().size(); pos++) {
+            Node child = node.getChildren().get(pos);
+
+            traverse(node, child);
+
+            if (child instanceof BlockNode && node instanceof BlockNode
+                    && parent != null) {
+                combineParentSelectorListToChild(node, child);
+                toBeDeleted.add(child);
+                parent.appendChild(child, after);
+                after = child;
+            }
+        }
+        for (Node child : toBeDeleted) {
+            node.removeChild(child);
+        }
+    }
+
+    private void combineParentSelectorListToChild(Node parent, Node child) {
+        if (parent instanceof BlockNode && child instanceof BlockNode) {
+            SelectorListImpl newList = new SelectorListImpl();
+            SelectorList parentSelectors = ((BlockNode) parent)
+                    .getSelectorList();
+            SelectorList childSelectors = ((BlockNode) child).getSelectorList();
+            for (int i = 0; i < parentSelectors.getLength(); i++) {
+                Selector parentSelector = parentSelectors.item(i);
+                for (int j = 0; j < childSelectors.getLength(); j++) {
+                    Selector childSelector = childSelectors.item(j);
+                    newList.addSelector(new CompositeSelector(parentSelector,
+                            childSelector));
+                }
+
+            }
+            ((BlockNode) child).setSelectorList(newList);
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/visitor/ExtendVisitor.java b/sass/src/com/vaadin/sass/visitor/ExtendVisitor.java
new file mode 100644 (file)
index 0000000..5dbea40
--- /dev/null
@@ -0,0 +1,98 @@
+package com.vaadin.sass.visitor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.w3c.css.sac.SelectorList;
+
+import com.vaadin.sass.parser.SelectorListImpl;
+import com.vaadin.sass.selector.SelectorUtil;
+import com.vaadin.sass.tree.BlockNode;
+import com.vaadin.sass.tree.ExtendNode;
+import com.vaadin.sass.tree.Node;
+
+public class ExtendVisitor implements Visitor {
+    private Map<String, List<SelectorList>> extendsMap = new HashMap<String, List<SelectorList>>();
+
+    @Override
+    public void traverse(Node node) throws Exception {
+        buildExtendsMap(node);
+        modifyTree(node);
+    }
+
+    private void modifyTree(Node node) throws Exception {
+        for (Node child : node.getChildren()) {
+            if (child instanceof BlockNode) {
+                BlockNode blockNode = (BlockNode) child;
+                String selectorString = SelectorUtil.toString(blockNode
+                        .getSelectorList());
+                if (extendsMap.get(selectorString) != null) {
+                    for (SelectorList sList : extendsMap.get(selectorString)) {
+                        SelectorList newList = SelectorUtil
+                                .createNewSelectorListFromAnOldOneWithSomPartReplaced(
+                                        blockNode.getSelectorList(),
+                                        selectorString, sList);
+                        addAdditionalSelectorListToBlockNode(blockNode, newList);
+                    }
+                } else {
+                    for (Entry<String, List<SelectorList>> entry : extendsMap
+                            .entrySet()) {
+                        if (selectorString.contains(entry.getKey())) {
+                            for (SelectorList sList : entry.getValue()) {
+                                SelectorList newList = SelectorUtil
+                                        .createNewSelectorListFromAnOldOneWithSomPartReplaced(
+                                                blockNode.getSelectorList(),
+                                                entry.getKey(), sList);
+                                addAdditionalSelectorListToBlockNode(blockNode,
+                                        newList);
+                            }
+                        }
+                    }
+                }
+            } else {
+                buildExtendsMap(child);
+            }
+        }
+
+    }
+
+    private void buildExtendsMap(Node node) {
+        if (node instanceof BlockNode) {
+            BlockNode blockNode = (BlockNode) node;
+            for (Node child : new ArrayList<Node>(node.getChildren())) {
+                if (child instanceof ExtendNode) {
+                    ExtendNode extendNode = (ExtendNode) child;
+                    String extendedString = SelectorUtil.toString(extendNode
+                            .getList());
+                    if (extendsMap.get(extendedString) == null) {
+                        extendsMap.put(extendedString,
+                                new ArrayList<SelectorList>());
+                    }
+                    extendsMap.get(extendedString).add(
+                            blockNode.getSelectorList());
+                    node.removeChild(child);
+                } else {
+                    buildExtendsMap(child);
+                }
+            }
+        } else {
+            for (Node child : node.getChildren()) {
+                buildExtendsMap(child);
+            }
+        }
+
+    }
+
+    private void addAdditionalSelectorListToBlockNode(BlockNode blockNode,
+            SelectorList list) {
+        if (list != null) {
+            for (int i = 0; i < list.getLength(); i++) {
+                ((SelectorListImpl) blockNode.getSelectorList())
+                        .addSelector(list.item(i));
+            }
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/visitor/ImportVisitor.java b/sass/src/com/vaadin/sass/visitor/ImportVisitor.java
new file mode 100644 (file)
index 0000000..50fc822
--- /dev/null
@@ -0,0 +1,87 @@
+package com.vaadin.sass.visitor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.LexicalUnit;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.parser.LexicalUnitImpl;
+import com.vaadin.sass.tree.ImportNode;
+import com.vaadin.sass.tree.Node;
+import com.vaadin.sass.tree.RuleNode;
+import com.vaadin.sass.util.StringUtil;
+
+public class ImportVisitor implements Visitor {
+
+    @Override
+    public void traverse(Node node) {
+        for (Node child : new ArrayList<Node>(node.getChildren())) {
+            if (child instanceof ImportNode) {
+                ImportNode importNode = (ImportNode) child;
+                if (!importNode.isPureCssImport()) {
+                    StringBuilder filePathBuilder = new StringBuilder(
+                            node.getFileName());
+                    filePathBuilder.append(File.separatorChar).append(
+                            importNode.getUri());
+                    if (!filePathBuilder.toString().endsWith(".scss")) {
+                        filePathBuilder.append(".scss");
+                    }
+                    try {
+                        ScssStylesheet imported = ScssStylesheet.get(new File(
+                                filePathBuilder.toString()));
+                        traverse(imported);
+                        String prefix = getUrlPrefix(importNode.getUri());
+                        if (prefix != null) {
+                            updateUrlInImportedSheet(imported, prefix);
+                        }
+                        Node pre = importNode;
+                        for (Node importedChild : imported.getChildren()) {
+                            node.appendChild(importedChild, pre);
+                            pre = importedChild;
+                        }
+                        node.removeChild(importNode);
+                    } catch (CSSException e) {
+                        e.printStackTrace();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+
+    private String getUrlPrefix(String url) {
+        if (url == null) {
+            return null;
+        }
+        int pos = url.lastIndexOf(File.separatorChar);
+        if (pos == -1) {
+            return null;
+        }
+        return url.substring(0, pos + 1);
+    }
+
+    private void updateUrlInImportedSheet(Node node, String prefix) {
+        for (Node child : node.getChildren()) {
+            if (child instanceof RuleNode) {
+                LexicalUnit value = ((RuleNode) child).getValue();
+                while (value != null) {
+                    if (value.getLexicalUnitType() == LexicalUnit.SAC_URI) {
+                        String path = value.getStringValue();
+                        if (!path.startsWith("/") && !path.contains(":")) {
+                            path = prefix + path;
+                            path = StringUtil.cleanPath(path);
+                            ((LexicalUnitImpl) value).setStringValue(path);
+                        }
+                    }
+                    value = value.getNextLexicalUnit();
+                }
+
+            }
+            updateUrlInImportedSheet(child, prefix);
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/visitor/MixinVisitor.java b/sass/src/com/vaadin/sass/visitor/MixinVisitor.java
new file mode 100644 (file)
index 0000000..b1c0a3a
--- /dev/null
@@ -0,0 +1,77 @@
+package com.vaadin.sass.visitor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.vaadin.sass.tree.MixinDefNode;
+import com.vaadin.sass.tree.MixinNode;
+import com.vaadin.sass.tree.Node;
+import com.vaadin.sass.tree.VariableNode;
+import com.vaadin.sass.util.DeepCopy;
+
+public class MixinVisitor implements Visitor {
+    Map<String, MixinDefNode> mixinDefs = new HashMap<String, MixinDefNode>();
+
+    @Override
+    public void traverse(Node node) throws Exception {
+        // create mixin map.
+        for (Node child : node.getChildren()) {
+            if (child instanceof MixinDefNode) {
+                mixinDefs.put(((MixinDefNode) child).getName(),
+                        (MixinDefNode) child);
+            }
+        }
+
+        replaceMixins(node);
+
+        // delete MixinDefNode
+        for (Node child : new ArrayList<Node>(node.getChildren())) {
+            if (child instanceof MixinDefNode) {
+                node.removeChild(child);
+            }
+        }
+    }
+
+    private void replaceMixins(Node node) throws Exception {
+        for (Node child : new ArrayList<Node>(node.getChildren())) {
+            replaceMixins(child);
+            if (child instanceof MixinNode) {
+                MixinNode mixinNode = (MixinNode) child;
+                MixinDefNode mixinDef = mixinDefs.get(mixinNode.getName());
+                if (mixinDef == null) {
+                    throw new Exception("Mixin Definition: "
+                            + mixinNode.getName() + " not found");
+                }
+                replaceMixinNode(node, mixinNode, mixinDef);
+            }
+        }
+    }
+
+    private void replaceMixinNode(Node current, MixinNode mixinNode,
+            MixinDefNode mixinDef) {
+        Node pre = mixinNode;
+        if (mixinDef.getArglist().isEmpty()) {
+            for (Node child : mixinDef.getChildren()) {
+                current.appendChild(child, pre);
+                pre = child;
+            }
+        } else {
+            for (int i = 0; i < mixinDef.getArglist().size(); i++) {
+                VariableNode arg = (VariableNode) DeepCopy.copy(mixinDef
+                        .getArglist().get(i));
+                if (i < mixinNode.getArglist().size()) {
+                    arg.setExpr(mixinNode.getArglist().get(i));
+                }
+                current.appendChild(arg, pre);
+                pre = arg;
+            }
+            for (Node child : mixinDef.getChildren()) {
+                Node clonedChild = (Node) DeepCopy.copy(child);
+                current.appendChild(clonedChild, pre);
+                pre = clonedChild;
+            }
+        }
+        current.removeChild(mixinNode);
+    }
+}
diff --git a/sass/src/com/vaadin/sass/visitor/NestPropertiesVisitor.java b/sass/src/com/vaadin/sass/visitor/NestPropertiesVisitor.java
new file mode 100644 (file)
index 0000000..d849173
--- /dev/null
@@ -0,0 +1,27 @@
+package com.vaadin.sass.visitor;
+
+import java.util.ArrayList;
+
+import com.vaadin.sass.tree.NestPropertiesNode;
+import com.vaadin.sass.tree.Node;
+import com.vaadin.sass.tree.RuleNode;
+
+public class NestPropertiesVisitor implements Visitor {
+
+    @Override
+    public void traverse(Node node) {
+        for (Node child : new ArrayList<Node>(node.getChildren())) {
+            if (child instanceof NestPropertiesNode) {
+                Node previous = child;
+                for (RuleNode unNested : ((NestPropertiesNode) child)
+                        .unNesting()) {
+                    node.appendChild(unNested, previous);
+                    previous = unNested;
+                    node.removeChild(child);
+                }
+            } else {
+                traverse(child);
+            }
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/visitor/ParentSelectorVisitor.java b/sass/src/com/vaadin/sass/visitor/ParentSelectorVisitor.java
new file mode 100644 (file)
index 0000000..011b47f
--- /dev/null
@@ -0,0 +1,42 @@
+package com.vaadin.sass.visitor;
+
+import java.util.ArrayList;
+
+import org.w3c.css.sac.SelectorList;
+
+import com.vaadin.sass.selector.SelectorUtil;
+import com.vaadin.sass.tree.BlockNode;
+import com.vaadin.sass.tree.Node;
+
+public class ParentSelectorVisitor implements Visitor {
+
+    @Override
+    public void traverse(Node node) throws Exception {
+        for (Node child : new ArrayList<Node>(node.getChildren())) {
+            if (child instanceof BlockNode) {
+                traverse(node, (BlockNode) child);
+            }
+        }
+    }
+
+    private void traverse(Node parent, BlockNode block) throws Exception {
+        Node pre = block;
+        for (Node child : new ArrayList<Node>(block.getChildren())) {
+            if (child instanceof BlockNode) {
+                BlockNode blockChild = (BlockNode) child;
+                traverse(block, blockChild);
+                if (SelectorUtil
+                        .hasParentSelector(blockChild.getSelectorList())) {
+                    parent.appendChild(child, pre);
+                    pre = child;
+                    block.removeChild(child);
+                    SelectorList newSelectorList = SelectorUtil
+                            .createNewSelectorListFromAnOldOneWithSomPartReplaced(
+                                    blockChild.getSelectorList(), "&",
+                                    block.getSelectorList());
+                    blockChild.setSelectorList(newSelectorList);
+                }
+            }
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/visitor/VariableVisitor.java b/sass/src/com/vaadin/sass/visitor/VariableVisitor.java
new file mode 100644 (file)
index 0000000..71c43e3
--- /dev/null
@@ -0,0 +1,52 @@
+package com.vaadin.sass.visitor;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.w3c.css.sac.LexicalUnit;
+
+import com.vaadin.sass.parser.LexicalUnitImpl;
+import com.vaadin.sass.parser.SCSSLexicalUnit;
+import com.vaadin.sass.tree.Node;
+import com.vaadin.sass.tree.RuleNode;
+import com.vaadin.sass.tree.VariableNode;
+
+public class VariableVisitor implements Visitor {
+
+    @Override
+    public void traverse(Node node) {
+        Map<String, LexicalUnitImpl> variables = new HashMap<String, LexicalUnitImpl>();
+        traverse(node, variables);
+    }
+
+    private void traverse(Node node, Map<String, LexicalUnitImpl> variables) {
+        if (node instanceof RuleNode) {
+            LexicalUnit value = ((RuleNode) node).getValue();
+            for (String variable : variables.keySet()) {
+                if (value.getLexicalUnitType() == SCSSLexicalUnit.SCSS_VARIABLE) {
+                    if (value.getStringValue().contains(variable)) {
+                        LexicalUnitImpl lexVal = (LexicalUnitImpl) value;
+                        lexVal.replaceValue(variables.get(variable));
+                    }
+                }
+            }
+        } else {
+            Set<Node> toBeDeleted = new HashSet<Node>();
+            for (Node child : node.getChildren()) {
+                if (child instanceof VariableNode) {
+                    variables.put(((VariableNode) child).getName(),
+                            (LexicalUnitImpl) ((VariableNode) child).getExpr());
+                    toBeDeleted.add(child);
+                } else {
+                    traverse(child, new HashMap<String, LexicalUnitImpl>(
+                            variables));
+                }
+            }
+            for (Node child : toBeDeleted) {
+                node.removeChild(child);
+            }
+        }
+    }
+}
diff --git a/sass/src/com/vaadin/sass/visitor/Visitor.java b/sass/src/com/vaadin/sass/visitor/Visitor.java
new file mode 100644 (file)
index 0000000..ae2c2b9
--- /dev/null
@@ -0,0 +1,8 @@
+package com.vaadin.sass.visitor;
+
+import com.vaadin.sass.tree.Node;
+
+public interface Visitor {
+
+    public void traverse(Node node) throws Exception;
+}
diff --git a/tests/sass/resources/basic/comments.css b/tests/sass/resources/basic/comments.css
new file mode 100644 (file)
index 0000000..96d6b31
--- /dev/null
@@ -0,0 +1,9 @@
+.v-button:focus {
+       background-image: url(img/left-focus.png);/** sprite-ref: buttons */
+       outline: none;
+}
+
+.v-button:focus .v-button-wrap {
+       background-image: url(img/right-focus.png);/** sprite-ref: buttons; sprite-alignment: right */
+       outline: none;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/basic/empty_block.css b/tests/sass/resources/basic/empty_block.css
new file mode 100644 (file)
index 0000000..31c0b47
--- /dev/null
@@ -0,0 +1,2 @@
+.v-panel-deco {
+}
\ No newline at end of file
diff --git a/tests/sass/resources/basic/media.css b/tests/sass/resources/basic/media.css
new file mode 100644 (file)
index 0000000..f118883
--- /dev/null
@@ -0,0 +1,27 @@
+.v-view {
+       height: 100%;
+       width: 100%;
+       overflow: auto;
+       outline: none;
+       margin-top: -1px;
+       border-top: 1px solid transparent;
+       position: relative;
+}
+
+@media print {
+       .v-generated-body {
+               height: auto;
+               min-height: 20cm;
+               overflow: visible;
+       }
+       .v-app {
+               height: auto;
+               min-height: 20cm;
+       }
+       .v-view {
+               overflow: visible;
+       }
+       .v-gridlayout {
+               overflow: visible !important;
+       }
+}
\ No newline at end of file
diff --git a/tests/sass/resources/basic/properties.css b/tests/sass/resources/basic/properties.css
new file mode 100644 (file)
index 0000000..bdc17af
--- /dev/null
@@ -0,0 +1,72 @@
+.all-the-properties {
+       font-family: Arial, Helvetica, "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif; ;
+       position: absolute;;
+       overflow: hidden;
+       outline: none;
+       text-align: left;
+       zoom: 1;
+       white-space: nowrap;
+       background: #123456;
+       border-bottom: 1px solid #ffffff;
+       filter: alpha(opacity = 30);
+       cursor: pointer;
+       overflow: auto;
+       width: 100%;
+       display: inline-block;
+}
+
+.missing-semicolon-on-last-row {
+       color: red;
+       background-color: blue
+}
+
+.lexical-value-test {
+       margin: none;
+       margin: 0px;
+       margin: 0;
+       margin: 0.5px;
+       margin: 2px;
+       margin: -0.5px;
+       margin: -2px;
+       margin: 10px 20px;
+       margin: -10px 20px;
+       margin: 20px -10px -20px 40px;
+       margin-right: -0.5px;
+}
+
+.background-positioning {
+       background-position: 0 0;
+       background-position: left top;
+       background-position: left 40px;
+       background-position: 50px left;
+       background-position: right -286px;
+}
+
+.user-select-rules {
+       user-select: none;
+       -ie-user-select: none;
+}
+
+.box-sizing-rules {
+       box-sizing: border-box;
+       -moz-box-sizing: border-box;
+}
+
+.user-select-and-box-sizing-combined {
+       -khtml-user-select: none;
+       -moz-user-select: none;
+       -ie-user-select: none;
+       user-select: none;
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       -ms-box-sizing: border-box;
+       box-sizing: border-box;
+}
+
+@media print {
+       .v-generated-body {
+               height: auto;
+               min-height: 20cm;
+               overflow: visible;
+       }
+}
diff --git a/tests/sass/resources/basic/reindeer.css b/tests/sass/resources/basic/reindeer.css
new file mode 100644 (file)
index 0000000..e32d917
--- /dev/null
@@ -0,0 +1,5905 @@
+.v-theme-version:after {
+       content: "6_8_0_dev-20120306";
+}
+
+.v-theme-version-6_8_0_dev-20120306 {
+       display: none;
+}
+
+.v-absolutelayout-wrapper {
+       position: absolute;
+       overflow: hidden;
+}
+
+.v-accordion {
+       position: relative;
+       outline: none;
+       overflow: hidden;
+       text-align: left;
+}
+
+.v-accordion-item {
+       position: relative;
+       zoom: 1;
+}
+
+.v-accordion-item-caption {
+       overflow: hidden;
+       white-space: nowrap;
+       background: #eeeeee;
+       border-bottom: 1px solid #dddddd;
+}
+
+.v-accordion-item-caption .v-caption {
+       cursor: pointer;
+}
+
+.v-accordion-item-open .v-accordion-item-caption .v-caption {
+       cursor: default;
+}
+
+.v-accordion-item-content {
+       position: absolute;
+       overflow: auto;
+       width: 100%;
+}
+
+.v-button {
+       display: inline-block;
+       zoom: 1;
+       text-align: center;
+       text-decoration: none;
+       border: 2px outset #dddddd;
+       background: #eeeeee;
+       cursor: pointer;
+       white-space: nowrap;
+       margin: 0;
+       padding: 0.2em 1em;
+       color: inherit;
+       font: inherit;
+       line-height: normal;
+       -khtml-user-select: none;
+       -moz-user-select: none;
+       -ie-user-select: none;
+       user-select: none;
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       -ms-box-sizing: border-box;
+       box-sizing: border-box;
+}
+
+.v-button.v-disabled {
+       cursor: default;
+}
+
+.v-ie6 .v-button {
+       display: inline;
+}
+
+.v-ie7 .v-button {
+       display: inline;
+}
+
+.v-button-wrap, .v-button-caption {
+       vertical-align: middle;
+       white-space: nowrap;
+       font: inherit;
+       color: inherit;
+       line-height: normal;
+}
+
+.v-button .v-icon, .v-nativebutton .v-icon {
+       vertical-align: middle;
+       margin-right: 3px;
+       border: none;
+}
+
+.v-button .v-errorindicator, .v-nativebutton .v-errorindicator {
+       display: inline-block;
+       zoom: 1;
+       vertical-align: middle;
+       float: none;
+}
+
+.v-button-link, .v-nativebutton-link {
+       border: none;
+       text-align: left;
+       background: transparent;
+       padding: 0;
+       color: inherit;
+       -khtml-user-select: text;
+       -moz-user-select: text;
+       -ie-user-select: text;
+       user-select: text;
+}
+
+.v-sa .v-button-link:focus {
+       outline-offset: -3px;
+}
+
+.v-button-link .v-button-caption, .v-nativebutton-link .v-nativebutton-caption {
+       text-decoration: underline;
+       color: inherit;
+       text-align: left;
+}
+
+.v-nativebutton {
+       text-align: center;
+       cursor: pointer;
+       white-space: nowrap;
+       margin: 0;
+       color: inherit;
+       font: inherit;
+       line-height: normal;
+}
+
+.v-nativebutton .v-nativebutton-caption {
+       vertical-align: middle;
+       white-space: nowrap;
+       font: inherit;
+       color: inherit;
+}
+
+.v-nativebutton .v-icon {
+       vertical-align: middle;
+       margin-right: 3px;
+}
+
+.v-nativebutton .v-errorindicator {
+       display: inline-block;
+       zoom: 1;
+       float: none;
+}
+
+.v-ie6 .v-nativebutton {
+       width: 1px;
+}
+
+.v-ie .v-nativebutton {
+       overflow: visible;
+       padding-left: 1em;
+       padding-right: 1em;
+}
+
+.v-ie .v-nativebutton-link {
+       padding: 0;
+}
+
+.v-checkbox {
+       display: block;
+}
+
+.v-checkbox, .v-checkbox label, .v-checkbox input, .v-checkbox .v-icon {
+       vertical-align: middle;
+       white-space: nowrap;
+}
+
+.v-ie6 .v-checkbox, .v-ie7 .v-checkbox {
+       vertical-align: baseline;
+}
+
+.v-checkbox .v-icon {
+       margin: 0 2px;
+}
+
+.v-checkbox .v-errorindicator {
+       float: none;
+       display: inline;
+       display: inline-block;
+       zoom: 1;
+}
+
+.v-captionwrapper {
+       text-align: left;
+}
+
+.v-caption {
+       overflow: hidden;
+       white-space: nowrap;
+}
+
+.v-errorindicator {
+       float: left;
+}
+
+.v-caption .v-icon {
+       float: left;
+       padding-right: 2px;
+       vertical-align: middle;
+}
+
+.v-caption .v-captiontext {
+       float: left;
+       overflow: hidden;
+       vertical-align: middle;
+}
+
+.v-caption .v-required-field-indicator {
+       float: left;
+}
+
+.v-caption-clearelem {
+       clear: both;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+}
+
+.v-ie6 .v-errorindicator, .v-ie6 .v-icon, .v-ie6 .v-captiontext, .v-ie6 .v-required-field-indicator {
+       display: inline;
+}
+
+.v-ie9 .v-gridlayout-margin > div > div > .v-caption, .v-ie9 .v-verticallayout > div > div > .v-caption, .v-ie9 .v-horizontallayout > div > div > .v-caption {
+       margin-right: -0.5px;
+}
+
+.v-generated-body {
+       width: 100%;
+       height: 100%;
+       border: 0;
+       margin: 0;
+       overflow: hidden;
+}
+
+.v-app {
+       height: 100%;
+}
+
+.v-app, .v-window, .v-popupview-popup, .v-label, .v-caption {
+       cursor: default;
+}
+
+div.v-app-loading {
+       background-image: url(../base/common/img/loading-indicator.gif);
+       background-repeat: no-repeat;
+       background-position: 50%;
+       width: 100%;
+       height: 100%;
+}
+
+.v-view {
+       height: 100%;
+       width: 100%;
+       overflow: auto;
+       outline: none;
+       margin-top: -1px;
+       border-top: 1px solid transparent;
+       position: relative;
+}
+
+@media print {
+       .v-generated-body {
+               height: auto;
+               min-height: 20cm;
+               overflow: visible;
+       }
+       .v-app {
+               height: auto;
+               min-height: 20cm;
+       }
+       .v-view {
+               overflow: visible;
+       }
+       .v-gridlayout {
+               overflow: visible !important;
+       }
+}
+
+.v-view:active, .v-view:focus {
+       outline: none;
+}
+
+.v-app select, .v-window select {
+       margin: 0;
+}
+
+.v-disabled {
+       opacity: 0.3;
+       filter: alpha(opacity = 30);
+       cursor: default;
+}
+
+.v-disabled * {
+       cursor: default;
+}
+
+.v-disabled .v-disabled {
+       opacity: 1;
+}
+
+.v-required-field-indicator {
+       padding-left: 2px;
+       color: red;
+}
+
+.v-form fieldset {
+       border: none;
+       padding: 0;
+       margin: 0;
+}
+
+.v-tooltip {
+       cursor: default;
+       background: #ffffff;
+}
+
+.v-tooltip-text {
+       overflow: auto;
+}
+
+.v-tooltip .v-errormessage {
+       overflow: auto;
+}
+
+.v-contextmenu {
+       background: #ffffff;
+}
+
+.v-contextmenu .gwt-MenuItem {
+       cursor: pointer;
+       vertical-align: middle;
+       padding: 0;
+       border: 0;
+       margin: 0;
+}
+
+.v-contextmenu .gwt-MenuItem div {
+       cursor: pointer;
+       vertical-align: middle;
+       white-space: nowrap;
+}
+
+.v-contextmenu .gwt-MenuItem-selected div {
+       background: #aaaaaa;
+       color: #ffffff;
+}
+
+.v-contextmenu table {
+       border-collapse: collapse;
+       margin: 0;
+       padding: 0;
+}
+
+.v-contextmenu .gwt-MenuItem img {
+       margin-right: 1em;
+       vertical-align: middle;
+}
+
+.v-label pre {
+       margin: 0;
+}
+
+.v-label-undef-w {
+       white-space: nowrap;
+}
+
+.v-label h1, .v-label h2, .v-label h3, .v-label h4, .v-label h5, .v-label h6 {
+       line-height: normal;
+}
+
+.v-loading-indicator, .v-loading-indicator-delay, .v-loading-indicator-wait {
+       position: absolute;
+       top: 0;
+       right: 0;
+       z-index: 30000;
+       width: 31px;
+       height: 31px;
+       background: transparent url(../base/common/img/loading-indicator.gif);
+       margin-right: 5px;
+       margin-top: 5px;
+}
+
+.v-loading-indicator-delay {
+       background-image: url(../base/common/img/loading-indicator-delay.gif);
+}
+
+.v-loading-indicator-wait {
+       background-image: url(../base/common/img/loading-indicator-wait.gif);
+}
+
+.v-debug-console {
+       background: #ffffff;
+       opacity: 0.9;
+       border: 1px solid #000000;
+       font-family: sans-serif;
+}
+
+.v-debug-console-caption {
+       background: #000000;
+       border-bottom: 1px solid grey;
+       color: white;
+       font-weight: bold;
+}
+
+.v-debug-console-content {
+       font-size: x-small;
+       overflow: auto;
+       white-space: pre;
+}
+
+.v-debug-console-content input {
+       font-size: xx-small;
+}
+
+.v-app .invalidlayout, .v-app .invalidlayout * {
+       background: #ff9999 !important;
+}
+
+.v-app input[type="text"], .v-app input[type="password"], .v-app input[type="reset"], .v-app select, .v-app textarea, .v-window input[type="text"], .v-window input[type="password"], .v-window input[type="reset"], .v-window select, .v-window textarea {
+       padding: 2px;
+}
+
+.v-drag-element {
+       z-index: 60000;
+       position: absolute;
+       opacity: 0.5;
+       filter: alpha(opacity = 50);
+       cursor: default;
+}
+
+.v-csslayout {
+       overflow: hidden;
+}
+
+.v-csslayout-margin-top {
+       padding-top: 12px;
+}
+
+.v-csslayout-margin-bottom {
+       padding-bottom: 12px;
+}
+
+.v-csslayout-margin-left {
+       padding-left: 12px;
+}
+
+.v-csslayout-margin-right {
+       padding-right: 12px;
+}
+
+.v-customcomponent {
+       overflow: hidden;
+}
+
+.v-customlayout {
+       overflow: hidden;
+}
+
+.v-datefield {
+       white-space: nowrap;
+       float: left;
+}
+
+.v-datefield-textfield {
+       vertical-align: top;
+}
+
+.v-datefield-button {
+       cursor: pointer;
+}
+
+.v-datefield-prompt .v-datefield-textfield {
+       color: #999999;
+       font-style: italic;
+}
+
+.v-datefield .v-datefield-button-readonly {
+       display: none;
+}
+
+.v-datefield-calendarpanel table {
+       width: 100%;
+}
+
+.v-datefield-calendarpanel td {
+       padding: 0;
+       margin: 0;
+}
+
+.v-datefield-calendarpanel:focus {
+       outline: none;
+}
+
+.v-datefield-calendarpanel-header td {
+       text-align: center;
+}
+
+.v-datefield-calendarpanel-month {
+       text-align: center;
+       white-space: nowrap;
+}
+
+.v-datefield-calendarpanel-weeknumber {
+       color: #999999;
+       border-right: 1px solid #dddddd;
+       font-size: 0.9em;
+}
+
+.v-datefield-calendarpanel-day, .v-datefield-calendarpanel-day-today {
+       cursor: pointer;
+}
+
+.v-datefield-calendarpanel-day-today {
+       border: 1px solid #dddddd;
+}
+
+.v-disabled .v-datefield-calendarpanel-day, .v-disabled .v-datefield-calendarpanel-day-today {
+       cursor: default;
+}
+
+.v-datefield-calendarpanel-day-disabled {
+       cursor: default;
+       opacity: 0.5;
+}
+
+.v-datefield-calendarpanel-day-selected {
+       cursor: default;
+       background: #333333;
+       color: #ffffff;
+}
+
+.v-datefield-calendarpanel-day-focused {
+       outline: 1px dotted black;
+}
+
+.v-datefield-calendarpanel-day-offmonth {
+       color: #666666;
+}
+
+.v-ie6 .v-datefield-calendarpanel-day, .v-ie7 .v-datefield-calendarpanel-day {
+       margin: 1px;
+}
+
+.v-ie6 .v-datefield-calendarpanel-day-focused, .v-ie7 .v-datefield-calendarpanel-day-focused {
+       border: 1px dotted black;
+       margin: 0px;
+}
+
+.v-datefield-time {
+       white-space: nowrap;
+}
+
+.v-datefield-time .v-label {
+       display: inline;
+}
+
+.v-datefield-popup {
+       background: #ffffff;
+}
+
+.v-ie6 .v-disabled .v-datefield-button, .v-ie6 .v-disabled .v-datefield-textfield, .v-ie7 .v-disabled .v-datefield-button, .v-ie7 .v-disabled .v-datefield-textfield {
+       filter: alpha(opacity = 30);
+}
+
+.v-ddwrapper {
+       padding: 2px;
+       -moz-border-radius: 4px;
+       -webkit-border-radius: 4px;
+       border-radius: 4px;
+       position: relative;
+}
+
+[draggable=true] {
+       -khtml-user-drag: element;
+       -webkit-user-drag: element;
+       -khtml-user-select: none;
+       -webkit-user-select: none;
+}
+
+.v-ie .v-ddwrapper a.drag-start {
+       display: block;
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       width: 100%;
+       height: 100%;
+       opacity: 0;
+       background-color: cyan;
+       filter: alpha(opacity = 0);
+}
+
+.v-ddwrapper-over {
+       border: 2px solid #1d9dff;
+       background-color: #bcdcff;
+       padding: 0;
+}
+
+.v-ddwrapper-over {
+       background-color: rgba(169, 209, 255, 0.6);
+}
+
+.no-box-drag-hints .v-ddwrapper-over {
+       border: none;
+       background-color: transparent;
+       padding: 2px;
+}
+
+.v-app .v-ddwrapper-over-top, .v-window .v-ddwrapper-over-top, .v-popupview-popup .v-ddwrapper-over-top {
+       border: none;
+       border-top: 2px solid #1d9dff;
+       background-color: transparent;
+       padding: 2px;
+       padding-top: 0;
+       -moz-border-radius: 0;
+       -webkit-border-radius: 0;
+       border-radius: 0;
+}
+
+.v-app .v-ddwrapper-over-bottom, .v-window .v-ddwrapper-over-bottom, .v-popupview-popup .v-ddwrapper-over-bottom {
+       border: none;
+       border-bottom: 2px solid #1d9dff;
+       background-color: transparent;
+       padding: 2px;
+       padding-bottom: 0;
+       -moz-border-radius: 0;
+       -webkit-border-radius: 0;
+       border-radius: 0;
+}
+
+.v-app .v-ddwrapper-over-left, .v-window .v-ddwrapper-over-left, .v-popupview-popup .v-ddwrapper-over-left {
+       border: none;
+       border-left: 2px solid #1d9dff;
+       background-color: transparent;
+       padding: 2px;
+       padding-left: 0;
+       -moz-border-radius: 0;
+       -webkit-border-radius: 0;
+       border-radius: 0;
+}
+
+.v-app .v-ddwrapper-over-right, .v-window .v-ddwrapper-over-right, .v-popupview-popup .v-ddwrapper-over-right {
+       border: none;
+       border-right: 2px solid #1d9dff;
+       background-color: transparent;
+       padding: 2px;
+       padding-right: 0;
+       -moz-border-radius: 0;
+       -webkit-border-radius: 0;
+       border-radius: 0;
+}
+
+.v-ddwrapper, .v-ddwrapper-over, .v-app .v-ddwrapper-over-top, .v-window .v-ddwrapper-over-top, .v-popupview-popup .v-ddwrapper-over-top, .v-app .v-ddwrapper-over-bottom, .v-window .v-ddwrapper-over-bottom, .v-popupview-popup .v-ddwrapper-over-bottom, .v-app .v-ddwrapper-over-left, .v-window .v-ddwrapper-over-left, .v-popupview-popup .v-ddwrapper-over-left, .v-app .v-ddwrapper-over-right, .v-window .v-ddwrapper-over-right, .v-popupview-popup .v-ddwrapper-over-right {
+       border-color: rgba(0, 109, 232, 0.6);
+}
+
+.v-ddwrapper-over-top:before, .v-ddwrapper-over-bottom:after, .v-ddwrapper-over-left:before, .v-ddwrapper-over-right:before {
+       display: block;
+       content: "";
+       position: absolute;
+       width: 6px;
+       height: 6px;
+       margin-top: -4px;
+       margin-left: -2px;
+       background: transparent url(../base/common/img/drag-slot-dot.png) no-repeat;
+}
+
+.v-ddwrapper-over-bottom:after {
+       margin-top: -2px;
+}
+
+.v-ddwrapper-over-left:before, .v-ddwrapper-over-right:before {
+       background-position: 0 -6px;
+       margin-top: -2px;
+       margin-left: -4px;
+}
+
+.v-ddwrapper-over-right:before {
+       position: relative;
+       margin-bottom: -4px;
+       margin-right: -4px;
+       margin-left: 0;
+       width: auto;
+       background-position: 100% -6px;
+}
+
+.no-horizontal-drag-hints .v-ddwrapper-over-left {
+       padding-left: 2px;
+       border-left: none;
+}
+
+.no-horizontal-drag-hints .v-ddwrapper-over-right {
+       padding-right: 2px;
+       border-right: none;
+}
+
+.no-vertical-drag-hints .v-ddwrapper-over-top {
+       padding-top: 2px;
+       border-top: none;
+}
+
+.no-vertical-drag-hints .v-ddwrapper-over-bottom {
+       padding-bottom: 2px;
+       border-bottom: none;
+}
+
+.no-horizontal-drag-hints .v-ddwrapper-over-left:before, .no-horizontal-drag-hints .v-ddwrapper-over-right:before, .no-vertical-drag-hints .v-ddwrapper-over-top:before, .no-vertical-drag-hints .v-ddwrapper-over-bottom:after {
+       display: none;
+}
+
+.v-table .v-embedded-image {
+       display: inline-block;
+}
+
+.v-formlayout-cell .v-errorindicator {
+       display: block;
+}
+
+.v-formlayout-error-indicator {
+       width: 12px;
+}
+
+.v-formlayout-captioncell {
+       text-align: right;
+       white-space: nowrap;
+}
+
+.v-formlayout-captioncell .v-caption {
+       overflow: visible;
+}
+
+.v-formlayout-spacing .v-formlayout-row .v-formlayout-captioncell, .v-formlayout-spacing .v-formlayout-row .v-formlayout-contentcell, .v-formlayout-spacing .v-formlayout-row .v-formlayout-errorcell {
+       padding-top: 6px;
+}
+
+.v-formlayout-spacing .v-formlayout-firstrow .v-formlayout-captioncell, .v-formlayout-spacing .v-formlayout-firstrow .v-formlayout-contentcell, .v-formlayout-spacing .v-formlayout-firstrow .v-formlayout-errorcell {
+       padding-top: 0;
+}
+
+.v-formlayout-margin-top .v-formlayout-firstrow .v-formlayout-captioncell, .v-formlayout-margin-top .v-formlayout-firstrow .v-formlayout-contentcell, .v-formlayout-margin-top .v-formlayout-firstrow .v-formlayout-errorcell {
+       padding-top: 12px;
+}
+
+.v-formlayout-margin-bottom .v-formlayout-lastrow .v-formlayout-captioncell, .v-formlayout-margin-bottom .v-formlayout-lastrow .v-formlayout-contentcell, .v-formlayout-margin-bottom .v-formlayout-lastrow .v-formlayout-errorcell {
+       padding-bottom: 12px;
+}
+
+.v-formlayout-margin-left .v-formlayout-captioncell {
+       padding-left: 12px;
+}
+
+.v-formlayout-margin-right .v-formlayout-contentcell {
+       padding-right: 12px;
+}
+
+.v-formlayout-captioncell .v-caption .v-required-field-indicator {
+       float: none;
+}
+
+.v-gridlayout-margin-top {
+       padding-top: 12px;
+}
+
+.v-gridlayout-margin-bottom {
+       padding-bottom: 12px;
+}
+
+.v-gridlayout-margin-left {
+       padding-left: 12px;
+}
+
+.v-gridlayout-margin-right {
+       padding-right: 12px;
+}
+
+.v-gridlayout-spacing-on {
+       padding-left: 6px;
+       padding-top: 6px;
+       overflow: hidden;
+}
+
+.v-gridlayout-spacing, .v-gridlayout-spacing-off {
+       padding-left: 0;
+       padding-top: 0;
+}
+
+.v-gridlayout-spacing-off {
+       overflow: hidden;
+}
+
+.v-ie6 .v-gridlayout, .v-ie7 .v-gridlayout {
+       overflow: hidden;
+}
+
+.v-link {
+       white-space: nowrap;
+}
+
+.v-link a {
+       vertical-align: middle;
+       text-decoration: none;
+}
+
+.v-link span {
+       text-decoration: underline;
+       vertical-align: middle;
+}
+
+.v-disabled a {
+       cursor: default;
+}
+
+.v-link img {
+       vertical-align: middle;
+       border: none;
+}
+
+.v-loginform {
+       height: 140px;
+       width: 200px;
+}
+
+.v-app-loginpage .v-button, .v-app-loginpage .v-button {
+       float: left;
+}
+
+.v-menubar {
+       float: left;
+       white-space: nowrap;
+}
+
+.v-menubar .v-menubar-menuitem {
+       cursor: default;
+       vertical-align: middle;
+       white-space: nowrap;
+       display: inline;
+       display: inline-block;
+       zoom: 1;
+}
+
+.v-menubar .v-menubar-menuitem-caption .v-icon {
+       vertical-align: middle;
+       white-space: nowrap;
+}
+
+.v-menubar-submenu {
+       background: #ffffff;
+}
+
+.v-menubar-menuitem-selected {
+       background: #333333;
+       color: #ffffff;
+}
+
+.v-menubar-submenu .v-menubar-menuitem {
+       cursor: default;
+       display: block;
+       position: relative;
+       padding-right: 1.5em;
+}
+
+.v-menubar-submenu .v-menubar-menuitem-caption {
+       display: block;
+}
+
+.v-menubar-submenu .v-menubar-menuitem *, .v-menubar-submenu .v-menubar-menuitem-caption * {
+       white-space: nowrap;
+}
+
+.v-menubar-submenu-indicator {
+       display: none;
+       font-family: arial, helvetica, sans-serif;
+}
+
+.v-menubar-submenu .v-menubar-submenu-indicator {
+       display: block;
+       position: absolute;
+       right: 0;
+       width: 1em;
+       height: 1em;
+       font-size: 0.9em;
+}
+
+.v-menubar-menuitem-disabled, .v-menubar span.v-menubar-menuitem-disabled:hover, .v-menubar span.v-menubar-menuitem-disabled:focus, .v-menubar span.v-menubar-menuitem-disabled:active {
+       color: #999999;
+}
+
+.v-menubar-more-menuitem {
+       font-family: arial, helvetica, sans-serif;
+}
+
+.v-menubar-separator {
+       overflow: hidden;
+}
+
+.v-menubar-separator span {
+       display: block;
+       text-indent: -9999px;
+       font-size: 1px;
+       line-height: 1px;
+       border-top: 1px solid #dddddd;
+       margin: 3px 0 2px;
+       overflow: hidden;
+}
+
+.v-menubar .v-icon, .v-menubar-submenu .v-icon {
+       margin-right: 3px;
+}
+
+.v-menubar:focus, .v-menubar-popup:focus, .v-menubar-popup .popupContent:focus, .v-menubar-popup .popupContent .v-menubar-submenu:focus {
+       outline: none;
+}
+
+.v-menubar-submenu-check-column .v-menubar-menuitem {
+       padding-left: 6px;
+}
+
+.v-menubar-submenu-check-column .v-menubar-menuitem-caption {
+       padding-left: 18px;
+}
+
+.v-menubar-submenu .v-menubar-menuitem-checked .v-menubar-menuitem-caption {
+       background: transparent url(../base/menubar/img/check.gif) no-repeat left;
+}
+
+.v-Notification {
+       background: #999999;
+       color: #ffffff;
+       cursor: pointer;
+       overflow: hidden;
+       padding: 1em;
+       max-width: 85%;
+}
+
+.v-Notification h1, .v-Notification p, .v-Notification-error h1, .v-Notification-error p, .v-Notification-warning h1, .v-Notification-warning p {
+       display: inline;
+       margin: 0 0.5em 0 0;
+}
+
+.v-Notification-warning {
+       background: orange;
+}
+
+.v-Notification-error {
+       background: red;
+}
+
+.v-Notification-tray h1 {
+       display: block;
+}
+
+.v-Notification-tray p {
+       display: block;
+}
+
+.v-Notification-system {
+       background-color: red;
+       opacity: 0.7;
+       filter: alpha(opacity = 70);
+}
+
+.v-Notification-system h1 {
+       display: block;
+       margin: 0;
+}
+
+.v-orderedlayout-margin-top, .v-horizontallayout-margin-top, .v-verticallayout-margin-top {
+       padding-top: 12px;
+}
+
+.v-orderedlayout-margin-right, .v-horizontallayout-margin-right, .v-verticallayout-margin-right {
+       padding-right: 12px;
+}
+
+.v-orderedlayout-margin-bottom, .v-horizontallayout-margin-bottom, .v-verticallayout-margin-bottom {
+       padding-bottom: 12px;
+}
+
+.v-orderedlayout-margin-left, .v-horizontallayout-margin-left, .v-verticallayout-margin-left {
+       padding-left: 12px;
+}
+
+.v-orderedlayout-spacing-on, .v-horizontallayout-spacing-on, .v-verticallayout-spacing-on {
+       padding-top: 6px;
+       padding-left: 6px;
+}
+
+.v-orderedlayout-spacing-off, .v-horizontallayout-spacing-off, .v-verticallayout-spacing-off {
+       padding-top: 0;
+       padding-left: 0;
+}
+
+.v-ie6 .v-orderedlayout, .v-ie6 .v-horizontallayout, .v-ie6 .v-verticallayout, .v-ie7 .v-orderedlayout, .v-ie7 .v-horizontallayout, .v-ie7 .v-verticallayout {
+       overflow: hidden;
+}
+
+.v-panel, .v-panel-caption, .v-panel-content, .v-panel-deco, .v-panel-light, .v-panel-caption-light, .v-panel-content-light, .v-panel-deco-light {
+       outline: none;
+       text-align: left;
+}
+
+.v-panel-caption .v-errorindicator {
+       float: none;
+       display: inline;
+}
+
+.v-panel-caption .v-icon {
+       display: inline;
+       vertical-align: middle;
+}
+
+.v-panel-caption span {
+       vertical-align: middle;
+}
+
+.v-panel-caption {
+       white-space: nowrap;
+       overflow: hidden;
+       font-weight: bold;
+}
+
+.v-panel-nocaption {
+       overflow: hidden;
+}
+
+.v-panel-content {
+       overflow: auto;
+}
+
+.v-panel-deco {
+}
+
+.v-popupview {
+       cursor: pointer;
+       text-decoration: underline;
+       white-space: nowrap;
+}
+
+.v-popupview-popup {
+       overflow: auto;
+}
+
+.v-popupview-loading {
+       width: 30px;
+       height: 30px;
+       background: transparent url(../base/common/img/ajax-loader-medium.gif) no-repeat 50%;
+}
+
+.v-progressindicator {
+       overflow: hidden;
+       width: 150px;
+}
+
+.v-progressindicator-wrapper {
+       overflow: hidden;
+       height: 7px;
+       border: 1px solid #dddddd;
+}
+
+.v-progressindicator-indicator {
+       height: 7px;
+       overflow: hidden;
+       background: #dddddd;
+}
+
+div.v-progressindicator-indeterminate {
+       height: 20px;
+       width: 20px;
+       overflow: hidden;
+       background: #ffffff url(../base/common/img/ajax-loader-medium.gif) no-repeat 50%;
+       border-radius: 4px;
+       -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+}
+
+.v-progressindicator-indeterminate .v-progressindicator-wrapper, .v-progressindicator-indeterminate .v-progressindicator-indicator, .v-progressindicator-indeterminate-disabled .v-progressindicator-wrapper, .v-progressindicator-indeterminate-disabled .v-progressindicator-indicator {
+       display: none;
+}
+
+div.v-progressindicator-indeterminate-disabled {
+       height: 20px;
+       width: 20px;
+       overflow: hidden;
+       background: transparent;
+}
+
+.v-select {
+       text-align: left;
+}
+
+.v-select-optiongroup .v-select-option {
+       display: block;
+       white-space: nowrap;
+}
+
+.v-select-optiongroup .v-icon {
+       vertical-align: middle;
+       white-space: nowrap;
+       margin: 0 2px;
+}
+
+.v-ie .v-select-optiongroup .v-select-option {
+       zoom: 1;
+}
+
+.v-select-select {
+       display: block;
+}
+
+.v-select-twincol {
+       white-space: nowrap;
+}
+
+.v-select-twincol-options {
+       float: left;
+}
+
+.v-select-twincol-caption-left {
+       float: left;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+
+.v-select-twincol-selections {
+       font-weight: bold;
+}
+
+.v-select-twincol-caption-right {
+       float: right;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+
+.v-select-twincol-buttons {
+       float: left;
+       text-align: center;
+}
+
+.v-select-twincol-buttons .v-select-twincol-deco {
+       clear: both;
+}
+
+.v-select-twincol .v-textfield {
+       display: block;
+       float: left;
+       clear: left;
+}
+
+.v-select-twincol .v-button {
+       float: left;
+}
+
+.v-select-twincol-buttons .v-button {
+       float: none;
+}
+
+.v-filterselect {
+       white-space: nowrap;
+       text-align: left;
+}
+
+.v-filterselect .v-icon {
+       float: left;
+}
+
+.v-app .v-filterselect-input, .v-window .v-filterselect-input, .v-popupview-popup .v-filterselect-input {
+       float: left;
+       -webkit-border-radius: 0px;
+}
+
+.v-filterselect-prompt .v-filterselect-input {
+       color: #999999;
+       font-style: italic;
+}
+
+.v-filterselect-button {
+       float: right;
+       cursor: pointer;
+       width: 1em;
+       height: 1em;
+       background: transparent url(../base/common/img/sprites.png) no-repeat -5px -8px;
+}
+
+.v-filterselect.v-readonly .v-filterselect-button {
+       display: none;
+}
+
+.v-filterselect.v-readonly, .v-filterselect.v-readonly .v-filterselect-input {
+       background: transparent;
+}
+
+.v-filterselect-suggestpopup {
+       background: #ffffff;
+       border: 1px solid #eeeeee;
+}
+
+.v-filterselect-suggestmenu table {
+       border-collapse: collapse;
+       border: none;
+}
+
+.v-filterselect-suggestmenu .gwt-MenuItem {
+       white-space: nowrap;
+}
+
+.v-filterselect-suggestmenu .gwt-MenuItem .v-icon {
+       margin-right: 3px;
+       vertical-align: middle;
+}
+
+.v-filterselect-suggestmenu .gwt-MenuItem span {
+       vertical-align: middle;
+}
+
+.v-filterselect-suggestmenu .gwt-MenuItem-selected {
+       background: #333333;
+       color: #ffffff;
+}
+
+.v-filterselect-nextpage, .v-filterselect-nextpage-off, .v-filterselect-prevpage-off, .v-filterselect-prevpage {
+       width: 100%;
+       background: #aaaaaa;
+       text-align: center;
+       overflow: hidden;
+       cursor: pointer;
+}
+
+.v-filterselect-nextpage-off, .v-filterselect-prevpage-off {
+       color: #666666;
+       opacity: 0.5;
+       filter: alpha(opacity = 50);
+       cursor: default;
+}
+
+.v-filterselect-nextpage-off span, .v-filterselect-prevpage-off span {
+       cursor: default;
+}
+
+.v-filterselect-status {
+       white-space: nowrap;
+       text-align: center;
+}
+
+.v-filterselect-no-input .v-filterselect-input {
+       cursor: default;
+}
+
+.v-shadow {
+       position: absolute;
+}
+
+.v-shadow .top-left {
+       position: absolute;
+       overflow: hidden;
+       top: -3px;
+       left: -5px;
+       width: 10px;
+       height: 10px;
+       background: transparent url(../base/shadow/img/top-left.png);
+}
+
+.v-shadow .top {
+       position: absolute;
+       overflow: hidden;
+       top: -3px;
+       left: 5px;
+       height: 10px;
+       right: 5px;
+       background: transparent url(../base/shadow/img/top.png);
+}
+
+.v-shadow .top-right {
+       position: absolute;
+       overflow: hidden;
+       top: -3px;
+       right: -5px;
+       width: 10px;
+       height: 10px;
+       background: transparent url(../base/shadow/img/top-right.png);
+}
+
+.v-shadow .left {
+       position: absolute;
+       overflow: hidden;
+       top: 7px;
+       left: -5px;
+       width: 10px;
+       bottom: 3px;
+       background: transparent url(../base/shadow/img/left.png);
+}
+
+.v-shadow .center {
+       position: absolute;
+       overflow: hidden;
+       top: 7px;
+       left: 5px;
+       bottom: 3px;
+       right: 5px;
+       background: transparent url(../base/shadow/img/center.png);
+}
+
+.v-shadow .right {
+       position: absolute;
+       overflow: hidden;
+       top: 7px;
+       right: -5px;
+       width: 10px;
+       bottom: 3px;
+       background: transparent url(../base/shadow/img/right.png);
+}
+
+.v-shadow .bottom-left {
+       position: absolute;
+       overflow: hidden;
+       bottom: -7px;
+       left: -5px;
+       width: 10px;
+       height: 10px;
+       background: transparent url(../base/shadow/img/bottom-left.png);
+}
+
+.v-shadow .bottom {
+       position: absolute;
+       overflow: hidden;
+       bottom: -7px;
+       left: 5px;
+       right: 5px;
+       height: 10px;
+       background: transparent url(../base/shadow/img/bottom.png);
+}
+
+.v-shadow .bottom-right {
+       position: absolute;
+       overflow: hidden;
+       bottom: -7px;
+       right: -5px;
+       width: 10px;
+       height: 10px;
+       background: transparent url(../base/shadow/img/bottom-right.png);
+}
+
+.v-ie6 .v-shadow * {
+       display: none;
+}
+
+.v-ie6 .v-shadow {
+       background: #000000;
+       filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2 ) alpha(opacity = 20);
+       margin-top: -2px;
+       margin-left: -2px;
+}
+
+.v-slider {
+       margin: 5px 0;
+}
+
+.v-slider-base {
+       height: 2px;
+       border-top: 1px solid #dddddd;
+       background: #eeeeee;
+       border-left: 1px solid #dddddd;
+       border-right: 1px solid #eeeeee;
+}
+
+.v-slider-handle {
+       background: #aaaaaa;
+       width: 12px;
+       height: 12px;
+       margin-top: -5px;
+       font-size: 0;
+}
+
+.v-slider-vertical {
+       width: 2px;
+       height: auto;
+       margin: 0 5px;
+       border: none;
+       border-left: 1px solid #cccfd0;
+       border-right: 1px solid #cccfd0;
+}
+
+.v-slider-vertical .v-slider-base {
+       width: 2px;
+       border-bottom: 1px solid #eeeeee;
+       border-right: none;
+}
+
+.v-slider-vertical .v-slider-handle {
+       width: 12px;
+       height: 12px;
+       font-size: 0;
+       margin-left: -5px;
+}
+
+.v-slider-feedback {
+       padding: 2px 5px;
+       background: #444444;
+       color: #ffffff;
+       font-size: 11px;
+       line-height: 13px;
+       font-weight: bold;
+       font-family: Arial, Helvetica, sans-serif;
+       border-radius: 4px;
+       -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+       margin: -2px 0 0 2px;
+       text-shadow: 0 1px 0 #000000;
+}
+
+.v-ie6 .v-slider, .v-ie6 .v-slider-vertical {
+       margin: 0;
+}
+
+.v-ie6 .v-slider .v-slider-handle {
+       margin: -1px 0;
+}
+
+.v-ie6 .v-slider-vertical .v-slider-handle {
+       margin: 0 -1px;
+}
+
+.v-splitpanel-horizontal, .v-splitpanel-vertical {
+       overflow: hidden;
+}
+
+.v-splitpanel-hsplitter {
+       width: 6px;
+       font-size: 1px;
+}
+
+.v-splitpanel-hsplitter div {
+       width: 6px;
+       font-size: 1px;
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       background: #dddddd;
+       cursor: e-resize;
+       cursor: col-resize;
+}
+
+.v-disabled .v-splitpanel-hsplitter div {
+       cursor: default;
+}
+
+.v-splitpanel-vsplitter {
+       height: 6px;
+       font-size: 1px;
+}
+
+.v-splitpanel-vsplitter div {
+       height: 6px;
+       font-size: 1px;
+       background: #dddddd;
+       cursor: s-resize;
+       cursor: row-resize;
+}
+
+.v-disabled .v-splitpanel-vsplitter div {
+       cursor: default;
+}
+
+.v-ie6 .v-splitpanel-hsplitter div {
+       height: 99%;
+}
+
+.v-ie6 .v-splitpanel-first-container, .v-ie6 .v-splitpanel-second-container, .v-ie7 .v-splitpanel-first-container, .v-ie7 .v-splitpanel-second-container {
+       position: relative;
+}
+
+.v-table {
+       overflow: hidden;
+       text-align: left;
+}
+
+.v-ie7 .v-table {
+       overflow: visible;
+}
+
+.v-table-header-wrap {
+       overflow: hidden;
+       border: 1px solid #aaaaaa;
+       border-bottom: none;
+       background: #efefef;
+}
+
+.v-table-header table, .v-table-table {
+       border-spacing: 0;
+       border-collapse: separate;
+       margin: 0;
+       padding: 0;
+       border: 0;
+}
+
+.v-table-header td {
+       padding: 0;
+}
+
+.v-table-header-cell, .v-table-header-cell-asc, .v-table-header-cell-desc {
+       cursor: pointer;
+}
+
+.v-table.v-disabled .v-table-header-cell, .v-table.v-disabled .v-table-header-cell-asc, .v-table.v-disabled .v-table-header-cell-desc {
+       cursor: default;
+}
+
+.v-table-footer-wrap {
+       overflow: hidden;
+       border: 1px solid #aaaaaa;
+       border-top: none;
+       background: #efefef;
+}
+
+.v-table-footer table {
+       border-spacing: 0;
+       border-collapse: collapse;
+       margin: 0;
+       padding: 0;
+       border: 0;
+}
+
+.v-table-footer td {
+       padding: 0;
+       border-right: 1px solid #aaaaaa;
+}
+
+.v-table-footer-cell {
+       cursor: pointer;
+}
+
+.v-table-footer-container {
+       float: right;
+       padding-right: 6px;
+       overflow: hidden;
+       white-space: nowrap;
+}
+
+.v-table-resizer {
+       display: block;
+       height: 1.2em;
+       float: right;
+       background: #aaaaaa;
+       cursor: e-resize;
+       cursor: col-resize;
+       width: 1px;
+       overflow: hidden;
+}
+
+.v-table.v-disabled .v-table-resizer {
+       cursor: default;
+}
+
+.v-table-caption-container {
+       overflow: hidden;
+       white-space: nowrap;
+       margin-left: 6px;
+}
+
+.v-ie7 .v-table-caption-container-align-right {
+       margin-left: 0px;
+       padding-left: 6px;
+}
+
+.v-table-caption-container-align-right {
+       float: right;
+}
+
+.v-table-sort-indicator {
+       width: 0px;
+       height: 1.2em;
+       float: right;
+}
+
+.v-table-header-cell-asc .v-table-sort-indicator, .v-table-header-cell-desc .v-table-sort-indicator {
+       width: 16px;
+       height: 1.2em;
+       float: right;
+}
+
+.v-table-header-cell-asc .v-table-sort-indicator {
+       background: transparent url(../base/common/img/sprites.png) no-repeat right 6px;
+}
+
+.v-table-header-cell-desc .v-table-sort-indicator {
+       background: transparent url(../base/common/img/sprites.png) no-repeat right -10px;
+}
+
+.v-table-caption-container-align-center {
+       text-align: center;
+}
+
+.v-table-caption-container-align-right {
+       text-align: right;
+}
+
+.v-table-caption-container .v-icon, .v-table-header-drag .v-icon {
+       vertical-align: middle;
+}
+
+.v-table-body {
+       border: 1px solid #aaaaaa;
+}
+
+.v-table-row-spacer {
+       height: 10px;
+       overflow: hidden;
+}
+
+.v-table-row, .v-table-row-odd {
+       background: #ffffff;
+       border: 0;
+       margin: 0;
+       padding: 0;
+       cursor: pointer;
+}
+
+.v-table-generated-row {
+       background: #efefef;
+}
+
+.v-table-body-noselection .v-table-row, .v-table-body-noselection .v-table-row-odd {
+       cursor: default;
+}
+
+.v-table .v-selected {
+       background: #999999;
+       color: #ffffff;
+}
+
+.v-table-cell-content {
+       white-space: nowrap;
+       overflow: hidden;
+       padding: 0 6px;
+       border-right: 1px solid #aaaaaa;
+}
+
+.v-table-cell-wrapper {
+       white-space: nowrap;
+       overflow: hidden;
+}
+
+.v-table-cell-wrapper-align-center {
+       text-align: center;
+}
+
+.v-table-cell-wrapper-align-right {
+       text-align: right;
+}
+
+.v-table-column-selector {
+       float: right;
+       background: transparent url(../base/common/img/sprites.png) no-repeat 4px -37px;
+       margin: -1.2em 0 0 0;
+       height: 1.2em;
+       width: 14px;
+       position: relative;
+       cursor: pointer;
+}
+
+.v-table.v-disabled .v-table-column-selector {
+       cursor: default;
+}
+
+.v-ie6 .v-table-column-selector, .v-ie7 .v-table-column-selector {
+       position: static;
+}
+
+.v-table-focus-slot-left {
+       border-left: 2px solid #999999;
+       float: none;
+       margin-bottom: -1.2em;
+       width: auto;
+       background: transparent;
+       border-right: 1px solid #aaaaaa;
+}
+
+.v-table-focus-slot-right {
+       border-right: 2px solid #999999;
+       margin-left: -2px;
+}
+
+.v-table-header-drag {
+       position: absolute;
+       background: #efefef;
+       border: 1px solid #eeeeee;
+       opacity: 0.9;
+       filter: alpha(opacity = 90);
+       margin-top: 20px;
+       z-index: 30000;
+}
+
+.v-table-header-drag .v-icon {
+       vertical-align: middle;
+}
+
+.v-table-scrollposition {
+       width: 160px;
+       background: #eeeeee;
+       border: 1px solid #aaaaaa;
+}
+
+.v-table-scrollposition span {
+       display: block;
+       text-align: center;
+}
+
+.v-table-body:focus, .v-table-body-wrapper:focus {
+       outline: none;
+}
+
+.v-table-body.focused {
+       border-color: #388ddd;
+}
+
+.v-table-focus .v-table-cell-content {
+       border-top: 1px dotted #0066bd;
+       border-bottom: 1px dotted #0066bd;
+}
+
+.v-table-focus .v-table-cell-wrapper {
+       margin-top: -1px;
+       margin-bottom: -1px;
+}
+
+.v-on {
+}
+
+.v-off {
+       color: #dddddd;
+}
+
+.v-table-drag .v-table-body {
+       border-color: #1d9dff;
+}
+
+.v-table-row-drag-middle .v-table-cell-content {
+       background-color: #bcdcff;
+}
+
+.v-table-row-drag-top .v-table-cell-content {
+       border-top: 2px solid #1d9dff;
+}
+
+.v-table-row-drag-top .v-table-cell-wrapper {
+       margin-top: -2px;
+}
+
+.v-table-row-drag-bottom .v-table-cell-content {
+       border-bottom: 2px solid #1d9dff;
+}
+
+.v-table-row-drag-bottom .v-table-cell-wrapper {
+       margin-bottom: -2px;
+}
+
+.v-table-row-drag-top .v-table-cell-content:first-child:before, .v-table-row-drag-bottom .v-table-cell-content:first-child:after {
+       display: block;
+       content: "";
+       position: absolute;
+       width: 6px;
+       height: 6px;
+       margin-top: -4px;
+       margin-left: -6px;
+       background: transparent url(../base/common/img/drag-slot-dot.png);
+}
+
+.v-ff .v-table-row-drag-bottom .v-table-cell-content:first-child:after, .v-ie .v-table-row-drag-bottom .v-table-cell-content:first-child:after {
+       margin-top: -2px;
+}
+
+.v-tabsheet, .v-tabsheet-content, .v-tabsheet-deco {
+       outline: none;
+       text-align: left;
+}
+
+.v-tabsheet-tabs {
+       empty-cells: hide;
+       border-collapse: collapse;
+       margin: 0;
+       padding: 0;
+       border: 0;
+       width: 100%;
+       overflow: hidden;
+}
+
+.v-tabsheet-tabitemcell:focus {
+       outline: none;
+}
+
+.v-tabsheet-tabitemcell, .v-tabsheet-spacertd {
+       margin: 0;
+       padding: 0;
+       vertical-align: bottom;
+}
+
+.v-tabsheet-spacertd {
+       width: 100%;
+}
+
+.v-tabsheet-spacertd div {
+       border-left: 1px solid #aaaaaa;
+       border-bottom: 1px solid #aaaaaa;
+       height: 1em;
+       padding: 0.2em 0;
+}
+
+.v-tabsheet-hidetabs .v-tabsheet-tabcontainer {
+       display: none;
+}
+
+.v-tabsheet-scroller {
+       white-space: nowrap;
+       text-align: right;
+       margin-top: -1em;
+}
+
+.v-ff2 .v-tabsheet-scroller {
+       position: relative;
+}
+
+.v-disabled .v-tabsheet-scroller {
+       display: none;
+}
+
+.v-tabsheet-scrollerPrev, .v-tabsheet-scrollerNext, .v-tabsheet-scrollerPrev-disabled, .v-tabsheet-scrollerNext-disabled {
+       border: 1px solid #aaaaaa;
+       background: #ffffff;
+       width: 12px;
+       height: 1em;
+       cursor: pointer;
+}
+
+.v-tabsheet-scrollerPrev-disabled, .v-tabsheet-scrollerNext-disabled {
+       opacity: 0.5;
+       cursor: default;
+}
+
+.v-tabsheet-tabs .v-caption, .v-tabsheet-tabs .v-caption span {
+       white-space: nowrap;
+}
+
+.v-tabsheet-caption-close {
+       display: inline;
+       display: inline-block;
+       zoom: 1;
+       width: 16px;
+       height: 16px;
+       text-align: center;
+       font-weight: bold;
+       cursor: pointer;
+       vertical-align: middle;
+       user-select: none;
+       -khtml-user-select: none;
+       -ms-user-select: none;
+       -moz-user-select: none;
+       -webkit-user-select: none;
+}
+
+.v-tabsheet .v-disabled .v-tabsheet-caption-close {
+       cursor: default;
+       visibility: hidden;
+}
+
+.v-tabsheet-tabitem:hover .v-tabsheet-caption-close, .v-ie6 .v-tabsheet-caption-close {
+       visibility: visible;
+}
+
+.v-ie6 .v-tabsheet-caption-close {
+       float: right;
+}
+
+.v-tabsheet-tabitem {
+       border: 1px solid #aaaaaa;
+       border-right: none;
+       cursor: pointer;
+       padding: 0.2em 0.5em;
+}
+
+.v-tabsheet-tabitem .v-caption {
+       cursor: inherit;
+}
+
+.v-tabsheet.v-disabled .v-tabsheet-tabitem, .v-tabsheet-tabitemcell-disabled .v-tabsheet-tabitem {
+       cursor: default;
+}
+
+.v-tabsheet-tabitem-selected {
+       cursor: default;
+       border-bottom-color: #ffffff;
+}
+
+.v-tabsheet-tabitem-selected .v-caption {
+       cursor: default;
+}
+
+.v-tabsheet-content {
+       border: 1px solid #aaaaaa;
+       border-top: none;
+       border-bottom: none;
+       position: relative;
+}
+
+.v-ie6 .v-tabsheet-content, .v-ie7 .v-tabsheet-content {
+       zoom: 1;
+}
+
+.v-tabsheet-deco {
+       height: 1px;
+       background: #aaaaaa;
+       overflow: hidden;
+}
+
+.v-tabsheet-hidetabs .v-tabsheet-content {
+       border: none;
+}
+
+.v-tabsheet-hidetabs .v-tabsheet-deco {
+       height: 0;
+}
+
+.v-textfield {
+       text-align: left;
+}
+
+.v-textarea {
+       resize: none;
+}
+
+.v-textfield-focus, .v-textarea-focus {
+}
+
+input.v-textfield-prompt, textarea.v-textarea-prompt {
+       color: #999999;
+       font-style: italic;
+}
+
+input.v-textfield-readonly, textarea.v-textarea-readonly {
+       background: transparent;
+       border: none;
+       resize: none;
+}
+
+input.v-disabled, textarea.v-disabled {
+       resize: none;
+}
+
+input.v-textfield-readonly:focus, textarea.v-textarea-readonly:focus {
+       outline: none;
+}
+
+.v-sa input:focus, .v-sa textarea:focus {
+       outline-width: medium;
+}
+
+.v-richtextarea {
+       border: 1px solid #aaaaaa;
+       overflow: hidden;
+}
+
+.v-richtextarea .gwt-RichTextArea {
+       background: #ffffff;
+       border: none;
+}
+
+.v-richtextarea .gwt-RichTextToolbar {
+       white-space: nowrap;
+       background: #959595 url(../base/textfield/img/richtext-toolbar-bg.png) repeat-x 0 -42px;
+       border-bottom: 1px solid #7d7d7d;
+       padding: 2px;
+       overflow: hidden;
+}
+
+.v-richtextarea .gwt-RichTextToolbar-top {
+       padding-bottom: 1px;
+       overflow: hidden;
+       white-space: normal;
+}
+
+.v-richtextarea .gwt-RichTextToolbar-bottom {
+       clear: left;
+       overflow: hidden;
+       white-space: nowrap;
+}
+
+.v-richtextarea .gwt-RichTextToolbar .gwt-ToggleButton, .v-richtextarea .gwt-RichTextToolbar .gwt-PushButton {
+       float: left;
+       display: inline;
+       width: 22px;
+       height: 21px;
+       overflow: hidden;
+       background: transparent url(../base/textfield/img/richtext-toolbar-bg.png) repeat-x;
+       cursor: pointer;
+       margin-right: 2px;
+       text-align: center;
+}
+
+.v-richtextarea .gwt-RichTextToolbar .gwt-ToggleButton-down, .v-richtextarea .gwt-RichTextToolbar .gwt-PushButton-down, .v-richtextarea .gwt-RichTextToolbar .gwt-ToggleButton-down-hovering, .v-richtextarea .gwt-RichTextToolbar .gwt-PushButton-down-hovering {
+       background-position: 0 -21px;
+}
+
+.v-richtextarea .gwt-RichTextToolbar .gwt-ToggleButton img, .v-richtextarea .gwt-RichTextToolbar .gwt-PushButton img {
+}
+
+.v-richtextarea .gwt-RichTextToolbar .gwt-ListBox {
+       width: 24.5%;
+       margin-right: 2px;
+}
+
+.v-richtextarea-readonly {
+       border: none;
+}
+
+.v-tree {
+       text-align: left;
+       overflow: hidden;
+       padding: 1px 0;
+       outline: none;
+}
+
+.v-tree-node {
+       background: transparent url(../base/common/img/sprites.png) no-repeat 5px -37px;
+       padding: 1px 0;
+}
+
+.v-tree-node-caption:focus {
+       outline: none;
+}
+
+div.v-tree-node-leaf {
+       background: transparent;
+}
+
+.v-tree-node-expanded {
+       background: transparent url(../base/common/img/sprites.png) no-repeat -5px -10px;
+}
+
+.v-tree-node-caption {
+       margin-left: 1em;
+}
+
+.v-tree-node span {
+       cursor: pointer;
+}
+
+.v-tree-node-caption div {
+       white-space: nowrap;
+}
+
+.v-tree-node-caption span, .v-tree-node-caption .v-icon {
+       vertical-align: middle;
+}
+
+.v-tree-node-selected span {
+       background: #999999;
+       color: #ffffff;
+}
+
+.v-tree-node-children {
+       padding-left: 1em;
+}
+
+.v-tree-node-ie6compatnode {
+       display: none;
+}
+
+.v-ie6 .v-tree-node-ie6compatnode {
+       display: inline;
+       float: left;
+       background: orange;
+       margin: 0;
+       width: 0.8em;
+       height: 0.8em;
+       padding: 0.1em;
+       filter: alpha(opacity = 0);
+}
+
+.v-ie6 .v-tree-node, .v-ie6 .v-tree-node-children {
+       clear: left;
+}
+
+.v-tree .v-tree-node-drag-top {
+       border-top: 2px solid #1d9dff;
+       margin-top: -1px;
+       padding-top: 0;
+}
+
+.v-tree .v-tree-node-drag-bottom {
+       border-bottom: 2px solid #1d9dff;
+       margin-bottom: -1px;
+       padding-bottom: 0;
+}
+
+.v-tree .v-tree-node-drag-top:before, .v-tree .v-tree-node-drag-bottom:after, .v-tree .v-tree-node-caption-drag-center:after {
+       display: block;
+       content: "";
+       position: absolute;
+       width: 6px;
+       height: 6px;
+       margin-top: -4px;
+       background: transparent url(../base/common/img/drag-slot-dot.png);
+}
+
+.v-tree .v-tree-node-drag-bottom:after {
+       margin-top: -2px;
+}
+
+.v-tree .v-tree-node-caption-drag-center:after {
+       margin-left: 14px;
+}
+
+.v-ff .v-tree .v-tree-node-caption-drag-center:after, .v-ie .v-tree .v-tree-node-caption-drag-center:after {
+       margin-top: -2px;
+}
+
+.v-tree .v-tree-node-drag-top {
+       background-position: 5px -38px;
+}
+
+.v-tree .v-tree-node-drag-top.v-tree-node-expanded {
+       background-position: -5px -11px;
+}
+
+.v-tree .v-tree-node-caption-drag-center div {
+       border: 2px solid #1d9dff;
+       -moz-border-radius: 4px;
+       -webkit-border-radius: 4px;
+       border-radius: 4px;
+       margin: -2px 2px -2px -2px;
+       background-color: #bcdcff;
+}
+
+.v-ie6 .v-tree .v-tree-node-caption-drag-center div {
+       margin: -2px;
+}
+
+.v-tree .v-tree-node-caption-drag-center div {
+       background-color: rgba(169, 209, 255, 0.6);
+}
+
+.v-tree .v-tree-node-caption-drag-center div, .v-tree .v-tree-node-drag-top, .v-tree .v-tree-node-drag-bottom {
+       border-color: rgba(0, 109, 232, 0.6);
+}
+
+.v-tree-connectors .v-tree-node-caption {
+       padding-top: 1px;
+}
+
+.v-tree-connectors .v-tree-node {
+       background: transparent url(../base/tree/img/connector-expand.png) no-repeat 2px -52px;
+}
+
+.v-tree-connectors .v-tree-node-expanded {
+       background: transparent url(../base/tree/img/connector-collapse.png) no-repeat 2px -52px;
+}
+
+.v-tree-connectors .v-tree-node-last {
+       background: transparent url(../base/tree/img/connector-expand-last.png) no-repeat 2px -52px;
+}
+
+.v-tree-connectors .v-tree-node-expanded.v-tree-node-last {
+       background: transparent url(../base/tree/img/connector-collapse-last.png) no-repeat 2px -52px;
+}
+
+.v-tree-connectors .v-tree-node-leaf {
+       background: transparent url(../base/tree/img/connector-leaf.png) repeat-y 2px 50%;
+}
+
+.v-tree-connectors .v-tree-node-leaf-last {
+       background: transparent url(../base/tree/img/connector-leaf-last.png) repeat-y 2px 50%;
+}
+
+.v-tree-connectors .v-tree-node-children {
+       background: transparent url(../base/tree/img/connector.png) repeat-y 2px 0;
+}
+
+.v-tree-connectors .v-tree-node-children-last {
+       background: transparent;
+}
+
+.v-tree-connectors .v-tree-node-drag-top, .v-tree-connectors .v-tree-node-expanded.v-tree-node-drag-top {
+       background-position: 2px -53px;
+}
+
+.v-tree-connectors .v-tree-node-drag-top.v-tree-node-leaf {
+       background-position: 2px 50%;
+}
+
+.v-ie6 .v-tree-connectors .v-tree-node {
+       background: transparent url(../base/tree/img/connector-expand-ie6.png) no-repeat 2px -52px;
+}
+
+.v-ie6 .v-tree-connectors .v-tree-node-expanded {
+       background: transparent url(../base/tree/img/connector-collapse-ie6.png) no-repeat 2px -52px;
+}
+
+.v-ie6 .v-tree-connectors .v-tree-node-last {
+       background: transparent url(../base/tree/img/connector-expand-last-ie6.png) no-repeat 2px -52px;
+}
+
+.v-ie6 .v-tree-connectors .v-tree-node-last.v-tree-node-expanded {
+       background: transparent url(../base/tree/img/connector-collapse-last-ie6.png) no-repeat 2px -52px;
+}
+
+.v-treetable-treespacer {
+       display: inline-block;
+       background: transparent;
+       height: 10px;
+       width: 18px;
+}
+
+.v-ie7 .v-treetable-treespacer {
+       height: 100%;
+}
+
+.v-treetable-node-closed {
+       background: url(../base/treetable/img/arrow-right.png) right center no-repeat;
+}
+
+.v-ie6 .v-treetable-node-closed {
+       background-image: url(../base/treetable/img/arrow-right.gif);
+}
+
+.v-treetable-node-open {
+       background: url(../base/treetable/img/arrow-down.png) right center no-repeat;
+}
+
+.v-ie6 .v-treetable-node-open {
+       background-image: url(../base/treetable/img/arrow-down.gif);
+}
+
+.v-treetable .v-checkbox {
+       display: inline-block;
+       padding-bottom: 4px;
+}
+
+.v-treetable .v-table-row .v-table-cell-content, .v-treetable .v-table-row-odd .v-table-cell-content {
+       position: relative;
+       z-index: 10;
+}
+
+.v-treetable .v-table-body .v-table-table .v-table-row-animating {
+       zoom: 1;
+       z-index: 1;
+}
+
+.v-treetable .v-table-body .v-table-table .v-table-row-animating, .v-treetable .v-table-body .v-table-table .v-table-row-animating .v-table-cell-content {
+       background: transparent;
+}
+
+.v-treetable-animation-clone {
+       border-spacing: 0;
+       zoom: 1;
+}
+
+div.v-treetable-animation-clone-wrapper {
+       position: absolute;
+       z-index: 2;
+       background-color: #ffffff;
+}
+
+div.v-treetable-animation-clone-wrapper table.v-treetable-animation-clone {
+       background-color: #ffffff;
+}
+
+div table.v-treetable-animation-clone tr.v-table-row, div table.v-treetable-animation-clone tr.v-table-row-odd, div table.v-treetable-animation-clone tr.v-table-row td.v-table-cell-content, div table.v-treetable-animation-clone tr.v-table-row-odd td.v-table-cell-content {
+       visibility: visible;
+}
+
+.v-upload {
+       white-space: nowrap;
+}
+
+.v-ie6 .v-upload, .v-ie7 .v-upload {
+       margin: 0;
+}
+
+.v-upload-immediate {
+       position: relative;
+       margin: 0;
+       overflow: hidden;
+}
+
+.v-ff .v-upload-immediate, .v-op .v-upload-immediate {
+       display: inline-block;
+}
+
+.v-upload-immediate input {
+       opacity: 0;
+       filter: alpha(opacity = 0);
+       z-index: 2;
+       position: absolute;
+       right: 0;
+       height: 21px;
+       text-align: right;
+       border: none;
+       background: transparent;
+}
+
+.v-upload-immediate button {
+       position: relative;
+       left: 0;
+       top: 0;
+       width: 100%;
+       text-align: left;
+}
+
+.v-window {
+       background: #ffffff;
+}
+
+.v-window-outerheader {
+       padding: 0.3em 1em;
+       height: 1em;
+}
+
+.v-window-outerheader, .v-window-draggingCurtain {
+       cursor: move;
+}
+
+.v-window-header {
+       font-weight: bold;
+}
+
+div.v-window-header {
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       -ms-text-overflow: ellipsis;
+       overflow: hidden;
+       padding: 0;
+}
+
+.v-ie6 .v-window-header {
+       width: 100%;
+}
+
+.v-window-header .v-icon {
+       vertical-align: middle;
+}
+
+.v-window-contents, x:-moz-any-link {
+       overflow: hidden;
+}
+
+.v-window-contents, x:-moz-any-link, x:default {
+       overflow: visible;
+}
+
+.v-window-contents > div {
+       outline: none;
+}
+
+.v-window-footer {
+       overflow: hidden;
+       zoom: 1;
+       height: 10px;
+       position: relative;
+       cursor: move;
+}
+
+.v-window-resizebox {
+       width: 10px;
+       height: 10px;
+       background: #dddddd;
+       overflow: hidden;
+       position: absolute;
+       right: 0;
+}
+
+.v-window-resizebox, .v-window-resizingCurtain {
+       cursor: se-resize;
+}
+
+.v-window div.v-window-footer-noresize {
+       height: 0;
+}
+
+.v-window-resizebox-disabled {
+       cursor: default;
+       display: none;
+}
+
+.v-window-closebox {
+       position: absolute;
+       top: 0;
+       right: 0;
+       width: 1em;
+       height: 1em;
+       background: red;
+       cursor: pointer;
+       overflow: hidden;
+}
+
+.v-window-modalitycurtain {
+       top: 0;
+       left: 0;
+       background: #999999;
+       opacity: 0.5;
+       position: fixed;
+       width: 100%;
+       height: 100%;
+       filter: alpha(opacity = 50);
+}
+
+.v-ie6 .v-window-modalitycurtain {
+       position: absolute;
+       top: expression(document.documentElement.scrollTop +   "px");
+}
+
+.v-ie6 .v-window {
+       width: 0;
+}
+
+.v-shadow-window {
+       position: absolute;
+}
+
+.v-shadow-window .top-left {
+       position: absolute;
+       overflow: hidden;
+       top: -10px;
+       left: -15px;
+       width: 28px;
+       height: 28px;
+       background: transparent url(../base/window/img/shadow/top-left.png);
+}
+
+.v-shadow-window .top {
+       position: absolute;
+       overflow: hidden;
+       top: -10px;
+       left: 13px;
+       height: 28px;
+       right: 13px;
+       background: transparent url(../base/window/img/shadow/top.png);
+}
+
+.v-shadow-window .top-right {
+       position: absolute;
+       overflow: hidden;
+       top: -10px;
+       right: -15px;
+       width: 28px;
+       height: 28px;
+       background: transparent url(../base/window/img/shadow/top-right.png);
+}
+
+.v-shadow-window .left {
+       position: absolute;
+       overflow: hidden;
+       top: 18px;
+       left: -15px;
+       width: 28px;
+       bottom: 10px;
+       background: transparent url(../base/window/img/shadow/left.png);
+}
+
+.v-shadow-window .center {
+       position: absolute;
+       overflow: hidden;
+       top: 18px;
+       left: 13px;
+       bottom: 10px;
+       right: 13px;
+       background: transparent url(../base/window/img/shadow/center.png);
+}
+
+.v-shadow-window .right {
+       position: absolute;
+       overflow: hidden;
+       top: 18px;
+       right: -15px;
+       width: 28px;
+       bottom: 10px;
+       background: transparent url(../base/window/img/shadow/right.png);
+}
+
+.v-shadow-window .bottom-left {
+       position: absolute;
+       overflow: hidden;
+       bottom: -18px;
+       left: -15px;
+       width: 28px;
+       height: 28px;
+       background: transparent url(../base/window/img/shadow/bottom-left.png);
+}
+
+.v-shadow-window .bottom {
+       position: absolute;
+       overflow: hidden;
+       bottom: -18px;
+       left: 13px;
+       right: 13px;
+       height: 28px;
+       background: transparent url(../base/window/img/shadow/bottom.png);
+}
+
+.v-shadow-window .bottom-right {
+       position: absolute;
+       overflow: hidden;
+       bottom: -18px;
+       right: -15px;
+       width: 28px;
+       height: 28px;
+       background: transparent url(../base/window/img/shadow/bottom-right.png);
+}
+
+.v-ie6 .v-shadow-window * {
+       display: none;
+}
+
+.v-ie6 .v-shadow-window {
+       background: #000000;
+       filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=5 ) alpha(opacity = 20);
+       margin-top: 2px;
+       margin-left: 2px;
+}
+
+.v-accordion {
+       border: 1px solid #bebebe;
+       border-radius: 2px;
+       -webkit-border-radius: 2px;
+       -moz-border-radius: 2px;
+       overflow: hidden;
+}
+
+.v-accordion-item {
+       background-color: #ffffff;
+}
+
+.v-accordion-item-caption {
+       height: 19px;
+       background: #e4e4e4 repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -0px;
+       font-size: 11px;
+       line-height: normal;
+       border-top: 1px solid #bebebe;
+       text-shadow: #ffffff 0 1px 0;
+}
+
+.v-accordion-item-first .v-accordion-item-caption {
+       border-top: none;
+}
+
+.v-accordion-item-caption .v-caption {
+       padding: 3px 0 5px 10px;
+}
+
+.v-ie .v-accordion-item-caption .v-caption {
+       padding: 2px 0 6px 10px;
+}
+
+.v-accordion-item-open .v-accordion-item-caption {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -19px;
+       border-bottom: 1px solid #bbbbbb;
+}
+
+.v-accordion-item-caption .v-icon {
+       margin-top: -1px;
+}
+
+.v-ie .v-accordion-item-caption .v-icon {
+       vertical-align: top;
+}
+
+.v-accordion-borderless {
+       border: none;
+       border-radius: 0;
+       -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+}
+
+.v-button:focus {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -0px;
+       outline: none;
+}
+
+.v-button:focus .v-button-wrap {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -26px;
+       outline: none;
+}
+
+.v-button:active, .v-button.v-pressed {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -52px;
+       outline: none;
+}
+
+.v-button:active .v-button-wrap, .v-button.v-pressed .v-button-wrap {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -78px;
+       outline: none;
+}
+
+.v-button, .v-disabled.v-button {
+       height: 26px;
+       padding: 0 0 0 6px;
+       background-color: transparent;
+       background-repeat: no-repeat;
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -104px;
+       border: none;
+       cursor: default;
+}
+
+.v-button-wrap, .v-disabled.v-button .v-button-wrap {
+       display: block;
+       height: 22px;
+       padding: 4px 15px 0 9px;
+       background-color: transparent;
+       background-repeat: no-repeat;
+       background-position: right top;
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -130px;
+}
+
+.v-button-caption {
+       color: #222222;
+       text-shadow: #ffffff 0 1px 0;
+       font-weight: bold;
+       font-size: 11px;
+       line-height: 16px;
+}
+
+.black .v-button:focus {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -0px;
+}
+
+.black .v-button:focus .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -26px;
+}
+
+.black .v-button:active, .black .v-button.v-pressed {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -52px;
+}
+
+.black .v-button:active .v-button-wrap, .black .v-button.v-pressed .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -78px;
+}
+
+.black .v-button, .black .v-disabled.v-button {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -104px;
+}
+
+.black .v-button-wrap, .black .v-disabled.v-button .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -130px;
+}
+
+.black .v-button-caption {
+       color: #c9ccce;
+       text-shadow: #121314 0 -1px 0;
+}
+
+.v-button-primary:focus {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -156px;
+}
+
+.v-button-primary:focus .v-button-wrap {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -182px;
+}
+
+.v-button-primary:active, .v-button-primary.v-pressed {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -208px;
+}
+
+.v-button-primary:active .v-button-wrap, .v-button-primary.v-pressed .v-button-wrap {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -234px;
+}
+
+.v-button-primary, .v-disabled.v-button-primary {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -260px;
+}
+
+.v-button-primary .v-button-wrap, .v-disabled.v-button-primary .v-button-wrap {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -286px;
+}
+
+.black .v-button-primary:focus {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -156px;
+}
+
+.black .v-button-primary:focus .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -182px;
+       color: #eaf4fb;
+}
+
+.black .v-button-primary:active, .black .v-button-primary.v-pressed {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -208px;
+}
+
+.black .v-button-primary:active .v-button-wrap, .black .v-button-primary.v-pressed .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -234px;
+}
+
+.black .v-button-primary, .black .v-disabled.v-button-primary {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -260px;
+}
+
+.black .v-button-primary .v-button-wrap, .black .v-disabled.v-button-primary .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -286px;
+}
+
+.v-button-small:focus {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -312px;
+}
+
+.v-button-small:focus .v-button-wrap {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -332px;
+}
+
+.v-button-small:active, .v-button-small.v-pressed {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -352px;
+}
+
+.v-button-small:active .v-button-wrap, .v-button-small.v-pressed .v-button-wrap {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -372px;
+}
+
+.v-button-small, .v-disabled.v-button-small {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: left -392px;
+       height: 20px;
+}
+
+.v-button-small .v-button-wrap, .v-disabled.v-button-small .v-button-wrap {
+       background-image: url(button/img/button-sprites.png);
+       -background-image: url(button/img/button-sprites-ie6.png);
+       background-position: right -412px;
+       height: 19px;
+       padding: 1px 14px 0 8px;
+}
+
+.v-button-small .v-button-caption {
+       font-weight: normal;
+}
+
+.black .v-button-small:focus {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -312px;
+}
+
+.black .v-button-small:focus .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -332px;
+}
+
+.black .v-button-small:active, .black .v-button-small.v-pressed {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -352px;
+}
+
+.black .v-button-small:active .v-button-wrap, .black .v-button-small.v-pressed .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -372px;
+}
+
+.black .v-button-small, .black .v-disabled.v-button-small {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: left -392px;
+}
+
+.black .v-button-small .v-button-wrap, .black .v-disabled.v-button-small .v-button-wrap {
+       background-image: url(button/img/black-button-sprites.png);
+       -background-image: url(button/img/black-button-sprites-ie6.png);
+       background-position: right -412px;
+}
+
+.v-button.v-button-link, .v-button.v-button-link:focus, .v-button.v-button-link:active, .v-button-link.v-pressed, .v-disabled.v-button.v-button-link, .v-button.v-button-link .v-button-wrap, .v-button.v-button-link:focus .v-button-wrap, .v-button.v-button-link:active .v-button-wrap, .v-button-link.v-pressed .v-button-wrap, .v-disabled.v-button.v-button-link .v-button-wrap {
+       background: transparent;
+       height: auto;
+       padding: 0;
+       cursor: pointer;
+       line-height: inherit;
+}
+
+.v-button.v-button-link.v-disabled, .v-button.v-button-link.v-disabled .v-button-wrap {
+       cursor: default;
+}
+
+.v-button-link .v-button-caption, .v-nativebutton-link .v-nativebutton-caption {
+       line-height: inherit;
+       font-weight: normal;
+       color: #1b699f;
+       font-size: 12px;
+       text-shadow: none;
+}
+
+.v-button-link:focus .v-button-caption, .v-nativebutton-link:focus .v-nativebutton-caption {
+       outline: 1px dotted #1b699f;
+}
+
+.v-ff2 .v-button .v-button-caption {
+       display: -moz-inline-box;
+       padding-top: 6px;
+       height: 20px;
+}
+
+.v-ie6 .v-nativebutton-link, .v-ie7 .v-nativebutton-link, .v-ie8 .v-nativebutton-link {
+       padding: 0;
+       text-align: left;
+}
+
+.v-ie6 .v-button {
+       border: 1px solid #b3b3b3;
+       border-bottom-color: #9a9a9a;
+       background: #d8d8d8 url(button/img/right.png) no-repeat 0 -1px;
+       padding: 0 15px;
+       height: 23px;
+}
+
+.v-ie6 .v-button .v-button-wrap {
+       background: transparent;
+       height: 20px;
+       padding: 3px 0 0;
+       display: inline;
+       zoom: 1;
+}
+
+.v-ie6 .v-button-primary {
+       background-image: url(button/img/primary-right.png);
+}
+
+.v-ie6 .v-button-small {
+       background-image: url(button/img/small-right.png);
+       height: 17px;
+}
+
+.v-ie6 .v-button-small .v-button-wrap {
+       height: 17px;
+       padding: 0;
+}
+
+.v-ie6 .v-button.v-pressed {
+       background: transparent url(button/img/right-pressed.png) no-repeat 0 -1px;
+}
+
+.v-ie6 .blue .v-button {
+       border-color: #84949c;
+       border-top-color: #83939b;
+       border-bottom-color: #888d91;
+}
+
+.v-ie6 .black .v-button {
+       border: 1px solid #0d0e0f;
+       background: #202224 url(button/img/black/right.png) no-repeat 0 -1px;
+       color: #c9ccce;
+}
+
+.v-ie6 .black .v-button-primary {
+       background-image: url(button/img/black/primary-right.png);
+}
+
+.v-ie6 .black .v-button-small {
+       background-image: url(button/img/black/small-right.png);
+}
+
+.v-ie6 .black .v-button.v-pressed {
+       background-image: url(button/img/black/right-pressed.png);
+}
+
+.v-ie6 .v-button-link, .v-ie6 .black .v-button-link {
+       background: transparent;
+       border: none;
+       height: auto;
+       line-height: normal;
+       padding: 0;
+}
+
+.v-ie6 .v-button-link .v-button-wrap, .v-ie6 .black .v-button-link .v-button-wrap {
+       padding: 0;
+       height: auto;
+}
+
+.v-generated-body, .v-app {
+       background: #f5f5f5;
+}
+
+.v-app, .v-window, .v-popupview-popup, .v-tooltip, .v-app input, .v-app select, .v-app button, .v-app textarea, .v-window input, .v-window select, .v-window button, .v-window textarea, .v-popupview-popup input, .v-popupview-popup select, .v-popupview-popup button, .v-popupview-popup textarea, .v-filterselect-suggestpopup, .v-datefield-popup, .v-contextmenu, .v-Notification, .v-menubar-submenu, .v-drag-element, .v-table-header-drag {
+       font-family: Arial, Helvetica, Tahoma, Verdana, sans-serif;
+       font-size: 12px;
+       line-height: normal;
+       color: #222222;
+}
+
+.v-app .black, .v-window-black, .v-window .black, .v-popupview-popup .black {
+       color: #c9ccce;
+       text-shadow: #000000 0 0 1px;
+}
+
+.v-errorindicator {
+       width: 13px;
+       height: 16px;
+       background: transparent url(common/icons/error.png) no-repeat 50%;
+}
+
+.v-ie6 .v-errorindicator {
+       background-image: url(common/icons/error-ie6.png);
+}
+
+.v-tooltip {
+       background-color: #fffcdd;
+       border: 1px solid #b8b295;
+       font-size: 11px;
+       color: #222222;
+}
+
+.v-tooltip-text {
+       padding: 2px 4px;
+}
+
+.v-tooltip .v-errormessage {
+       padding: 3px 4px;
+       background: #ffecc6;
+       color: #b74100;
+       border: none;
+       border-top: 1px solid #fff3dc;
+}
+
+.v-tooltip .v-errormessage h2 {
+       font-size: 16px;
+       font-weight: normal;
+       color: #ab3101;
+       margin: 2px 0 8px 0;
+}
+
+.v-tooltip .v-errormessage h3 {
+       font-size: 13px;
+       font-weight: bold;
+       margin: 1px 0 4px 0;
+}
+
+.v-contextmenu {
+       background: #f8f8f9;
+       border: none;
+       border-radius: 3px;
+       -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+       -o-border-radius: 3px;
+       overflow: hidden;
+       padding: 4px 0;
+}
+
+.v-contextmenu .gwt-MenuItem {
+       padding: 1px 12px 1px 8px;
+       height: 16px;
+       user-select: none;
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       cursor: default;
+}
+
+.v-contextmenu .gwt-MenuItem .v-icon {
+       margin-right: 3px;
+}
+
+.v-contextmenu .gwt-MenuItem-selected {
+       background: transparent repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -38px;
+       color: #ffffff;
+       text-shadow: #3b5a7a 0 1px 0;
+}
+
+.v-ie .v-contextmenu .gwt-MenuItem-selected {
+       background-image: url(common/img/sel-bg.png);
+       background-position: left top;
+}
+
+.v-contextmenu .gwt-MenuItem-selected div {
+       background: transparent;
+       cursor: default;
+}
+
+.portlet .v-app {
+       background: transparent;
+}
+
+.portlet .v-app .v-radiobutton input, .portlet .v-window .v-radiobutton input, .portlet .v-popupview-popup .v-radiobutton input, .portlet .v-app .v-checkbox input, .portlet .v-window .v-checkbox input, .portlet .v-popupview-popup .v-checkbox input {
+       margin-right: 3px;
+       background: transparent;
+}
+
+input.v-textfield-readonly:focus {
+       background-color: transparent;
+}
+
+.v-datefield-calendarpanel {
+       border-collapse: collapse;
+       margin: 0;
+       padding: 0;
+       height: auto !important;
+}
+
+.v-datefield-year .v-datefield-calendarpanel-prevmonth, .v-datefield-year .v-datefield-calendarpanel-nextmonth {
+       display: none;
+}
+
+.v-datefield-calendarpanel td {
+       vertical-align: top;
+}
+
+td.v-datefield-calendarpanel-month {
+       height: 23px;
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -58px;
+}
+
+span.v-datefield-calendarpanel-month {
+       display: block;
+       text-align: center;
+       height: 16px;
+       padding: 3px 10px 0 10px;
+       border-left: 1px solid #efefef;
+       border-right: 1px solid #d8d8d8;
+       text-shadow: #ffffff 0 1px 0;
+       overflow: hidden;
+       margin-top: 1px;
+}
+
+.v-datefield-year .v-datefield-calendarpanel-month {
+       width: 35px;
+}
+
+.v-datefield-month .v-datefield-calendarpanel-month, .v-datefield-day .v-datefield-calendarpanel-month, .v-datefield-full .v-datefield-calendarpanel-month {
+       width: 124px;
+}
+
+.v-datefield-month, .v-datefield-day, .v-datefield-full {
+       min-width: 240px;
+}
+
+.v-ff2 .v-datefield-month, .v-ff2 .v-datefield-day, .v-ff2 .v-datefield-full {
+       min-width: 254px;
+}
+
+.v-datefield-popupcalendar, .v-ff2 .v-datefield-popupcalendar {
+       min-width: 0;
+}
+
+.v-datefield-year .v-datefield-calendarpanel {
+       width: 100px;
+}
+
+td.v-datefield-calendarpanel-prevyear {
+       text-align: right;
+}
+
+td.v-datefield-calendarpanel-nextyear {
+       text-align: left;
+}
+
+.v-datefield-calendarpanel-prevyear button, .v-datefield-calendarpanel-nextyear button, .v-datefield-calendarpanel-prevmonth button, .v-datefield-calendarpanel-nextmonth button {
+       width: 24px;
+       height: 23px;
+       border: none;
+       background: transparent;
+       background-repeat: no-repeat;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -81px;
+       overflow: hidden;
+       padding: 0;
+       text-indent: -9999px;
+       outline: none;
+       -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+       border-radius: 0;
+}
+
+.v-ie .v-datefield-calendarpanel-prevyear button, .v-ie .v-datefield-calendarpanel-nextyear button, .v-ie .v-datefield-calendarpanel-prevmonth button, .v-ie .v-datefield-calendarpanel-nextmonth button {
+       text-indent: 0;
+       font-size: 1px;
+}
+
+.v-datefield-calendarpanel-nextyear button {
+       background-position: left top;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -104px;
+}
+
+.v-datefield-calendarpanel-prevyear button:active, .v-ie .v-datefield-calendarpanel-prevyear button.v-pressed {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -127px;
+}
+
+.v-datefield-calendarpanel-nextyear button:active, .v-ie .v-datefield-calendarpanel-nextyear button.v-pressed {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -150px;
+}
+
+.v-datefield-calendarpanel-prevmonth, .v-datefield-calendarpanel-nextmonth {
+       width: 24px;
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -173px;
+}
+
+.v-datefield-calendarpanel-prevmonth button, .v-datefield-calendarpanel-nextmonth button {
+       width: 100%;
+       height: 21px;
+       border-left: 1px solid #efefef;
+       border-right: 1px solid #d8d8d8;
+       background: transparent;
+       background-position: center top;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -196px;
+       min-width: 24px;
+       margin-top: 1px;
+}
+
+.v-ie .v-datefield-calendarpanel-prevmonth button, .v-ie .v-datefield-calendarpanel-nextmonth button {
+       border: none;
+}
+
+.v-ie6 .v-datefield-calendarpanel-prevmonth button, .v-ie6 .v-datefield-calendarpanel-nextmonth button {
+       width: 24px;
+}
+
+.v-datefield-calendarpanel-nextmonth button {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -217px;
+}
+
+.v-datefield-calendarpanel-prevmonth button:active, .v-ie .v-datefield-calendarpanel-prevmonth button.v-pressed {
+       background-position: center top;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -238px;
+}
+
+.v-datefield-calendarpanel-nextmonth button:active, .v-ie .v-datefield-calendarpanel-nextmonth button.v-pressed {
+       background-position: center top;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -259px;
+}
+
+.v-datefield-calendarpanel-body, .v-datefield-calendarpanel-time {
+       text-align: center;
+       vertical-align: top;
+}
+
+.v-datefield-calendarpanel-body table {
+       border-collapse: collapse;
+       margin: 0;
+       padding: 0;
+       width: 220px;
+       margin: 0 auto;
+}
+
+.v-datefield-calendarpanel-weekdays td {
+       width: 14.2%;
+       overflow: hidden;
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -280px;
+       font-size: 10px;
+       line-height: normal;
+       text-transform: uppercase;
+       color: #eaeff1;
+       text-shadow: #3b4651 0 -1px 0;
+       vertical-align: top;
+}
+
+.v-datefield-calendarpanel-weeknumbers td {
+       width: 12.4%;
+}
+
+.v-datefield-calendarpanel-weekdays strong {
+       display: block;
+       text-align: right;
+       padding: 1px 5px 0 0;
+       height: 14px;
+       border-top: 1px solid #596775;
+}
+
+.v-datefield-calendarpanel-weekdays .v-first {
+       background-repeat: no-repeat;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -299px;
+}
+
+.v-datefield-calendarpanel-weekdays .v-last {
+       background-repeat: no-repeat;
+       background-position: right top;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -318px;
+}
+
+.v-ie .v-datefield-calendarpanel-weekdays td {
+       background: url(datefield/img/weekday-bg.png) repeat-x;
+       background-position: left top;
+}
+
+.v-ie .v-datefield-calendarpanel .v-first {
+       background: url(datefield/img/weekday-first.png) no-repeat;
+}
+
+.v-ie .v-datefield-calendarpanel .v-last {
+       background: url(datefield/img/weekday-last.png) no-repeat right top;
+}
+
+.v-datefield-calendarpanel-body td {
+       text-align: right;
+       height: 19px;
+}
+
+.v-datefield-calendarpanel-day, .v-datefield-calendarpanel-weeknumber, .v-datefield-calendarpanel-day-today {
+       padding: 2px 5px 2px 0;
+       display: block;
+       margin: 1px 0 0 5px;
+}
+
+.v-datefield-calendarpanel-weeknumber {
+       margin: 0;
+       padding-top: 4px;
+       padding-bottom: 3px;
+}
+
+.v-datefield-calendarpanel-day-today {
+       color: #4095d1;
+       border: none;
+}
+
+.v-datefield-calendarpanel-day-selected {
+       background: #507ba3;
+       color: #ffffff;
+       text-shadow: #3b5b79 0 1px 0;
+       border-radius: 2px;
+       -webkit-border-radius: 2px;
+       -moz-border-radius: 2px;
+}
+
+.v-datefield-calendarpanel-time select {
+       padding: 0;
+       font-size: 11px;
+}
+
+.v-datefield-popup {
+       background: #f8f8f9;
+       padding: 8px 4px;
+       border-radius: 3px;
+       -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+}
+
+.v-sa .v-datefield-popup, .v-ff3 .v-datefield-popup, .v-op .v-datefield-popup {
+       background: rgba(255, 255, 255, 0.95);
+}
+
+.v-datefield-year .v-datefield-textfield {
+       width: 4em;
+}
+
+.v-datefield-month .v-datefield-textfield {
+       width: 5em;
+}
+
+.v-datefield-day .v-datefield-textfield {
+       width: 5.5em;
+}
+
+.v-datefield-full .v-datefield-textfield {
+       width: 12em;
+}
+
+.v-datefield-popupcalendar input.v-datefield-textfield {
+       border-right-width: 0;
+       -moz-border-radius-topright: 0;
+       -moz-border-radius-bottomright: 0;
+       -webkit-border-top-right-radius: 0;
+       -webkit-border-bottom-right-radius: 0;
+       height: 14px;
+}
+
+.v-datefield.v-readonly input.v-datefield-textfield {
+       border-right-width: 1px;
+       border-radius: 3px;
+       -moz-border-radius: 3px;
+       -webkit-border-radius: 3px;
+}
+
+.v-datefield-prompt .v-datefield-textfield {
+       color: #999999;
+       font-style: normal;
+}
+
+.v-datefield-popupcalendar .v-datefield-button {
+       width: 24px;
+       height: 23px;
+       background: transparent;
+       border: none;
+       padding: 0;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -337px;
+       cursor: pointer;
+       -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+       border-radius: 0;
+}
+
+.v-datefield-popupcalendar .v-datefield-button:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -360px;
+}
+
+.black .v-datefield-popupcalendar .v-datefield-button {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -0px;
+}
+
+.black .v-datefield-popupcalendar .v-datefield-button:active {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -23px;
+}
+
+.v-ie6 .v-datefield-popupcalendar .v-datefield-button {
+       margin-top: 1px;
+}
+
+.black td.v-datefield-calendarpanel-month {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -46px;
+       height: 21px;
+}
+
+.black span.v-datefield-calendarpanel-month {
+       border-left: 1px solid #333638;
+       border-right: 1px solid #232527;
+       color: #c9ccce;
+       text-shadow: #000000 0 -1px 0;
+       padding: 4px 10px 1px 10px;
+       margin-top: 0;
+}
+
+.black .v-datefield-calendarpanel-prevyear button, .black .v-datefield-calendarpanel-nextyear button, .black .v-datefield-calendarpanel-prevmonth button, .black .v-datefield-calendarpanel-nextmonth button {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -67px;
+       height: 21px;
+}
+
+.black .v-datefield-calendarpanel-nextyear button {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -88px;
+}
+
+.black .v-datefield-calendarpanel-prevyear button:active, .v-ie .black .v-datefield-calendarpanel-prevyear button.v-pressed {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -109px;
+}
+
+.black .v-datefield-calendarpanel-nextyear button:active, .v-ie .black .v-datefield-calendarpanel-nextyear button.v-pressed {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -130px;
+}
+
+.black .v-datefield-calendarpanel-prevmonth, .black .v-datefield-calendarpanel-nextmonth {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -151px;
+}
+
+.black .v-datefield-calendarpanel-prevmonth button, .black .v-datefield-calendarpanel-nextmonth button {
+       border-left: 1px solid #333638;
+       border-right: 1px solid #232527;
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: center -172px;
+       margin-top: 0;
+}
+
+.black .v-datefield-calendarpanel-nextmonth button {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: center -193px;
+}
+
+.black .v-datefield-calendarpanel-prevmonth button:active, .v-ie .black .v-datefield-calendarpanel-prevmonth button.v-pressed {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: center -214px;
+}
+
+.black .v-datefield-calendarpanel-nextmonth button:active, .v-ie .black .v-datefield-calendarpanel-nextmonth button.v-pressed {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: center -235px;
+}
+
+.v-ie .black .v-datefield-calendarpanel-prevmonth button, .v-ie .black .v-datefield-calendarpanel-nextmonth button {
+       border: none;
+}
+
+.black .v-datefield-calendarpanel-weekdays td {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -256px;
+       color: #0a0b0b;
+       text-shadow: #5a5c5e 0 1px 0;
+}
+
+.black .v-datefield-calendarpanel-weekdays strong {
+       border-top-color: #1b1c1d;
+}
+
+.black .v-datefield-calendarpanel .v-first {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -275px;
+}
+
+.black .v-datefield-calendarpanel .v-last {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: right -294px;
+}
+
+.black .v-datefield-prompt .v-datefield-textfield {
+       color: #5f6366;
+}
+
+.v-formlayout-errorcell {
+       width: 13px;
+}
+
+.v-formlayout-cell .v-errorindicator {
+       width: 13px;
+       height: 16px;
+       background: transparent url(common/icons/error.png) no-repeat 50%;
+}
+
+.v-ie6 .v-formlayout-cell .v-errorindicator {
+       background-image: url(common/icons/error-ie6.png);
+}
+
+.v-formlayout-captioncell {
+       text-align: right;
+       white-space: nowrap;
+}
+
+.v-formlayout-spacing .v-formlayout-row .v-formlayout-captioncell, .v-formlayout-spacing .v-formlayout-row .v-formlayout-contentcell, .v-formlayout-spacing .v-formlayout-row .v-formlayout-errorcell {
+       padding-top: 8px;
+}
+
+.v-formlayout-margin-top .v-formlayout-firstrow .v-formlayout-captioncell, .v-formlayout-margin-top .v-formlayout-firstrow .v-formlayout-contentcell, .v-formlayout-margin-top .v-formlayout-firstrow .v-formlayout-errorcell {
+       padding-top: 15px;
+}
+
+.v-formlayout-margin-bottom .v-formlayout-lastrow .v-formlayout-captioncell, .v-formlayout-margin-bottom .v-formlayout-lastrow .v-formlayout-contentcell, .v-formlayout-margin-bottom .v-formlayout-lastrow .v-formlayout-errorcell {
+       padding-bottom: 15px;
+}
+
+.v-formlayout-margin-left .v-formlayout-captioncell {
+       padding-left: 18px;
+}
+
+.v-formlayout-margin-right .v-formlayout-contentcell {
+       padding-right: 18px;
+}
+
+.v-form-errormessage {
+       background: transparent url(common/icons/error.png) no-repeat 3px 2px;
+       padding-left: 20px;
+       margin-bottom: 5px;
+       margin-top: 5px;
+       min-height: 20px;
+}
+
+.v-ie6 .v-form-errormessage {
+       height: 20px;
+       background-image: url(common/icons/error-ie6.png);
+}
+
+.v-form fieldset {
+       border: none;
+       border-top: 1px solid #babfc0;
+}
+
+.v-form-nocaption fieldset {
+       border: none;
+}
+
+.v-form-nocaption legend {
+       display: none;
+}
+
+.v-form legend {
+       margin: 0 0 0 20px;
+       padding: 0 5px;
+       font-weight: bold;
+       color: #222222;
+}
+
+.black .v-form legend {
+       color: #e3e6e8;
+}
+
+.v-label {
+       line-height: 18px;
+}
+
+.white .black, .blue .black {
+       color: #c9ccce;
+       text-shadow: 0 0 1px #000000;
+}
+
+.black .v-label-h1, .black .v-label-h2, .black .v-caption-h1, .black .v-caption-h2, .white .black .v-label-h1, .white .black .v-label-h2, .white .black .v-caption-h1, .white .black .v-caption-h2, .blue .black .v-label-h1, .blue .black .v-label-h2, .blue .black .v-caption-h1, .blue .black .v-caption-h2 {
+       color: #ffffff;
+       text-shadow: rgba(0, 0, 0, 0.8) 0 2px 2px;
+}
+
+.black .v-label-light, .white .black .v-label-light {
+       color: #72787c;
+}
+
+.black .v-label hr, .white .black .v-label hr {
+       background: #0c0d0e;
+       color: #0c0d0e;
+       border-bottom-color: #292b2e;
+}
+
+.v-app .white, .v-window .white, .v-app .blue, .v-window .blue {
+       color: #222222;
+       text-shadow: none;
+}
+
+.blue .v-label-h1, .blue .v-label-h2, .blue .v-caption-h1, .blue .v-caption-h2, .white .blue .v-label-h1, .white .blue .v-label-h2, .white .blue .v-caption-h1, .white .blue .v-caption-h2 {
+       color: #ffffff;
+       text-shadow: rgba(0, 0, 0, 0.3) 0 1px 1px;
+}
+
+.blue .v-label-light, .white .blue .v-label-light {
+       color: #6e7c83;
+}
+
+.blue .v-label hr, .white .blue .v-label hr {
+       background: #a3bcc9;
+       color: #a3bcc9;
+       border-bottom-color: #cfe2eb;
+}
+
+.v-label-h1, .v-label-h2, .v-caption-h1, .v-caption-h2, .white .v-label-h1, .white .v-label-h2, .white .v-caption-h1, .white .v-caption-h2 {
+       font-family: Helvetica, Arial, "Lucida Grande", Geneva, Tahoma, Verdana, sans-serif;
+       font-size: 24px;
+       line-height: 30px;
+       font-weight: bold;
+       color: #44698b;
+       letter-spacing: -0.02em;
+       text-shadow: #ffffff 0 -1px 1px;
+}
+
+.v-label-h2, .v-caption-h2, .white .v-label-h2, .white .v-caption-h2 {
+       font-size: 16px;
+       line-height: 22px;
+}
+
+.v-label-light, .white .v-label-light {
+       font-size: 11px;
+       line-height: 13px;
+       color: #707070;
+}
+
+.v-label hr, .white .v-label hr {
+       height: 2px;
+       overflow: hidden;
+       background: #dcdcdc;
+       color: #dcdcdc;
+       border: none;
+       border-bottom: 1px solid #ffffff;
+}
+
+.v-sa .v-label hr, .v-ie8 .v-label hr {
+       height: 1px;
+}
+
+.v-table .v-label {
+       line-height: normal;
+}
+
+.v-orderedlayout-margin-top, .v-horizontallayout-margin-top, .v-verticallayout-margin-top {
+       padding-top: 18px;
+}
+
+.v-orderedlayout-margin-right, .v-horizontallayout-margin-right, .v-verticallayout-margin-right {
+       padding-right: 18px;
+}
+
+.v-orderedlayout-margin-bottom, .v-horizontallayout-margin-bottom, .v-verticallayout-margin-bottom {
+       padding-bottom: 18px;
+}
+
+.v-orderedlayout-margin-left, .v-horizontallayout-margin-left, .v-verticallayout-margin-left {
+       padding-left: 18px;
+}
+
+.v-orderedlayout-spacing-on, .v-horizontallayout-spacing-on, .v-verticallayout-spacing-on {
+       padding-top: 7px;
+       padding-left: 6px;
+}
+
+.v-gridlayout-margin-top {
+       padding-top: 24px;
+}
+
+.v-gridlayout-margin-bottom {
+       padding-bottom: 24px;
+}
+
+.v-gridlayout-margin-left {
+       padding-left: 24px;
+}
+
+.v-gridlayout-margin-right {
+       padding-right: 24px;
+}
+
+.v-gridlayout-spacing-on {
+       padding-left: 12px;
+       padding-top: 12px;
+}
+
+.v-verticallayout-blue, .v-horizontallayout-blue, .v-orderedlayout-blue, .v-gridlayout-blue, .v-csslayout-blue, .v-formlayout-blue, .v-splitpanel-vertical-blue, .v-splitpanel-horizontal-blue {
+       background-color: #bcd3de;
+}
+
+.v-panel-content > div.blue {
+       background-color: #bcd3de;
+}
+
+.v-verticallayout-white, .v-horizontallayout-white, .v-orderedlayout-white, .v-gridlayout-white, .v-csslayout-white, .v-formlayout-white, .v-splitpanel-vertical-white, .v-splitpanel-horizontal-white {
+       background-color: #ffffff;
+       color: #222222;
+}
+
+.v-panel-content > div.white {
+       background-color: #ffffff;
+       color: #222222;
+}
+
+.v-verticallayout-black, .v-horizontallayout-black, .v-orderedlayout-black, .v-gridlayout-black, .v-csslayout-black, .v-formlayout-black, .v-splitpanel-vertical-black, .v-splitpanel-horizontal-black {
+       background: #1e2022 url(layouts/img/black-bg.png) repeat-x;
+}
+
+.v-panel-content > div.black {
+       background: #1e2022 url(layouts/img/black-bg.png) repeat-x;
+}
+
+.v-link a:link span {
+       color: #1b699f;
+}
+
+.v-link a:visited span {
+       color: #5c7485;
+}
+
+.v-link a:hover span {
+       color: #2483c4;
+}
+
+.v-menubar {
+       height: 23px;
+       background: #323336 repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -383px;
+       color: #d1d3d6;
+       text-shadow: rgba(0, 0, 0, 0.9) 0 1px 0;
+       padding: 0 8px;
+}
+
+.v-menubar .v-menubar-menuitem {
+       padding: 3px 8px;
+       height: 17px;
+       line-height: 16px;
+}
+
+.v-menubar .v-menubar-menuitem:hover {
+       color: #ffffff;
+}
+
+.v-menubar-submenu {
+       background: #f8f8f9;
+       border: none;
+       border-radius: 3px;
+       -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+       -o-border-radius: 3px;
+       overflow: hidden;
+       padding: 4px 0;
+}
+
+.v-menubar-submenu .v-menubar-menuitem {
+       padding: 1px 26px 1px 10px;
+       line-height: 16px;
+}
+
+.v-menubar-submenu .v-menubar-menuitem-caption .v-icon {
+       vertical-align: middle;
+}
+
+.v-menubar .v-menubar-menuitem-selected, .v-menubar-submenu .v-menubar-menuitem-selected {
+       background: #4d749f repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -406px;
+       color: #ffffff;
+       text-shadow: 0 1px 0 #3b5a7a;
+}
+
+.v-menubar .v-menubar-menuitem-selected {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -426px;
+}
+
+.v-menubar-submenu .v-menubar-submenu-indicator {
+       background: transparent url(menubar/img/submenu-icon.png) no-repeat right 70%;
+       width: 26px;
+       height: 16px;
+       text-indent: -9999px;
+}
+
+.v-menubar-submenu .v-menubar-menuitem-selected .v-menubar-submenu-indicator {
+       background-image: url(menubar/img/submenu-icon-hover.png);
+}
+
+.v-menubar-submenu-check-column .v-menubar-menuitem {
+       padding-left: 6px;
+}
+
+.v-menubar-submenu-check-column .v-menubar-menuitem-caption {
+       padding-left: 18px;
+}
+
+.v-menubar-submenu .v-menubar-menuitem-checked .v-menubar-menuitem-caption {
+       background: transparent url(menubar/img/checked.png) no-repeat left;
+}
+
+.v-menubar-submenu .v-menubar-menuitem-unchecked .v-menubar-menuitem-caption {
+       background: transparent url(menubar/img/unchecked.png) no-repeat left;
+}
+
+.v-menubar-submenu .v-menubar-menuitem-selected-checked .v-menubar-menuitem-caption {
+       background: transparent url(menubar/img/checked-selected.png) no-repeat left;
+}
+
+.v-menubar-submenu .v-menubar-menuitem-selected-unchecked .v-menubar-menuitem-caption {
+       background: transparent url(menubar/img/unchecked-selected.png) no-repeat left;
+}
+
+.v-Notification {
+       color: #ffffff;
+       border-radius: 4px;
+       -moz-border-radius: 4px;
+       -webkit-border-radius: 4px;
+       font-size: 100%;
+       background: #c8ccd0;
+       font-weight: bold;
+}
+
+.v-ie9 .v-Notification H1 {
+       font-weight: bold;
+}
+
+.v-Notification p {
+       line-height: 1.3;
+}
+
+.v-Notification-warning {
+       background: #fdf3b5;
+       color: #ca9a61;
+       border: 3px solid #fee3af;
+}
+
+.v-Notification-error {
+       background: #b40000 url(notification/img/error-close.png) no-repeat right top;
+       border: 3px solid #ca3030;
+}
+
+.v-Notification-tray {
+       margin: 0 5px 5px 0;
+       background: #3b3c3e;
+       border: 2px solid #585b5c;
+       padding: 0.8em 0.9em;
+}
+
+.v-Notification-tray h1 {
+       font-size: 14px;
+       line-height: 18px;
+}
+
+.v-Notification-tray p {
+       font-size: 12px;
+       font-weight: normal;
+}
+
+.v-Notification-system {
+       background-color: #b40000;
+}
+
+.blue .v-panel-caption, .blue .v-panel-nocaption, .blue .v-panel-content {
+       border-color: #a8bcc5;
+}
+
+.v-panel-caption, .v-panel-nocaption, .white .v-panel-caption, .white .v-panel-nocaption {
+       border-bottom: 1px solid #e5e5e5;
+       line-height: 16px;
+}
+
+.v-webkit .v-panel-caption, .v-webkit .v-panel-nocaption, .v-gecko .v-panel-caption, .v-gecko .v-panel-nocaption, .v-ie9 .v-panel-caption, .v-ie9 .v-panel-nocaption {
+       border-bottom-color: rgba(0, 0, 0, 0.08);
+}
+
+.v-panel-caption {
+       padding-bottom: 2px;
+}
+
+.v-panel-content, .white .v-panel-content {
+       border: 1px solid #dcdcdc;
+       border-bottom: none;
+       border-top: none;
+}
+
+.v-webkit .v-panel-content, .v-gecko .v-panel-content, .v-ie9 .v-panel-content {
+       border-top-color: rgba(0, 0, 0, 0.07);
+}
+
+.v-panel-content > div {
+       background: #ffffff;
+       min-height: 100%;
+}
+
+.v-ie6 .v-panel-content {
+       background: #ffffff;
+}
+
+.blue .v-panel-deco {
+       border-color: #92a3ac;
+       background: #adc2cd;
+}
+
+.v-panel-deco, .white .v-panel-deco {
+       height: 1px;
+       border-top: 1px solid #bebebe;
+       background: #e2e2e2;
+       overflow: hidden;
+}
+
+.v-wekit .v-panel-deco, .v-gecko .v-panel-deco, .v-ie9 .v-panel-deco {
+       border-top-color: rgba(0, 0, 0, 0.1);
+       background: rgba(0, 0, 0, 0.08);
+}
+
+.v-panel-caption .v-errorindicator {
+       height: 16px;
+       width: 13px;
+       background: url(common/icons/error.png) no-repeat 50%;
+       display: inline;
+       display: inline-block;
+       vertical-align: middle;
+}
+
+.v-ie6 .v-panel-caption .v-errorindicator {
+       background-image: url(common/icons/error-ie6.png);
+}
+
+.v-panel-light .v-panel-caption-light, .v-panel-light .v-panel-nocaption-light {
+       border: none;
+}
+
+.v-panel-light .v-panel-content-light {
+       border: none;
+}
+
+.v-panel-content-light > div {
+       background: transparent;
+}
+
+.v-ie6 .v-panel-content-light {
+       background: transparent;
+}
+
+.v-panel-light .v-panel-deco-light {
+       height: 0;
+       border: none;
+}
+
+.v-popupview {
+       color: #1b699f;
+}
+
+.v-popupview:hover {
+       color: #2483c4;
+}
+
+.v-popupview-popup {
+       background: #ffffff;
+       padding: 3px;
+}
+
+.v-progressindicator-wrapper {
+       background: #dfe2e4 url(progressindicator/img/base.gif) repeat-x;
+       border: 1px solid #bfbfbf;
+}
+
+.v-disabled .v-progressindicator-wrapper {
+       background-image: url(progressindicator/img/disabled.gif);
+}
+
+.v-progressindicator-indicator {
+       background: #f7f9f9 url(progressindicator/img/progress.png);
+}
+
+.v-filterselect {
+       height: 24px;
+       background-repeat: no-repeat;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -450px;
+       padding-left: 2px;
+}
+
+.v-ie6 .v-filterselect {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -475px;
+}
+
+.v-app .v-filterselect-input, .v-window .v-filterselect-input, .v-popupview-popup .v-filterselect-input {
+       background: transparent repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -499px;
+       border: none;
+       height: 16px;
+}
+
+.v-app input.v-filterselect-input, .v-window input.v-filterselect-input, .v-popupview-popup input.v-filterselect-input {
+       padding: 4px 0 4px 2px;
+}
+
+.v-filterselect-prompt .v-filterselect-input {
+       font-style: normal;
+}
+
+.v-filterselect-input:focus {
+       outline: none;
+}
+
+.v-filterselect-focus {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -524px;
+}
+
+.v-ie6 .v-filterselect-focus {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -549px;
+}
+
+.v-filterselect-focus .v-filterselect-input {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -573px;
+}
+
+.v-filterselect-button {
+       overflow: hidden;
+       width: 25px;
+       height: 24px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -597px;
+       cursor: default;
+}
+
+.v-filterselect-button:hover {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -622px;
+}
+
+.v-filterselect-button:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -646px;
+}
+
+.v-filterselect-focus .v-filterselect-button {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -670px;
+}
+
+.v-filterselect-focus .v-filterselect-button:hover {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -694px;
+}
+
+.v-filterselect-focus .v-filterselect-button:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -718px;
+}
+
+.v-disabled .v-filterselect-button:hover, .v-readonly .v-filterselect-button:hover {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -742px;
+}
+
+.v-filterselect-suggestpopup {
+       background: #f8f8f9;
+       border: none;
+       border-radius: 3px;
+       -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+       -o-border-radius: 3px;
+       overflow: hidden;
+}
+
+.v-filterselect-suggestmenu {
+       margin: 4px 0;
+}
+
+.v-filterselect-suggestmenu .gwt-MenuItem {
+       padding: 1px 8px;
+       height: 16px;
+       user-select: none;
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       cursor: default;
+}
+
+.v-ff .v-filterselect-suggestmenu .gwt-MenuItem {
+       height: 18px;
+}
+
+.v-filterselect-suggestmenu .gwt-MenuItem .v-icon {
+       margin-right: 3px;
+}
+
+.v-filterselect-suggestmenu .gwt-MenuItem-selected {
+       background: transparent repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -766px;
+       color: #ffffff;
+       text-shadow: #3b5a7a 0 1px 0;
+}
+
+.v-filterselect-nextpage, .v-filterselect-nextpage-off, .v-filterselect-prevpage-off, .v-filterselect-prevpage {
+       height: 11px;
+       width: 100%;
+       background: transparent;
+       margin-bottom: -4px;
+}
+
+.v-filterselect-nextpage, .v-filterselect-nextpage-off {
+       margin: -4px 0 0;
+}
+
+.v-filterselect-nextpage:hover {
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -786px;
+}
+
+.v-filterselect-prevpage:hover {
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -797px;
+}
+
+.v-filterselect-nextpage:active {
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -808px;
+}
+
+.v-filterselect-prevpage:active {
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -819px;
+}
+
+.v-filterselect-nextpage-off span, .v-filterselect-prevpage-off span {
+       display: none;
+}
+
+.v-filterselect-nextpage span, .v-filterselect-prevpage span {
+       display: block;
+       height: 11px;
+       width: 100%;
+       overflow: hidden;
+       text-indent: -99999px;
+       background: transparent no-repeat center 3px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -830px;
+       user-select: none;
+       -moz-user-select: none;
+       -webkit-user-select: none;
+}
+
+.v-filterselect-prevpage span {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -841px;
+}
+
+.v-filterselect-nextpage:hover span {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -852px;
+}
+
+.v-filterselect-prevpage:hover span {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -863px;
+}
+
+.v-filterselect-status {
+       text-shadow: #e9eaeb 0 1px 0;
+       font-size: 11px;
+       line-height: normal;
+       width: 100%;
+       padding: 3px 0;
+       height: 11px;
+       overflow: hidden;
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -874px;
+       -moz-border-radius-bottomleft: 3px;
+       -moz-border-radius-bottomright: 3px;
+       -webkit-border-bottom-left-radius: 3px;
+       -webkit-border-bottom-right-radius: 3px;
+       user-select: none;
+       -moz-user-select: none;
+       -webkit-user-select: none;
+}
+
+.v-ie .v-filterselect-suggestmenu .gwt-MenuItem-selected {
+       background: transparent url(common/img/sel-bg.png) repeat-x;
+}
+
+.v-ie .v-filterselect-nextpage:hover {
+       background: transparent url(select/img/page-down-hover.png) repeat-x;
+}
+
+.v-ie .v-filterselect-prevpage:hover {
+       background: transparent url(select/img/page-up-hover.png) repeat-x;
+}
+
+.v-ie .v-filterselect-prevpage span {
+       background: transparent url(select/img/arrow-up.png) no-repeat center 3px;
+}
+
+.v-ie .v-filterselect-nextpage span {
+       background: transparent url(select/img/arrow-down.png) no-repeat center 3px;
+}
+
+.v-ie .v-filterselect-prevpage:hover span {
+       background: transparent url(select/img/arrow-up-hover.png) no-repeat center 3px;
+}
+
+.v-ie .v-filterselect-nextpage:hover span {
+       background: transparent url(select/img/arrow-down-hover.png) no-repeat center 3px;
+}
+
+.v-ie .v-filterselect-status {
+       background: transparent url(select/img/status-bg.png) repeat-x;
+}
+
+.v-filterselect .v-icon {
+       width: 16px;
+       position: relative;
+}
+
+.v-filterselect .v-icon + .v-filterselect-input {
+       margin-left: -16px;
+       padding-left: 18px;
+}
+
+.black .v-filterselect {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -310px;
+}
+
+.v-ie6 .black .v-filterselect {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -334px;
+}
+
+.v-app .black .v-filterselect-input, .v-window .black .v-filterselect-input, .v-window-black .v-filterselect-input, .v-popupview-popup .black .v-filterselect-input {
+       color: #c9ccce;
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -358px;
+}
+
+.black .v-filterselect-focus {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -382px;
+}
+
+.v-ie6 .black .v-filterselect-focus {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -406px;
+}
+
+.black .v-filterselect-focus .v-filterselect-input {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -430px;
+}
+
+.black .v-filterselect-button {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -454px;
+}
+
+.black .v-filterselect-button:hover {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -478px;
+}
+
+.black .v-filterselect-button:active {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -502px;
+}
+
+.black .v-filterselect-focus .v-filterselect-button {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -526px;
+}
+
+.black .v-filterselect-focus .v-filterselect-button:hover {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -550px;
+}
+
+.black .v-filterselect-focus .v-filterselect-button:active {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -574px;
+}
+
+.black .v-disabled .v-filterselect-button:hover, .black .v-readonly .v-filterselect-button:hover {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -598px;
+}
+
+.black .v-filterselect-prompt .v-filterselect-input {
+       color: #5f6366;
+}
+
+.black .v-select select, .black .v-select-twincol select {
+       border-color: #38393a;
+       border-top-color: #2c2d2e;
+       border-bottom-color: #3e3f3f;
+       background: #151717;
+       color: #c9ccce;
+}
+
+.v-ie6 .v-select-twincol-buttons .v-button {
+       padding-left: 12px;
+       padding-right: 12px;
+}
+
+.v-ie6 .v-filterselect.v-readonly, .v-ie6 .v-filterselect .v-filterselect-input-readonly {
+       background: transparent;
+}
+
+.v-slider {
+       border-top: 1px solid #9a9c9e;
+       border-bottom: 1px solid #bdbfc1;
+       margin: 4px 0;
+}
+
+.v-slider-base {
+       height: 1px;
+       background: #e0e2e2;
+       border-top: 1px solid #adb0b1;
+       border-left: 1px solid #a0a3a6;
+       border-right: 1px solid #a0a3a6;
+}
+
+.v-slider-handle {
+       background: transparent;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -891px;
+       width: 10px;
+       height: 10px;
+       margin-top: -5px;
+}
+
+.v-slider-handle-active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -901px;
+}
+
+.v-slider-vertical {
+       width: 2px;
+       margin: 0 5px;
+       border: none;
+       border-left: 1px solid #9a9c9e;
+       border-right: 1px solid #bdbfc1;
+}
+
+.v-slider-vertical .v-slider-base {
+       width: 2px;
+       border-left: 1px solid #adb0b1;
+       border-right: none;
+       border-top: 1px solid #adb0b1;
+       border-bottom: 1px solid #adb0b1;
+}
+
+.v-slider-vertical .v-slider-handle {
+       width: 10px;
+       height: 10px;
+       margin-left: -5px;
+}
+
+.v-splitpanel-hsplitter, .v-splitpanel-hsplitter-locked {
+       width: 7px;
+       background-repeat: repeat-y;
+       background-image: url(common/img/horizontal-sprites.png);
+       background-position: -0px top;
+}
+
+.v-splitpanel-hsplitter div {
+       width: 7px;
+       height: 100%;
+       background: transparent;
+       background-repeat: no-repeat;
+       background-position: 50%;
+       background-image: url(common/img/horizontal-sprites.png);
+       background-position: -7px center;
+}
+
+.v-splitpanel-vsplitter, .v-splitpanel-vsplitter-locked {
+       height: 7px;
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -911px;
+}
+
+.v-splitpanel-vsplitter div {
+       height: 7px;
+       background: transparent;
+       background-repeat: no-repeat;
+       background-position: 50%;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: center -918px;
+}
+
+.blue .v-splitpanel-hsplitter-small, .blue .v-splitpanel-hsplitter-small-locked {
+       background: #7c8a91;
+}
+
+.black .v-splitpanel-hsplitter-small, .black .v-splitpanel-hsplitter-small-locked {
+       background: #4e5253;
+}
+
+.v-splitpanel-hsplitter-small, .v-splitpanel-hsplitter-small-locked, .white .v-splitpanel-hsplitter-small, .white .v-splitpanel-hsplitter-small-locked {
+       width: 1px;
+       background: #949698;
+}
+
+.v-splitpanel-vsplitter-small, .v-splitpanel-vsplitter-small-locked, .white .v-splitpanel-vsplitter-small, .white .v-splitpanel-vsplitter-small-locked {
+       height: 1px;
+       background: #949698;
+}
+
+.v-splitpanel-hsplitter-small div {
+       width: 5px;
+       margin-left: -2px;
+       background: transparent;
+}
+
+.v-splitpanel-vsplitter-small div {
+       height: 5px;
+       margin-top: -2px;
+       background: transparent;
+}
+
+.blue .v-table-header-wrap {
+       border-color: #92a2aa;
+}
+
+.blue .v-table-body {
+       border-color: #92a2aa;
+       border-top-color: #c2c3c4;
+}
+
+.v-table-header-wrap, .white .v-table-header-wrap, .v-table-footer-wrap, .white .v-table-footer-wrap, .v-table-header-drag {
+       border-color: #c2c3c4;
+       background: transparent repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -925px;
+       height: 20px;
+       text-transform: uppercase;
+       font-size: 10px;
+       font-weight: bold;
+       color: #222222;
+       text-shadow: #f3f5f8 0 1px 0;
+       line-height: normal;
+}
+
+.v-ie6 .v-table, .v-ie6 .v-table-header-wrap, .v-ie6 .v-table-footer-wrap, .v-ie6 .v-table-column-selector {
+       position: relative;
+}
+
+.v-ie6 .v-table.v-disabled, .v-ie7 .v-table.v-disabled {
+       position: relative;
+}
+
+.v-table-footer-wrap, .white .v-table-footer-wrap {
+       text-transform: none;
+       font-size: 12px;
+       font-weight: normal;
+}
+
+.v-table-footer td, .white .v-table-footer td {
+       border-color: #c2c3c4;
+}
+
+.v-table-footer-container {
+       padding-right: 7px;
+}
+
+.v-table-header, .v-table-footer, .v-table-footer table {
+       height: 20px;
+}
+
+.v-table-caption-container, .v-table-header-drag {
+       padding-top: 4px;
+       padding-right: 4px;
+}
+
+.v-table-caption-container .v-icon, .v-table-header-drag .v-icon {
+       height: 16px;
+       margin: -4px 3px 0 0;
+       vertical-align: middle;
+}
+
+.v-ie .v-table-caption-container .v-icon, .v-ie .v-table-header-drag .v-icon {
+       margin-top: -3px;
+}
+
+.v-table-resizer {
+       height: 20px;
+       width: 2px;
+       background: transparent;
+       border-right: 1px solid #c2c3c4;
+}
+
+.v-table-sort-indicator {
+       background: transparent;
+       width: 0px;
+       height: 20px;
+}
+
+.v-table-header-cell-asc .v-table-sort-indicator {
+       background: transparent no-repeat right 7px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -945px;
+       width: 16px;
+}
+
+.v-table-header-cell-desc .v-table-sort-indicator {
+       background: transparent no-repeat right 7px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -965px;
+       width: 16px;
+}
+
+.v-table-body, .white .v-table-body {
+       border-color: #c2c3c4;
+       background: #ffffff;
+}
+
+.v-table-cell-content {
+       padding-top: 0;
+       border-right-color: #d3d4d5;
+       vertical-align: top;
+}
+
+.v-table-cell-wrapper {
+       padding-top: 3px;
+       padding-bottom: 3px;
+}
+
+.v-table-row-odd {
+       background: #eff0f1;
+}
+
+.v-table-generated-row {
+       background: #dcdee0;
+       text-transform: uppercase;
+       font-size: 10px;
+       font-weight: bold;
+       color: #222222;
+       text-shadow: #f3f5f8 0 1px 0;
+       line-height: normal;
+}
+
+.v-table-generated-row .v-table-cell-content {
+       padding-top: 1px;
+       padding-bottom: 2px;
+}
+
+.v-table-cell-content:last-child {
+       border-right-color: transparent;
+}
+
+.v-table .v-selected, .black .v-table .v-selected {
+       background: #4d749f url(common/img/sel-bg.png) repeat-x;
+       color: #ffffff;
+       text-shadow: #3b5a7a 0 1px 0;
+}
+
+.v-table .v-selected .v-table-cell-content {
+       border-right-color: #466c90;
+}
+
+.v-table-column-selector {
+       width: 16px;
+       height: 20px;
+       margin-top: -20px;
+       background: transparent no-repeat;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -985px;
+}
+
+.v-table-column-selector:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1005px;
+}
+
+.v-table-focus-slot-left {
+       border-left: 1px solid #222222;
+       margin-bottom: -20px;
+       width: auto;
+}
+
+.v-table-focus-slot-right {
+       border-right-color: #222222;
+       margin-right: 0;
+}
+
+.v-table-header-drag {
+       padding-left: 6px;
+       height: 16px;
+}
+
+.v-table-header-drag img {
+       height: 16px;
+       margin: -3px 3px 0 0;
+}
+
+.v-table-scrollposition {
+       width: auto;
+       background: transparent;
+       border: none;
+}
+
+.v-table-scrollposition span {
+       background: transparent repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1025px;
+       border: 1px solid #939494;
+       border: none;
+       border-radius-bottomleft: 4px;
+       border-radius-bottomright: 4px;
+       -moz-border-radius-bottomleft: 4px;
+       -moz-border-radius-bottomright: 4px;
+       -webkit-border-bottom-left-radius: 4px;
+       -webkit-border-bottom-right-radius: 4px;
+       height: 13px;
+       padding: 4px 30px;
+       white-space: nowrap;
+       color: #222222;
+       text-shadow: #ffffff 0 1px 0;
+       position: relative;
+       top: 1px;
+       -webkit-box-shadow: rgba(0, 0, 0, 0.5) 0 1px 2px;
+       -moz-box-shadow: rgba(0, 0, 0, 0.5) 0 1px 2px;
+}
+
+.v-table-borderless .v-table-scrollposition span {
+       top: 0;
+}
+
+.v-contextmenu .v-on, .v-contextmenu .v-off {
+       display: inline-block;
+       zoom: 1;
+       background: transparent no-repeat 0 4px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1047px;
+       padding-left: 12px;
+       padding-right: 4px;
+}
+
+.v-contextmenu .v-off {
+       background-image: none;
+       color: #666666;
+}
+
+.v-contextmenu .gwt-MenuItem-selected .v-on {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1061px;
+}
+
+.v-table-strong .v-table-header-wrap, .v-table-strong .v-table-header-drag {
+       border-color: #2b3033;
+       border-top-color: #2b3033;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1076px;
+       color: #e7e9ea;
+       text-shadow: #000000 0 -1px 0;
+}
+
+.v-table-strong .v-table-body {
+       border-top-color: #2b3033;
+}
+
+.v-table-strong .v-table-resizer {
+       border-right-color: #1c1f21;
+}
+
+.v-table-strong .v-table-header-cell-asc .v-table-sort-indicator {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -1096px;
+}
+
+.v-table-strong .v-table-header-cell-desc .v-table-sort-indicator {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -1115px;
+}
+
+.v-table-strong .v-table-column-selector {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1134px;
+}
+
+.v-table-strong .v-table-column-selector:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1154px;
+}
+
+.v-table-strong .v-table-focus-slot-left, .v-table-strong .v-table-focus-slot-right {
+       border-color: #9ca1a5;
+}
+
+.black .v-table-header-wrap, .black .v-table-header-drag {
+       border-color: #252729;
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -622px;
+       color: #e7eaee;
+       text-shadow: #000000 0 -1px 0;
+}
+
+.black .v-table-resizer {
+       border-right-color: #252729;
+}
+
+.black .v-table-header-cell-asc .v-table-sort-indicator {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: right -642px;
+}
+
+.black .v-table-header-cell-desc .v-table-sort-indicator {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: right -661px;
+}
+
+.black .v-table-column-selector {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -680px;
+}
+
+.black .v-table-column-selector:active {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -700px;
+}
+
+.black .v-table-focus-slot-left, .black .v-table-focus-slot-right {
+       border-color: #9ca1a5;
+}
+
+.black .v-table-body {
+       border-color: #252729;
+       background: transparent;
+}
+
+.black .v-table-cell-content {
+       border-right-color: #252729;
+       border-bottom: 1px solid #252729;
+}
+
+.black .v-table-cell-wrapper {
+       padding-bottom: 2px;
+}
+
+.black .v-table-row-odd {
+       background: transparent;
+}
+
+.black .v-table .v-selected .v-table-cell-content {
+       border-bottom: 1px solid #4d749f;
+}
+
+.v-table-borderless .v-table-header-wrap, .v-table-borderless .v-table-body {
+       border: none;
+}
+
+.v-tabsheet-tabitemcell, .v-tabsheet-spacertd {
+       height: 32px;
+}
+
+.v-tabsheet-tabitemcell {
+       background: no-repeat;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1174px;
+       padding-left: 3px;
+}
+
+.v-tabsheet-tabitemcell-first {
+       padding-left: 10px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1206px;
+}
+
+.v-tabsheet-tabitem, .v-tabsheet-spacertd div {
+       border: none;
+       height: 32px;
+       background: transparent repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1238px;
+       padding: 0;
+       color: #222222;
+       text-shadow: #ffffff 0 1px 0;
+}
+
+.v-tabsheet-tabitem .v-caption {
+       border: none;
+       height: 23px;
+       background: no-repeat right top;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -1270px;
+       padding: 9px 8px 0 6px;
+}
+
+.v-tabsheet-tabitem .v-caption-closable {
+       padding-right: 0;
+       padding-left: 17px;
+}
+
+.v-tabsheet-tabitem .v-captiontext {
+       height: 16px;
+       line-height: 16px;
+}
+
+.v-tabsheet-caption-close {
+       float: right;
+       width: 19px;
+       height: 18px;
+       margin: -1px -1px 0;
+       padding-left: 2px;
+       background: transparent;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1302px;
+       cursor: default;
+       text-indent: -999px;
+       overflow: hidden;
+       font-size: 14px;
+       font-weight: normal;
+}
+
+.v-ff .v-tabsheet-caption-close, .v-ie7 .v-tabsheet-caption-close {
+       margin-top: -17px;
+}
+
+.v-ie6 .v-tabsheet-caption-close {
+       float: none;
+}
+
+.v-tabsheet-caption-close:hover {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1320px;
+}
+
+.v-tabsheet-caption-close:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1338px;
+}
+
+.v-tabsheet-tabitem-selected .v-tabsheet-caption-close {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1356px;
+}
+
+.v-tabsheet-tabitem-selected .v-tabsheet-caption-close:hover {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1374px;
+}
+
+.v-tabsheet-tabitem-selected .v-tabsheet-caption-close:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1392px;
+}
+
+.v-tabsheet-tabitemcell-selected {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1410px;
+}
+
+.v-tabsheet-tabitemcell-selected-first {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1442px;
+}
+
+.v-tabsheet-tabitem-selected {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1474px;
+       color: #232930;
+}
+
+.v-tabsheet-tabitem-selected .v-caption {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -1506px;
+}
+
+.v-tabsheet-spacertd div {
+       margin-right: 4px;
+}
+
+.v-tabsheet-spacertd {
+       background: transparent no-repeat right top;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -1538px;
+}
+
+.blue .v-tabsheet-content {
+       border-color: #a8bcc5;
+}
+
+.v-tabsheet-content, .white .v-tabsheet-content {
+       border: 1px solid #dcdcdc;
+       border-bottom: none;
+       border-top: none;
+       color: #222222;
+       text-shadow: none;
+}
+
+.v-tabsheet-tabsheetpanel {
+       background: #ffffff;
+}
+
+.v-sa .v-tabsheet-content, .v-ff3 .v-tabsheet-content {
+       border-color: rgba(0, 0, 0, 0.1);
+}
+
+.blue .v-tabsheet-deco {
+       border-color: #92a3ac;
+       background: #adc2cd;
+}
+
+.v-tabsheet-deco, .white .v-tabsheet-deco {
+       height: 1px;
+       border-top: 1px solid #bebebe;
+       background: #e2e2e2;
+       overflow: hidden;
+}
+
+.v-sa .v-tabsheet-deco, .v-ff3 .v-tabsheet-deco {
+       border-top-color: rgba(0, 0, 0, 0.1);
+       background: rgba(0, 0, 0, 0.08);
+}
+
+.v-tabsheet-tabs .v-icon, .v-tabsheet-tabs .v-captiontext, .v-tabsheet-tabs .v-errorindicator {
+       display: inline;
+       float: none;
+}
+
+.v-sa .v-tabsheet-tabs .v-captiontext {
+       display: inline-block;
+}
+
+.v-tabsheet-tabs .v-icon {
+       width: 16px !important;
+       height: 16px !important;
+}
+
+.v-tabsheet-tabs .v-errorindicator {
+       display: inline-block;
+       width: 13px;
+       height: 16px;
+       background: transparent url(common/icons/error.png) no-repeat 50%;
+}
+
+.v-ff2 .v-tabsheet-tabs .v-icon, .v-ff2 .v-tabsheet-tabs .v-errorindicator {
+       display: -moz-inline-stack;
+}
+
+.v-ie6 .v-tabsheet-tabs .v-errorindicator {
+       background-image: url(common/icons/error-ie6.png);
+}
+
+.v-ie .v-tabsheet-tabs .v-errorindicator {
+       zoom: 1;
+       display: inline;
+}
+
+.v-ie8 .v-tabsheet-tabs .v-errorindicator, .v-ie9 .v-tabsheet-tabs .v-errorindicator {
+       display: inline-block;
+}
+
+.v-tabsheet-scroller {
+       height: 31px;
+       margin-top: -31px;
+       padding: 0 3px 0 4px;
+       border-right: 1px solid #c2c2c2;
+       border-left: 1px solid #cfcfcf;
+       position: relative;
+       float: right;
+       background: transparent url(tabsheet/img/framed/tab-bg.png) repeat-x left -1px;
+       width: 36px;
+}
+
+.v-tabsheet-scroller button {
+       margin-top: 7px;
+}
+
+.v-tabsheet-scrollerPrev, .v-tabsheet-scrollerNext, .v-tabsheet-scrollerPrev-disabled, .v-tabsheet-scrollerNext-disabled {
+       border: none;
+       background: transparent;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1570px;
+       width: 18px;
+       height: 17px;
+       overflow: hidden;
+}
+
+.v-tabsheet-scroller button::-moz-focus-inner {
+       border: none;
+}
+
+.v-tabsheet-scrollerNext {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1587px;
+}
+
+.v-tabsheet-scrollerPrev:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1604px;
+}
+
+.v-tabsheet-scrollerNext:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1621px;
+}
+
+.v-tabsheet-scrollerPrev-disabled, .v-tabsheet-scrollerPrev-disabled:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1638px;
+       opacity: 1;
+       filter: none;
+}
+
+.v-tabsheet-scrollerNext-disabled, .v-tabsheet-scrollerNext-disabled:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1655px;
+       opacity: 1;
+       filter: none;
+}
+
+.v-tabsheet-borderless .v-tabsheet-tabitemcell-first {
+       padding-left: 7px;
+       background: url(tabsheet/img/framed/tab-first-left.png) no-repeat -3px 0;
+}
+
+.v-tabsheet-borderless .v-tabsheet-tabitemcell-selected-first {
+       background: url(tabsheet/img/framed/tab-first-left-sel.png) no-repeat -3px 0;
+}
+
+.v-tabsheet-borderless .v-tabsheet-spacertd div {
+       margin-right: 0;
+}
+
+.v-tabsheet-borderless .v-tabsheet-spacertd {
+       background: transparent;
+}
+
+.v-tabsheet-borderless .v-tabsheet-content {
+       border: none;
+}
+
+.v-tabsheet-borderless .v-tabsheet-deco {
+       height: 0;
+       border-top: none;
+}
+
+.blue .v-tabsheet-tabs-minimal .v-tabsheet-spacertd div, .blue .v-tabsheet-tabs-minimal .v-tabsheet-tabitem, .blue .v-tabsheet-tabs-minimal .v-tabsheet-tabitem-selected {
+       border-color: #7c8a91;
+}
+
+.blue .v-tabsheet-tabs-minimal .v-tabsheet-caption-close {
+       color: #7c8a91;
+}
+
+.blue .v-tabsheet-tabs-minimal .v-tabsheet-caption-close:hover {
+       color: #bcd3de;
+       background: #778d98;
+}
+
+.blue .v-tabsheet-tabs-minimal .v-tabsheet-caption-close:active {
+       background: #4f6874;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-spacertd div, .white .v-tabsheet-tabs-minimal .v-tabsheet-spacertd div {
+       border-bottom: 1px solid #bfbfbf;
+       height: auto;
+       background: transparent;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-tabitemcell, .v-tabsheet-tabs-minimal .v-tabsheet-spacertd {
+       height: auto;
+       background: transparent;
+       padding-left: 0;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-tabitem, .white .v-tabsheet-tabs-minimal .v-tabsheet-tabitem {
+       border: none;
+       border-bottom: 1px solid #bfbfbf;
+       color: #4d748f;
+       padding: 0;
+       height: auto;
+       background: transparent;
+       text-shadow: none;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-tabitem .v-caption {
+       padding: 5px 16px;
+       height: auto;
+       background: transparent;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-tabitemcell-selected {
+       background: transparent;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-tabitem-selected, .white .v-tabsheet-tabs-minimal .v-tabsheet-tabitem-selected {
+       background: transparent;
+       border: 1px solid #bfbfbf;
+       border-bottom: none;
+       color: #222222;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-tabitem-selected .v-caption {
+       background: transparent;
+       padding: 4px 15px 6px 15px;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-tabitem .v-caption-closable, .v-tabsheet-tabs-minimal .v-tabsheet-tabitem-selected .v-caption-closable {
+       padding-right: 6px;
+}
+
+.v-tabsheet-content-minimal, .white .v-tabsheet-content-minimal {
+       border: none;
+}
+
+.v-tabsheet-content-minimal .v-tabsheet-tabsheetpanel {
+       background: transparent;
+}
+
+.v-tabsheet-deco-minimal, .white .v-tabsheet-deco-minimal {
+       height: 0;
+       border: none;
+}
+
+.v-tabsheet-tabcontainer-minimal .v-tabsheet-scroller {
+       margin-top: -20px;
+       height: 17px;
+       padding: 0;
+       border: none;
+       background: transparent;
+}
+
+.v-tabsheet-tabcontainer-minimal .v-tabsheet-scroller button {
+       margin-top: 0;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-caption-close, .v-tabsheet-tabs-minimal .v-tabsheet-caption-close:hover, .v-tabsheet-tabs-minimal .v-tabsheet-caption-close:active {
+       text-indent: 0;
+       background: transparent;
+       margin-left: 3px;
+       margin-right: -3px;
+       padding: 0;
+       color: #999999;
+       width: 14px;
+       height: 14px;
+       line-height: 14px;
+       -webkit-border-radius: 7px;
+       -moz-border-radius: 7px;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-caption-close {
+       margin-top: 1px;
+}
+
+.v-ff .v-tabsheet-tabs-minimal .v-tabsheet-caption-close, .v-ie7 .v-tabsheet-tabs-minimal .v-tabsheet-caption-close {
+       margin-top: -15px;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-caption-close:hover, .white .v-tabsheet-tabs-minimal .v-tabsheet-caption-close:hover {
+       color: #ffffff;
+       background: #aaaaaa;
+}
+
+.v-tabsheet-tabs-minimal .v-tabsheet-caption-close:active, .white .v-tabsheet-tabs-minimal .v-tabsheet-caption-close:active {
+       background: #777777;
+}
+
+.black .v-tabsheet-tabs-minimal .v-tabsheet-spacertd div, .black .v-tabsheet-tabs-minimal .v-tabsheet-tabitem, .black .v-tabsheet-tabs-minimal .v-tabsheet-tabitem-selected {
+       border-color: #3e4044;
+       color: #6a7f89;
+}
+
+.black .v-tabsheet-tabs-minimal .v-tabsheet-tabitem-selected {
+       color: #c9ccce;
+}
+
+.black .v-tabsheet-content-minimal, .black .v-tabsheet-content-bar {
+       color: #c9ccce;
+       text-shadow: #000000 0 0 1px;
+}
+
+.black .v-tabsheet-tabs-minimal .v-tabsheet-caption-close {
+       color: #72787c;
+}
+
+.black .v-tabsheet-tabs-minimal .v-tabsheet-caption-close:hover {
+       color: #1d2021;
+       background: #4d5154;
+}
+
+.black .v-tabsheet-tabs-minimal .v-tabsheet-caption-close:active {
+       background: #626669;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitemcell, .v-tabsheet-tabs-bar .v-tabsheet-spacertd {
+       height: 20px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-spacertd {
+       background: transparent;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitemcell {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1673px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitemcell-first {
+       padding-left: 6px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1693px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitem, .v-tabsheet-tabs-bar .v-tabsheet-spacertd div {
+       height: 20px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1713px;
+       font-size: 11px;
+       margin: 0;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitem .v-caption {
+       height: 18px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -1733px;
+       padding: 2px 12px 0 10px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitem .v-caption-closable, .v-tabsheet-tabs-bar .v-tabsheet-tabitem-selected .v-caption-closable {
+       padding-right: 8px;
+       padding-left: 14px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-caption-close, .v-tabsheet-tabs-bar .v-tabsheet-caption-close:hover, .v-tabsheet-tabs-bar .v-tabsheet-caption-close:active {
+       text-indent: 0;
+       background: transparent;
+       margin-left: 3px;
+       margin-right: -3px;
+       padding: 1px 0 0 1px;
+       color: #3c3c3c;
+       width: 13px;
+       height: 13px;
+       line-height: 12px;
+       -webkit-border-radius: 7px;
+       -moz-border-radius: 7px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-caption-close {
+       margin-top: 1px;
+}
+
+.v-ff .v-tabsheet-tabs-bar .v-tabsheet-caption-close, .v-ie7 .v-tabsheet-tabs-bar .v-tabsheet-caption-close {
+       margin-top: -14px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-caption-close:hover {
+       background: #bfbfbf;
+       -webkit-box-shadow: 0 1px 0 #ffffff;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-caption-close:active {
+       background: #a9a9a9;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitem-selected .v-tabsheet-caption-close {
+       color: #404142;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitem-selected .v-tabsheet-caption-close:hover {
+       background: #5e666e;
+       color: #ffffff;
+       text-shadow: 0 -1px 0 #222222;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitem-selected .v-tabsheet-caption-close:active {
+       background: #404142;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitemcell-selected {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1753px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitemcell-selected-first {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1773px;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitem-selected {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1793px;
+       color: #232930;
+}
+
+.v-tabsheet-tabs-bar .v-tabsheet-tabitem-selected .v-caption {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: right -1813px;
+}
+
+.v-tabsheet-tabcontainer-bar .v-tabsheet-scroller {
+       margin-top: -20px;
+       height: 19px;
+       border-right: none;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1833px;
+}
+
+.v-tabsheet-tabcontainer-bar .v-tabsheet-scroller button {
+       margin-top: 1px;
+}
+
+.v-tabsheet-content-bar, .white .v-tabsheet-content-bar {
+       border: none;
+}
+
+.v-tabsheet-content-bar .v-tabsheet-tabsheetpanel {
+       background: transparent;
+}
+
+.v-tabsheet-deco-bar, .white .v-tabsheet-deco-bar {
+       height: 0;
+       border: none;
+}
+
+.v-tabsheet-tabs-selected-closable .v-tabsheet-tabitem .v-tabsheet-caption-close, .v-tabsheet-tabs-selected-closable .v-tabsheet-tabitem:hover .v-tabsheet-caption-close {
+       visibility: hidden;
+}
+
+.v-tabsheet-tabs-selected-closable .v-tabsheet-tabitem-selected .v-tabsheet-caption-close, .v-tabsheet-tabs-selected-closable .v-tabsheet-tabitem-selected:hover .v-tabsheet-caption-close {
+       visibility: visible;
+}
+
+.v-tabsheet-tabs-hover-closable .v-tabsheet-caption-close {
+       visibility: hidden;
+}
+
+.v-tabsheet-tabs-hover-closable .v-tabsheet-tabitem:hover .v-tabsheet-caption-close {
+       visibility: visible;
+}
+
+.blue .v-textfield, .blue .v-textarea {
+       border-color: #92a2aa;
+       border-top-color: #7c8a90;
+       border-bottom-color: #a1b3bc;
+}
+
+.v-textfield, .v-textarea, .white .v-textfield, .white .v-textarea {
+       border: 1px solid #bcbdbe;
+       border-top-color: #a2a3a4;
+       border-bottom-color: #d2d3d4;
+       background: #ffffff;
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1853px;
+       -moz-border-radius: 3px;
+       -webkit-border-radius: 3px;
+       border-radius: 3px;
+       margin: 0;
+       height: 15px;
+       line-height: normal;
+}
+
+.v-textarea, .white .v-textarea {
+       background-image: none;
+       height: auto;
+}
+
+.v-app input.v-textfield, .v-window input.v-textfield, .v-app textarea.v-textarea, .v-window textarea.v-textarea {
+       padding: 3px 3px 4px;
+}
+
+.v-app .v-textfield-focus, .v-window .v-textfield-focus, .v-popupview-popup .v-textfield-focus, .v-app .v-textarea-focus, .v-window .v-textarea-focus, .v-popupview-popup .v-textarea-focus {
+       border-color: #5b97d0;
+       border-top-color: #4f83b4;
+       border-bottom-color: #5ca0df;
+       outline: none;
+       background-color: #ffffff;
+}
+
+input.v-textfield-prompt, textarea.v-textarea-prompt {
+       font-style: normal;
+       color: #999999;
+}
+
+.v-app input.v-textfield-small {
+       font-size: 11px;
+       line-height: normal;
+       height: auto;
+       padding: 2px;
+}
+
+.v-app textarea.v-textarea-small {
+       font-size: 11px;
+}
+
+.v-table input.v-textfield {
+       padding: 1px 2px;
+       height: auto;
+       line-height: normal;
+}
+
+.v-table-cell-wrapper > input.v-textfield {
+       margin-top: -2px;
+       margin-bottom: -2px;
+}
+
+.v-ie6 .v-table-cell-wrapper input.v-textfield {
+       margin-top: -2px;
+       margin-bottom: -2px;
+}
+
+.v-ie6 .v-table-cell-wrapper div input.v-textfield {
+       margin-top: 0;
+       margin-bottom: 0;
+}
+
+.black .v-textfield, .black .v-textarea {
+       border-color: #38393a;
+       border-top-color: #2c2d2e;
+       border-bottom-color: #3e3f3f;
+       background: #151717;
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -720px;
+       color: #c9ccce;
+       text-shadow: #000000 0 0 1px;
+}
+
+.black .v-textarea {
+       background-image: none;
+}
+
+.v-app .black .v-textfield-focus, .v-window-black .v-textfield-focus, .v-window .black .v-textfield-focus, .v-popupview-popup .black .v-textfield-focus, .v-app .black .v-textarea-focus, .v-window-black .v-textarea-focus, .v-window .black .v-textarea-focus, .v-popupview-popup .black .v-textarea-focus {
+       border-color: #4b7192;
+       border-top-color: #3b5a75;
+       border-bottom-color: #507596;
+       background-color: #151717;
+}
+
+.black input.v-textfield-prompt {
+       color: #5f6366;
+}
+
+input.v-textfield-readonly, .black input.v-textfield-readonly, textarea.v-textarea-readonly, .black textarea.v-textarea-readonly {
+       border: none;
+       background: transparent;
+}
+
+.v-tree-node {
+       background: transparent url(tree/img/arrows.png) no-repeat 6px -10px;
+}
+
+.v-ie6 .v-tree-node {
+       background-image: url(tree/img/arrows-ie6.png);
+       background-repeat: no-repeat;
+}
+
+.v-ie6 div.v-tree-node-leaf {
+       background: transparent;
+}
+
+.v-tree-node-expanded {
+       background-position: -7px 5px;
+}
+
+.v-tree-node-caption {
+       margin-left: 16px;
+       padding-bottom: 1px;
+}
+
+.v-tree-node span {
+       padding: 1px 2px;
+       display: inline-block;
+}
+
+.v-tree-node-selected span {
+       background: #4d749f repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1876px;
+       color: #ffffff;
+       padding: 1px 2px;
+       -webkit-border-radius: 2px;
+       -moz-border-radius: 2px;
+       text-shadow: #2b425a 0 1px 0;
+       display: inline-block;
+}
+
+.v-tree-node-children {
+       padding-left: 16px;
+}
+
+.v-ie6 .v-tree-node-ie6compatnode {
+       width: 14px;
+       height: 10px;
+       padding: 1px;
+}
+
+.v-tree-node-caption.v-tree-node-focused span {
+       padding-left: 1px;
+       padding-top: 0px;
+       padding-bottom: 0px;
+}
+
+.v-tree-node-focused span {
+       border: 1px dotted black;
+}
+
+.v-ie6 .v-tree-node-ie6compatnode.v-tree-node-focused {
+       padding-left: 0px;
+}
+
+.v-tree .v-tree-node-drag-top {
+       background-position: 6px -11px;
+}
+
+.v-tree .v-tree-node-drag-top.v-tree-node-expanded {
+       background-position: -7px 4px;
+}
+
+.v-tree-connectors .v-tree-node-drag-top, .v-tree-connectors .v-tree-node-expanded.v-tree-node-drag-top {
+       background-position: 2px -53px;
+}
+
+.v-tree-connectors .v-tree-node-drag-top.v-tree-node-leaf {
+       background-position: 2px 50%;
+}
+
+.v-window {
+       background: transparent;
+}
+
+.v-window-wrap {
+       border: 1px solid #808386;
+}
+
+.v-sa .v-window-wrap, .v-ff3 .v-window-wrap, .v-op .v-window-wrap {
+       border-color: rgba(0, 0, 0, 0.2);
+}
+
+.v-ff2 .v-window-wrap, .v-ie6 .v-window-wrap {
+       border: none;
+}
+
+.v-ff2 .v-window-outerheader, .v-ie6 .v-window-outerheader {
+       border: 1px solid #808386;
+       border-bottom: none;
+}
+
+.v-ff2 .v-window-contents, .v-ie6 .v-window-contents {
+       border: 1px solid #808386;
+       border-top: none;
+       border-bottom: none;
+}
+
+.v-ff2 .v-window-footer, .v-ie6 .v-window-footer {
+       border: 1px solid #808386;
+       border-top: none;
+}
+
+.v-window-outerheader {
+       padding: 12px 32px 0 14px;
+       height: 25px;
+       background: black repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1896px;
+}
+
+.v-window-header {
+       font-weight: bold;
+       font-size: 12px;
+       line-height: normal;
+       color: #ffffff;
+       text-shadow: #000000 0 -1px 0;
+       white-space: nowrap;
+       overflow: hidden;
+       text-overflow: ellipsis;
+       -ms-text-overflow: ellipsis;
+}
+
+.v-window-error .v-window-header {
+       padding-left: 13px;
+       background: transparent url(common/icons/error.png) no-repeat 0 50%;
+}
+
+.v-ie6 .v-window-error .v-window-header {
+       background-image: url(common/icons/error-ie6.png);
+}
+
+.v-window-resizebox {
+       width: 15px;
+       height: 15px;
+       cursor: se-resize;
+       background: transparent;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1933px;
+}
+
+.v-window-footer {
+       background-color: white;
+       background-repeat: repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1948px;
+       height: 15px;
+}
+
+.v-window-closebox {
+       top: 12px;
+       right: 10px;
+       width: 15px;
+       height: 16px;
+       background: transparent;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1963px;
+}
+
+.v-window-closebox:hover {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1979px;
+}
+
+.v-window-closebox:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -1995px;
+}
+
+.v-window-contents {
+       background: #ffffff;
+}
+
+.v-window-modalitycurtain {
+       background: #56595b;
+}
+
+.v-window-light .v-window-outerheader {
+       background: transparent;
+       padding: 15px 32px 0 18px;
+       height: 23px;
+}
+
+.v-window-light .v-window-header {
+       font-size: 16px;
+       color: #292e34;
+       text-shadow: none;
+}
+
+.v-window-light .v-window-resizebox {
+       width: 12px;
+       height: 12px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -2011px;
+}
+
+.v-window-light .v-window-footer {
+       background: transparent;
+       height: 12px;
+}
+
+.v-window-light .v-window-closebox {
+       right: 1px;
+       top: 17px;
+       width: 19px;
+       height: 15px;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -2023px;
+}
+
+.v-window-light .v-window-closebox:hover {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -2038px;
+}
+
+.v-window-light .v-window-closebox:active {
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -2053px;
+}
+
+.v-window-light .v-window-contents {
+       background: transparent;
+}
+
+.v-window-light .v-window-wrap2 {
+       background: #f7f7f8 repeat-x;
+       background-image: url(common/img/vertical-sprites.png);
+       -background-image: url(common/img/vertical-sprites-ie6.png);
+       background-position: left -2068px;
+}
+
+.v-ie6 .v-window-light .v-window-wrap2 {
+       background-image: none;
+}
+
+.v-window-black .v-window-wrap {
+       border-color: #2e3030;
+       border-radius: 8px;
+       -webkit-border-radius: 8px;
+       -moz-border-radius: 8px;
+       overflow: hidden;
+}
+
+.v-sa .v-window-black .v-window-wrap, .v-ff3 .v-window-black .v-window-wrap, .v-op .v-window-black .v-window-wrap {
+       border-color: rgba(0, 0, 0, 0.8);
+}
+
+.v-window-black .v-window-wrap2 {
+       background-color: #1d2021;
+       -moz-border-radius: 7px;
+       -webkit-border-radius: 7px;
+}
+
+.v-sa .v-window-black .v-window-wrap2, .v-ff3 .v-window-black .v-window-wrap2, .v-op .v-window-black .v-window-wrap2 {
+       background-color: rgba(29, 32, 33, 0.9);
+}
+
+.v-window-black .v-window-outerheader {
+       height: auto;
+       padding: 7px 14px;
+       height: 15px;
+       background: transparent repeat-x;
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -743px;
+       text-align: center;
+       -moz-border-radius-topright: 7px;
+       -moz-border-radius-topleft: 7px;
+       -webkit-border-top-right-radius: 7px;
+       -webkit-border-top-left-radius: 7px;
+       overflow: hidden;
+       border: none;
+}
+
+.v-window-black .v-window-header {
+       font-size: 12px;
+       font-weight: normal;
+       color: #dddfe1;
+}
+
+.v-window-black .v-window-closebox {
+       top: 8px;
+}
+
+.v-window-black .v-window-footer {
+       background: transparent;
+       border: none;
+       height: 14px;
+}
+
+.v-window-black .v-window-resizebox {
+       background: transparent no-repeat;
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -772px;
+       width: 14px;
+       height: 14px;
+}
+
+.v-ie6 .v-window-black .v-window-resizebox {
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -786px;
+}
+
+.v-ie6 .v-window-black .v-window-contents {
+       background: transparent url(window/img/black/content-bg-ie6.png) repeat-x;
+}
+
+.v-window-black .v-window-contents {
+       border: none;
+       background: transparent repeat-x;
+       background-image: url(common/img/black-vertical-sprites.png);
+       -background-image: url(common/img/black-vertical-sprites-ie6.png);
+       background-position: left -800px;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/basic/selectors.css b/tests/sass/resources/basic/selectors.css
new file mode 100644 (file)
index 0000000..50c5fb7
--- /dev/null
@@ -0,0 +1,103 @@
+.foo {
+       color: red;
+}
+
+.foo-bar {
+       color: red;
+}
+
+.foo_bar {
+       color: red;
+}
+
+.foo .bar {
+       color: red;
+}
+
+.foo .bar .baz .fee .roo {
+       color: red;
+}
+
+.foo.bar.baz.fee.roo {
+       color: red;
+}
+
+.foo.bar .baz.fee.roo .dar {
+       color: red;
+}
+
+.foo > .bar {
+       color: red;
+}
+
+#foo {
+       color: red;
+}
+
+#foo .bar {
+       color: red;
+}
+
+.foo #bar {
+       color: red;
+}
+
+#foo.bar {
+       color: red;
+}
+
+#foo, #bar, .baz, .roo .dar {
+       color: red;
+}
+
+#foo a, .foo pre img {
+       color: red;
+}
+
+#foo a.bar {
+       color: red;
+}
+
+a:link {
+       color: red;
+}
+
+a.foo:visited, .bar {
+       color: red;
+}
+
+.v-app input[type="text"] {
+       color: red;
+}
+
+.foo + .bar {
+       color: red;
+}
+
+h1 + .foo {
+       color: red;
+}
+
+.foo * {
+       color: red;
+}
+
+.foo * h1 {
+       color: red;
+}
+
+h1 * .foo {
+       color: red;
+}
+
+* .foo {
+       color: red;
+}
+
+p::abc {
+       color: red;
+}
+
+p:first {
+       color: red;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/css/control-directives.scss b/tests/sass/resources/css/control-directives.scss
new file mode 100644 (file)
index 0000000..0a6f1f7
--- /dev/null
@@ -0,0 +1 @@
+Implement a sane test case.
\ No newline at end of file
diff --git a/tests/sass/resources/css/extends.css b/tests/sass/resources/css/extends.css
new file mode 100644 (file)
index 0000000..d1c903f
--- /dev/null
@@ -0,0 +1,13 @@
+.error, .badError {
+       border: 1px #f00;
+       background: #fdd;
+}
+
+.error.intrusion, .badError.intrusion {
+       font-size: 1.3em;
+       font-weight: bold;
+}
+
+.badError {
+       border-width: 3px;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/css/functions.css b/tests/sass/resources/css/functions.css
new file mode 100644 (file)
index 0000000..3757096
--- /dev/null
@@ -0,0 +1,14 @@
+.main {
+       margin: 2px;
+       border: 11px;
+       border: 10px;
+       border: 10px;
+       color: hsl(0, 0%, 30%);
+       color: hsl(25, 100%, 50%);
+       color: rgb(36, 0, 0);
+       color: rgb(240, 0, 0);
+       color: #200;
+       color: #240000;
+       color: #f00;
+       color: #f00000;
+}
diff --git a/tests/sass/resources/css/imports.css b/tests/sass/resources/css/imports.css
new file mode 100644 (file)
index 0000000..5b10018
--- /dev/null
@@ -0,0 +1,11 @@
+.caption {
+       border: 1px solid black;
+       background: #ff0000;
+       padding: 10px;
+       margin: 10px;
+}
+
+.text {
+       font-weight: bold;
+       color: red;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/css/mixins.css b/tests/sass/resources/css/mixins.css
new file mode 100644 (file)
index 0000000..cd5c9b8
--- /dev/null
@@ -0,0 +1,41 @@
+.main {
+       border: 1px solid black;
+       -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+       border-radius: 3px;
+       font-family: arial;
+       font-size: 16px;
+       font-weight: bold;
+}
+
+.footer {
+       border: 2px solid black;
+       -webkit-border-radius: 10px;
+       -moz-border-radius: 10px;
+       border-radius: 10px;
+}
+
+.header {
+       width: 100%;
+}
+
+.main {
+       width: 100%;
+       height: 100%;
+}
+
+.footer {
+       width: 100%;
+}
+
+@media print {
+       .v-view {
+               overflow: visible;
+       }
+}
+
+font-family: arial;
+
+font-size: 16px;
+
+font-weight: bold;
\ No newline at end of file
diff --git a/tests/sass/resources/css/nested-properties.css b/tests/sass/resources/css/nested-properties.css
new file mode 100644 (file)
index 0000000..79b21e6
--- /dev/null
@@ -0,0 +1,5 @@
+li {
+       font-family: serif;
+       font-weight: bold;
+       font-size: 1.2em;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/css/nesting.css b/tests/sass/resources/css/nesting.css
new file mode 100644 (file)
index 0000000..2400c73
--- /dev/null
@@ -0,0 +1,47 @@
+.top-bar {
+       color: red;
+}
+
+.top-bar .alt {
+       color: blue;
+}
+
+.menu {
+       background-color: red;
+}
+
+.menu a {
+       color: blue;
+}
+
+.caption {
+       padding: 10px;
+}
+
+.caption .text, .caption .header {
+       color: green;
+}
+
+.footer {
+       padding: 10px;
+}
+
+.footer .left, .footer .right {
+       color: purple;
+}
+
+.footer .left a, .footer .right a {
+       color: orange;
+}
+
+.main {
+       color: red;
+}
+
+.main .second.third {
+       color: blue;
+}
+
+.main .second.third .fourth {
+       color: black;
+}
diff --git a/tests/sass/resources/css/parent-import.css b/tests/sass/resources/css/parent-import.css
new file mode 100644 (file)
index 0000000..f67d17f
--- /dev/null
@@ -0,0 +1,25 @@
+.content-navigation {
+       border-color: #3bbfce;
+       color: #0000ff;
+}
+
+.border {
+       padding: 8px;
+       margin: 8px;
+       border-color: #3bbfce;
+}
+
+.body {
+       background-image: url(../folder-test2/bg.png);
+       background: transparent url(../folder-test2/img/loading-indicator.gif);
+       background-image: url(http://abc/bg.png);
+       background-image: url(/abc/bg.png);
+}
+
+.base {
+       color: red;
+}
+
+.text {
+       font-weight: bold;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/css/parent-selector.css b/tests/sass/resources/css/parent-selector.css
new file mode 100644 (file)
index 0000000..9c7140e
--- /dev/null
@@ -0,0 +1,24 @@
+a {
+       font-weight: bold;
+       text-decoration: none;
+}
+
+a:hover {
+       text-decoration: underline;
+}
+
+body.firefox a {
+       font-weight: normal;
+}
+
+#main {
+       color: black;
+}
+
+#main a {
+       font-weight: bold;
+}
+
+#main a:hover {
+       color: red;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/css/variables.css b/tests/sass/resources/css/variables.css
new file mode 100644 (file)
index 0000000..67ca5fd
--- /dev/null
@@ -0,0 +1,11 @@
+.content-navigation {
+       border-color: #3bbfce;
+       color: #0000ff;
+       font-family: Arial, Helvetica, "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+}
+
+.border {
+       padding: 8px;
+       margin: 8px;
+       border-color: #3bbfce;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/_partial-for-import.scss b/tests/sass/resources/scss/_partial-for-import.scss
new file mode 100644 (file)
index 0000000..32c3149
--- /dev/null
@@ -0,0 +1,9 @@
+$foo : red;
+
+.caption {
+       $side: right;
+       border: 1px solid black;
+       background: #ff0000;
+       padding: 10px;
+       margin: 10px;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/control-directives.scss b/tests/sass/resources/scss/control-directives.scss
new file mode 100644 (file)
index 0000000..febd563
--- /dev/null
@@ -0,0 +1,14 @@
+@for $i from 1 through 3 {
+  .item-#{$i} { width: 2em * $i; }
+}
+
+@while $i > 0 {
+  .item-#{$i} { width: 2em * $i; }
+  $i: $i - 2;
+}
+
+@each $animal in puma, sea-slug, egret, salamander {
+  .#{$animal}-icon {
+    background-image: url('/images/#{$animal}.png');
+  }
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/extends.scss b/tests/sass/resources/scss/extends.scss
new file mode 100644 (file)
index 0000000..c9e0f85
--- /dev/null
@@ -0,0 +1,13 @@
+.error {
+  border: 1px #f00;
+  background: #fdd;
+}
+.error.intrusion {
+  font-size: 1.3em;
+  font-weight: bold;
+}
+
+.badError {
+  @extend .error;
+  border-width: 3px;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/folder-test/parent-import.scss b/tests/sass/resources/scss/folder-test/parent-import.scss
new file mode 100644 (file)
index 0000000..b3f6c80
--- /dev/null
@@ -0,0 +1,6 @@
+@import "../folder-test2/variables.scss";
+@import "../folder-test2/url";
+@import "../folder-test2/base-imported.scss";
+.text {
+       font-weight: bold;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/folder-test2/base-imported.scss b/tests/sass/resources/scss/folder-test2/base-imported.scss
new file mode 100644 (file)
index 0000000..17d801e
--- /dev/null
@@ -0,0 +1 @@
+@import "base.scss";
\ No newline at end of file
diff --git a/tests/sass/resources/scss/folder-test2/base.scss b/tests/sass/resources/scss/folder-test2/base.scss
new file mode 100644 (file)
index 0000000..57ca0bb
--- /dev/null
@@ -0,0 +1,3 @@
+.base{
+       color: red;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/folder-test2/url.scss b/tests/sass/resources/scss/folder-test2/url.scss
new file mode 100644 (file)
index 0000000..a4be967
--- /dev/null
@@ -0,0 +1,6 @@
+.body{
+       background-image: url(bg.png);
+       background: transparent url(img/loading-indicator.gif);
+       background-image: url(http://abc/bg.png);
+       background-image: url(/abc/bg.png);
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/folder-test2/variables.scss b/tests/sass/resources/scss/folder-test2/variables.scss
new file mode 100644 (file)
index 0000000..2d06d36
--- /dev/null
@@ -0,0 +1,14 @@
+$blue: #3bbfce;
+$margin: 8px;
+
+.content-navigation {
+       border-color: $blue;
+       $blue: #0000ff;
+       color: $blue;
+}
+
+.border {
+       padding: $margin;
+       margin: $margin;
+       border-color: $blue;
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/functions.scss b/tests/sass/resources/scss/functions.scss
new file mode 100644 (file)
index 0000000..abf6f61
--- /dev/null
@@ -0,0 +1,16 @@
+.main {
+       margin: abs(-2px);
+       border: ceil(10.4px);
+       border: floor(10.4px);
+       border: round(10.4px);
+       color: lighten(hsl(0, 0%, 0%), 30%);
+       color: darken(hsl(25, 100%, 80%), 30%);
+       color: darken(rgb(136, 0, 0), 20%);
+       color: lighten(rgb(136, 0, 0), 20%);
+       color: darken(#880000, 20%);
+       color: darken(#800, 20%);
+       color: lighten(#880000, 20%);
+       color: lighten(#800, 20%);
+}
+
+
diff --git a/tests/sass/resources/scss/imports.scss b/tests/sass/resources/scss/imports.scss
new file mode 100644 (file)
index 0000000..4d53a12
--- /dev/null
@@ -0,0 +1,6 @@
+@import "_partial-for-import";
+
+.text {
+       font-weight: bold;
+       color: $foo;
+}
diff --git a/tests/sass/resources/scss/interpolation.scss b/tests/sass/resources/scss/interpolation.scss
new file mode 100644 (file)
index 0000000..5859a98
--- /dev/null
@@ -0,0 +1,3 @@
+$name: foo;
+$attr: border;
+p.#{$name}abc { abc#{$attr}-color: blue }
\ No newline at end of file
diff --git a/tests/sass/resources/scss/mixins.scss b/tests/sass/resources/scss/mixins.scss
new file mode 100644 (file)
index 0000000..f16c9a0
--- /dev/null
@@ -0,0 +1,44 @@
+//asfdasdf
+
+@mixin font-settings {
+       font-family: arial;
+       font-size: 16px;
+       font-weight: bold;
+}
+
+@mixin rounded-borders($thickness, $radius : 3px) {
+       border: $thickness solid black;
+       -webkit-border-radius: $radius;
+       -moz-border-radius: $radius;
+       border-radius: $radius;
+}
+
+.main {
+       @include rounded-borders(1px);
+       @include font-settings;
+}
+
+.footer {
+       @include rounded-borders(2px, 10px);
+}
+
+@mixin layout {
+       .header {
+               width: 100%;
+       }
+       .main {
+               width: 100%;
+               height: 100%;
+       }
+       
+       .footer {
+               width: 100%;
+       }
+       @media print {
+               .v-view {
+                       overflow: visible;
+               }
+       }
+       @include font-settings;
+}
+@include layout;
\ No newline at end of file
diff --git a/tests/sass/resources/scss/nested-properties.scss b/tests/sass/resources/scss/nested-properties.scss
new file mode 100644 (file)
index 0000000..e12a83a
--- /dev/null
@@ -0,0 +1,7 @@
+li {
+  font: {
+    family: serif;;
+    weight: bold;
+    size: 1.2em
+  }
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/nesting.scss b/tests/sass/resources/scss/nesting.scss
new file mode 100644 (file)
index 0000000..0336c9e
--- /dev/null
@@ -0,0 +1,40 @@
+.top-bar {
+       color: red;
+       .alt {
+               color: blue;
+       }
+}
+
+.menu {
+       background-color: red;
+       a {
+               color: blue;
+       }
+}
+
+.caption {
+       padding: 10px;
+       .text, .header {
+               color: green;
+       }
+}
+
+.footer {
+       padding: 10px;
+       .left, .right {
+               color: purple;
+               a {
+                       color: orange;
+               }
+       }
+}
+
+.main {
+  color: red;
+  .second.third {
+    color: blue;
+    .fourth {
+      color: black;
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/parent-selector.scss b/tests/sass/resources/scss/parent-selector.scss
new file mode 100644 (file)
index 0000000..3d0f694
--- /dev/null
@@ -0,0 +1,14 @@
+a {
+  font-weight: bold;
+  text-decoration: none;
+  &:hover { text-decoration: underline; }
+  body.firefox & { font-weight: normal; }
+}
+
+#main {
+  color: black;
+  a {
+    font-weight: bold;
+    &:hover { color: red; }
+  }
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/reference-parent-selector.css b/tests/sass/resources/scss/reference-parent-selector.css
new file mode 100644 (file)
index 0000000..733c8fd
--- /dev/null
@@ -0,0 +1,6 @@
+a {
+       color: #660000;
+       &:hover {color: #000000;}
+       &:visited {color:#660066;}
+       &:active {color: #ffffff;}
+}
\ No newline at end of file
diff --git a/tests/sass/resources/scss/variables.scss b/tests/sass/resources/scss/variables.scss
new file mode 100644 (file)
index 0000000..2b39ef4
--- /dev/null
@@ -0,0 +1,16 @@
+$blue: #3bbfce;
+$margin: 8px;
+$chameleon-font-family: Arial, Helvetica, "Lucida Grande", "Lucida Sans Unicode", Tahoma, Verdana, sans-serif;
+
+.content-navigation {
+       border-color: $blue;
+       $blue: #0000ff;
+       color: $blue;
+       font-family: $chameleon-font-family;
+}
+
+.border {
+       padding: $margin;
+       margin: $margin;
+       border-color: $blue;
+}
\ No newline at end of file
diff --git a/tests/sass/src/com/vaadin/sass/AllTests.java b/tests/sass/src/com/vaadin/sass/AllTests.java
new file mode 100644 (file)
index 0000000..574b1a4
--- /dev/null
@@ -0,0 +1,11 @@
+package com.vaadin.sass;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+@RunWith(Suite.class)
+@SuiteClasses({ CssTestSuite.class, ScssTestSuite.class, VisitorTestSuite.class })
+public class AllTests {
+
+}
diff --git a/tests/sass/src/com/vaadin/sass/CssTestSuite.java b/tests/sass/src/com/vaadin/sass/CssTestSuite.java
new file mode 100644 (file)
index 0000000..e15da68
--- /dev/null
@@ -0,0 +1,17 @@
+package com.vaadin.sass;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+import com.vaadin.sass.testcases.css.Comments;
+import com.vaadin.sass.testcases.css.Media;
+import com.vaadin.sass.testcases.css.Properties;
+import com.vaadin.sass.testcases.css.Reindeer;
+import com.vaadin.sass.testcases.css.Selectors;
+
+@RunWith(Suite.class)
+@SuiteClasses({ Selectors.class, Properties.class, Reindeer.class, Media.class,
+        Comments.class })
+public class CssTestSuite {
+}
diff --git a/tests/sass/src/com/vaadin/sass/ScssTestSuite.java b/tests/sass/src/com/vaadin/sass/ScssTestSuite.java
new file mode 100644 (file)
index 0000000..9ab0a76
--- /dev/null
@@ -0,0 +1,26 @@
+package com.vaadin.sass;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+import com.vaadin.sass.testcases.scss.ControlDirectives;
+import com.vaadin.sass.testcases.scss.Extends;
+import com.vaadin.sass.testcases.scss.Functions;
+import com.vaadin.sass.testcases.scss.Imports;
+import com.vaadin.sass.testcases.scss.Mixins;
+import com.vaadin.sass.testcases.scss.NestedProperties;
+import com.vaadin.sass.testcases.scss.Nesting;
+import com.vaadin.sass.testcases.scss.ParentImports;
+import com.vaadin.sass.testcases.scss.ParentSelector;
+import com.vaadin.sass.testcases.scss.Variables;
+import com.vaadin.sass.tree.ImportNodeTest;
+
+@RunWith(Suite.class)
+@SuiteClasses({ ControlDirectives.class, Extends.class, Functions.class,
+        ImportNodeTest.class, Imports.class, Mixins.class,
+        NestedProperties.class, Nesting.class, ParentImports.class,
+        Variables.class, ParentSelector.class })
+public class ScssTestSuite {
+
+}
diff --git a/tests/sass/src/com/vaadin/sass/TestBase.java b/tests/sass/src/com/vaadin/sass/TestBase.java
new file mode 100644 (file)
index 0000000..6947d24
--- /dev/null
@@ -0,0 +1,84 @@
+package com.vaadin.sass;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import org.w3c.css.sac.CSSException;
+
+public class TestBase {
+
+    protected ScssStylesheet stylesheet;
+    protected String originalScss;
+    protected String parsedScss;
+    protected String comparisonCss;
+
+    public ScssStylesheet getStyleSheet(String filename)
+            throws URISyntaxException, CSSException, IOException {
+        File file = getFile(filename);
+        stylesheet = ScssStylesheet.get(file);
+        return stylesheet;
+    }
+
+    public File getFile(String filename) throws URISyntaxException,
+            CSSException, IOException {
+        return new File(getClass().getResource(filename).toURI());
+    }
+
+    public String getFileContent(String filename) throws IOException,
+            CSSException, URISyntaxException {
+        File file = getFile(filename);
+        return getFileContent(file);
+    }
+
+    /**
+     * Read in the full content of a file into a string.
+     * 
+     * @param file
+     *            the file to be read
+     * @return a String with the content of the
+     * @throws IOException
+     *             when file reading fails
+     */
+    public String getFileContent(File file) throws IOException {
+        StringBuilder content = new StringBuilder();
+
+        FileReader fileReader = new FileReader(file);
+        BufferedReader bufferedReader = new BufferedReader(fileReader);
+        String line = null;
+        // Handle the first line separately to get the right amount of line
+        // separators in the loop
+        if ((line = bufferedReader.readLine()) != null) {
+            content.append(line);
+        }
+        // Handle the rest of the lines
+        while ((line = bufferedReader.readLine()) != null) {
+            content.append(System.getProperty("line.separator"));
+            content.append(line);
+        }
+        bufferedReader.close();
+        return content.toString();
+    }
+
+    public boolean testParser(String file) throws CSSException, IOException,
+            URISyntaxException {
+        originalScss = getFileContent(file);
+        ScssStylesheet sheet = getStyleSheet(file);
+        parsedScss = sheet.toString();
+        return parsedScss.equals(originalScss);
+    }
+
+    public boolean testCompiler(String scss, String css) {
+        try {
+            comparisonCss = getFileContent(css);
+            ScssStylesheet sheet = getStyleSheet(scss);
+            sheet.compile();
+            parsedScss = sheet.toString();
+        } catch (Exception e) {
+            return false;
+        }
+        return parsedScss.equals(comparisonCss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/VisitorTestSuite.java b/tests/sass/src/com/vaadin/sass/VisitorTestSuite.java
new file mode 100644 (file)
index 0000000..46dfce6
--- /dev/null
@@ -0,0 +1,14 @@
+package com.vaadin.sass;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+import com.vaadin.sass.testcases.visitor.MixinVisitorTest;
+import com.vaadin.sass.testcases.visitor.NestedPropertiesVisitorTest;
+
+@RunWith(Suite.class)
+@SuiteClasses({ NestedPropertiesVisitorTest.class, MixinVisitorTest.class })
+public class VisitorTestSuite {
+
+}
diff --git a/tests/sass/src/com/vaadin/sass/parser/ParserTest.java b/tests/sass/src/com/vaadin/sass/parser/ParserTest.java
new file mode 100644 (file)
index 0000000..db77544
--- /dev/null
@@ -0,0 +1,49 @@
+package com.vaadin.sass.parser;
+
+import java.io.IOException;
+import java.io.StringReader;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.LexicalUnit;
+
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+
+public class ParserTest {
+
+    @Test
+    public void testParsePropertyValue() throws CSSException, IOException {
+        Parser parser = new Parser();
+
+        LexicalUnit value = parser.parsePropertyValue(new InputSource(
+                new StringReader("$margin/2;")));
+
+        Assert.assertEquals("margin", value.getStringValue());
+        Assert.assertEquals(SCSSLexicalUnit.SCSS_VARIABLE,
+                value.getLexicalUnitType());
+        value = value.getNextLexicalUnit();
+        Assert.assertEquals(LexicalUnit.SAC_OPERATOR_SLASH,
+                value.getLexicalUnitType());
+        value = value.getNextLexicalUnit();
+        Assert.assertEquals(LexicalUnit.SAC_INTEGER, value.getLexicalUnitType());
+        Assert.assertEquals(2, value.getIntegerValue());
+
+    }
+
+    @Test
+    public void testCanIngoreSingleLineComment() {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        try {
+            parser.parseStyleSheet(new InputSource(new StringReader(
+                    "//kjaljsföajsfalkj\n@12abcg;")));
+            Assert.assertTrue(true);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/sass/src/com/vaadin/sass/testcases/css/Comments.java b/tests/sass/src/com/vaadin/sass/testcases/css/Comments.java
new file mode 100644 (file)
index 0000000..c069041
--- /dev/null
@@ -0,0 +1,23 @@
+package com.vaadin.sass.testcases.css;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.TestBase;
+
+public class Comments extends TestBase {
+    String css = "/basic/comments.css";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        testParser(css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                originalScss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/css/EmptyBlock.java b/tests/sass/src/com/vaadin/sass/testcases/css/EmptyBlock.java
new file mode 100644 (file)
index 0000000..c80ebea
--- /dev/null
@@ -0,0 +1,23 @@
+package com.vaadin.sass.testcases.css;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.TestBase;
+
+public class EmptyBlock extends TestBase {
+    String css = "/basic/empty_block.css";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        testParser(css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                originalScss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/css/Interpolation.java b/tests/sass/src/com/vaadin/sass/testcases/css/Interpolation.java
new file mode 100644 (file)
index 0000000..fd57f1c
--- /dev/null
@@ -0,0 +1,33 @@
+package com.vaadin.sass.testcases.css;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.BlockNode;
+
+public class Interpolation extends TestBase {
+    String scss = "/scss/interpolation.scss";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+
+        Assert.assertEquals(3, root.getChildren().size());
+        BlockNode blockNodeWithInterpolation = (BlockNode) root.getChildren()
+                .get(2);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/css/Media.java b/tests/sass/src/com/vaadin/sass/testcases/css/Media.java
new file mode 100644 (file)
index 0000000..21ab421
--- /dev/null
@@ -0,0 +1,24 @@
+package com.vaadin.sass.testcases.css;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.TestBase;
+
+public class Media extends TestBase {
+
+    String css = "/basic/media.css";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        testParser(css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                originalScss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/css/Properties.java b/tests/sass/src/com/vaadin/sass/testcases/css/Properties.java
new file mode 100644 (file)
index 0000000..e140a40
--- /dev/null
@@ -0,0 +1,24 @@
+package com.vaadin.sass.testcases.css;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.TestBase;
+
+public class Properties extends TestBase {
+
+    String css = "/basic/properties.css";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        testParser(css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                originalScss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/css/Reindeer.java b/tests/sass/src/com/vaadin/sass/testcases/css/Reindeer.java
new file mode 100644 (file)
index 0000000..9a82096
--- /dev/null
@@ -0,0 +1,24 @@
+package com.vaadin.sass.testcases.css;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.TestBase;
+
+public class Reindeer extends TestBase {
+
+    String css = "/basic/reindeer.css";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        testParser(css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                originalScss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/css/Selectors.java b/tests/sass/src/com/vaadin/sass/testcases/css/Selectors.java
new file mode 100644 (file)
index 0000000..f8259e8
--- /dev/null
@@ -0,0 +1,24 @@
+package com.vaadin.sass.testcases.css;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.TestBase;
+
+public class Selectors extends TestBase {
+
+    String css = "/basic/selectors.css";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        testParser(css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                originalScss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/ControlDirectives.java b/tests/sass/src/com/vaadin/sass/testcases/scss/ControlDirectives.java
new file mode 100644 (file)
index 0000000..d42199d
--- /dev/null
@@ -0,0 +1,40 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+
+public class ControlDirectives extends TestBase {
+
+    String scss = "/scss/control-directives.scss";
+    String css = "/css/control-directives.css";
+
+    @Test
+    public void testParser() throws CSSException, IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+        Assert.assertNotNull(root);
+        Assert.fail("Implement assert nodes");
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/Extends.java b/tests/sass/src/com/vaadin/sass/testcases/scss/Extends.java
new file mode 100644 (file)
index 0000000..fa0d323
--- /dev/null
@@ -0,0 +1,40 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.ExtendNode;
+
+public class Extends extends TestBase {
+    String scss = "/scss/extends.scss";
+    String css = "/css/extends.css";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+
+        Assert.assertTrue(root.getChildren().get(2).getChildren().get(0) instanceof ExtendNode);
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/Functions.java b/tests/sass/src/com/vaadin/sass/testcases/scss/Functions.java
new file mode 100644 (file)
index 0000000..d3085f6
--- /dev/null
@@ -0,0 +1,42 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.BlockNode;
+
+public class Functions extends TestBase {
+
+    String scss = "/scss/functions.scss";
+    String css = "/css/functions.css";
+
+    @Test
+    public void testParser() throws CSSException, IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+        Assert.assertEquals(1, root.getChildren().size());
+        BlockNode blockNode = (BlockNode) root.getChildren().get(0);
+        Assert.assertEquals(12, blockNode.getChildren().size());
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/Imports.java b/tests/sass/src/com/vaadin/sass/testcases/scss/Imports.java
new file mode 100644 (file)
index 0000000..bcee04f
--- /dev/null
@@ -0,0 +1,42 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.ImportNode;
+
+public class Imports extends TestBase {
+
+    String scss = "/scss/imports.scss";
+    String css = "/css/imports.css";
+
+    @Test
+    public void testParser() throws CSSException, IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+        ImportNode importNode = (ImportNode) root.getChildren().get(0);
+        Assert.assertEquals("_partial-for-import", importNode.getUri());
+        Assert.assertFalse(importNode.isPureCssImport());
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/Mixins.java b/tests/sass/src/com/vaadin/sass/testcases/scss/Mixins.java
new file mode 100644 (file)
index 0000000..a4ecf75
--- /dev/null
@@ -0,0 +1,103 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.LexicalUnit;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.BlockNode;
+import com.vaadin.sass.tree.MediaNode;
+import com.vaadin.sass.tree.MixinDefNode;
+import com.vaadin.sass.tree.MixinNode;
+
+public class Mixins extends TestBase {
+
+    String scss = "/scss/mixins.scss";
+    String css = "/css/mixins.css";
+
+    @Test
+    public void testParser() throws CSSException, URISyntaxException,
+            IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+
+        MixinDefNode mixinDefNode0 = (MixinDefNode) root.getChildren().get(0);
+        Assert.assertEquals("font-settings", mixinDefNode0.getName());
+        Assert.assertTrue(mixinDefNode0.getArglist().isEmpty());
+        Assert.assertEquals(3, mixinDefNode0.getChildren().size());
+
+        MixinDefNode mixinDefNode1 = (MixinDefNode) root.getChildren().get(1);
+        Assert.assertEquals("rounded-borders", mixinDefNode1.getName());
+        Assert.assertEquals(2, mixinDefNode1.getArglist().size());
+        Assert.assertEquals("thickness", mixinDefNode1.getArglist().get(0)
+                .getName());
+        Assert.assertEquals("radius", mixinDefNode1.getArglist().get(1)
+                .getName());
+        Assert.assertEquals(LexicalUnit.SAC_PIXEL, mixinDefNode1.getArglist()
+                .get(1).getExpr().getLexicalUnitType());
+        Assert.assertEquals(3f, mixinDefNode1.getArglist().get(1).getExpr()
+                .getFloatValue());
+
+        Assert.assertEquals(4, mixinDefNode1.getChildren().size());
+
+        BlockNode mainBlockNode = (BlockNode) root.getChildren().get(2);
+        Assert.assertEquals(2, mainBlockNode.getChildren().size());
+        MixinNode mixinNode0MainBlock = (MixinNode) mainBlockNode.getChildren()
+                .get(0);
+        Assert.assertEquals("rounded-borders", mixinNode0MainBlock.getName());
+        Assert.assertEquals(1f, mixinNode0MainBlock.getArglist().get(0)
+                .getFloatValue());
+        Assert.assertEquals(LexicalUnit.SAC_PIXEL, mixinNode0MainBlock
+                .getArglist().get(0).getLexicalUnitType());
+        MixinNode mixinNOde1MainBlock = (MixinNode) mainBlockNode.getChildren()
+                .get(1);
+        Assert.assertEquals("font-settings", mixinNOde1MainBlock.getName());
+        Assert.assertTrue(mixinNOde1MainBlock.getArglist().isEmpty());
+
+        MixinNode mixinNode1MainBlock = (MixinNode) mainBlockNode.getChildren()
+                .get(1);
+        Assert.assertTrue(mixinNode1MainBlock.getArglist().isEmpty());
+
+        BlockNode footerBlockNode = (BlockNode) root.getChildren().get(3);
+        MixinNode mixinNodeFooterBlock = (MixinNode) footerBlockNode
+                .getChildren().get(0);
+        Assert.assertEquals(2f, mixinNodeFooterBlock.getArglist().get(0)
+                .getFloatValue());
+        Assert.assertEquals("px", mixinNodeFooterBlock.getArglist().get(0)
+                .getDimensionUnitText());
+
+        Assert.assertEquals(10f, mixinNodeFooterBlock.getArglist().get(1)
+                .getFloatValue());
+        Assert.assertEquals("px", mixinNodeFooterBlock.getArglist().get(1)
+                .getDimensionUnitText());
+
+        Assert.assertTrue(root.getChildren().get(4) instanceof MixinDefNode);
+        Assert.assertTrue(root.getChildren().get(4).getChildren().get(3) instanceof MediaNode);
+        Assert.assertTrue(root.getChildren().get(4).getChildren().get(4) instanceof MixinNode);
+
+        MixinNode topLevelMixin = (MixinNode) root.getChildren().get(5);
+        Assert.assertEquals("layout", topLevelMixin.getName());
+
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/NestedProperties.java b/tests/sass/src/com/vaadin/sass/testcases/scss/NestedProperties.java
new file mode 100644 (file)
index 0000000..a236eea
--- /dev/null
@@ -0,0 +1,57 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.BlockNode;
+import com.vaadin.sass.tree.NestPropertiesNode;
+import com.vaadin.sass.tree.RuleNode;
+
+public class NestedProperties extends TestBase {
+    String scss = "/scss/nested-properties.scss";
+    String css = "/css/nested-properties.css";
+
+    @Test
+    public void testParser() throws CSSException, IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+        Assert.assertEquals(1, root.getChildren().size());
+
+        BlockNode blockNode = (BlockNode) root.getChildren().get(0);
+        Assert.assertEquals(1, blockNode.getChildren().size());
+
+        NestPropertiesNode nestPropertiesNode = (NestPropertiesNode) blockNode
+                .getChildren().get(0);
+        Assert.assertEquals("font", nestPropertiesNode.getName());
+        RuleNode nestedProperty0 = (RuleNode) nestPropertiesNode.getChildren()
+                .get(0);
+        RuleNode nestedProperty1 = (RuleNode) nestPropertiesNode.getChildren()
+                .get(1);
+        RuleNode nestedProperty2 = (RuleNode) nestPropertiesNode.getChildren()
+                .get(2);
+        Assert.assertEquals("family", nestedProperty0.getVariable());
+        Assert.assertEquals("weight", nestedProperty1.getVariable());
+        Assert.assertEquals("size", nestedProperty2.getVariable());
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/Nesting.java b/tests/sass/src/com/vaadin/sass/testcases/scss/Nesting.java
new file mode 100644 (file)
index 0000000..1ca8bc7
--- /dev/null
@@ -0,0 +1,75 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.BlockNode;
+
+public class Nesting extends TestBase {
+
+    String scss = "/scss/nesting.scss";
+    String css = "/css/nesting.css";
+
+    @Test
+    public void testParser() throws CSSException, IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+        Assert.assertEquals(5, root.getChildren().size());
+
+        BlockNode blockNode0 = (BlockNode) root.getChildren().get(0);
+        Assert.assertEquals(2, blockNode0.getChildren().size());
+        BlockNode nestedBlock0 = (BlockNode) blockNode0.getChildren().get(1);
+        org.junit.Assert.assertEquals(1, nestedBlock0.getChildren().size());
+
+        BlockNode blockNode1 = (BlockNode) root.getChildren().get(1);
+        Assert.assertEquals(2, blockNode1.getChildren().size());
+        BlockNode nestedBlockInBlock1 = (BlockNode) blockNode1.getChildren()
+                .get(1);
+        Assert.assertEquals(1, nestedBlockInBlock1.getChildren().size());
+
+        BlockNode blockNode2 = (BlockNode) root.getChildren().get(2);
+        Assert.assertEquals(2, blockNode2.getChildren().size());
+        BlockNode nestedBlockInBlock2 = (BlockNode) blockNode2.getChildren()
+                .get(1);
+        Assert.assertEquals(1, nestedBlockInBlock2.getChildren().size());
+
+        BlockNode blockNode3 = (BlockNode) root.getChildren().get(3);
+        Assert.assertEquals(2, blockNode3.getChildren().size());
+        BlockNode nestedBlockInBlock3 = (BlockNode) blockNode3.getChildren()
+                .get(1);
+        Assert.assertEquals(2, nestedBlockInBlock3.getChildren().size());
+        BlockNode nestednestedBlockInBlock3 = (BlockNode) nestedBlockInBlock3
+                .getChildren().get(1);
+        Assert.assertEquals(1, nestednestedBlockInBlock3.getChildren().size());
+
+        BlockNode blockNode4 = (BlockNode) root.getChildren().get(4);
+        Assert.assertEquals(2, blockNode4.getChildren().size());
+        BlockNode nestedBlockInBlock4 = (BlockNode) blockNode3.getChildren()
+                .get(1);
+        Assert.assertEquals(2, nestedBlockInBlock4.getChildren().size());
+        BlockNode nestednestedBlockInBlock4 = (BlockNode) nestedBlockInBlock3
+                .getChildren().get(1);
+        Assert.assertEquals(1, nestednestedBlockInBlock4.getChildren().size());
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/ParentImports.java b/tests/sass/src/com/vaadin/sass/testcases/scss/ParentImports.java
new file mode 100644 (file)
index 0000000..b25c841
--- /dev/null
@@ -0,0 +1,52 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.tree.ImportNode;
+
+public class ParentImports extends TestBase {
+
+    String scss = "/scss/folder-test/parent-import.scss";
+    String css = "/css/parent-import.css";
+
+    @Test
+    public void testParser() throws CSSException, IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+        ImportNode importVariableNode = (ImportNode) root.getChildren().get(0);
+        Assert.assertEquals("../folder-test2/variables.scss",
+                importVariableNode.getUri());
+        Assert.assertFalse(importVariableNode.isPureCssImport());
+
+        ImportNode importURLNode = (ImportNode) root.getChildren().get(1);
+        Assert.assertEquals("../folder-test2/url", importURLNode.getUri());
+        Assert.assertFalse(importURLNode.isPureCssImport());
+
+        ImportNode importImportNode = (ImportNode) root.getChildren().get(2);
+        Assert.assertEquals("../folder-test2/base-imported.scss",
+                importImportNode.getUri());
+        Assert.assertFalse(importImportNode.isPureCssImport());
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/ParentSelector.java b/tests/sass/src/com/vaadin/sass/testcases/scss/ParentSelector.java
new file mode 100644 (file)
index 0000000..0df3fde
--- /dev/null
@@ -0,0 +1,47 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.selector.SelectorUtil;
+import com.vaadin.sass.tree.BlockNode;
+
+public class ParentSelector extends TestBase {
+    String scss = "/scss/parent-selector.scss";
+    String css = "/css/parent-selector.css";
+
+    @Test
+    public void testParser() throws CSSException, IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+        BlockNode blockNode = (BlockNode) root.getChildren().get(0);
+        Assert.assertEquals(4, blockNode.getChildren().size());
+        BlockNode nestedBlock1 = (BlockNode) blockNode.getChildren().get(2);
+        Assert.assertEquals("&:hover",
+                SelectorUtil.toString(nestedBlock1.getSelectorList()));
+        BlockNode nestedBlock2 = (BlockNode) blockNode.getChildren().get(3);
+        Assert.assertEquals("body.firefox &",
+                SelectorUtil.toString(nestedBlock2.getSelectorList()));
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/scss/Variables.java b/tests/sass/src/com/vaadin/sass/testcases/scss/Variables.java
new file mode 100644 (file)
index 0000000..df6bd41
--- /dev/null
@@ -0,0 +1,94 @@
+package com.vaadin.sass.testcases.scss;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.w3c.css.sac.CSSException;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.TestBase;
+import com.vaadin.sass.handler.SCSSDocumentHandler;
+import com.vaadin.sass.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.parser.Parser;
+import com.vaadin.sass.parser.SCSSLexicalUnit;
+import com.vaadin.sass.tree.BlockNode;
+import com.vaadin.sass.tree.RuleNode;
+import com.vaadin.sass.tree.VariableNode;
+
+public class Variables extends TestBase {
+
+    String scss = "/scss/variables.scss";
+    String css = "/css/variables.css";
+
+    @Test
+    public void testParser() throws CSSException, IOException {
+        Parser parser = new Parser();
+        SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
+        parser.setDocumentHandler(handler);
+        parser.parseStyleSheet(getClass().getResource(scss).getPath());
+        ScssStylesheet root = handler.getStyleSheet();
+        Assert.assertEquals(5, root.getChildren().size());
+
+        VariableNode varNode1 = (VariableNode) root.getChildren().get(0);
+        Assert.assertEquals("blue", varNode1.getName());
+        // Assert.assertEquals("blue", varNode1.getExpr().);
+
+        VariableNode varNode2 = (VariableNode) root.getChildren().get(1);
+        Assert.assertEquals("margin", varNode2.getName());
+        Assert.assertEquals(8f, varNode2.getExpr().getFloatValue());
+        Assert.assertEquals("px", varNode2.getExpr().getDimensionUnitText());
+
+        VariableNode varNode3 = (VariableNode) root.getChildren().get(2);
+        Assert.assertEquals("chameleon-font-family", varNode3.getName());
+
+        BlockNode blockNode1 = (BlockNode) root.getChildren().get(3);
+        Assert.assertEquals(4, blockNode1.getChildren().size());
+        RuleNode ruleNode1Block1 = (RuleNode) blockNode1.getChildren().get(0);
+        Assert.assertEquals("border-color", ruleNode1Block1.getVariable());
+        Assert.assertEquals(SCSSLexicalUnit.SCSS_VARIABLE, ruleNode1Block1
+                .getValue().getLexicalUnitType());
+        Assert.assertEquals("blue", ruleNode1Block1.getValue().getStringValue());
+
+        VariableNode varNode1Block1 = (VariableNode) blockNode1.getChildren()
+                .get(1);
+        Assert.assertEquals("blue", varNode1Block1.getName());
+
+        RuleNode ruleNode2Block1 = (RuleNode) blockNode1.getChildren().get(2);
+        Assert.assertEquals("color", ruleNode2Block1.getVariable());
+        Assert.assertEquals(SCSSLexicalUnit.SCSS_VARIABLE, ruleNode2Block1
+                .getValue().getLexicalUnitType());
+        Assert.assertEquals("blue", ruleNode2Block1.getValue().getStringValue());
+
+        BlockNode blockNode2 = (BlockNode) root.getChildren().get(4);
+        RuleNode ruleNode1Block2 = (RuleNode) blockNode2.getChildren().get(0);
+        Assert.assertEquals("padding", ruleNode1Block2.getVariable());
+        Assert.assertEquals(SCSSLexicalUnit.SCSS_VARIABLE, ruleNode1Block2
+                .getValue().getLexicalUnitType());
+        Assert.assertEquals("margin", ruleNode1Block2.getValue()
+                .getStringValue());
+
+        RuleNode ruleNode2Block2 = (RuleNode) blockNode2.getChildren().get(1);
+        Assert.assertEquals("margin", ruleNode2Block2.getVariable());
+        Assert.assertEquals(SCSSLexicalUnit.SCSS_VARIABLE, ruleNode2Block2
+                .getValue().getLexicalUnitType());
+        Assert.assertEquals("margin", ruleNode2Block2.getValue()
+                .getStringValue());
+
+        RuleNode ruleNode3Block2 = (RuleNode) blockNode2.getChildren().get(2);
+        Assert.assertEquals("border-color", ruleNode3Block2.getVariable());
+        Assert.assertEquals(SCSSLexicalUnit.SCSS_VARIABLE, ruleNode1Block2
+                .getValue().getLexicalUnitType());
+        Assert.assertEquals("blue", ruleNode3Block2.getValue().getStringValue());
+    }
+
+    @Test
+    public void testCompiler() throws CSSException, URISyntaxException,
+            IOException {
+        testCompiler(scss, css);
+        Assert.assertEquals("Original CSS and parsed CSS doesn't match",
+                comparisonCss, parsedScss);
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/visitor/ImportVisitorTest.java b/tests/sass/src/com/vaadin/sass/testcases/visitor/ImportVisitorTest.java
new file mode 100644 (file)
index 0000000..0bc6cb8
--- /dev/null
@@ -0,0 +1,9 @@
+package com.vaadin.sass.testcases.visitor;
+
+import org.junit.Test;
+
+public class ImportVisitorTest {
+    @Test
+    public void canHandleNestedImports() {
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/visitor/MixinVisitorTest.java b/tests/sass/src/com/vaadin/sass/testcases/visitor/MixinVisitorTest.java
new file mode 100644 (file)
index 0000000..8030d4e
--- /dev/null
@@ -0,0 +1,263 @@
+package com.vaadin.sass.testcases.visitor;
+
+import java.util.ArrayList;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.w3c.css.sac.LexicalUnit;
+
+import com.steadystate.css.parser.LexicalUnitImpl;
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.parser.SCSSLexicalUnit;
+import com.vaadin.sass.tree.BlockNode;
+import com.vaadin.sass.tree.MixinDefNode;
+import com.vaadin.sass.tree.MixinNode;
+import com.vaadin.sass.tree.RuleNode;
+import com.vaadin.sass.tree.VariableNode;
+import com.vaadin.sass.visitor.MixinVisitor;
+
+public class MixinVisitorTest {
+    private MixinVisitor mixinVisitor = new MixinVisitor();
+
+    @Test
+    public void testTraversMixinWithoutArgs() {
+        ScssStylesheet root = new ScssStylesheet();
+        MixinDefNode mixinDefNoArgs = new MixinDefNode("no-args", null);
+        BlockNode blockNode = new BlockNode(null);
+        mixinDefNoArgs.appendChild(blockNode);
+        root.appendChild(mixinDefNoArgs);
+
+        BlockNode blockWithMixin = new BlockNode(null);
+        MixinNode mixin = new MixinNode("no-args", null);
+        blockWithMixin.appendChild(mixin);
+        root.appendChild(blockWithMixin);
+
+        try {
+            mixinVisitor.traverse(root);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+
+        Assert.assertEquals(1, root.getChildren().size());
+        BlockNode child = (BlockNode) root.getChildren().get(0);
+        BlockNode fromMixin = (BlockNode) child.getChildren().get(0);
+        Assert.assertFalse(fromMixin.hasChildren());
+    }
+
+    @Test
+    public void testTraverseMixinWithNonDefaultArgs() {
+        ScssStylesheet root = new ScssStylesheet();
+        ArrayList<VariableNode> args = new ArrayList<VariableNode>();
+        args.add(new VariableNode("arg", null, false));
+        MixinDefNode mixinDefWithNonDefaultArg = new MixinDefNode(
+                "non-default-arg", args);
+        BlockNode blockNode = new BlockNode(null);
+        mixinDefWithNonDefaultArg.appendChild(blockNode);
+        root.appendChild(mixinDefWithNonDefaultArg);
+
+        BlockNode blockWithMixin = new BlockNode(null);
+        ArrayList<LexicalUnit> includeArgs = new ArrayList<LexicalUnit>();
+        LexicalUnit includeArg = LexicalUnitImpl.createPixel(null, 1f);
+        includeArgs.add(includeArg);
+        MixinNode mixin = new MixinNode("non-default-arg", includeArgs);
+        blockWithMixin.appendChild(mixin);
+        root.appendChild(blockWithMixin);
+
+        try {
+            mixinVisitor.traverse(root);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+
+        Assert.assertEquals(1, root.getChildren().size());
+        BlockNode child = (BlockNode) root.getChildren().get(0);
+        VariableNode varNode = (VariableNode) child.getChildren().get(0);
+        Assert.assertEquals("arg", varNode.getName());
+        Assert.assertEquals(LexicalUnit.SAC_PIXEL, varNode.getExpr()
+                .getLexicalUnitType());
+        Assert.assertEquals(1f, varNode.getExpr().getFloatValue(), 0);
+        BlockNode fromMixin = (BlockNode) child.getChildren().get(1);
+        Assert.assertFalse(fromMixin.hasChildren());
+
+    }
+
+    @Test
+    public void testTraverseMixinWithDefaultArgs() {
+        ScssStylesheet root = new ScssStylesheet();
+        ArrayList<VariableNode> args = new ArrayList<VariableNode>();
+        args.add(new VariableNode("arg", LexicalUnitImpl.createPixel(null, 1f),
+                false));
+        MixinDefNode mixinDefWithNonDefaultArg = new MixinDefNode(
+                "default-arg", args);
+        BlockNode blockNode = new BlockNode(null);
+        mixinDefWithNonDefaultArg.appendChild(blockNode);
+        root.appendChild(mixinDefWithNonDefaultArg);
+
+        BlockNode blockWithMixin = new BlockNode(null);
+        MixinNode mixin = new MixinNode("default-arg", null);
+        blockWithMixin.appendChild(mixin);
+        root.appendChild(blockWithMixin);
+
+        try {
+            mixinVisitor.traverse(root);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+
+        Assert.assertEquals(1, root.getChildren().size());
+        BlockNode child = (BlockNode) root.getChildren().get(0);
+        VariableNode varNode = (VariableNode) child.getChildren().get(0);
+        Assert.assertEquals("arg", varNode.getName());
+        Assert.assertEquals(LexicalUnit.SAC_PIXEL, varNode.getExpr()
+                .getLexicalUnitType());
+        Assert.assertEquals(1f, varNode.getExpr().getFloatValue(), 0);
+        BlockNode fromMixin = (BlockNode) child.getChildren().get(1);
+        Assert.assertFalse(fromMixin.hasChildren());
+
+    }
+
+    @Test
+    public void testMixinWithoutArgument() {
+        /*
+         * ArrayList<String> args = new ArrayList<String>(); args.add("arg");
+         * MixinDefNode mixinDefWithArgs = new MixinDefNode("with-args", args);
+         * RuleNode ruleNode = new RuleNode("var",
+         * com.vaadin.sass.parser.LexicalUnitImpl.createVariable(0, 0, null,
+         * "arg"), false); mixinDefWithArgs.appendChild(ruleNode);
+         */
+        ScssStylesheet root = new ScssStylesheet();
+        MixinDefNode mixinDefNoArgs = new MixinDefNode("table-base", null);
+        BlockNode thBlockNode = new BlockNode(null);
+        RuleNode textAlignRuleNode = new RuleNode("text-align",
+                LexicalUnitImpl.createString(null, "center"), false, null);
+        thBlockNode.appendChild(textAlignRuleNode);
+        RuleNode fontWeightRuleNode = new RuleNode("font-weight",
+                LexicalUnitImpl.createString(null, "bold"), false, null);
+        thBlockNode.appendChild(fontWeightRuleNode);
+        mixinDefNoArgs.appendChild(thBlockNode);
+
+        BlockNode tdthBlockNode = new BlockNode(null);
+        RuleNode paddingRuleNode = new RuleNode("padding",
+                LexicalUnitImpl.createPixel(null, 2f), false, null);
+        tdthBlockNode.appendChild(paddingRuleNode);
+        mixinDefNoArgs.appendChild(tdthBlockNode);
+        root.appendChild(mixinDefNoArgs);
+
+        BlockNode dataBlock = new BlockNode(null);
+        MixinNode mixinNode = new MixinNode("table-base", null);
+        dataBlock.appendChild(mixinNode);
+        root.appendChild(dataBlock);
+
+        try {
+            mixinVisitor.traverse(root);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+
+        Assert.assertEquals(1, root.getChildren().size());
+        dataBlock = (BlockNode) root.getChildren().get(0);
+        BlockNode thBlock = (BlockNode) dataBlock.getChildren().get(0);
+        Assert.assertEquals(2, thBlock.getChildren().size());
+        BlockNode thtdBlock = (BlockNode) dataBlock.getChildren().get(1);
+        Assert.assertEquals(1, thtdBlock.getChildren().size());
+
+        /*
+         * Assert.assertEquals(2, root.getChildren().size()); BlockNode
+         * datathBlockNode = (BlockNode) root.getChildren().get(0);
+         * Assert.assertEquals(LexicalUnit.SAC_IDENT, datathBlockNode
+         * .getSelectorList().item(0).getSelectorType());
+         * Assert.assertEquals("text-align", ((RuleNode) datathBlockNode
+         * .getChildren().get(0)).getVariable()); Assert.assertEquals("center",
+         * ((RuleNode) datathBlockNode.getChildren()
+         * .get(0)).getValue().getStringValue());
+         * Assert.assertEquals("font-weight", ((RuleNode) datathBlockNode
+         * .getChildren().get(1)).getVariable()); Assert.assertEquals("bold",
+         * ((RuleNode) datathBlockNode.getChildren()
+         * .get(1)).getValue().getStringValue());
+         * 
+         * BlockNode datathdatatdBlockNode = (BlockNode)
+         * root.getChildren().get(1); Assert.assertEquals(LexicalUnit.SAC_IDENT,
+         * datathdatatdBlockNode .getSelectorList().item(0).getSelectorType());
+         * Assert.assertEquals(LexicalUnit.SAC_IDENT, datathdatatdBlockNode
+         * .getSelectorList().item(1).getSelectorType());
+         * Assert.assertEquals("padding", ((RuleNode) datathdatatdBlockNode
+         * .getChildren().get(0)).getVariable()); Assert.assertEquals(2.0f,
+         * ((RuleNode) datathdatatdBlockNode
+         * .getChildren().get(0)).getValue().getFloatValue(), 0);
+         * Assert.assertEquals(LexicalUnit.SAC_PIXEL, ((RuleNode)
+         * datathdatatdBlockNode.getChildren().get(0))
+         * .getValue().getLexicalUnitType());
+         */
+
+    }
+
+    @Test
+    public void testMixinWithArgument() {
+        ScssStylesheet root = new ScssStylesheet();
+        ArrayList<VariableNode> argNameList = new ArrayList<VariableNode>();
+        argNameList.add(new VariableNode("dist", null, false));
+        MixinDefNode mixinDef = new MixinDefNode("left", argNameList);
+
+        RuleNode floatRuleNode = new RuleNode("float",
+                LexicalUnitImpl.createString(null, "left"), false, null);
+        mixinDef.appendChild(floatRuleNode);
+        RuleNode marginLeftRuleNode = new RuleNode("margin-left",
+                com.vaadin.sass.parser.LexicalUnitImpl.createVariable(0, 0,
+                        null, "dist"), false, null);
+        mixinDef.appendChild(marginLeftRuleNode);
+        root.appendChild(mixinDef);
+
+        BlockNode dataBlock = new BlockNode(null);
+        ArrayList<LexicalUnit> argValueList = new ArrayList<LexicalUnit>();
+        LexicalUnit arg = LexicalUnitImpl.createPixel(null, 10f);
+        argValueList.add(arg);
+        MixinNode mixinNode = new MixinNode("left", argValueList);
+        dataBlock.appendChild(mixinNode);
+        root.appendChild(dataBlock);
+
+        try {
+            mixinVisitor.traverse(root);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+
+        Assert.assertEquals(1, root.getChildren().size());
+        BlockNode dataBlockNode = (BlockNode) root.getChildren().get(0);
+        VariableNode variable = (VariableNode) dataBlockNode.getChildren().get(
+                0);
+        Assert.assertEquals("dist", variable.getName());
+        Assert.assertEquals("float", ((RuleNode) dataBlockNode.getChildren()
+                .get(1)).getVariable());
+        Assert.assertEquals("left", ((RuleNode) dataBlockNode.getChildren()
+                .get(1)).getValue().getStringValue());
+        Assert.assertEquals("margin-left", ((RuleNode) dataBlockNode
+                .getChildren().get(2)).getVariable());
+        Assert.assertEquals(SCSSLexicalUnit.SCSS_VARIABLE,
+                ((RuleNode) dataBlockNode.getChildren().get(2)).getValue()
+                        .getLexicalUnitType());
+    }
+
+    @Test
+    public void testTopLevelInclude() {
+        ScssStylesheet root = new ScssStylesheet();
+
+        MixinDefNode defNode = new MixinDefNode("mixin", null);
+        defNode.appendChild(new RuleNode("var", null, false, null));
+        root.appendChild(defNode);
+
+        MixinNode mixinNode = new MixinNode("mixin", null);
+        root.appendChild(mixinNode);
+
+        try {
+            mixinVisitor.traverse(root);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+
+        Assert.assertEquals(1, root.getChildren().size());
+        RuleNode varRule = (RuleNode) root.getChildren().get(0);
+        Assert.assertEquals("var", varRule.getVariable());
+
+    }
+
+}
diff --git a/tests/sass/src/com/vaadin/sass/testcases/visitor/NestedPropertiesVisitorTest.java b/tests/sass/src/com/vaadin/sass/testcases/visitor/NestedPropertiesVisitorTest.java
new file mode 100644 (file)
index 0000000..48705c1
--- /dev/null
@@ -0,0 +1,51 @@
+package com.vaadin.sass.testcases.visitor;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.sass.ScssStylesheet;
+import com.vaadin.sass.tree.NestPropertiesNode;
+import com.vaadin.sass.tree.RuleNode;
+import com.vaadin.sass.tree.VariableNode;
+import com.vaadin.sass.visitor.NestPropertiesVisitor;
+
+public class NestedPropertiesVisitorTest {
+    private NestPropertiesVisitor visitor = new NestPropertiesVisitor();
+
+    @Test
+    public void testEmptyTreeNoChange() {
+        ScssStylesheet root = new ScssStylesheet();
+        Assert.assertFalse(root.hasChildren());
+        visitor.traverse(root);
+        Assert.assertFalse(root.hasChildren());
+    }
+
+    @Test
+    public void testNoNestPropertiesNodeNoChange() {
+        ScssStylesheet root = new ScssStylesheet();
+        root.appendChild(new VariableNode("", ""));
+        Assert.assertEquals(1, root.getChildren().size());
+        visitor.traverse(root);
+        Assert.assertEquals(1, root.getChildren().size());
+    }
+
+    @Test
+    public void testNestedPropertiesCanBeUnnested() {
+        ScssStylesheet root = new ScssStylesheet();
+        NestPropertiesNode nested = new NestPropertiesNode("nested");
+        RuleNode child0 = new RuleNode("child0", null, false, null);
+        RuleNode child1 = new RuleNode("child1", null, true, null);
+        nested.appendChild(child0);
+        nested.appendChild(child1);
+        root.appendChild(nested);
+
+        Assert.assertEquals(1, root.getChildren().size());
+        visitor.traverse(root);
+        Assert.assertEquals(2, root.getChildren().size());
+
+        for (int i = 0; i < root.getChildren().size(); i++) {
+            RuleNode node = (RuleNode) root.getChildren().get(i);
+            Assert.assertEquals("nested-child" + i, node.getVariable());
+        }
+    }
+}
diff --git a/tests/sass/src/com/vaadin/sass/tree/ImportNodeTest.java b/tests/sass/src/com/vaadin/sass/tree/ImportNodeTest.java
new file mode 100644 (file)
index 0000000..ff7e4d9
--- /dev/null
@@ -0,0 +1,60 @@
+package com.vaadin.sass.tree;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.steadystate.css.parser.SACMediaListImpl;
+
+public class ImportNodeTest {
+    @Test
+    public void testIsPureCssImportShouldReturnTrueWhenIsURL() {
+        ImportNode node = new ImportNode("", null, true);
+        Assert.assertTrue(node.isPureCssImport());
+    }
+
+    @Test
+    public void testIsPureCssImportShouldReturnTrueWhenStartsWithHttp() {
+        ImportNode node = new ImportNode("http://abc", null, false);
+        Assert.assertTrue(node.isPureCssImport());
+    }
+
+    @Test
+    public void testIsPureCssImportShouldReturnTrueWhenEndsWithCss() {
+        ImportNode node = new ImportNode("abc.css", null, false);
+        Assert.assertTrue(node.isPureCssImport());
+    }
+
+    @Test
+    public void testIsPureCssImportShouldReturnTrueWhenHasMediaQueries() {
+        SACMediaListImpl ml = new SACMediaListImpl();
+        ml.add("screen");
+        ImportNode node = new ImportNode("", ml, false);
+        Assert.assertTrue(node.isPureCssImport());
+    }
+
+    @Test
+    public void testIsPureCssImportShouldReturnFalseInOtherCases() {
+        ImportNode node = new ImportNode("", null, false);
+        Assert.assertFalse(node.isPureCssImport());
+    }
+
+    @Test
+    public void testToStringWhenIsURL() {
+        ImportNode node = new ImportNode("test", null, true);
+        Assert.assertEquals("@import url(test);", node.toString());
+    }
+
+    @Test
+    public void testToStringWhenIsNotURL() {
+        ImportNode node = new ImportNode("test", null, false);
+        Assert.assertEquals("@import \"test\";", node.toString());
+    }
+
+    @Test
+    public void testToStringWithMediaQueries() {
+        SACMediaListImpl ml = new SACMediaListImpl();
+        ml.add("screen");
+        ImportNode node = new ImportNode("test", ml, true);
+        Assert.assertEquals("@import url(test) screen;", node.toString());
+    }
+}